This commit is contained in:
duan 2025-09-29 10:42:48 +08:00
parent 89db955ec1
commit 096f591123
80 changed files with 8735 additions and 3286 deletions

View File

@ -16,7 +16,7 @@
"type" : "uniCloud"
},
{
"playground" : "custom",
"playground" : "standard",
"type" : "uni-app:app-android"
}
]

View File

@ -3,14 +3,20 @@
App.vue本身不是页面这里不能编写视图元素也就是没有<template>
-->
<script setup>
//
import {
ref,
reactive
reactive, provide,onMounted
} from 'vue';
import appConfig from '@/config/appConfig.js';
import {
onLaunch,onHide
} from '@dcloudio/uni-app';
import WebsocketUtil from '@/http/websock.js'
const websocketUtil = new WebsocketUtil(appConfig.wss, 5000); // WebSocket
provide('websocketUtil', websocketUtil); //
import { getFindBySource } from '@/http/yskApi/version.js'
onHide(()=>{
@ -23,7 +29,6 @@ App.vue本身不是页面这里不能编写视图元素也就是没有<tem
//
console.log("widgetInfo==",widgetInfo)
getFindBySource({source:'点餐宝'}).then(res => {
console.log('res');
if (res.url && widgetInfo.version < res.version) {
let downloadLink = res.url;
console.log(downloadLink)

84
commons/utils/dict.js Normal file
View File

@ -0,0 +1,84 @@
export default {
orderStatus: [
{ label: "待支付", type: "unpaid" },
{ label: "制作中", type: "in_production" },
{ label: "待取餐", type: "wait_out" },
{ label: "订单完成", type: "done" },
{ label: "申请退单", type: "refunding" },
{ label: "退单", type: "refund" },
{ label: "部分退单", type: "part_refund" },
{ label: "取消订单", type: "cancelled" },
],
orderType: [
{ label: "收银", type: "cash" },
{ label: "小程序", type: "miniapp" },
],
dineMode: [
{ label: "堂食", type: "dine-in" },
{ label: "外带", type: "take-out" },
{ label: "外卖", type: "take-away" },
],
payType: [
{ label: "主扫", type: "main_scan" },
{ label: "被扫", type: "back_scan" },
{ label: "微信小程序", type: "wechat_mini" },
{ label: "支付宝小程序", type: "alipay_mini" },
{ label: "会员支付", type: "vip_pay" },
{ label: "现金支付", type: "cash_pay" },
{ label: "挂账支付", type: "credit_pay" },
],
bizCodes: [
{ label: "现金充值", type: "cashIn" },
{ label: "微信小程序充值", type: "wechatIn" },
{ label: "支付宝小程序充值", type: "alipayIn" },
{ label: "充值奖励", type: "awardIn" },
{ label: "充值退款", type: "rechargeRefund" },
{ label: "订单消费", type: "orderPay" },
{ label: "订单退款", type: "orderRefund" },
{ label: "管理员充值", type: "adminIn" },
{ label: "管理员消费", type: "adminOut" },
],
platformType: [
{ label: '微信小程序', type: 'WX' },
{ label: '支付宝小程序', type: 'ALI' },
{ label: '收银机客户端', type: 'PC' },
{ label: 'PC管理端', type: 'WEB' },
{ label: 'APP管理端', type: 'APP' },
{ label: '收款码', type: 'H5' },
],
tableStatus: {
idle: { label: "空闲", type: "#3F9EFF" },
using: { label: "使用中", type: "#fa5555" },
subscribe: { label: "预定", type: "rgb(34, 191, 100)" },
closed: { label: "关台", type: "rgb(221,221,221)" },
opening: { label: "开台中", type: "#E6A23C" },
cleaning: { label: "待清台", type: "#FAAD14" },
paying: { label: "结算中", type: "#E6A23C" },
unbind: { label: "未绑定", type: "rgb(221,221,221)" }
},
invoicingType: [
{ label: '全部', type: '' },
{ label: '手动入库', type: 'manual-in' },
{ label: '手动出库', type: 'manual-out' },
{ label: '盘盈入库', type: 'win-in' },
{ label: '盘亏出库', type: 'loss-out' },
{ label: '订单退款入库', type: 'other-out' },
{ label: '订单消费出库', type: 'order-out' },
{ label: '损耗出库', type: 'damage-out' },
],
invoicingType: [
{ label: '全部', type: '' },
{ label: '手动入库', type: 'manual-in' },
{ label: '手动出库', type: 'manual-out' },
{ label: '盘盈入库', type: 'win-in' },
{ label: '盘亏出库', type: 'loss-out' },
{ label: '订单退款入库', type: 'other-out' },
{ label: '订单消费出库', type: 'order-out' },
{ label: '损耗出库', type: 'damage-out' },
],
getDiceName(val,key){
let item = this[key].find(v => v.type == val)
return item ? item.label : ''
}
}

View File

@ -35,3 +35,14 @@ export function numSum(arr) {
}, 0)
return (sum / 100).toFixed(2)
}
export function mathFloorPrice(price,item) {
if( item ){
if( item.productType == 'weight' || item.type == 'weight'){
return (Math.floor(price * 100)/100).toFixed(2)
} else {
return parseFloat(price).toFixed(2)
}
} else {
return parseFloat(price).toFixed(2)
}
}

View File

@ -140,24 +140,32 @@ function returnFormatParams(params) {
export async function hasPermission(params) {
//如果是商户默认拥有全部权限
const loginType=uni.getStorageSync('loginType')
if(loginType=='merchant'){
if(loginType=='0'){
return true
}
params = returnFormatParams(params)
if (!params) {
return infoBox.showToast('未找到相关权限请检查代码或在权限配置文件commons/utils/hasPermission.js文件进行修改或增加')
}
const option = Object.assign({
tips: true,
key: '',
text: ''
}, params)
const res = await $hasPermission({
code: params.key
})
if (!res && option.tips) {
infoBox.showToast('您没有' + params.text + '权限!')
}
return res
// const loginType=uni.getStorageSync('loginType')
// if(loginType=='merchant'){
// return true
// }
// params = returnFormatParams(params)
// if (!params) {
// return infoBox.showToast('未找到相关权限请检查代码或在权限配置文件commons/utils/hasPermission.js文件进行修改或增加')
// }
// const option = Object.assign({
// tips: true,
// key: '',
// text: ''
// }, params)
// const res = await $hasPermission({
// code: params.key
// })
// if (!res && option.tips) {
// infoBox.showToast('您没有' + params.text + '权限!')
// }
// return res
}

194
commons/utils/index.js Normal file
View File

@ -0,0 +1,194 @@
export const utils = {
ColorMain: '#318AFE',
ColorRed: '#F02C45',
/**
* 限制只让输入数字
* @param {Object} e
*/
isNumber (e) {
return e.replace(/[^\d]/g, '')
},
/**
* 限制金额输入格式
* @param {Object} e
*/
isMoney (e) {
return e.toString().replace(/[^0-9.]/g, '').replace(/^\./g, "").replace(".", "$#$").replace(/\./g, "").replace("$#$", ".").replace(/^(\-)*(\d+)\.(\d{0,2}).*$/, "$1$2.$3")
},
/**
* 判断菜品使用价格
* @param {Object} e
*/
isGoodsPrice(item,user) {
let isVip = uni.getStorageSync("shopInfo").isMemberPrice&&user.id&&user.isVip
let memberPrice = item.memberPrice ? item.memberPrice : item.price;
let price = isVip ? memberPrice : item.price;
price = item.discountSaleAmount ? item.discountSaleAmount : price
return price;
},
inputReg(value,key,regName){
//判断regList对象是否存在属性 避免报错
// utils.hasOwnProperty.call(utils,regName)&&(form[key]=utils[regName](value))
},
/**
* 金额保留两位小数
* @param {Object} e
*/
toFixed (price,item) {
if( item ){
if( item.productType == 'weight' || item.type == 'weight'){
return (Math.floor(price * 100)/100).toFixed(2)
} else {
return parseFloat(price).toFixed(2)
}
} else {
return parseFloat(price).toFixed(2)
}
},
/**
* 金额向下取整
* @param {Object} e
*/
formatPrice (e) {
return (Math.floor(n*100)/100).toFixed(2)
},
/**
* 消息提示框
*/
showToast(title, duration = 1.5, extObject) {
return new Promise((resolve, reject) => {
uni.showToast(Object.assign({ title: title, icon: 'none', mask: false, duration: (duration * 1000) }, extObject))
setTimeout(resolve, (duration * 1000));
})
},
/**
* 保留小数n位不进行四舍五入
* num你传递过来的数字,
* decimal你保留的几位,默认保留小数后两位
*/
formatDecimal (num, decimal = 2) {
num = num.toString()
const index = num.indexOf('.')
if (index !== -1) {
num = num.substring(0, decimal + index + 1)
} else {
num = num.substring(0)
}
//截取后保留两位小数
return parseFloat(num).toFixed(decimal)
},
/**
* 分转元
* amount - 金额
* parseFloat - 是否转换为数字格式
* 默认String
*/
cert2Dollar(amount, needParseFloat = false) {
if (needParseFloat) { // parseFlot
return formatDecimal(amount / 100)
}
return formatDecimal(amount / 100)
},
/**
* @desc 函数防抖
* @param func 目标函数
* @param wait 延迟执行毫秒数
* @param immediate true - 立即执行 false - 延迟执行
*/
debounce (func, wait = 1000, immediate = true) {
let timer;
return function() {
let context = this,
args = arguments;
if (timer) clearTimeout(timer);
if (immediate) {
let callNow = !timer;
timer = setTimeout(() => {
timer = null;
}, wait);
if (callNow) func.apply(context, args);
} else {
timer = setTimeout(() => {
func.apply(context, args);
}, wait)
}
}
},
/**
* @desc 函数节流
* @param func 函数
* @param wait 延迟执行毫秒数
* @param type 1 使用表时间戳在时间段开始的时候触发 2 使用表定时器在时间段结束的时候触发
*/
throttle (func, wait = 1000, type = 1) {
let previous = 0;
let timeout;
return function() {
let context = this;
let args = arguments;
if (type === 1) {
let now = Date.now();
if (now - previous > wait) {
func.apply(context, args);
previous = now;
}
} else if (type === 2) {
if (!timeout) {
timeout = setTimeout(() => {
timeout = null;
func.apply(context, args)
}, wait)
}
}
}
},
/**
* 对象转数组
* @param {Object} e
*/
objToArrary (obj) {
if (Object.values(obj) && Array.isArray(Object.values(obj)[0])){
// 是数组
let arr = []
Object.values(obj).forEach(item=>{
arr = [...arr,...item]
})
return arr
} else {
// 不是数组
return Object.keys(obj).map(key => obj[key])
}
},
/**
* 获取url链接参数
* @param {Object} url
* @param {Object} name
*/
getQueryString(url, name) {
var reg = new RegExp('(^|&|/?)' + name + '=([^&|/?]*)(&|/?|$)', 'i')
var r = url.substr(1).match(reg)
if (r != null) {
return r[2]
}
return null;
},
}

View File

@ -18,13 +18,13 @@ const appCache = {
const model = {
setLogin(res){
const user=res.user.user
const user=res.shopInfo
uni.setStorageSync('logoutHandle',false)
uni.setStorageSync('shopId', res.shopId)
uni.setStorageSync('shopName',res.shopName)
uni.setStorageSync('logo',res.logo)
uni.setStorageSync('shopId', user.id)
uni.setStorageSync('shopName',user.shopName)
uni.setStorageSync('logo',user.logo)
uni.setStorageSync('loginType',res.loginType)
uni.setStorageSync('shopUserId',user.id)
// uni.setStorageSync('shopUserId',user.id)
if(res.loginType=='staff'){
uni.setStorageSync('merchantName',user.createBy||user.updateBy)
}
@ -51,14 +51,14 @@ const model = {
if (val) {
// 有值,为放置
appCache.tokenVal = val
uni.setStorageSync(appConfig.tokenKey, val)
appCache.tokenVal = val.tokenValue
uni.setStorageSync(appConfig.tokenKey, val.tokenValue)
} else {
// 否则为获取
if (!appCache.tokenVal) {
//缓存取不到,获取应用本地信息
appCache.tokenVal = uni.getStorageSync(appConfig.tokenKey)
appCache.tokenVal = uni.getStorageSync(appConfig.tokenKey).tokenValue
}
return appCache.tokenVal
}
@ -72,8 +72,8 @@ const model = {
if (val) {
// 有值,为放置
appCache.shopId = val
uni.setStorageSync('shopId', val)
appCache.shopId = val.id
uni.setStorageSync('shopId', val.id)
} else {
// 否则为获取
@ -223,20 +223,18 @@ const model = {
if (currentUserInfo) {
// 仅保存基础数据
let saveUser = {
sysUserId: currentUserInfo.sysUserId, // 用户ID
realname: currentUserInfo.realname, // 用户姓名
avatarUrl: currentUserInfo.avatarUrl, // 头像
telphone: currentUserInfo.telphone, // 手机号
userType: currentUserInfo.userType, // 用户类型
mchNo: currentUserInfo.userNo, // 商户No
mchShortName: currentUserInfo.shortName, // 商户简称
mchType: currentUserInfo.mchType, // 商户类型
mchLevel: currentUserInfo.mchLevel, // 商户级别
isHasMemberEnt:currentUserInfo.isHasMemberEnt,// 是否购买会员模块
entIdList: currentUserInfo.entIdList, // 权限集合List
// sysUserId: currentUserInfo.sysUserId, // 用户ID
// realname: currentUserInfo.realname, // 用户姓名
// avatarUrl: currentUserInfo.avatarUrl, // 头像
// telphone: currentUserInfo.telphone, // 手机号
// userType: currentUserInfo.userType, // 用户类型
// mchNo: currentUserInfo.userNo, // 商户No
// mchShortName: currentUserInfo.shortName, // 商户简称
// mchType: currentUserInfo.mchType, // 商户类型
// mchLevel: currentUserInfo.mchLevel, // 商户级别
// isHasMemberEnt:currentUserInfo.isHasMemberEnt,// 是否购买会员模块
// entIdList: currentUserInfo.entIdList, // 权限集合List
...currentUserInfo
}
uni.setStorageSync("currentUserInfo", saveUser) // 改变存储
appCache.currentUser = null

View File

@ -141,11 +141,11 @@
const accountType = reactive({
list: [{
label: '商户',
value: 'merchant'
value: 0
},
{
label: '员工',
value: 'staff'
value: 1
},
],
sel: 0
@ -204,8 +204,8 @@
const getCode = () => {
getCodeImg().then(res => {
vdata.formData.img = res.img
vdata.formData.uuid = res.uuid
vdata.formData.img = res.data.code
vdata.formData.uuid = res.data.uuid
})
}
@ -219,7 +219,7 @@
let loginPromise = null;
loginPromise = login({
username: vdata.formData.username,
password: encrypt(vdata.formData.pwd),
password: vdata.formData.pwd,
rememberMe: false,
code: vdata.formData.code,
uuid: vdata.formData.uuid,
@ -233,9 +233,11 @@
//
loginPromise.then(res => {
console.log(res);
uni.removeStorageSync('shopInfo')
uni.removeStorageSync('tokenInfo')
uni.removeStorageSync('shopId')
//
loginFinishFunc(res)
loginFinishFunc(res.data)
}).catch(e => {
getCode()
})
@ -252,11 +254,11 @@
//
async function loginFinishFunc(loginBizData) {
// token
storageManage.setLogin(loginBizData)
storageManage.token(loginBizData.token)
storageManage.shopId(loginBizData.shopId)
storageManage.shopUserId(loginBizData.user.user.id)
storageManage.userInfo(loginBizData)
uni.setStorageSync('shopInfo', loginBizData.shopInfo)
uni.setStorageSync('tokenInfo', loginBizData.tokenInfo)
uni.setStorageSync('shopId', loginBizData.shopInfo.id)
uni.setStorageSync('loginType',loginBizData.loginType)
console.log(loginBizData.shopInfo,111111111111);
emits('loginSuccess')
}
</script>

View File

@ -4,12 +4,12 @@ const appConfig = {
appName: '银收客',
// token取值key
tokenKey: 'iToken',
// tokenKey: 'satoken',
tokenKey: 'tokenInfo',
// 环境变量相关
env: {},
wss: "ws://192.168.1.31:2348", //
// wss: "wss://sockets.sxczgkj.com/wss", //
// 环境变量常量
ENV_ENUM: {
DEVELOPMENT: 'development', // 本地调试地址

16
http/api/area.js Normal file
View File

@ -0,0 +1,16 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取区域列表
* @returns
*/
export function getShopArea(data, urlType = 'account') {
return request({
url: `/account/admin/shopArea`,
method: "GET",
data: {
...data
}
})
}

136
http/api/buyer.js Normal file
View File

@ -0,0 +1,136 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取挂账人分页
* @returns
*/
export function getCreditBuyerPage(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyer/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取挂账人详情
* @returns
*/
export function getCreditBuyerDetail(id, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyer/${id}`,
method: "GET",
})
}
/**
* 添加挂账人
* @returns
*/
export function addCreditBuyer(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyer`,
method: "POST",
data: {
...data
}
})
}
/**
* 编辑挂账人
* @returns
*/
export function editCreditBuyer(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyer`,
method: "PUT",
data: {
...data
}
})
}
/**
* 删除挂账人
* @returns
*/
export function delCreditBuyer(id, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyer/${id}`,
method: "DELETE",
})
}
/**
* 还款
* @returns
*/
export function creditBuyerRepayment(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyer/repayment`,
method: "POST",
data: {
...data
}
})
}
/**
* 付款
* @returns
*/
export function creditBuyerOrderPay(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyerOrder/pay`,
method: "POST",
data: {
...data
}
})
}
/**
* 还款记录
* @returns
*/
export function creditRePaymentRecord(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/paymentRecord/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 明细分页
* @returns
*/
export function creditBuyerOrderList(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyerOrder/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 明细统计
* @returns
*/
export function creditBuyerOrderSummary(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/credit/buyerOrder/summary`,
method: "GET",
data: {
...data
}
})
}

86
http/api/callTable.js Normal file
View File

@ -0,0 +1,86 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取叫号队列
* @returns
*/
export function getCallTableQueue(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/callTable/queue`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取叫号记录列表
* @returns
*/
export function getCallRecord(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/callTable/callRecord`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取叫号桌型
* @returns
*/
export function getCallTable(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/callTable`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取叫号号码
* @returns
*/
export function callTableTakeNumber(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/callTable/takeNumber`,
method: "POST",
data: {
...data
}
})
}
/**
* 执行叫号
* @returns
*/
export function callTableCall(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/callTable/call`,
method: "POST",
data: {
...data
}
})
}
/**
* 修改叫号状态
* @returns
*/
export function updateCallTableState(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/callTable/updateState`,
method: "PUT",
data: {
...data
}
})
}

55
http/api/cateGory.js Normal file
View File

@ -0,0 +1,55 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取分类分页
* @returns
*/
export function categoryPage(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/prod/category/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 分类添加
* @returns
*/
export function addCategory(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/prod/category`,
method: "POST",
data: {
...data
}
})
}
/**
* 分类修改
* @returns
*/
export function putCategory(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/prod/category`,
method: "PUT",
data: {
...data
}
})
}
/**
* 分类删除
* @returns
*/
export function delCategory(id, urlType = 'product') {
return request({
url: `/${urlType}/admin/prod/category/${id}`,
method: "DELETE",
})
}

222
http/api/cons.js Normal file
View File

@ -0,0 +1,222 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取耗材分页
* @returns
*/
export function getConsPage(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/cons/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取耗材列表
* @returns
*/
export function getConsList(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/cons/list`,
method: "GET",
data: {
...data
}
})
}
/**
* 耗材添加
* @returns
*/
export function addCons(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/cons`,
method: "POST",
data: {
...data
}
})
}
/**
* 耗材修改
* @returns
*/
export function editCons(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/cons`,
method: "PUT",
data: {
...data
}
})
}
/**
* 获取耗材类别
* @returns
*/
export function getConsGrpupPage(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/consGroup/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取耗材类别
* @returns
*/
export function getConsGrpupList(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/consGroup/list`,
method: "GET",
data: {
...data
}
})
}
/**
* 新增耗材类别
* @returns
*/
export function addConsGrpup(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/consGroup`,
method: "POST",
data: {
...data
}
})
}
/**
* 修改耗材类别
* @returns
*/
export function editConsGrpup(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/consGroup`,
method: "PUT",
data: {
...data
}
})
}
/**
* 启用耗材类别
* @returns
*/
export function consGrpupEnable(id, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/consGroup/enable/${id}`,
method: "POST",
})
}
/**
* 禁用耗材类别
* @returns
*/
export function consGrpupDisable(id, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/consGroup/disable/${id}`,
method: "POST",
})
}
/**
* 耗材入库
* @returns
*/
export function consStockIn(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/stock/in`,
method: "POST",
data: {
...data
}
})
}
/**
* 耗材出库
* @returns
*/
export function stockOut(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/stock/out`,
method: "POST",
data: {
...data
}
})
}
/**
* 库存盘点
* @returns
*/
export function stockCheck(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/stock/check`,
method: "POST",
data: {
...data
}
})
}
/**
* 耗材报损
* @returns
*/
export function stockReportDamage(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/stock/reportDamage`,
method: "POST",
data: {
...data
}
})
}
/**
* 耗材库存变动记录
* @returns
*/
export function stockFlow(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/stock/flow`,
method: "GET",
data: {
...data
}
})
}
/**
* 耗材统计
* @returns
*/
export function consStatistics(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/cons/statistics`,
method: "GET",
data: {
...data
}
})
}

58
http/api/coupon.js Normal file
View File

@ -0,0 +1,58 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 店铺优惠券列表
* @returns
*/
export function getCouponList(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/coupon`,
method: "GET",
data: {
...data
}
})
}
/**
* 生成订单后使用
* @returns
*/
export function getFindCoupon(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/coupon/findCoupon`,
method: "GET",
data: {
...data
}
})
}
/**
* 店铺优惠券新增
* @returns
*/
export function addCoupon(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/coupon`,
method: "POST",
data: {
...data
}
})
}
/**
* 店铺优惠券修改
* @returns
*/
export function updateCoupon(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/coupon`,
method: "PUT",
data: {
...data
}
})
}

30
http/api/freeDing.js Normal file
View File

@ -0,0 +1,30 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取当前店铺霸王餐配置信息列表
* @returns
*/
export function getFreeDing(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/freeDing`,
method: "GET",
data: {
...data
}
})
}
/**
* 修改霸王餐配置信息
* @returns
*/
export function updateFreeDing(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/freeDing`,
method: "PUT",
data: {
...data
}
})
}

66
http/api/handover.js Normal file
View File

@ -0,0 +1,66 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 交班记录-分页
* @returns
*/
export function getHandoverRecord(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/handoverRecord/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 交班记录-查看
* @returns
*/
export function getHandoverRecordView(id, urlType = 'account') {
return request({
url: `/${urlType}/admin/handoverRecord/${id}`,
method: "GET",
})
}
/**
* 交班记录-导出
* @returns
*/
export function getHandoverRecordExport(id, urlType = 'account') {
return request({
url: `/${urlType}/admin/handoverRecord/export/${id}`,
method: "GET",
})
}
/**
* 收银机-交班数据统计
* @returns
*/
export function getHandoverRecordTotal(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/handoverRecord/total`,
method: "GET",
data: {
...data
}
})
}
/**
* 收银机-交班/关班
* @returns
*/
export function getHandoverRecordHandover(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/handoverRecord/handover`,
method: "POST",
data: {
...data
}
})
}

52
http/api/index.js Normal file
View File

@ -0,0 +1,52 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 文件上传
* @returns
*/
export function uploadFile(file, data, urlType = 'account') {
return http.upload(`/${urlType}/admin/common/upload`,data,file)
}
/**
* 订阅二维码
* @returns
*/
export function getShopMsgPushCode(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopMsgPush/code`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取店铺权限列表
* @returns
*/
export function getShopPermission(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopPermission`,
method: "GET",
data: {
...data
}
})
}
/**
* 根据渠道获取版本信息
* @returns
*/
export function getVersion(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/version/${data.source}/${data.type}`,
method: "GET",
data: {
...data
}
})
}

30
http/api/login.js Normal file
View File

@ -0,0 +1,30 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取验证码
* @returns
*/
export function authCaptcha(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/auth/captcha`,
method: "GET",
data: {
...data
}
})
}
/**
* 登录
* @returns
*/
export function login(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/auth/login`,
method: "POST",
data: {
...data
}
})
}

116
http/api/order.js Normal file
View File

@ -0,0 +1,116 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取订单列表
* @returns
*/
export function getOrderList(data, urlType = 'order') {
return request({
url: `/order/admin/order`,
method: "GET",
data: {
...data
}
})
}
/**
* 订单详情
* @returns
*/
export function getOrderById(data, urlType = 'order') {
return request({
url: `/order/admin/order/getOrderById`,
method: "GET",
data: {
...data
}
})
}
/**
* 历史订单(多次下单使用)
* @returns
*/
export function getHistoryOrder(data, urlType = '/order') {
return request({
url: `/order/admin/order/historyOrder`,
method: "GET",
data: {
...data
}
})
}
/**
* 生成订单
* @returns
*/
export function createOrder(data, urlType = 'order') {
return request({
url: `/order/admin/order/createOrder`,
method: "POST",
data: {
...data
}
})
}
/**
* 订单退款 只传订单id
* @returns
*/
export function refundOrder(data, urlType = 'order') {
return request({
url: `/order/admin/order/refundOrder`,
method: "POST",
data: {
...data
}
})
}
/**
* 订单打印
* @returns
*/
export function printOrder(data, urlType = 'order') {
return request({
url: `/order/admin/order/print`,
method: "POST",
data: {
...data
}
})
}
/**
* 清空历史订单
* @returns
*/
export function cancelOrder(data, urlType = 'order') {
return request({
url: `/order/admin/order/cancelOrder`,
method: "POST",
data: {
...data
}
})
}
/**
* 清空某一次历史订单
* @returns
*/
export function rmPlaceOrder(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/rmPlaceOrder`,
method: "POST",
data: {
...data
}
})
}

100
http/api/pay.js Normal file
View File

@ -0,0 +1,100 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取店铺订单支付URL
* @returns
*/
export function getOrderPayUrl(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/shopPayApi/orderPayUrl`,
method: "GET",
data: {
...data
}
})
}
/**
* 扫码支付
* @returns
*/
export function scanPay(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/scanPay`,
method: "POST",
data: {
...data
}
})
}
/**
* 现金支付
* @returns
*/
export function cashPay(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/cashPay`,
method: "POST",
data: {
...data
}
})
}
/**
* 扫码/储值支付
* @returns
*/
export function microPay(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/microPay`,
method: "POST",
data: {
...data
}
})
}
/**
* 挂账支付
* @returns
*/
export function creditPay(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/creditPay`,
method: "POST",
data: {
...data
}
})
}
/**
* 会员支付
* @returns
*/
export function vipPay(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/vipPay`,
method: "POST",
data: {
...data
}
})
}
/**
* 查询订单状态
* @returns
*/
export function queryOrderStatus(data, urlType = 'order') {
return request({
url: `/${urlType}/pay/queryOrderStatus`,
method: "GET",
data: {
...data
}
})
}

16
http/api/payType.js Normal file
View File

@ -0,0 +1,16 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取支付方式列表
* @returns
*/
export function getPayTypeList(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/payType`,
method: "GET",
data: {
...data
}
})
}

59
http/api/points.js Normal file
View File

@ -0,0 +1,59 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取订单可用积分及抵扣金额支付页面使用
* @returns
*/
export function calcUsablePoints(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/points/memberPoints/calcUsablePoints`,
method: "GET",
data: {
...data
}
})
}
/**
* 根据积分计算可抵扣金额
* @returns
*/
export function calcDeductionAmount(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/points/memberPoints/calcDeductionAmount`,
method: "GET",
data: {
...data
}
})
}
/**
* 支付完成扣减积分
* @returns
*/
export function payedDeductPoints(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/points/memberPoints/payedDeductPoints`,
method: "POST",
data: {
...data
}
})
}
/**
* 消费赠送积分
* @returns
*/
export function consumeAwardPoints(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/points/memberPoints/consumeAwardPoints`,
method: "POST",
data: {
...data
}
})
}

72
http/api/printer.js Normal file
View File

@ -0,0 +1,72 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取打印机列表
* @returns
*/
export function getPrinter(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/printer`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取打印机详情
* @returns
*/
export function getPrinterDetail(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/printer/detail`,
method: "GET",
data: {
...data
}
})
}
/**
* 添加打印机
* @returns
*/
export function addPrinter(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/printer`,
method: "POST",
data: {
...data
}
})
}
/**
* 修改打印机
* @returns
*/
export function updatePrinter(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/printer`,
method: "PUT",
data: {
...data
}
})
}
/**
* 删除打印机
* @returns
*/
export function delPrinter(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/printer`,
method: "DELETE",
data: {
...data
}
})
}

347
http/api/product.js Normal file
View File

@ -0,0 +1,347 @@
import http from '@/http/yskApi/http.js'
const request = http.request
// 商品----------------------------------------------------------------------------------------------------
/**
* 获取商品分页
* @returns
*/
export function getProductPage(data, urlType = 'product' ,showLoading) {
return request({
url: `/product/admin/product/page`,
method: "GET",
data: {
...data
},
showLoading
})
}
/**
* 获取商品列表
* @returns
*/
export function getProductList(data, urlType = 'product' ,showLoading) {
return request({
url: `/product/admin/product/list`,
method: "GET",
data: {
...data
},
showLoading
})
}
/**
* 获取商品详情
* @returns
*/
export function getProductDetail (id, urlType = 'product') {
return request({
url: `/product/admin/product/${id}`,
method: "GET",
})
}
/**
* 添加商品
* @returns
*/
export function addProduct(data, urlType = 'product') {
return request({
url: `/product/admin/product`,
method: "POST",
data: {
...data
}
})
}
/**
* 删除商品
* @returns
*/
export function delProduct(id, urlType = 'product') {
return request({
url: `/product/admin/product/${id}`,
method: "DELETE",
})
}
/**
* 商品上下架
* @returns
*/
export function productOnOff (data, urlType = 'product') {
return request({
url: `/product/admin/product/onOff`,
method: "POST",
data: {
...data
}
})
}
/**
* 商品售罄
* @returns
*/
export function productMarkIsSoldOut (data, urlType = 'product') {
return request({
url: `/product/admin/product/markIsSoldOut`,
method: "POST",
data: {
...data
}
})
}
/**
* 修改商品
* @returns
*/
export function updateProduct(data, urlType = 'product') {
return request({
url: `/product/admin/product`,
method: "PUT",
data: {
...data
}
})
}
/**
* 绑定耗材
* @returns
*/
export function productBindCons(data, urlType = 'product') {
return request({
url: `/product/admin/product/bind`,
method: "POST",
data: {
...data
}
})
}
/**
* 商品报损
* @returns
*/
export function productReportDamage(data, urlType = 'product') {
return request({
url: `/product/admin/product/reportDamage`,
method: "POST",
data: {
...data
}
})
}
/**
* 商品商品-修改库存
* @returns
*/
export function productModifyStock(data, urlType = 'product') {
return request({
url: `/product/admin/product/modifyStock`,
method: "POST",
data: {
...data
}
})
}
/**
* 商品-库存变动记录
* @returns
*/
export function productStockFlow(data, urlType = 'product') {
return request({
url: `/product/admin/product/stockFlow`,
method: "GET",
data: {
...data
}
})
}
// 商品分类----------------------------------------------------------------------------------------------------
/**
* 获取商品分类列表
* @returns
*/
export function getCategoryList(data, urlType = 'product') {
return request({
url: `/product/admin/prod/category/list`,
method: "GET",
data: {
...data
}
})
}
// 商品单位----------------------------------------------------------------------------------------------------
/**
* 获取商品单位列表
* @returns
*/
export function getProdUnitList(data, urlType = 'product') {
return request({
url: `/product/admin/prod/unit/list`,
method: "GET",
data: {
...data
}
})
}
// 商品规格----------------------------------------------------------------------------------------------------
/**
* 获取商品规格列表
* @returns
*/
export function getSpecList(data, urlType = 'product') {
return request({
url: `/product/admin/prod/spec/list`,
method: "GET",
data: {
...data
}
})
}
/**
* 添加商品规格
* @returns
*/
export function addSpec(data, urlType = 'product') {
return request({
url: `/product/admin/prod/spec`,
method: "POST",
data: {
...data
}
})
}
/**
* 修改商品规格
* @returns
*/
export function updateSpec(data, urlType = 'product') {
return request({
url: `/product/admin/prod/spec`,
method: "PUT",
data: {
...data
}
})
}
/**
* 快捷添加商品规格
* @returns
*/
export function addSpecQuic(data, urlType = 'product') {
return request({
url: `/product/admin/prod/spec/quickAdd`,
method: "POST",
data: {
...data
}
})
}
/**
* 删除商品规格
* @returns
*/
export function delSpec(id, urlType = 'product') {
return request({
url: `/product/admin/prod/spec/${id}`,
method: "DELETE",
})
}
// 商品分组----------------------------------------------------------------------------------------------------
/**
* 获取商品分组列表
* @returns
*/
export function getProdGroupPage(data, urlType = 'product') {
return request({
url: `/product/admin/prod/group/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取商品分组详情
* @returns
*/
export function getProdGroupDetail(id, urlType = 'product') {
return request({
url: `/product/admin/prod/group/${id}`,
method: "GET",
})
}
/**
* 商品分组添加
* @returns
*/
export function addProdGroup(data, urlType = 'product') {
return request({
url: `/product/admin/prod/group`,
method: "POST",
data: {
...data
}
})
}
/**
* 商品分组修改
* @returns
*/
export function updateProdGroup(data, urlType = 'product') {
return request({
url: `/product/admin/prod/group`,
method: "PUT",
data: {
...data
}
})
}
/**
* 商品分组简单修改
* @returns
*/
export function editProdGroup(data, urlType = 'product') {
return request({
url: `/product/admin/prod/group/update`,
method: "PUT",
data: {
...data
}
})
}
/**
* 商品分组删除
* @returns
*/
export function delProdGroup(id, urlType = 'product') {
return request({
url: `/product/admin/prod/group/${id}`,
method: "DELETE",
})
}

16
http/api/role.js Normal file
View File

@ -0,0 +1,16 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取角色列表
* @returns
*/
export function getRoleList(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/role/list`,
method: "GET",
data: {
...data
}
})
}

58
http/api/shop.js Normal file
View File

@ -0,0 +1,58 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取店铺详情
* @returns
*/
export function getShopInfo(data, urlType = 'account') {
return request({
url: `/account/admin/shopInfo/detail`,
method: "GET",
data: {
...data
}
})
}
/**
* 修改店铺详情
* @returns
*/
export function editShopInfo(data, urlType = 'account') {
return request({
url: `/account/admin/shopInfo`,
method: "PUT",
data: {
...data
}
})
}
/**
* 获取当前店铺拓展参数
* @returns
*/
export function getShopExtend(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopExtend`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取当前店铺拓展参数
* @returns
*/
export function editShopExtend(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopExtend`,
method: "PUT",
data: {
...data
}
})
}

View File

@ -0,0 +1,30 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取所有页面路径
* @returns
*/
export function getshopPagePermission(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopPagePermission`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取员工拥有页面路径
* @returns
*/
export function getshopPagePermissionDetail(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopPagePermission/detail`,
method: "GET",
data: {
...data
}
})
}

86
http/api/shopUser.js Normal file
View File

@ -0,0 +1,86 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取店铺用户概述信息
* @returns
*/
export function shopUserSummary(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopUser/summary`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取店铺用户列表
* @returns
*/
export function shopUserList(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopUser`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取店铺用户详情
* @returns
*/
export function shopUserDetail(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopUser/detail`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取店铺用户新增
* @returns
*/
export function shopUserAdd(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopUser`,
method: "POST",
data: {
...data
}
})
}
/**
* 店铺用户修改
* @returns
*/
export function shopUserPut(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopUser`,
method: "PUT",
data: {
...data
}
})
}
/**
* 店铺用户余额修改
* @returns
*/
export function shopUserMoney(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopUser/money`,
method: "PUT",
data: {
...data
}
})
}

86
http/api/staff.js Normal file
View File

@ -0,0 +1,86 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 员工列表
* @returns
*/
export function shopStaffList(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopStaff`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取员工对应的权限idid
* @returns
*/
export function getShopStaffPermission(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopStaff/permission`,
method: "GET",
data: {
...data
}
})
}
/**
* 员工详情
* @returns
*/
export function shopStaffDetail(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopStaff/detail`,
method: "GET",
data: {
...data
}
})
}
/**
* 员工添加
* @returns
*/
export function shopStaffAdd(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopStaff`,
method: "POST",
data: {
...data
}
})
}
/**
* 员工修改
* @returns
*/
export function shopStaffPut(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopStaff`,
method: "PUT",
data: {
...data
}
})
}
/**
* 员工删除
* @returns
*/
export function shopStaffDel(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopStaff`,
method: "DELETE",
data: {
...data
}
})
}

30
http/api/summary.js Normal file
View File

@ -0,0 +1,30 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 营业板块
* @returns
*/
export function getTrade(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/data/summary/trade`,
method: "GET",
data: {
...data
}
})
}
/**
* 商品销售汇总
* @returns
*/
export function productSaleDate(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/data/summary/productSaleDate`,
method: "GET",
data: {
...data
}
})
}

58
http/api/table.js Normal file
View File

@ -0,0 +1,58 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取台桌列表
* @returns
*/
export function getShopTable(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopTable`,
method: "GET",
data: {
...data
}
})
}
/**
* 获取台桌详情
* @returns
*/
export function getShopTableDetail(data, urlType = 'account') {
return request({
url: `/account/admin/shopTable/detail`,
method: "GET",
data: {
...data
}
})
}
/**
* 台桌清台
* @returns
*/
export function shopTableClear(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopTable/clear`,
method: "PUT",
data: {
...data
}
})
}
/**
* 台桌绑定
* @returns
*/
export function shopTableBind(data, urlType = 'account') {
return request({
url: `/${urlType}/admin/shopTable/bind`,
method: "POST",
data: {
...data
}
})
}

56
http/api/vendor.js Normal file
View File

@ -0,0 +1,56 @@
import http from '@/http/yskApi/http.js'
const request = http.request
/**
* 获取供应商列表
* @returns
*/
export function getVendorPage(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/vendor/page`,
method: "GET",
data: {
...data
}
})
}
/**
* 添加供应商
* @returns
*/
export function addVendor(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/vendor`,
method: "POST",
data: {
...data
}
})
}
/**
* 编辑供应商
* @returns
*/
export function editVendor(data, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/vendor`,
method: "PUT",
data: {
...data
}
})
}
/**
* 删除供应商
* @returns
*/
export function delVendor(id, urlType = 'product') {
return request({
url: `/${urlType}/admin/product/vendor/${id}`,
method: "DELETE",
})
}

View File

@ -7,8 +7,9 @@ import go from '@/commons/utils/go.js';
// const baseURL = 'http://192.168.2.41:9888/cashierService'
let baseURL = 'https://wxcashiertest.sxczgkj.cn/cashierService'
// #ifdef H5
baseURL = '/ysk'
// baseURL = '/ysk'
// #endif
baseURL = "http://192.168.1.31"
// const baseURL = 'https://cashier.sxczgkj.cn/cashierService'
export default function(api = '', data = {}, method = 'GET') {
return new Promise((resolve, reject) => {

View File

@ -156,7 +156,6 @@ function upload(uri, data, file, showLoading = true, extParams = {}) {
// 放置token
let headerObject = {}
// headerObject[appConfig.tokenKey] = storageManage.token()
headerObject["satoken"] = storageManage.token()
return commonsProcess(showLoading, () => {

155
http/websock.js Normal file
View File

@ -0,0 +1,155 @@
import {
reactive,
ref
} from 'vue';
// WebSocket 工具类,封装了 WebSocket 的连接、发送、接收、心跳、重连和关闭等操作
class WebsocketUtil {
// 构造函数,初始化 WebSocket 连接
constructor(url, time, params) {
this.url = url; // WebSocket 服务器的 URL
this.params = params; // WebSocket 服务器的 URL
this.time = time; // 心跳发送的间隔时间(秒)
this.socketTask = null; // WebSocket 任务对象
this.isOpen = false; // WebSocket 连接是否打开
this.reconnectTimeout = null; // 重连定时器
this.heartbeatInterval = null; // 心跳定时器
this.messageCallbacks = []; // 存储外部注册的消息回调函数的数组
this.messageCallbacks = []; // 存储外部注册的消息回调函数的数组
// 初始化 WebSocket 连接
this.initializeWebSocket();
}
// 初始化 WebSocket 连接
initializeWebSocket() {
if (this.isOpen) {
return
}
this.socketTask = uni.connectSocket({
url: this.url,
success: () => {
console.log('WebSocket连接成功');
return this.socketTask;
},
fail: (error) => {
console.error('WebSocket连接失败', error);
uni.$emit('is-socket-open', true)
this.reconnect();
}
});
this.socketTask.onOpen((res) => {
console.log('WebSocket连接正常==', res);
this.isOpen = true;
// 连接成功后启动心跳和消息监听
this.startHeartbeat();
this.listenForMessages();
uni.$emit('is-socket-open', true)
});
this.socketTask.onError((res) => {
console.log('WebSocket连接失败==', res);
uni.$emit('is-socket-open', false)
this.reconnect();
});
// 注意:这里的 onClose 监听器应该放在 uni.connectSocket 调用之后
this.socketTask.onClose((result) => {
this.isOpen = false;
// if( this.isOpen ){
this.reconnect();
// }
});
}
// 启动心跳检测
startHeartbeat() {
if (this.heartbeatInterval) {
clearInterval(this.heartbeatInterval);
}
this.heartbeatInterval = setInterval(() => {
if (this.isOpen) {
this.send(JSON.stringify({"type": "ping_interval","set": "pad"}));
}
}, this.time);
}
// 发送消息
send(data, type) {
if (this.socketTask && this.isOpen) {
this.socketTask.send({
data: data,
success: (res) => {
// console.log('消息发送成功', res);
},
fail: (error) => {
console.error('消息发送失败', error);
this.reconnect(); // 这里可能需要根据实际情况判断是否重连
}
});
}
}
// 监听 WebSocket 消息
listenForMessages() {
if (this.socketTask) {
this.socketTask.onMessage((res) => {
const {
data
} = res;
this.messageCallbacks.forEach(callback => callback(data
.toString())); // 假设 data 是字符串或可转换为字符串
});
// this.send("WebSocket连接正常");
} else {
console.error('WebSocket 连接尚未建立,无法监听消息');
}
}
// 重连 WebSocket
reconnect() {
if (this.reconnectTimeout) {
clearTimeout(this.reconnectTimeout);
}
this.reconnectTimeout = setTimeout(() => {
this.initializeWebSocket();
}, 3000);
}
// 关闭 WebSocket 连接
closeSocket() {
if (this.socketTask) {
uni.closeSocket({
success: () => {
console.log('WebSocket连接已关闭');
this.isOpen = false;
},
fail: (error) => {
console.error('关闭WebSocket连接失败', error);
}
});
this.socketTask = null;
}
}
// 外部注册消息回调函数
onMessage(callback) {
this.messageCallbacks.push(callback);
}
// 外部注销消息回调函数
offMessage(callback) {
this.messageCallbacks = []
}
// 销毁 WebSocket 连接,清理资源
destroy() {
this.closeSocket();
clearInterval(this.heartbeatInterval);
clearTimeout(this.reconnectTimeout);
this.messageCallbacks = [];
}
}
export default WebsocketUtil;

View File

@ -17,8 +17,35 @@ function getUseType() {
const type = uni.getStorageSync("useType")
return type ? type : useType
}
// import {
// webscoketUtill
// } from '../websock.js'
// let wxObj = null
// wx初始化购物车
// export function getWXCart(params) {
// let wxUrl = 'ws://192.168.1.31:2348/?' + objectToString(params)
// wxObj = new webscoketUtill(wxUrl,3000,9,(e)=>{
// console.log('收到消息');
// console.log(e);
// })
// return uni.getStorageSync('wxList')
// }
// 新增\删除\修改到购物车
// export function addWXCart(params) {
// wxObj.ws.send(params)
// }
function objectToString(obj) {
let result = '';
for (const key in obj) {
if (obj.hasOwnProperty(key)) {
result += `${key}=${obj[key]}&`;
}
}
// 去掉最后一个多余的 &
return result.slice(0, -1);
}
/**
* 获取当前台桌订单信息
* @returns
@ -40,7 +67,7 @@ export function getCart(params) {
*/
export function getGoodsLists(params, showLoading = true) {
return request({
url: `/api/place/activate`,
url: `/product/admin/product/list`,
method: "get",
params: {
shopId: uni.getStorageSync("shopId"),
@ -146,7 +173,7 @@ export function $getMasterId(data) {
*/
export function $getPayType(data) {
return request({
url: `/api/place/payType`,
url: `/account/admin/payType`,
method: "get",
params: {
shopId: uni.getStorageSync("shopId"),

View File

@ -33,13 +33,13 @@ export function tbPrintMachineGet(params) {
}
// 打印机部分
export function tbShopCategoryget(params) {
return request({
url: '/api/tbShopCategory',
method: 'get',
params
})
}
// export function tbShopCategoryget(params) {
// return request({
// url: '/api/tbShopCategory',
// method: 'get',
// params
// })
// }
// 修改打印机状态
export function shopConfigprinter(data) {
return request({

View File

@ -1,6 +1,7 @@
import http from './http.js'
import $API from '@/http/classApi.js'
import appConfig from '@/config/appConfig.js'
const request = http.request
import {
Base64
} from 'js-base64'
@ -16,9 +17,47 @@ function objectToUrlParams(obj) {
}
return params.join('&');
}
export function getHistoryOrder(data, urlType = 'order') {
return request({
url: `/order/admin/order/historyOrder`,
method: "GET",
data: {
...data
}
})
}
/**
* 清空某一次历史订单
* @returns
*/
export function rmPlaceOrder(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/rmPlaceOrder`,
method: "POST",
data: {
...data
}
})
}
/* 商品列表 */
export function $tbProduct(data) {
return http.req('/api/tbProduct', {...data,shopId:uni.getStorageSync('shopId')}, 'GET')
export function $tbProduct(params) {
return request({
url: `/product/admin/product/list`,
method: "get",
params: {
...params
}
});
}
// 商品详情
export function adminProduct(params) {
return request({
url: `/product/admin/product/`+params,
method: "get",
params: {}
});
}
/* 添加商品 */
@ -56,7 +95,11 @@ export function $goodsIsHot(data) {
* 商品分类列表
*/
export function $tbShopCategory(data) {
return http.req('/api/tbShopCategory', {...data,shopId:uni.getStorageSync('shopId')}, 'GET')
return request({
url: `/product/admin/prod/category/list`,
method: "get",
params:data
});
}
/**
* 商品分类

View File

@ -15,18 +15,26 @@ import {
} from '@/commons/utils/encryptUtil.js'
import infoBox from "@/commons/utils/infoBox.js"
import go from '@/commons/utils/go.js';
import { reject } from 'lodash';
import {
reject
} from 'lodash';
// 测试服
let baseUrl = 'https://admintestpapi.sxczgkj.cn'
// let baseUrl = 'http://192.168.1.31'
// let baseUrl = 'https://admintestpapi.sxczgkj.cn'
// const proxyApiwws = 'ws://192.168.1.31:2348' // 调试地址
//预发布
// let baseUrl = 'https://pre-cashieradmin.sxczgkj.cn'
//正式
// let baseUrl = 'https://cashieradmin.sxczgkj.cn'
// let baseUrl = 'https://cashier.sxczgkj.com'
// 本地测
let baseUrl = "http://192.168.1.31"
// #ifdef H5
baseUrl = '/ysk'
// #endif
// 王伟本地测
// let baseUrl = '/ww'
// let baseUrl = 'http://192.168.1.15:8000'
// 巩
// let baseUrl = 'http://192.168.1.9:8000'
@ -36,7 +44,11 @@ const loadingShowTime = 200
function getHeader() {
const headerObject = {}
headerObject["Authorization"] = storageManage.token()
headerObject["token"] = uni.getStorageSync('tokenInfo').tokenValue
headerObject["shopId"] = uni.getStorageSync("shopId"),
// shopId:shopInfo.value.id
headerObject["Content-Type"] = 'application/json;charset=UTF-8'
headerObject["platformType"] ="PAD"
return headerObject
}
@ -85,12 +97,9 @@ function commonsProcess(showLoading, httpReqCallback) {
return Promise.reject(bodyData) // 跳转到catch函数
}
if (statusCode == 401) {
// storageManage.token(null, true)
// 提示信息
isShowErrorToast = true
// infoBox.showErrorToast('请登录').then(() => {
// go.to("PAGES_LOGIN", {}, go.GO_TYPE_RELAUNCH)
// })
return Promise.reject(bodyData) // 跳转到catch函数
}
// http响应码不正确
@ -101,21 +110,7 @@ function commonsProcess(showLoading, httpReqCallback) {
return Promise.reject(bodyData) // 跳转到catch函数
}
// // 业务响应异常
// if (bodyData.hasOwnProperty('code') && bodyData.code != 200) {
// isShowErrorToast = true
// infoBox.showToast(bodyData.msg)
// if (bodyData.code == 5005) { // 密码已过期, 直接跳转到更改密码页面
// uni.reLaunch({
// url: '/pageUser/setting/updatePwd'
// })
// }
// // if(bodyData.code == 500){ // 密码已过期, 直接跳转到更改密码页面
// // uni.redirectTo({url: '/pages/login/index'})
// // }
// return bodyData
// // return Promise.reject(bodyData)
// }
// 加密数据
if (!bodyData.data && bodyData.encryptData) {
@ -133,23 +128,17 @@ function commonsProcess(showLoading, httpReqCallback) {
if (res.status == 401) {
storageManage.token(null, true)
infoBox.showErrorToast(res.message || '请登录').then(() => {
uni.redirectTo({url: '/pages/login/index'})
uni.redirectTo({
url: '/pages/login/index'
})
reject()
})
}
// if(res.status==400){
// storageManage.token(null, true)
// infoBox.showErrorToast('').then(() => {
// go.to("PAGES_LOGIN", {}, go.GO_TYPE_RELAUNCH)
// })
// }
if (res.status == 500) {
infoBox.showErrorToast(res.message||'服务器异常').then(() => {
})
infoBox.showErrorToast(res.message || '服务器异常').then(() => {})
}
// if(res&&res.msg){
// infoBox.showErrorToast(res.msg)
// }
reqFinishFunc(); // 请求完毕的动作
// 如果没有提示错误, 那么此处提示 异常。
@ -168,7 +157,6 @@ function commonsProcess(showLoading, httpReqCallback) {
// 默认 显示loading(控制 xxs 内 不提示loading )
function req(uri, data, method = "GET", showLoading = true, extParams = {}) {
// headerObject[appConfig.tokenKey] = storageManage.token()
return commonsProcess(showLoading, () => {
return uni.request(
Object.assign({
@ -193,8 +181,9 @@ function request(args) {
extParams = {}
} = args
let headerObject = {}
// headerObject[appConfig.tokenKey] = storageManage.token()
return commonsProcess(showLoading, () => {
// console.log('baseUrl+');
// console.log(baseUrl + url);
return uni.request(
Object.assign({
url: baseUrl + url,
@ -212,7 +201,6 @@ function request(args) {
function upload(uri, data, file, showLoading = true, extParams = {}) {
// 放置token
let headerObject = {}
// headerObject[appConfig.tokenKey] = storageManage.token()
return commonsProcess(showLoading, () => {
return uni.uploadFile(

View File

@ -3,7 +3,7 @@ const request=http.request
export function login(data) {
return request({
url: "/auth/login",
url: "/account/admin/auth/login",
method: "post",
data
});
@ -18,7 +18,7 @@ export function getInfo() {
export function getCodeImg(header) {
return request({
url: "/auth/code",
url: "/account/admin/auth/captcha",
method: "get"
});
}

View File

@ -8,8 +8,8 @@ const request = http.request
*/
export function tbOrderInfoData(data) {
return request({
url: "/api/tbOrderInfo/date",
method: "post",
url: "/order/admin/order",
method: "get",
data: {
shopId: uni.getStorageSync('shopId'),
...data
@ -33,7 +33,15 @@ export function tbOrderInfoDownload(data) {
responseType: "blob"
});
}
export function createOrder(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/createOrder`,
method: "POST",
data: {
...data
}
})
}
/**
* 通过Id查询订单
* @param {*} id

View File

@ -13,15 +13,28 @@ export function $layout(params) {
}
});
}
/**
* 清空历史订单
* @returns
*/
export function cancelOrder(data, urlType = 'order') {
return request({
url: `/${urlType}/admin/order/cancelOrder`,
method: "POST",
data: {
...data
}
})
}
// Pad点餐列表
export function $layoutpage(params) {
return request({
url: '/api/pad/productCategory/page',
url: '/account/admin/padProd',
method: "get",
params:{
userId: uni.getStorageSync("shopUserId"),
shopId: uni.getStorageSync("shopId"),
// userId: uni.getStorageSync("shopUserId"),
// shopId: uni.getStorageSync("shopId"),
...params
}
});
@ -30,11 +43,11 @@ export function $layoutpage(params) {
export function $productCategory(id) {
return request({
url: '/api/pad/productCategory/'+id,
url: '/account/admin/padProd/detail?id='+id,
method: "get",
params:{
userId: uni.getStorageSync("shopUserId"),
shopId: uni.getStorageSync("shopId"),
// userId: uni.getStorageSync("shopUserId"),
// shopId: uni.getStorageSync("shopId"),
}
});
}

View File

@ -1,4 +1,4 @@
import http from './http.js'
import http from '@/http/http.js'
const request=http.request
@ -8,7 +8,7 @@ const request=http.request
*/
export function getShopList(params) {
return request({
url: `/api/tbShopInfo`,
url: `/account/admin/shopUser`,
method: 'get',
params: {
@ -20,15 +20,15 @@ export function getShopList(params) {
* 获取店铺数据
* @returns
*/
export function getShopInfo(params) {
return request({
url: `/api/tbShopInfo/${params}`,
method: 'get',
params: {
// export function getShopInfo(params) {
// return request({
// url: `/account/admin/shopUser/detail/${params}`,
// method: 'get',
// params: {
}
})
}
// }
// })
// }
/**
* 更改店铺信息
@ -189,13 +189,13 @@ export function tbShopCurrencyGet(params) {
* 商品分类列表
* @returns
*/
export function tbShopCategoryGet(params) {
return request({
url: `/api/tbShopCategory`,
method: "get",
params
});
}
// export function categorylist(params) {
// return request({
// url: `/admin/prod/category/list`,
// method: "get",
// params
// });
// }
/**
* 新增编辑分类/新增编辑子分类

View File

@ -9,9 +9,9 @@ import {
import infoBox from '@/commons/utils/infoBox.js'
/* 台桌区域 */
export const $tableArea = new $API('/api/tbShopArea', http.req)
export const $tableArea = new $API('/account/admin/shopArea', http.req)
/* 台桌 */
export const $table = new $API('/api/tbShopTable', http.req)
export const $table = new $API('/account/admin/shopTable', http.req)
/* 绑定 */
// export const $bind=new $API('/api/tbShopTable/bind',http.req)
export function $bind(data) {
@ -27,7 +27,7 @@ export function $bind(data) {
//获取台桌详情状态
export function $returnTableDetail(data) {
return request({
url: '/api/tbShopTable/state',
url: '/account/admin/shopTable/detail',
method: "get",
params: {
shopId: uni.getStorageSync('shopId'),

View File

@ -7,7 +7,7 @@ const request=http.request
export function tbShopInfo(shopId) {
const _shopId=uni.getStorageSync('shopId')
return request({
url: `/api/tbShopInfo/${shopId||_shopId}`,
url: `/account/admin/shopUser/detail?id=${shopId||_shopId}`,
method: 'get'
})
}
@ -23,3 +23,20 @@ export function tbShopInfoPut(data) {
data
})
}
// 获取店铺商品信息
export function getShopInfo(data) {
return request({
url: `/account/admin/shopInfo/detail`,
method: 'get',
data
})
}
// 获取布局
export function getLayout(data) {
return request({
url: `/account/admin/padProd/layout`,
method: 'get',
data
})
}

13
main.js
View File

@ -4,7 +4,9 @@ import envConfig from '@/env/config.js'
import appConfig from '@/config/appConfig.js'
import storageManage from '@/commons/utils/storageManage.js'
import uviewPlus,{setConfig} from 'uview-plus'
import dict from '@/commons/utils/dict.js'
// 下面的在特殊场景下才需要配置通常不用配置即可直接使用uvire-plus框架。
import {utils} from '@/commons/utils/index.js'
// 调用setConfig方法方法内部会进行对象属性深度合并可以放心嵌套配置
// 需要在app.use(uview-plus)之后执行
setConfig({
@ -26,6 +28,13 @@ setConfig({
// 设置node环境
envConfig.changeEnv(storageManage.env())
// import VConsole from 'vconsole';
// 初始化vConsole
// const vConsole = new VConsole({
// defaultPlugins: ['console']
// });
// #ifndef VUE3
import App from './App'
@ -49,6 +58,10 @@ export function createApp() {
app.use(uviewPlus)
app.config.globalProperties.$appName = appConfig.appName
uni.$appName = appConfig.appName
app.config.globalProperties.$utils = utils
uni.$utils = utils
app.config.globalProperties.$dict = dict
uni.$dict = dict
return {
app
}

View File

@ -146,7 +146,7 @@
"quickapp": {},
/* */
"mp-weixin": {
"appid" : "wxcbff1cfb27c1066c",
"appid": "wxd88fffa983758a30",
"setting": {
"urlCheck": false,
"minified": true,
@ -205,12 +205,15 @@
},
"/ysk": {
//
"target" : "https://admintestpapi.sxczgkj.cn",
"target": "http://192.168.1.31",
"changeOrigin": true,
"secure": false,
"pathRewrite": {
"/ysk" : ""
"^/ysk": ""
}
// "onProxyRes": function(proxyRes, req, res) {
// // proxyRes.headers['Content-Type'] = 'application/json';
// },
},
"/ww": {
//

1529
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -142,5 +142,15 @@
"text": "我的"
}
]
},
"condition" : { //
"current": 0, //(list )
"list": [
{
"name": "", //
"path": "", //
"query": "" //onLoad
}
]
}
}

View File

@ -185,11 +185,11 @@
const accountType = reactive({
list: [{
label: '商户',
value: 'merchant'
value: '0'
},
{
label: '员工',
value: 'staff'
value: '1'
},
],
sel: 0
@ -246,8 +246,8 @@
})
// #ifdef H5
vdata.formData.username = '17792050546'
vdata.formData.pwd = 'sy666888'
vdata.formData.username = 'xpc'
vdata.formData.pwd = '123'
// #endif
// #ifdef MP-WEIXIN
// vdata.formData.username = '15699991111'
@ -268,8 +268,8 @@
const getCode = () => {
getCodeImg().then(res => {
vdata.formData.img = res.img
vdata.formData.uuid = res.uuid
vdata.formData.img = res.data.code
vdata.formData.uuid = res.data.uuid
})
}
@ -310,7 +310,8 @@
// loginPromise = $loginByPwd(vdata.formData.username, vdata.formData.pwd, vdata.formData.safetyCode)
loginPromise = login({
username: vdata.formData.username,
password: encrypt(vdata.formData.pwd),
password: vdata.formData.pwd,
// password: encrypt(vdata.formData.pwd),
rememberMe: false,
code: vdata.formData.code,
uuid: vdata.formData.uuid,
@ -330,7 +331,7 @@
//
loginPromise.then(res => {
//
loginFinishFunc(res)
loginFinishFunc(res.data)
//
uni.setStorageSync('MerchantId', {
merchantName: vdata.formData.merchantName,
@ -368,14 +369,15 @@
//
async function loginFinishFunc(loginBizData) {
// token
storageManage.setLogin(loginBizData)
storageManage.token(loginBizData.token)
storageManage.shopId(loginBizData.shopId)
storageManage.shopUserId(loginBizData.user.user.id)
storageManage.userInfo(loginBizData)
uni.setStorageSync('shopInfo',loginBizData.shopInfo)
uni.setStorageSync('tokenInfo',loginBizData.tokenInfo)
uni.setStorageSync('shopId',loginBizData.shopInfo.id)
uni.setStorageSync('loginType',loginBizData.loginType)
//
go.to("PAGES_CREATE_ORDER")
// uni.navigateTo({
// url:'pagesCreateOrder/index/index'
// })
}
//

View File

@ -26,8 +26,9 @@
<view class="">
<template v-if="tables.list.length">
<view class=" bg-fff box bg-fff">
<view class="u-flex item u-row-between" v-for="(item,index) in tables.list" :key="index"
@tap="chooseTable(index,item)">
<view class="" v-for="(item,index) in tables.list" :key="index" @tap="chooseTable(index,item)">
<template v-if="item.status=='idle'">
<view class="u-flex item u-row-between" style="border-bottom: 1px solid #E5E5E5;">
<view class="u-flex">
<view class="">
<view class="u-flex">
@ -42,11 +43,14 @@
</view>
</view>
<view class="my-radio u-font-28 u-flex color-333">
<view class="circle u-flex u-row-center" :class="{active:index==tables.selIndex}">
<view class="circle u-flex u-row-center"
:class="{active:index==tables.selIndex}">
<uni-icons type="checkmarkempty" :size="16" color="#fff"></uni-icons>
</view>
</view>
</view>
</template>
</view>
</view>
<view class="u-m-t-32">
<my-pagination :page="query.page" :totalElements="query.totalElements" :size="query.size"
@ -168,26 +172,30 @@
// state=state?(state=='all'?'':state):''
const areaId = area.list[area.defaultCateIndex].id || ''
let {
content,total
} = await $table.get({...query,areaId,name:searchValue.value,state:'idle'})
query.totalElements=total||0;
data
} = await $table.get({
...query,
areaId,
name: searchValue.value,
state: 'idle'
})
query.totalElements = data.totalRow || 0;
tables.hasAjax = true;
console.log(content);
tables.list = content
tables.selIndex = content.findIndex(v => v.tableId == option.tableId)
tables.originList = content
tables.list = data.records
tables.selIndex = data.records.findIndex(v => v.tableCode == option.tableCode)
tables.originList = data.records
}
async function getArea() {
const {
content
data
} = await $tableArea.get({
page: 0,
size: 300
})
content.unshift({
data.records.unshift({
name: '全部'
})
area.list = content.map(v => {
area.list = data.records.map(v => {
return {
...v,
}

View File

@ -1,9 +1,6 @@
<template>
<my-model ref="model" :title="title" iconColor="#000" @close="resetForm">
<template #desc>
<view class="u-m-t-48 tab">
<my-tabs :list="tabs" @change="tabsChange"></my-tabs>
</view>
<view class="u-text-left u-p-30 ">
<template v-if="!current">
<view>
@ -33,8 +30,7 @@
<view class="u-m-t-24 border discount u-relative u-flex input-box">
<view class="u-flex-1">
<input @input="discountMoneyInput" v-model="form.discountMoney" type="digit"
placeholder-class="placeholder-class" placeholder="减8.55元请输入8.55" />
placeholder-class="placeholder-class" placeholder="请输入最终优惠金额" />
</view>
<view class="color-999 u-p-l-48 u-p-r-48 u-flex u-row-center u-col-center">
<view></view>
@ -46,19 +42,22 @@
</view>
</template>
<view class="u-m-t-48">
<view class="u-font-24">
<text class="color-999">当前单品价格{{price}}</text>
</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" 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>
</view>
</view>
</view>
<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>
@ -67,7 +66,10 @@
<view class="u-p-30">
<view class="u-m-t-10">
<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>
</template>
@ -75,12 +77,7 @@
</template>
<script setup>
import {
reactive,
nextTick,
ref,
watch
} from 'vue';
import { reactive, nextTick, ref, watch } from 'vue';
import myModel from '@/components/my-components/my-model.vue'
import myButton from '@/components/my-components/my-button.vue'
import myTabs from '@/components/my-components/my-tabs.vue'
@ -99,12 +96,6 @@
}
})
function changeCauses(item) {
item.checked = !item.checked
}
const discounts = [95, 90, 85, 80]
const causes = reactive([{
name: '顾客投诉质量问题',
@ -120,6 +111,11 @@
}
])
function changeCauses(item, index) {
item.checked = !item.checked
form.notes = causes
}
function discountInput(e) {
if (e.detail.value >= 100) {
nextTick(() => {
@ -127,6 +123,7 @@
})
}
}
function discountMoneyInput(e) {
const max = 100
if (e.detail.value >= max) {
@ -142,7 +139,7 @@
const tabs = ['打折', '减免']
let current = ref(0)
let current = ref(1)
function tabsChange(i) {
console.log(i);
@ -159,10 +156,10 @@
...$form
})
watch(() => props.price, (newval) => {
console.log(newval);
form.price = newval
form.currentPrice = newval
})
function resetForm() {
Object.assign(form, {
...$form
@ -182,7 +179,8 @@
function confirm() {
const {
discount,discountMoney
discount,
discountMoney
} = form
if (current.value === 0 && discount === '') {
return uni.showToast({
@ -196,8 +194,8 @@
title: '请输入有效减免价格!'
})
}
close()
emits('confirm', form)
close()
}
defineExpose({
open,

View File

@ -0,0 +1,131 @@
<template>
<my-model ref="model" :title="title" iconColor="#000" @close="resetForm">
<template #desc>
<view class="u-text-left u-p-l-30 u-p-r-30 u-p-t-30 ">
<view class="u-m-t-32 u-flex ">
<uni-easyinput type="number" v-model="form.pack_number" placeholder="打包数量"></uni-easyinput>
</view>
</view>
</template>
<template #btn>
<view class="u-p-l-30 u-p-r-30 u-m-t-28 u-p-b-30">
<view class="">
<my-button @tap="confirm" shape="circle" fontWeight="700">确认</my-button>
<view class="u-m-t-10">
<my-button type="cancel" bgColor="#fff" @tap="confirm">取消</my-button>
</view>
</view>
</view>
</template>
</my-model>
</template>
<script setup>
import { reactive, nextTick, ref } from 'vue';
const props = defineProps({
title: {
type: String,
default: ''
}
})
const $form = {
pack_number: 1
}
const form = reactive({
number: null,
...$form
})
function resetForm() {
Object.assign(form, {
...$form
})
}
const model = ref(null)
function open(data) {
console.log(data)
form.number = data.number
model.value.open()
}
function close() {
model.value.close()
}
const emits = defineEmits(['confirm'])
function confirm() {
const { pack_number } = form
if( pack_number > form.number){
uni.showToast({
title: '打包数量不能大于菜品数量',
icon: 'none'
})
return false;
}
emits('confirm', pack_number)
close()
}
defineExpose({
open,
close
})
</script>
<style lang="scss">
.lh34{
line-height: 34rpx;
}
.tag {
background-color: #fff;
border: 1px solid #E5E5E5;
line-height: inherit;
font-size: 24rpx;
color: #666666;
padding: 6rpx 20rpx;
border-radius: 8rpx;
&.active {
border-color: #E6F0FF;
color: $my-main-color;
}
}
.hover-class {
background-color: #E5E5E5;
}
.discount {
.u-absolute {
top: 0;
bottom: 0;
right: 0;
}
}
.bg1 {
background: #F7F7FA;
}
.tab {
padding: 0 80rpx;
}
.border {
border: 1px solid #E5E5E5;
border-radius: 4rpx;
}
.input-box {
padding: 22rpx 32rpx;
font-size: 28rpx;
color: #666;
}
.placeholder-class {
font-size: 28rpx;
}
</style>

View File

@ -99,8 +99,7 @@
const emits = defineEmits(['confirm'])
function confirm() {
const {remark
} = form
const { remark } = form
emits('confirm', {
remark
})

File diff suppressed because it is too large Load Diff

View File

@ -12,7 +12,7 @@
已选菜品({{goodsNumber}})
</view>
</view>
<view class="u-flex" @click="setModalShow('clear',true)">
<view class="u-flex" @click="setModalShow('clear',true,'','是否清空点餐?')">
<view>
<up-icon name="trash-fill" size="20" color="rgb(102,102,102)"></up-icon>
</view>
@ -26,19 +26,22 @@
<view class=""></view>
</view>
</view>
<scroll-view scroll-y="true" class=" u-flex-1 ">
<scroll-view scroll-y="true" style="height: 300px;background-color: #fff;">
<!-- <scroll-view scroll-y="true" class=" u-flex-1 " > -->
<view class=" ">
<view class="color-333item border-bottom u-p-l-20 u-p-r-20 u-p-b-10 u-p-t-20 u-flex u-row-center u-row-between"
v-for="(item,index) in data" :key="index">
<view
class="color-333 item border-bottom u-p-l-20 u-p-r-20 u-p-b-10 u-p-t-20 u-flex u-row-center u-row-between"
v-for="(item,index) in data" :key="item.id">
<view class="u-flex u-col-top">
<view class="u-p-r-20">
{{index+1}}
</view>
<view class="">
<view>{{item.name}}</view>
<view class="u-m-t-10 u-font-24 color-666">{{item.specSnap||''}}</view>
<view class="u-m-t-10 u-font-24 color-666">{{item.specInfo||''}}</view>
<view class="u-flex u-m-t-14">
<up-icon name="edit-pen" @click="showModel('remark',index)" color="#333" size="16"></up-icon>
<up-icon name="edit-pen" @click="showModel('remark',index)" color="#333"
size="16"></up-icon>
<view class="color-666 u-font-24">
{{item.note}}
</view>
@ -47,7 +50,8 @@
</view>
<view class="u-flex">
<view class="font-bold red u-m-r-32">{{formatPrice(item.salePrice*item.number) }}</view>
<view class="font-bold red u-m-r-32">{{formatPrice(item.lowPrice*item.number) }}
</view>
<view class="u-flex" @tap="updateNumber(false,index,item)">
<image src="/pagesCreateOrder/static/images/icon-reduce-black.svg" class="icon" mode="">
</image>
@ -55,17 +59,57 @@
<view class="u-p-l-30 u-p-r-30 color-333" style="">
{{item.number}}
</view>
<template v-if="item.type!='package'">
<view class="u-flex" @tap="updateNumber(true,index,item)">
<image src="/pagesCreateOrder/static/images/icon-add-black.svg" class="icon" mode="">
</image>
</view>
</template>
<template v-else>
<view class="u-flex" >
<image src="/pagesCreateOrder/static/images/icon-add-black.svg" style=" filter: opacity(30%);" class="icon" mode="">
</image>
</view>
</template>
</view>
</view>
<my-empty v-if="!data.length" text="暂未有添加商品"></my-empty>
</view>
<!-- 历史订单 -->
<view v-if="historyOrder.length > 0"
class="u-p-t-32 u-p-b-32 u-p-r-28 u-p-l-28 u-m-t-40 bg-fff u-flex u-row-between">
<view class="color-333" style="font-weight: bold;">历史订单</view>
<view class="color-666">
<uni-icons color="#666" type="trash"></uni-icons>
<text class="u-m-l-10" @tap="setModalShow('clear',true,'allHistoryOrder','清空历史订单')">清空历史订单</text>
</view>
</view>
<view v-for="(item,index) in historyOrder" :key="index" style="margin-top: 20rpx;">
<view v-if="historyOrder.length > 0"
class="u-p-t-32 border-top bg-fff u-p-r-28 u-p-b-32 u-p-l-28 u-flex u-row-between">
<view class="color-333" style="font-size: 30rpx;">{{item.placeNum}}次下单</view>
<view class="color-666">
<!-- <uni-icons color="#666" type="trash"></uni-icons>
<text class="u-m-l-10"
@tap="setModalShow('clear',true,item.placeNum,'清空第'+item.placeNum+'次下单历史订单')">清空</text> -->
</view>
</view>
<view class="color-333 item border-top u-flex u-row-center u-row-between" style="margin-left: 60rpx;"
v-for="(v,i) in item.info" :key="i">
<view style="display: flex;align-items: center;">
<view class="up-line-1" style="margin-right: 10rpx;">{{v.productName}}</view>
<uni-tag v-if="v.returnNum>0" :text="'退菜X'+v.returnNum"
custom-style="background-color: #EB4F4F; border-color: #EB4F4F; color: #fff;">
</uni-tag>
</view>
<view class="u-flex" style="flex-shrink: 0;margin-top: 20rpx;">
<view class="font-bold red u-m-r-32">{{formatPrice(v.price*(v.num - v.returnNum)) }}</view>
<view class="u-m-l-30 u-m-r-30 color-333"> X{{v.num.toFixed(2)}} </view>
</view>
</view>
</view>
</scroll-view>
<view class="u-row-between bottom u-flex">
<view class="u-row-between bottom u-flex" style="position: absolute;left: 0;bottom: 0;background-color: #fff;">
<view class="u-flex" @click="hideGoods">
<view>
<up-icon name="arrow-left" size="14" color="#333"></up-icon>
@ -80,8 +124,8 @@
</view>
</view>
<view class="car u-flex u-row-between u-col-bottom u-relative" @touchmove.stop.prevent="moveHandle"
:style="{transform: 'translateY(' + offset.y + 'px)'}" @touchstart="touchstart"
@touchmove="touchmove" @touchend="touchend">
:style="{transform: 'translateY(' + offset.y + 'px)'}" @touchstart="touchstart" @touchmove="touchmove"
@touchend="touchend">
<view class="u-absolute goods bg-fff">
<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">
@ -98,17 +142,10 @@
<image src="/pagesCreateOrder/static/images/icon-car.svg" class="icon-car" />
<view class="dot">{{goodsNumber}}</view>
</view>
<!-- <view class="price font-bold u-flex">
<view></view>
<view>{{allPrice}}</view>
</view> -->
<!-- <my-button shape="circle" height="80" width="220" @tap="toConfimOrder">
<text class="u-font-32 font-bold">{{table.type=='add'?'确认加菜':'去下单'}} </text>
</my-button> -->
</view>
<up-modal title="提示" content="是否清空全部已添加的商品?" :show="modal.clear" showCancelButton closeOnClickOverlay
<up-modal title="提示" :content="modal.title" :show="modal.clear" showCancelButton closeOnClickOverlay
@confirm="confirmModelConfirm" @cancel="setModalShow('clear',false)" @close="setModalShow('clear',false)"
width="300px"></up-modal>
<one-remark width="400px" @confirm="goodsOneRemarkConfirm" title="单品备注" :ref="setModel" name="remark"></one-remark>
@ -121,6 +158,13 @@
import {
formatPrice
} from '@/commons/utils/format.js';
import {
$tbProduct,
adminProduct
} from '@/http/yskApi/goods.js'
// import {
// addWXCart
// } from "@/http/yskApi/Instead.js"
import {
getElRect
} from '@/commons/utils/safe-bottom.js'
@ -132,6 +176,7 @@
reactive,
watch
} from 'vue';
let shopList = ref()
const props = defineProps({
sysInfo: {
type: Object,
@ -143,6 +188,12 @@
}
}
},
historyOrder: {
type: Array,
default: () => {
return []
}
},
instance: {
type: Object,
default: {
@ -171,7 +222,7 @@
type: Object,
default: () => {
return {
tableId: ''
}
}
},
@ -183,9 +234,23 @@
const edmits = defineEmits(['clear', 'updateNumber', 'updateSafeBottom', 'updateCart'])
const modal = reactive({
key: '',
title: '',
type: '',
clear: false
})
let allHistoryOrder = ref([]);
const allPrice = computed(() => {
let cartPrice = props.data.reduce((prve, cur) => {
let price = Math.floor((cur.lowPrice * cur.number) * 100) / 100
return prve + price
}, 0)
let historyOrderPrice = allHistoryOrder.value.reduce((prve, cur) => {
let price = Math.floor((cur.price * (cur.num - cur.returnNum)) * 100) / 100
return prve + price
}, 0)
return (cartPrice + historyOrderPrice).toFixed(2)
})
const models = new Map();
const modelData = reactive({
data: {},
@ -193,6 +258,12 @@
})
//
let note = ref('')
watch(() => props.historyOrder, (newval) => {
allHistoryOrder.value = [];
newval.forEach(item => {
allHistoryOrder.value = [...allHistoryOrder.value, ...item.info]
})
})
function setModel(el) {
if (el && el.$attrs['name']) {
@ -229,14 +300,17 @@
})
edmits('updateCart')
}
function setModalShow(key = 'show', show = true) {
if (key == 'clear' && show && props.data.length <= 0) {
return infoBox.showToast('购物车是空的!')
//
function setModalShow(key = 'show', show = true, type = '', title = '') {
if (title) {
modal.title = title
}
if (type) {
modal.type = type
}
modal.key = key
modal[key] = show
console.log(modal);
console.log(modal, 123);
}
@ -260,56 +334,86 @@
function toggleGoods() {
switchGoods.value = !switchGoods.value
//
// getshopsInfo()
}
function getshopsInfo() {
let arr = uni.getStorageSync('wxList')
let att = []
arr.forEach(async ele => {
let res = await adminProduct(ele.product_id)
console.log(res);
att.push({
...res.data,
...ele,
ele
})
})
setTimeout(() => {
// uni.setStorageSync('shopsList', att)
shopList.value = att
console.log(att, '初始化')
}, 200)
// product_id()
// const findCategory = layoutData.category.list.find(v => v.shopId == goods.shop_id)
}
function toConfimOrder() {
console.log(props.user);
if (props.data.length <= 0) {
return infoBox.showToast('还没有选择商品')
}
if (props.table.id) {
const {
tableId,
id,
name,
maxCapacity,
status,
type
} = props.table
if (props.table.tableId == '') {
go.to('PAGES_CONFIRM_ORDER', {
masterId: props.masterId,
isCreateOrderToDetail: props.isCreateOrderToDetail ? 1 : 0
type,
tableId: id,
name,
maxCapacity,
status,
isCreateOrderToDetail: props.isCreateOrderToDetail ? 1 : 0,
tableCode: props.table.tableCode,
})
} else {
go.to('PAGES_CONFIRM_ORDER', {
masterId: props.masterId,
type,
tableId,
name,
maxCapacity,
status,
isCreateOrderToDetail: props.isCreateOrderToDetail ? 1 : 0
isCreateOrderToDetail: props.isCreateOrderToDetail ? 1 : 0,
tableCode: props.table.tableCode,
})
}
hideGoods()
}
const allPrice = computed(() => {
return props.data.reduce((prve, cur) => {
return prve + cur.salePrice * cur.number
}, 0).toFixed(2)
})
const goodsNumber = computed(() => {
let result = 0
result = props.data.reduce((prve, cur) => {
let cart = props.data.reduce((prve, cur) => {
return prve + cur.number
}, 0)
return result >= 99 ? 99 : result
let historyOrderNum = allHistoryOrder.value.reduce((prve, cur) => {
return prve + cur.num
}, 0)
result = cart + historyOrderNum
result = result > 0 ? result.toFixed(2) : 0
return result >= 99 ? 99 : parseFloat(result)
})
function updateNumber(isAdd, index, goods) {
const step = isAdd ? 1 : -1
const newval = goods.number + step
const newval = (goods.number) + step
const par = {
num: newval,
index: index,
@ -332,6 +436,11 @@
console.log(newval);
offset.value.y = (newval - 70 - 40) / 2
})
// watch(() => props.data, (n) => {
// shopList.value = uni.getStorageSync('wxList')
// getshopsInfo()
// })
// function
function touchstart(event) {
startPoint.value = {
x: event.touches[0].clientX,
@ -348,7 +457,8 @@
x: currentPoint.x - startPoint.value.x,
y: currentPoint.y - startPoint.value.y
};
const minY=props.sysInfo.statusBarHeight||0 ,maxY=props.sysInfo.windowHeight-70-40;
const minY = props.sysInfo.statusBarHeight || 0,
maxY = props.sysInfo.windowHeight - 70 - 40;
let newY = offset.value.y + delta.y
if (newY > maxY) {
newY = maxY
@ -372,13 +482,20 @@
}
function clear() {
setModalShow('clear', false)
edmits('clear')
if (modal.type == 'cart') {
hideGoods()
}
onMounted(() => {
setModalShow('clear', false)
edmits('clear', modal.type)
// setModalShow('clear', false)
// edmits('clear')
// hideGoods()
}
onMounted(async () => {
getElRect('car', props.instance).then(res => {
console.log(res);
edmits('updateSafeBottom', res)
}).catch(err => {
console.log(err);
@ -416,6 +533,7 @@
transition: all .2s ease-in-out;
transform: translateX(100%);
z-index: 10;
&.active {
transform: translateX(0);
}

View File

@ -1,5 +1,28 @@
<template>
<view class="u-relative u-flex item box-shadow " @tap="emitEvent('showDetail')">
<!-- 已下架 -->
<view v-if="!data.isSale"
style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;z-index: 9999;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);background-color: rgba(0, 0, 0, .6);">
<image style="width: 220px;height: 220px;" src="@/static/iconImg/icon_goods_yxj.svg" />
</view>
<!-- 未开售 -->
<view v-else-if="!isProductAvailable(data.days,data.startTime.substring(11),data.endTime.substring(11))"
style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;z-index: 9999;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);background-color: rgba(0, 0, 0, .6);">
<image style="width: 220px;height: 220px;" src="@/static/iconImg/icon_goods_wks.svg" />
</view>
<!-- 已售罄 -->
<view v-else-if="(data.isStock && data.stockNumber<=0) "
style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;z-index: 9999;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);background-color: rgba(0, 0, 0, .6);">
<image style="width: 220px;height: 220px;" src="@/static/iconImg/icon_goods_sq.svg" />
</view>
<!-- 库存不足 -->
<view v-else-if="data.isSoldStock"
style="display: flex;align-items: center;justify-content: center;width: 100%;height: 100%;z-index: 9999;position: absolute;top: 50%;left: 50%;transform: translate(-50%,-50%);background-color: rgba(0, 0, 0, .6);">
<image style="width: 220px;height: 220px;" src="@/static/iconImg/Insufficient_inventory.svg" />
</view>
<view class="img">
<image lazy-load :src="data.coverImg" mode="aspectFill"></image>
</view>
@ -7,27 +30,37 @@
<view class="info u-flex u-flex-col u-row-right ">
<view class="u-flex w-full u-row-right u-p-r-20 u-p-b-16 u-flex-1 u-flex-col">
<template v-if="!isSellout">
<template v-if="data.typeEnum=='sku'">
<template v-if="data.type=='sku'||data.groupType==1">
<view class="u-flex u-row-right w-full">
<view class="u-flex">
<button class="btn" hover-class="btn-hover-class" @tap.stop="emitEvent('chooseGuige')">选规格</button>
<button class="btn" hover-class="btn-hover-class"
@tap.stop="emitEvent('chooseGuige')">选规格</button>
</view>
</view>
</template>
<template v-else-if="data.type=='weight'">
<view class="u-flex u-row-right w-full">
<view class="u-flex">
<button class="btn" hover-class="btn-hover-class"
@tap.stop="emitEvent('tapweigh')">称重</button>
</view>
</view>
</template>
<template v-else>
<view class="u-flex w-full u-row-right ">
<view class="u-flex icon-btn">
<template v-if="data.chooseNumber">
<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="">
</image>
</view>
<view class="u-font-32 ">
{{data.chooseNumber}}
</view>
</template>
<view class="u-flex" @tap.stop="emitEvent('add')">
<view class="u-flex" @tap.stop="emitEvent(data.type=='weight'?'tapweigh':'add')">
<image src="/pagesCreateOrder/static/images/icon-add.svg" class="icon" mode="">
</image>
</view>
@ -64,6 +97,12 @@
toRefs,
watch
} from 'vue';
import dayjs from "dayjs";
import isBetween from "dayjs/plugin/isBetween";
dayjs.extend(isBetween)
import {
onLoad
} from '@dcloudio/uni-app'
const props = defineProps({
img: {
type: Object,
@ -113,6 +152,7 @@
console.log(newval);
})
const computedImgStyle = computed(() => {
const stylobj = {
width: props.img.width,
@ -126,6 +166,10 @@
}
return stylobj
})
// const asd = computed(()=>{
// })
// function computedImgStyle() {
// return {
// width: props.img.width,
@ -151,7 +195,43 @@
})
const emits = defineEmits(['add', 'reduce', 'chooseGuige','showDetail'])
const emits = defineEmits(['add', 'reduce', 'chooseGuige', 'showDetail', 'tapweigh'])
//
//
function isProductAvailable(sellDaysStr, startTimeStr, endTimeStr) {
    //
    const sellDays = sellDaysStr.split(',');
    const now = dayjs();
    const days = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];
    const currentDay = days[now.day()];
    // console.log(':', currentDay);
    // console.log(':', sellDays);
    //
    if (!sellDays.includes(currentDay)) {
        // console.log('');
        return false;
    }
    const startTime = dayjs(`${now.format('YYYY-MM-DD')} ${startTimeStr}`);
    let endTime = dayjs(`${now.format('YYYY-MM-DD')} ${endTimeStr}`);
    //
    if (endTime.isBefore(startTime)) {
        endTime = endTime.add(1, 'day');
    }
    // console.log(':', now.format('YYYY-MM-DD HH:mm:ss'));
    // console.log(':', startTime.format('YYYY-MM-DD HH:mm:ss'));
    // console.log(':', endTime.format('YYYY-MM-DD HH:mm:ss'));
    const isInRange = now.isBetween(startTime, endTime, null, '[)');
    // console.log(':', isInRange);
    return isInRange;
}
// isBetween
function emitEvent(emitName) {
if (isGoods()) {

View File

@ -1,7 +1,10 @@
<template>
<up-popup :show="popShow" @close="close" @open="open" mode="top" :round="0">
<view class="u-p-32 box u-font-28">
<up-search v-model="searchVal" @search="search" @clear="search" @click="search"></up-search>
<view style="display: flex;align-items: center;">
<up-search v-model="searchVal" actionText="" @search="search" @clear="search"></up-search>
<text @tap="search">搜索</text>
</view>
</view>
</up-popup>
</template>
@ -49,11 +52,12 @@
function open() {
}
function search() {
console.log(searchVal.value, '值啊啊啊啊 ')
emits('search', searchVal.value)
close()
}
</script>
<style lang="scss" scoped>

View File

@ -0,0 +1,185 @@
<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, reactive, ref, watch } from 'vue';
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: () => {}
},
})
const model = ref(null)
const popup = ref()
let datas = reactive({
item: "",
title: "",
price: "",
skus: [],
// ,
selectNumber: 0,
})
watch(() => props.goodsData, (newval) => {
let gArr = JSON.parse(newval.groupSnap)
gArr.forEach(ele => {
ele.selectData = []
})
console.log(newval,11);
datas.item = newval
datas.title = newval.name
datas.price = newval.lowPrice
datas.skus = gArr
})
const selectNumber = computed(() => {
return datas.skus.reduce((prve, cur) => {
console.log(prve)
return 0 + cur.number
}, 0)
})
const emits = defineEmits(['confirm', 'updateSku'])
function confirm() {
//
let arr = []
let arrlength = 0
datas.selectNumber = 0
datas.skus.map(ele => {
let group = {
...ele,
goods: [],
}
if(ele.goods&&ele.goods.length>0){
ele.goods.map(item=>{
if(item.select){
group.goods.push(item)
arrlength++
}
})
}
arr.push(group)
datas.selectNumber += ele.number
})
console.log(arrlength)
console.log(datas.selectNumber)
if (arrlength == datas.selectNumber) {
emits('confirm', arr, datas.item)
close()
} else {
popup.value.open()
}
}
/**
* 套餐选择处理
* @param {Object} skd
* @param {Object} item
*/
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)
}
}
}
function open() {
model.value.open()
}
function close() {
datas.selectNumber = 0
model.value.close()
}
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,279 @@
<template>
<view class="">
<up-overlay :show="overlayshow" @click="overlayshow = false">
<view class="boxoverlay" v-if="form&&form.goods">
<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">
{{ (Math.floor((form.goods.lowPrice * currentInput)*100)/100).toFixed(2) }}
</view>
<view class="classconfirm" @click="clickconfirm"> 确认 </view>
</view>
</view>
</up-overlay>
</view>
</template>
<script setup>
import { onLoad, onShow } from '@dcloudio/uni-app';
import { 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;
}
console.log(currentInput.value,'称重数量')
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) => {
console.log("222",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: 30%;
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>

File diff suppressed because it is too large Load Diff

View File

@ -2,35 +2,77 @@ import {
returnBoolean
} from '@/commons/utils/format.js';
// 返回购物车未下单的数据
export function getNowCart(records) {
const nowCart = records.find(v => v.placeNum == 0)
const Cart = nowCart ? nowCart.info : []
const goodsMap = {}
export function getNowCart(carItem,goodsList,user) {
// console.log("carItem===",carItem)
// console.log("goodsList===",goodsList)
// const nowCart = records.find(v => v.placeNum == 0)
const arr = []
for (let i in Cart) {
const item=Cart[i]
const key = item.productId + '_' + item.skuId
if (goodsMap.hasOwnProperty(key)) {
const index = goodsMap[key]
arr[index].number = arr[index].number * 1 + item.number
arr[index].totalNumber = arr[index].totalNumber * 1 + item.totalNumber
arr[index].totalAmount = arr[index].totalAmount * 1 + item.totalAmount
arr[index].packFee = arr[index].packFee * 1 + item.packFee
if( carItem.is_temporary != 1 ){
carItem.isGrounding = false;
goodsList.map(goodsItem => {
if(carItem.product_id == goodsItem.id){
goodsItem.skuList.map(item=>{
if(carItem.product_id == item.productId){
carItem.lowPrice = item.salePrice
carItem.lowMemberPrice = item.memberPrice
carItem.specInfo = item.specInfo
if( uni.getStorageSync('shopInfo').isMemberPrice && user && user.id && user.isVip ){
carItem.salePrice = item.memberPrice
} else {
arr.push({
...item,
isPack: returnBoolean(item.isPack),
isGift: returnBoolean(item.isGift)
carItem.salePrice = item.salePrice
}
}
})
goodsMap[key] = arr.length - 1;
carItem.name = goodsItem.name
carItem.coverImg = goodsItem.coverImg
carItem.packFee = goodsItem.packFee
carItem.type = goodsItem.type
carItem.isGrounding = true;
}
carItem.number = parseFloat(carItem.number)
})
} else {
// 临时菜
console.log(carItem,'salePrice1111111111')
carItem.number = parseFloat(carItem.number)
carItem.name = carItem.product_name
carItem.lowPrice = carItem.discount_sale_amount
carItem.discount_sale_amount = 0
}
// const result = Cart.map(item => {
// return {
return carItem
}
// export function getNowCart(records) {
// const nowCart = records.find(v => v.placeNum == 0)
// const Cart = nowCart ? nowCart.info : []
// const goodsMap = {}
// const arr = []
// for (let i in Cart) {
// const item=Cart[i]
// const key = item.productId + '_' + item.skuId
// if (goodsMap.hasOwnProperty(key)) {
// const index = goodsMap[key]
// arr[index].number = arr[index].number * 1 + item.number
// arr[index].totalNumber = arr[index].totalNumber * 1 + item.totalNumber
// arr[index].totalAmount = arr[index].totalAmount * 1 + item.totalAmount
// arr[index].packFee = arr[index].packFee * 1 + item.packFee
// } else {
// arr.push({
// ...item,
// isPack: returnBoolean(item.isPack),
// isGift: returnBoolean(item.isGift)
// }
// })
return arr
}
// goodsMap[key] = arr.length - 1;
// }
// }
// // const result = Cart.map(item => {
// // return {
// // ...item,
// // isPack: returnBoolean(item.isPack),
// // isGift: returnBoolean(item.isGift)
// // }
// // })
// return arr
// }

View File

@ -29,14 +29,7 @@
<!-- <view class="line-th">{{data.priceAmount||data.returnAmount}}</view> -->
</view>
</template>
<!-- <view class="u-flex u-row-right u-m-t-24">
<template v-if="orderInfo.status=='unpaid'&&data.status!='return'">
<my-button plain shape="circle" :width="160" :height="56" @click="tuicai">退菜</my-button>
</template>
<template v-if="orderInfo.status=='closed'&&data.status!='return'">
<my-button plain shape="circle" :width="160" :height="56" @click="tuikuan">退款</my-button>
</template>
</view> -->
</view>
<view class="u-flex u-row-between u-m-t-24" v-if="packeFee>0">
@ -112,7 +105,7 @@
}
function extraCanTuiKuan(orderInfo, data) {
return orderInfo.status == 'closed' && data.status != 'refund' && data.priceAmount * 1 > 0
return orderInfo.status == 'done' && data.status != 'refund' && data.priceAmount * 1 > 0
}
const packeNumbber = computed(() => {
if (!props.orderInfo.detailList) {

View File

@ -4,19 +4,29 @@
<text class="">桌号</text>
<text class="">{{orderInfo.tableName||""}}</text>
</view>
<!-- <view class=" font-bold u-p-b-32 border-bottom u-m-b-24" v-if="orderInfo.tableName&&orderInfo.status=='unpaid'">
<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>
</view> -->
<view class=" color-999 border-bottom u-p-b-24">
<text></text>
<text class="color-333 "> {{goodsNumber}}</text>
<text>份菜品</text>
</view>
<view class="u-m-b-20 " v-for="(order,orderIndex) in data" :key="orderIndex">
<view class="u-p-t-24"> {{ order.placeNum }}次下单
</view>
<view class="u-p-t-24"> {{ order.placeNum }}次下单 </view>
<view class="u-m-t-24 list">
<view class="item u-m-b-32" v-for="(item,index) in order.info" :key="index">
<view class="u-flex u-col-top">
<view class="u-flex">
<image class="img" :src="item.coverImg||item.productImg" mode=""></image>
<image v-if="item.isTemporary == 0" class="img" :src="item.coverImg||item.productImg" mode=""></image>
<view v-else style="background-color: #3f9eff; width: 152rpx;height: 152rpx;line-height: 152rpx;text-align: center;color: #fff;" >
临时菜
</view>
</view>
<view class="u-p-l-32 u-flex-1">
<view class="u-flex u-row-between u-col-top">
@ -24,15 +34,16 @@
<view class="">
<view class="u-flex">
<view class="tui" v-if="isTui(item)">
{{item.status=='refunding'?'退款中':'已退'}}
{{item.status=='part_refund'?'部分已退':'全部已退'}}
</view>
<view
:class="{'line-th':item.status=='return'||item.status=='refund'||item.status=='refunding'}">
{{item.name||item.productName}}
</view>
</view>
<view class="u-flex u-m-t-8">
<view class="u-m-r-20 u-flex " v-if="item.gift">
<view class="u-flex u-m-t-8" style="flex-direction: column;align-items: flex-start;">
<view class="u-flex u-m-b-8">
<view class="u-m-r-20 u-flex" v-if="item.isGift">
<uni-tag text="赠送"
custom-style="background-color: #FFF0DF; border-color: #FFF0DF; color: #FF9F2E;">
</uni-tag>
@ -42,52 +53,58 @@
custom-style="background-color: #FFF0DF; border-color: #FFF0DF; color: #FF9F2E;">
</uni-tag>
</view>
<view class="u-m-r-20 u-flex" v-if="item.pack">
<view class="u-m-r-20 u-flex" v-if="item.packNumber > 0">
<uni-tag
custom-style="background-color: #E6F0FF; border-color: #E6F0FF; color: #318AFE;"
size="small" text="打包" inverted type="success" />
</view>
<view class="u-m-r-20 u-font-24 u-flex" v-if="item.returnAmount">
</view>
<view class="u-flex u-m-t-8">
<view class="u-m-r-20 u-font-24 u-flex" v-if="item.refundNum>0">
<view class="color-666">退款金额:</view>
<view class="color-999 u-m-l-6">{{item.returnAmount}}</view>
<view class="color-999 u-m-l-6">{{item.refundNum*item.unitPrice}}</view>
</view>
<view class="u-m-r-20 u-font-24 u-flex" v-if="item.returnNum">
<view class="color-666">退菜数量:</view>
<view class="color-999 u-m-l-6">{{item.returnNum}}</view>
</view>
</view>
<view class="color-999 u-font-24 u-m-t-8">{{item.productSkuName||''}}</view>
</view>
<view class="color-999 u-font-24 u-m-t-8">{{item.skuName||''}}</view>
<view class="u-m-t-12 color-666 u-font-24" v-if="item.note">
备注{{item.note}}
<view class="u-m-t-12 color-666 u-font-24" v-if="item.remark">
备注{{item.remark}}
</view>
</view>
<view class="u-text-right u-m-t-28">
<template v-if="isTui(item)">
<view>0.00</view>
<view class="line-th color-666 ">{{returnTotalMoney(item)}}
</view>
<template v-if="item.refundNum>0||item.returnNum>0">
<view>{{mathFloorPrice( parseFloat(mathFloorPrice(item.num*item.unitPrice,item)) - (parseFloat(mathFloorPrice(item.returnNum*item.unitPrice,item)) + parseFloat(mathFloorPrice(item.refundNum*item.unitPrice,item))))}}</view>
<view class="line-th color-666 ">{{returnTotalMoney(item)}}</view>
</template>
<template v-else-if="isGift(item)||item.userCouponId">
<view>0.00</view>
<view class="line-th color-666 ">{{returnTotalMoney(item)}}
</view>
<template v-else-if="item.couponNum > 0">
<view>{{mathFloorPrice((item.num-item.couponNum)*item.unitPrice,item)}}</view>
<view class="line-th color-666 ">{{returnTotalMoney(item)}}</view>
</template>
<template v-else-if="item.discountSaleAmount > 0">
<view>{{mathFloorPrice(item.num*item.discountSaleAmount,item)}}</view>
<view class="line-th color-666 ">{{returnTotalMoney(item)}}</view>
</template>
<template v-else-if="isVip == 1">
<view>{{mathFloorPrice((item.memberPrice?item.num*item.memberPrice:item.num*item.price),item)}}</view>
<view class="line-th color-666 ">{{returnTotalMoney(item)}}</view>
</template>
<template v-else>
<template v-if="returnCanTuiMoney(item)*1!=returnTotalMoney(item)*1">
<view>{{returnCanTuiMoney(item)}}</view>
<view>{{returnTotalMoney(item)}}</view>
<view class=" color-666 line-th">
{{returnTotalMoney(item)}}</view>
{{returnCanTuiMoney(item)}}</view>
</template>
<template v-else>
<view>{{returnTotalMoney(item)}}</view>
</template>
<!-- <template
v-if="user.isVip&&item.isMember&&returnVipMoney(item)>0&&returnVipMoney(item)!=returnTotalMoney(item)">
<view>{{returnVipMoney(item)}}</view>
<view class=" color-666 line-th">
{{returnTotalMoney(item)}}</view>
</template>
<template v-else>
<view>{{returnTotalMoney(item)}}</view>
</template> -->
</template>
<view class="u-m-t-22 color-999 u-font-24">X{{item.number||item.num}}</view>
</view>
@ -95,28 +112,29 @@
</view>
</view>
<template v-if="canTuicai(orderInfo,item)">
<view class="u-flex u-row-right gap-20 u-m-t-24">
<!-- <my-button :height="60" color="#333" plain type="cancel" shape="circle">更多操作</my-button> -->
<view class="u-flex u-row-right gap-20 u-m-t-24" v-if="item.returnNum*item.unitPrice<item.num*item.unitPrice">
<my-button :width="128" :height="48" plain shape="circle" @tap="tuicai(item,index)"><text
class="no-wrap">退菜</text></my-button>
</view>
</template>
<template v-if="canTuiKuan(orderInfo,item)">
<view class="u-flex u-row-right gap-20 u-m-t-20">
<my-button :width="128" :height="48" plain shape="circle" @tap="tuikuan(item,index)"><text
class="no-wrap">{{item.userCouponId?'退券':'退款' }}</text> </my-button>
</view>
</template>
</view>
</view>
<!-- <view class="bg-gray u-p-20 u-m-t-20" v-if="orderInfo.remark">
<view>备注</view>
<view class="u-m-t-10">{{orderInfo.remark}}</view>
</view> -->
</view>
<view class="u-m-t-32">
<template v-if="seatFeePrice&&seatFeePrice>0">
<view class="u-flex u-row-between border-top u-p-t-32 u-p-b-32 u-col-top">
<view class="no-wrap u-m-r-32">桌位费</view>
<view>{{seatFeePrice||'0.00'}}</view>
</view>
</template>
<template v-if="allPpackFee&&allPpackFee>0">
<view class="u-flex u-row-between border-top u-p-t-32 u-p-b-32 u-col-top">
<view class="no-wrap u-m-r-32">打包费</view>
<view>{{allPpackFee||'0.00'}}</view>
</view>
</template>
<view class="u-flex u-row-between border-top u-p-t-32">
<view>
<template v-if="orderInfo.status=='unpaid'">
@ -132,16 +150,17 @@
</view>
<view class="u-flex">
<view class="u-flex u-m-r-24" v-if="youhuiAllPrice>0">
<view class="u-flex u-m-r-24" v-if="discountsPrice>0">
<view class="color-red u-m-r-6 ">
已优惠{{youhuiAllPrice}}
已优惠{{discountsPrice}}
</view>
<!-- <up-icon name="info-circle" color="#999" :size="14" @click="youhuiDetailShow"></up-icon> -->
<up-icon name="info-circle" color="#999" :size="14" @click="youhuiDetailShow"></up-icon>
</view>
<view>
<!-- <view>
<text>小计</text>
<text class="font-bold u-font-32">{{allPrice}}</text>
</view>
</view> -->
</view>
</view>
@ -150,7 +169,7 @@
<view class="u-flex u-row-between u-m-t-32">
<view>退款金额</view>
<view class="color-999">
<text class="">{{(orderInfo.refundAmount).toFixed(2)}}</text>
<text class="">{{mathFloorPrice(orderInfo.refundAmount)}}</text>
</view>
</view>
<view class="u-flex u-row-between u-m-t-32">
@ -166,38 +185,32 @@
</view>
</view>
</template>
<template v-if="canTuiKuan(orderInfo)">
<view class="u-flex u-row-right gap-20 u-m-t-20">
<my-button :width="168" :height="48" plain shape="circle" @tap="tuikuan(data,index)"><text
class="no-wrap">全部退款</text> </my-button>
</view>
</template>
<view class="u-flex u-row-between u-m-t-20">
<view></view>
<template v-if="orderInfo.status=='unpaid'">
<view>
<text>总计</text>
<text class="font-bold u-font-32">{{orderInfo.amount }}</text>
<text class="font-bold u-font-32">{{allPrice}}</text>
</view>
</template>
<template v-else>
<view>
<text>总计</text>
<text class="font-bold u-font-32">{{orderInfo.amount}}</text>
<text class="font-bold u-font-32">{{mathFloorPrice(orderInfo.payAmount)}}</text>
</view>
</template>
</view>
<!-- <view class="u-flex u-row-between u-m-t-20" v-if="orderInfo.status=='closed'">
<view></view>
<view>
<text>实付</text>
<text class="font-bold u-font-32">{{to2(orderInfo.amount) }}</text>
</view>
</view> -->
<!-- <view class="u-flex u-row-between u-m-t-20">
<view></view>
<view>
<text>原价</text>
<text class="font-bold u-font-32">{{to2(orderInfo.originAmount||0) }}</text>
</view>
</view> -->
<view class="u-m-t-24">
<my-button @tap="printOrder" type="cancel" :color="color.ColorMain">重新打印</my-button>
<view class="u-m-t-24" v-if="orderInfo.status == 'unpaid'||orderInfo.status == 'done'">
<my-button @tap="printOrder" type="cancel" :color="$utils.ColorMain">重新打印</my-button>
</view>
</view>
<up-popup :round="10" :show="pop.youhui" mode="center" closeOnClickOverlay @close="youhuiDetailHide">
@ -211,8 +224,15 @@
<text>{{vipDiscountPrice}}</text>
</view>
</view>
<view class="u-flex u-row-between u-m-b-18" v-if="discountSaleAmount">
<view>单品打折</view>
<view class="color-red">
<text></text>
<text>{{ discountSaleAmount }}</text>
</view>
</view>
<view class="u-flex u-row-between u-m-b-18" v-if="discountAmount">
<view>打折</view>
<view>服务改价优惠 </view>
<view class="color-red">
<text></text>
<text>{{to2(discountAmount) }}</text>
@ -225,21 +245,13 @@
<text>{{to2(orderInfo.fullCouponDiscountAmount) }}</text>
</view>
</view>
<view class="u-flex u-row-between u-m-t-18" v-if="productCouponDiscountAmount*1>0">
<view class="u-flex u-row-between u-m-t-18" v-if="orderInfo.productCouponDiscountAmount*1>0">
<view>商品券抵扣</view>
<view class="color-red">
<text></text>
<text> {{productCouponDiscountAmount }}</text>
<text> {{to2(orderInfo.productCouponDiscountAmount) }}</text>
</view>
</view>
<!-- <view class="u-flex u-row-between u-m-t-18"
v-if="orderInfo.productCouponDiscountAmount||productCoupPrice*1>0">
<view>商品券抵扣</view>
<view class="color-red">
<text></text>
<text> {{to2(orderInfo.productCouponDiscountAmount||productCoupPrice) }}</text>
</view>
</view> -->
<view class="u-flex u-row-between u-m-t-18" v-if="orderInfo.pointsDiscountAmount">
<view>积分抵扣</view>
<view class="color-red">
@ -255,37 +267,15 @@
</template>
<script setup>
import {
computed,
reactive
} from 'vue';
import color from '@/commons/color.js'
import {
hasPermission
} from '@/commons/utils/hasPermission.js'
import {
isTui,
isTuiCai,
isGift,
canTuiKuan,
canTuicai,
numSum
} from '@/commons/utils/goodsUtil.js'
import { computed, reactive } from 'vue';
import { hasPermission } from '@/commons/utils/hasPermission.js'
import { isTui, isTuiCai, isGift, canTuiKuan, canTuicai, mathFloorPrice } from '@/commons/utils/goodsUtil.js'
const emits = defineEmits(['tuicai', 'tuikuan', 'printOrder'])
const pop = reactive({
youhui: false
})
function youhuiDetailShow() {
pop.youhui = true
}
function productCouponDikou(item) {
return '商品券抵扣¥' + returnProductCoupPrice(item)
}
function youhuiDetailHide() {
pop.youhui = false
}
const props = defineProps({
orderInfo: {
type: Object,
@ -310,6 +300,193 @@
}
})
/**
* 计算菜品数量
*/
const goodsNumber = computed(() => {
let result = 0
result = props.data.reduce((a, b) => {
const bTotal = b.info.length
return a + bTotal
}, 0)
return result.toFixed(0)
})
/**
* 桌位费
*/
const seatFeePrice = computed(() => {
const n = props.orderInfo.seatNum > 0 ? props.orderInfo.seatNum*uni.getStorageSync('shopInfo').tableFee : 0
return n.toFixed(2)
})
/**
* 判断是否是会员
*/
const isVip = computed(() => {
return uni.getStorageSync('shopInfo').isMemberPrice && props.user && props.user.id && props.user.isVip
})
const freePrice = computed(() => {
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.gift == true || isGift(v)).reduce((a,
b) => {
const price = (b.isMember && b.memberPrice) ? b.memberPrice : b.price
return a + (b.num * price)
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const vipDiscountPrice = computed(() => {
if (!isVip.value) {
return 0
}
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.discountSaleAmount <= 0 && v.isGift != 1 && v.status !== "return" && (v.price != v.unitPrice) && (v.memberPrice != v.price)).reduce(( a, b) => {
return a + (b.num * (b.price - b.memberPrice))
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
/**
* 单品打折优惠
*/
const discountSaleAmount = computed(() => {
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.discountSaleAmount > 0 && v.isGift != 1 && v.status !== "return" ).reduce(( a, b) => {
return a + (b.num * (b.price - b.discountSaleAmount))
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
/**
* 打折优惠
*/
const discountAmount = computed(() => {
return props.orderInfo.discountAmount||0
})
/**
* 总优惠金额
*/
const discountsPrice = computed(() => {
//
let fullCouponDiscountAmount = props.orderInfo.status == 'done' ? props.orderInfo.fullCouponDiscountAmount : 0
//
let productCouponDiscountAmount = props.orderInfo.status == 'done' ? props.orderInfo.productCouponDiscountAmount : 0
//
let pointsDiscountAmount = props.orderInfo.status == 'done' ? props.orderInfo.pointsDiscountAmount : 0
return (parseFloat(vipDiscountPrice.value) + parseFloat(discountSaleAmount.value) + discountAmount.value + fullCouponDiscountAmount + productCouponDiscountAmount + pointsDiscountAmount).toFixed(2)
})
//
const productCoupPrice = computed(() => {
if (props.orderInfo.status == 'done') {
return props.orderInfo.productCouponDiscountAmount
}
const goodsPrice = props.data.reduce((a, b) => {
const curTotal = b.info.filter(v => !v.isGift).reduce((prve, cur) => {
let memberPrice = cur.memberPrice ? cur.memberPrice : cur.price
let tPrice = (isVip.value ? memberPrice : cur.price)
tPrice = cur.memberPrice != cur.unitPrice&& cur.price != cur.unitPrice ? cur.unitPrice : tPrice
let Total = Math.floor(tPrice * cur.num * 100) / 100
return prve + Total - (cur.returnNum*tPrice) - (cur.refundNum*cur.unitPrice)
}, 0)
return a + curTotal
}, 0)
// console.log("==",goodsPrice)
return goodsPrice.toFixed(2)
})
const allPpackFee = computed(() => {
//退
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.packNumber > 0).reduce((a,
b) => {
return a + parseFloat(b.packAmount*b.packNumber).toFixed(2)*1
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const packFee = computed(() => {
//退
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.status !== "return" && (v.returnNum+v.refundNum < v.num)).reduce((a,
b) => {
return a + parseFloat((b.packAmount*(b.num-(b.returnNum+b.refundNum)>b.packNumber?b.packNumber:b.num-(b.returnNum+b.refundNum))).toFixed(2))
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const allPrice = computed(() => {
let seatAmount = props.orderInfo.seatAmount || 0
const total = productCoupPrice.value*1 + seatAmount*1 + packFee.value*1
return (total <= 0 ? 0 : total).toFixed(2)
})
/**
* 已优惠金额
*/
const youhuiAllPrice = computed(() => {
const n = vipDiscountPrice.value * 1
return (n < 0 ? 0 : n).toFixed(2)
})
function youhuiDetailShow() {
pop.youhui = true
}
function productCouponDikou(item) {
return '商品券抵扣¥' + returnProductCoupPrice(item)
}
function youhuiDetailHide() {
pop.youhui = false
}
/**
* 转桌/并桌
*/
function rotatingTables() {
let arr = []
props.data.forEach(ele => {
ele.info.forEach(res => {
// coverImg
res.coverImg = res.productImg
// name
res.name = res.productName
// salePrice
res.salePrice = res.price
// number
res.number = res.num
res.masterId = props.orderInfo.masterId
res.useType = props.orderInfo.useType
res.tableId = props.orderInfo.tableId
arr.push(res)
})
})
uni.navigateTo({
url: '/pagesCreateOrder/confirm-order/rotatingTables?item=' + JSON.stringify(arr) + '&tableId=' + props
.orderInfo.tableId
})
}
function returnProductCoupPrice(item) {
if (!item.isMember) {
return item.price * item.num
@ -317,58 +494,40 @@
const price = item.memberPrice ? item.memberPrice : item.price
return price * item.num
}
const productCouponDiscountAmount = computed(() => {
// if(props.orderInfo.productCouponDiscountAmount){
// return orderInfo.productCouponDiscountAmount.toFixed(2)
// }
if (!props.data.length) {
return 0
}
const n = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.userCouponId).reduce((a, b) => {
return a + returnProductCoupPrice(b)
}, 0)
return prve + curTotal
}, 0)
console.log(n);
return n.toFixed(2)
})
const emits = defineEmits(['tuicai', 'tuikuan', 'printOrder'])
function returnVipMoney(item) {
if (!item.memberPrice || !props.user.isVip) {
return 0
}
return (item.memberPrice * item.num).toFixed(2)
}
function returnTotalMoney(item) {
return (item.price * item.num).toFixed(2)
return (Math.floor(item.num*item.price*100)/100).toFixed(2)
}
function returnCanTuiMoney(item) {
// if (props.orderInfo.status == 'unpaid') {
// return returnTotalMoney(item)
// } else {
if (props.orderInfo.pointsDiscountAmount > 0 || props.orderInfo.fullCouponDiscountAmount > 0) {
return item.canReturnAmount
} else if (item.price != item.unitPrice) {
return item.price*item.num
} else {
return (Math.floor(item.num*item.unitPrice*100)/100).toFixed(2)
}
// }
}
const canTuiKuanPrice = computed(() => {
const goodsTotal = props.data.reduce((prve, cur) => {
// const curTotal=cur.info.filter(v=>!v.userCouponId).reduce((a,b)=>{
// return a+b.priceAmount*1
// },0)
const curTotal = cur.info.filter(v => !isTui(v) && !v.userCouponId)
.reduce((a, b) => {
return a + b.priceAmount * 1
return a + b.payAmount * 1
}, 0)
return prve + curTotal
}, 0)
console.log(goodsTotal);
console.log(seatFeePrice.value);
return (goodsTotal + seatFeePrice.value * 1).toFixed(2)
})
const TuiKuanPrice = computed(() => {
return props.data.reduce((prve, cur) => {
// const curTotal=cur.info.filter(v=>!v.userCouponId).reduce((a,b)=>{
// return a+b.priceAmount*1
// },0)
const curTotal = cur.info.filter(v => isTui(v) && !v.userCouponId)
.reduce((a, b) => {
return a + b.priceAmount * 1
return a + b.payAmount * 1
}, 0)
return prve + curTotal
}, 0)
@ -377,31 +536,14 @@
return props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => !isTui(v) && !v.userCouponId)
.reduce((a, b) => {
return a + b.priceAmount * 1
return a + b.payAmount * 1
}, 0)
return prve + curTotal
}, 0)
})
const cantuiSeatFee=computed(()=>{
let seatFee=props.orderInfo.seatInfo?(props.orderInfo.seatInfo.priceAmount):0
const bili = Math.floor((seatFee / canTuiKuanPrice.value) * 100) / 100
seatFee= Math.floor((props.orderInfo.amount-props.orderInfo.refundAmount) * bili * 100) / 100
return seatFee
})
function returnCanTuiMoney(item) {
return props.orderInfo.status == 'unpaid'? item.priceAmount: item.canReturnAmount
if (props.orderInfo.status == 'unpaid') {
return returnTotalMoney(item)
} else {
if(props.orderInfo.pointsDiscountAmount>0||props.orderInfo.fullCouponDiscountAmount>0){
return item.canReturnAmount
// const bili=Math.floor((item.priceAmount/canTuiKuanPrice.value )*100)/100
// return Math.floor((allPrice.value)*bili*100)/100
}else{
return item.priceAmount
}
}
}
function to2(n) {
if (!n) {
@ -417,11 +559,33 @@
function tuikuan(item, index) {
hasPermission('允许退款').then(res => {
if (res) {
if (Array.isArray(item)) {
let arr = [];
item.map(v=>{
let infoLit = JSON.parse(JSON.stringify(v.info))
infoLit.map((obj,i)=>{
obj.number = '0.00'
obj.skuName = obj.skuName || ''
obj.unitPrice = obj.unitPrice
obj.num = obj.num - obj.returnNum - obj.refundNum - obj.couponNum
obj.priceAmount = mathFloorPrice(obj.num*obj.unitPrice ,obj)
})
arr = [...arr,...infoLit]
})
arr.map((v,e)=>{
if( v.num <= 0){
// arr.splice(e, 1)
}
})
emits('tuikuan', arr)
} else {
emits('tuikuan', {
...item,
priceAmount: item.canReturnAmount
payAmount: item.payAmount
}, index)
}
}
})
}
@ -430,134 +594,6 @@
}
const seatFeePrice = computed(() => {
if (!props.seatFee.priceAmount) {
return 0
}
const n = props.seatFee.priceAmount * (isTui(props.seatFee) ? 0 : 1)
return n.toFixed(2)
})
const discountAmount = computed(() => {
if (props.orderInfo.discountAmount) {
return props.orderInfo.discountAmount
}
console.log(props.orderInfo.originAmount * (1 - props.orderInfo.discountRatio));
return (props.orderInfo.originAmount * (1 - props.orderInfo.discountRatio))
})
const goodsOriginAllPrice = computed(() => {
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.reduce((a,
b) => {
return a + (b.num * b.price)
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const freePrice = computed(() => {
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.gift == true || isGift(v)).reduce((a,
b) => {
const price = (b.isMember && b.memberPrice) ? b.memberPrice : b.price
return a + (b.num * price)
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const vipDiscountPrice = computed(() => {
if (!props.user.isVip) {
return 0
}
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.gift != true && v.status !== "return" && (v.isMember &&
v.memberPrice) && (v.memberPrice != v.price)).reduce((
a,
b) => {
return a + (b.num * (b.price - b.memberPrice))
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const productCoupPrice = computed(() => {
if (props.orderInfo.status == 'closed') {
return props.orderInfo.productCouponDiscountAmount
}
const goodsPrice = props.data.reduce((a, b) => {
const curTotal = b.info.filter(v => v.gift != true && v.userCouponId).reduce((prve,
cur) => {
const isVip = props.user.isVip && cur.isMember
const memberPrice = cur.memberPrice ? cur.memberPrice : cur.price
const price = isVip ? memberPrice : cur.price
const curTotal = price * cur.num
return prve + curTotal
}, 0)
return a + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const youhuiAllPrice = computed(() => {
const n= props.orderInfo.originAmount-props.orderInfo.amount+vipDiscountPrice.value*1
return (n<0?0:n).toFixed(2)
// if(props.orderInfo.status!='unpaid'){
// const seatfee=(props.orderInfo.amount==0&&allPrice.value==0)?seatFeePrice.value:0
// return (goodsOriginAllPrice.value-allPrice.value+seatfee*1).toFixed(2)
// }
// return (freePrice.value * 1 + vipDiscountPrice.value * 1 + props.orderInfo.fullCouponDiscountAmount + props
// .orderInfo.pointsDiscountAmount + (props.orderInfo.status == 'unpaid' ? productCoupPrice.value :
// productCouponDiscountAmount.value) * 1 + (props.orderInfo.discountAmount ||
// 0)).toFixed(2)
})
const packFee = computed(() => {
//退
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.filter(v => v.status !== "return").reduce((a,
b) => {
return a + b.packAmount
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
})
const allPrice = computed(() => {
const goodsPrice = props.data.reduce((prve, cur) => {
const curTotal = cur.info.reduce((a,
b) => {
return a +(props.orderInfo.status == 'unpaid'?b.priceAmount:b.canReturnAmount*1)
}, 0)
return prve + curTotal
}, 0)
return goodsPrice.toFixed(2)
if (props.orderInfo.status == 'unpaid') {
const n = goodsOriginAllPrice.value - youhuiAllPrice.value
return (n < 0 ? 0 : n).toFixed(2)
}
const returnAmount=props.orderInfo.seatInfo&&props.orderInfo.seatInfo.returnAmount?props.orderInfo.seatInfo.returnAmount:0
const canReturnAmount=props.orderInfo.seatInfo&&props.orderInfo.seatInfo.canReturnAmount?props.orderInfo.seatInfo.canReturnAmount:0
const total=props.orderInfo.amount-(returnAmount?returnAmount:canReturnAmount)
return (total<=0?0:total).toFixed(2)
})
const goodsNumber = computed(() => {
let result = 0
result = props.data.reduce((a, b) => {
const bTotal = b.info.reduce((prve, cur) => {
return prve + (cur.number || cur.num) * 1;
}, 0);
return a + bTotal
}, 0)
return result
})
</script>
<style lang="scss" scoped>

View File

@ -2,11 +2,11 @@
<view class="default-box-padding bg-fff border-r-12 u-m-t-24">
<view class="u-flex u-row-between">
<view>订单状态</view>
<view>{{returnStatus(data.status)}}</view>
<view>{{$dict.getDiceName(data.status,'orderStatus')}}</view>
</view>
<view class="u-flex u-row-between u-m-t-24">
<view>订单类型</view>
<view>{{returnUseType(data.useType)}}</view>
<view>{{$dict.getDiceName(data.dineMode,'dineMode')}}</view>
</view>
<view class="u-flex u-row-between u-m-t-24">
<view>桌位号</view>
@ -18,16 +18,11 @@
</view>
<view class="u-flex u-row-between u-m-t-24">
<view>支付方式</view>
<view>{{data.payType||''}}</view>
<view>{{$dict.getDiceName(data.payType,'payType')||''}}</view>
</view>
<!-- <view class="u-flex u-row-between u-m-t-24">
<view>预约时间</view>
<view></view>
</view> -->
<view class="u-flex u-row-between u-m-t-24">
<view>下单时间</view>
<view><up-text v-if="data.createdAt" mode="date" format="yyyy-mm-dd hh:MM:ss"
:text="data.createdAt"></up-text></view>
<view><up-text v-if="data.createTime" mode="date" format="yyyy-mm-dd hh:MM:ss" :text="data.createTime"></up-text></view>
</view>
<view class="u-flex u-row-between u-m-t-24">
<view>订单编号</view>
@ -38,22 +33,20 @@
<up-icon name="/static/copy.svg" :size="16"></up-icon>
</up-copy>
</view>
</view>
</view>
<view class="u-flex u-row-between u-m-t-24 u-col-top">
<view class="no-wrap">商家备注</view>
<view class="u-p-l-32 " style="max-width: 522rpx; word-wrap: break-word;">
{{data.remark}}
</view>
<!-- <my-button plain shape="circle" :width="160" :height="60">编辑</my-button> -->
</view>
</view>
</template>
<script setup>
import orderEnum from '@/commons/orderEnum.js'
import { ref } from 'vue';
const props = defineProps({
data: {
type: Object,
@ -71,17 +64,6 @@
}
})
function returnStatus(status) {
const item = orderEnum.status.find(v => v.key == status)
return item ? item.label : ''
}
function returnUseType(useType) {
if (!useType) {
return ''
}
return useType == "takeout" ? '自取' : '堂食';
}
</script>
<style lang="scss" scoped>

View File

@ -13,10 +13,7 @@
</template>
<script setup>
import {
reactive
} from 'vue';
import color from '@/commons/color.js'
import { reactive } from 'vue';
const itemStyle = reactive({
color: 'rgb(255,0,0)'
})

View File

@ -6,22 +6,22 @@
{{data.productName}}
</view>
<view class="u-flex u-m-t-32" :class="{'gray':data.productId=='-999'}">
<up-number-box :min="1" :max="data.num" :buttonSize="44" v-model="number" integer :disabled="data.productId=='-999'">
<up-number-box :min="0" :max="maxNum" :buttonSize="44" v-model="number" integer
:disabled="data.productId=='-999'">
<template #minus>
<view class="minus number-box-btn">
</view>
<view class="minus number-box-btn"></view>
</template>
<template #input>
<view class="u-flex-1 u-row-center u-text-center input">
<up-input
:disabled="data.productId=='-999'"
@change="parseIntNumber($event,false)" @blur="parseIntNumber($event,true)"
v-model="number" border="none" type="number"></up-input>
<up-input :disabled="data.productId=='-999'" @change="parseIntNumber($event,false)"
@blur="parseIntNumber($event,true)" v-model="number" border="none"
type="digit"></up-input>
</view>
</template>
<template #plus>
<view class="plus number-box-btn">
<up-icon v-if="data.productId=='-999'" name="plus" color="#ccc" size="16" bold></up-icon>
<up-icon v-if="data.productId=='-999'" name="plus" color="#ccc" size="16"
bold></up-icon>
<up-icon v-else name="plus" color="#999" size="16" bold></up-icon>
</view>
</template>
@ -50,8 +50,7 @@
<view class="u-p-t-18 u-p-l-30 u-p-r-30 u-p-b-10">
<my-button box-shadow shape="circle" @tap="confirm">确认退菜</my-button>
<view class="u-m-t-10">
<my-button @tap="onModelClose" shape="circle" bgColor="#fff" type="cancel"
box-shadow>取消</my-button>
<my-button @tap="onModelClose" shape="circle" bgColor="#fff" type="cancel" box-shadow>取消</my-button>
</view>
</view>
@ -60,12 +59,9 @@
</template>
<script setup>
import {
reactive,
ref,
watch
} from 'vue';
import { reactive, ref, watch } from 'vue';
import infoBox from '@/commons/utils/infoBox.js'
const emits = defineEmits(['update:show', 'confirm'])
const props = defineProps({
data: {
type: Object,
@ -83,10 +79,11 @@
const form = reactive({
note: ''
})
const emits = defineEmits(['update:show', 'confirm'])
let model = ref(null)
let modelShow = ref(props.show)
let number = ref(1)
let number = ref(0)
let maxNum = ref(0)
const tags = ref([{
label: "点错",
checked: false
@ -101,28 +98,6 @@
checked: false
}])
let timer = null
function parseIntNumber(val, isNow) {
console.log(val);
let newval = parseInt(val)
if (newval > props.data.num) {
newval = props.data.num
}
if (newval < 1) {
newval = 1
}
if (isNow) {
number.value = parseInt(newval)
return
}
timer = setTimeout(() => {
number.value = newval
}, 100)
}
function changeTagSel(item) {
item.checked = !item.checked
}
watch(() => props.show, (newval) => {
modelShow.value = newval
})
@ -135,6 +110,26 @@
}
})
function parseIntNumber(val, isNow) {
console.log(val)
let newval = val * 1
if (newval > props.data.num - props.data.returnNum) {
newval = props.data.num - props.data.returnNum
}
if (isNow) {
number.value = newval * 1
return
}
timer = setTimeout(() => {
number.value = newval
}, 100)
}
function changeTagSel(item) {
item.checked = !item.checked
}
function toggleModelShow(show) {
modelShow.value = show ? true : false
}
@ -151,9 +146,8 @@
function open() {
model.value.open()
if(props.data.productId=='-999'){
number.value=props.data.num
}
number.value = props.data.num - props.data.returnNum
maxNum.value = props.data.num - props.data.returnNum
}
function close() {
@ -164,6 +158,9 @@
form.note = ''
}
/**
* 确认退菜
*/
function confirm() {
const selTag = tags.value.filter(item => item.checked).map(item => item.label).join(",")
const note = selTag + (form.note.length > 0 ? "," + form.note : "");
@ -174,10 +171,17 @@
if (!note) {
return infoBox.showToast("请输入退菜原因");
}
emits('confirm', {
note,
num: number.value
})
let par = {
orderId: props.data.orderId,
refundAmount: number.value * props.data.unitPrice,
refundReason: note,
refundDetails: [{
id: props.data.id,
returnAmount: number.value * props.data.unitPrice,
num: number.value,
}],
}
emits('confirm', par)
}
</script>
@ -206,12 +210,14 @@
::v-deep .uni-input-input {
text-align: center;
}
.gray {
.minus::after {
border-color: #ccc;
}
}
.minus {
&::after {
content: '';

View File

@ -7,7 +7,7 @@
<view class="u-flex u-row-between u-m-t-20 border-bottom u-p-b-20">
<view class="u-flex">
<up-avatar :size="30" :src="user.headImg"></up-avatar>
<view class="color-666 u-m-l-30">{{user.telephone||'未绑定手机号'}}</view>
<view class="color-666 u-m-l-30">{{user.phone||'未绑定手机号'}}</view>
</view>
<view>
<my-button @click="toOrder" :height="60" plain shape="circle">他的订单</my-button>
@ -29,11 +29,11 @@
</template>
<view class="u-flex u-m-t-24 u-row-between u-font-28">
<view class="">
<view class="font-bold ">{{user.amount}}</view>
<view class="font-bold ">{{user.amount||0}}</view>
<view class="color-666 u-m-t-8 u-font-24">余额</view>
</view>
<view class="">
<view class="font-bold">{{user.accountPoints}}</view>
<view class="font-bold">{{user.accountPoints||0}}</view>
<view class="color-666 u-m-t-8 u-font-24">积分</view>
</view>
<view class="">
@ -66,10 +66,9 @@
}
}
})
function toOrder(){
go.to('PAGES_ORDER_INDEX',{
userId:props.user.id||'',
userId:props.user.userId||'',
type:'user'
})
}

View File

@ -1,19 +1,11 @@
<template>
<view class="min-page bg-gray u-font-28 u-p-30">
<user-vue :orderInfo="orderDetail.info" :user="user"></user-vue>
<!-- <view class="default-box-padding bg-fff border-r-12 u-m-t-32">
<text class="">桌位号</text>
<text class="">{{orderDetail.info.tableName}}</text>
</view> -->
<goods-list @printOrder="onPrintOrder" @tuikuan="onTuikuan" :orderInfo="orderDetail.info"
:user="user"
:data="orderDetail.goodsList" :seatFee="orderDetail.seatFee" @tuicai="onTuiCai"></goods-list>
<!-- <template v-if="orderDetail.seatFee.totalNumber&&orderDetail.seatFee.totalAmount"> -->
<!-- <view class="default-box-padding bg-fff border-r-12 u-m-t-20 u-flex u-row-between" v-if="orderDetail.info.discountAmount>0">
<view>服务员改价</view>
<view class="color-red">-{{orderDetail.info.discountAmount}}</view>
</view> -->
<template v-if="true">
<extra-vue @tuicai="onSeatFeeTuicai" @tuikuan="onSeatFeeTuiKuan" :orderInfo="orderDetail.info"
:data="orderDetail.seatFee"></extra-vue>
@ -23,7 +15,7 @@
<view style="height: 200rpx;"></view>
<view class="u-fixed bottom bg-fff ">
<view class="u-flex u-abso">
<template v-if="orderDetail.info.useType=='takeout'||!orderDetail.info.tableId||orderDetail.info.useType=='dine-in-before'">
<template v-if="orderDetail.info.dineMode=='take-out'||!orderDetail.info.tableCode||pageData.shopInfo.registerType=='before'">
<view class="u-flex-1" v-if="orderDetail.info.status=='unpaid'">
<my-button @tap="toPay" borderRadius="100rpx" shape="circle"
type="primary">结账</my-button>
@ -49,40 +41,98 @@
</template>
<script setup>
import * as Api from '@/http/yskApi/Instead.js'
import * as orderApi from '@/http/yskApi/order.js'
import {queryAllShopUser} from '@/http/yskApi/shop-user.js'
import {
objToArrary
} from '@/commons/utils/returrn-data.js'
import { onLoad, onShow } from '@dcloudio/uni-app';
import { reactive, ref } from 'vue';
import userVue from './components/user.vue';
import orderVue from './components/order.vue';
import goodsList from './components/list.vue';
import stepVue from './components/step.vue';
import extraVue from './components/extra.vue';
import tuicaiVue from './components/tuicai.vue';
import go from '@/commons/utils/go.js'
import infoBox from '@/commons/utils/infoBox.js'
import {hasPermission} from '@/commons/utils/hasPermission.js'
import {
onLoad,
onShow,
onHide
} from '@dcloudio/uni-app';
import {
reactive,
ref
} from 'vue';
import OrderDetail from './page.js'
import { getHistoryOrder, refundOrder,getOrderById,printOrder } from '@/http/api/order.js'
import { shopStaffDetail } from '@/http/api/staff.js'
import { shopUserDetail } from '@/http/api/shopUser.js'
import { getShopInfo } from '@/http/api/shop.js'
const tuicai = reactive({
show: false,
isSeatFee: false,
selGoods: {}
})
const orderDetail = reactive({
goodsList: [],
info: {},
seatFee: {
totalAmount: 0
}
})
const options = reactive({})
//
let user = ref({
headImg:'',
phone:'',
amount:'0.00',
accountPoints:'0.00'
})
const pageData = reactive({
shopInfo: {},
})
onLoad((opt) => {
Object.assign(options, opt)
getShopInfoData()
})
onShow(() => {
watchEmit()
watchChooseuser()
getOrderDetail()
})
/**
* 获取店铺信息
*/
function getShopInfoData () {
getShopInfo({id:uni.getStorageSync('shopInfo').id}).then(res=>{
pageData.shopInfo = res;
uni.setStorageSync('shopInfo',res)
})
}
/**
* 获取订单详情
*/
async function getOrderDetail () {
let {data:res} = await getHistoryOrder({orderId: options.id})
// console.log("===",res)
if(res.userId){
let {data:resUser} = await shopUserDetail({userId:res.userId})
user.value = resUser
}
orderDetail.seatFee = {
seatNum: res.seatNum,
seatAmount: res.seatAmount,
}
orderDetail.goodsList = Object.entries(res.detailMap).map(([key, value]) => ({
info: value,
placeNum: key
}))
orderDetail.goodsList.map(item=>{
item.info.map(item=>{
item.unitPrice = uni.$utils.isGoodsPrice(item,user.value)
})
})
orderDetail.info = res
}
function onSeatFeeTuicai(seatFee) {
seatFee={...seatFee,num:seatFee.num,productName:seatFee.productName}
console.log(seatFee);
tuicai.show = true
tuicai.isSeatFee = seatFee
tuicai.selGoods = seatFee
@ -90,11 +140,11 @@
//退
async function hasTuiKuan(){
const isHas=await hasPermission('允许退款')
console.log(isHas,'11111111');
return isHas
}
async function onSeatFeeTuiKuan(seatFee) {
console.log(seatFee);
const canTuikuan=await hasTuiKuan()
if(!canTuikuan){
return
@ -117,49 +167,45 @@
productName,
num,
number: 0,
productSkuName: '',
skuName: '',
priceAmount,
price
})
}
function onTuiCai(goods, index) {
console.log(goods);
tuicai.show = true
tuicai.selGoods = goods
}
async function tuicaiConfirm(e) {
console.log(tuicai.selGoods);
const res = await Api.$returnCart({
...e,
cartId: tuicai.selGoods.hasOwnProperty('cartId') ? tuicai.selGoods.cartId : tuicai.selGoods.id,
tableId: orderDetail.info.tableId,
})
const res = await refundOrder(e)
tuicai.show = false
init()
}
async function printDishes() {
try {
const res = await Api.$printDishes({
tableId: orderDetail.info.tableId
})
infoBox.showToast('已发送打印请求')
} catch (e) {
infoBox.showToast('发送打印请求失败')
//TODO handle the exception
}
if(res){
go.back()
}else{
getOrderDetail()
}
}
/**
* 打印订单
*/
function onPrintOrder() {
uni.showModal({
title: '提示',
content: '是否打印当前台桌菜品',
success(res) {
async success(res) {
if (res.confirm) {
printDishes()
try {
const res = await printOrder({
id: orderDetail.info.id,
type: orderDetail.info.status == 'unpaid' ? 1 : 0
})
infoBox.showToast('已发送打印请求')
} catch (e) {
infoBox.showToast('发送打印请求失败')
}
}
}
})
@ -171,34 +217,25 @@
if(!canTuikuan){
return
}
console.log(goods);
const {
id,
productId,
productSkuId,
productName,
productSkuName,
cartId,
orderId,
num,
priceAmount,
price,userCouponId
} = goods
go.to('PAGES_ORDER_TUIKUAN', {
id,
cartId,
orderId,
productId,
productSkuId,
productName,
num,
number: 0,
productSkuName: productSkuName || '',
priceAmount:priceAmount?priceAmount:(num*price).toFixed(2),
price,
userCouponId:userCouponId?userCouponId:''
})
if (Array.isArray(goods)) {
go.to('PAGES_ORDER_TUIKUAN', {
orderInfo: JSON.stringify(orderDetail.info),
goodsList:JSON.stringify(goods)
})
} else {
goods.number = 0
goods.skuName = goods.skuName || ''
goods.priceAmount = goods.priceAmount ? goods.priceAmount : (goods.num*uni.$utils.isGoodsPrice(goods,user.value)).toFixed(2)
console.log(goods)
goods.unitPrice = uni.$utils.isGoodsPrice(goods,user.value)
goods.userCouponId = goods.userCouponId ? goods.userCouponId:''
go.to('PAGES_ORDER_TUIKUAN', {
orderInfo: JSON.stringify(orderDetail.info),
goodsList:JSON.stringify([goods])
})
}
}
@ -217,9 +254,10 @@
clearEmit()
go.to('PAGES_CREATE_ORDER', {
tableId: options.tableId || orderDetail.info.tableId,
tableCode: options.tableCode || orderDetail.info.tableCode,
name: options.name || orderDetail.info.tableName,
masterId:orderDetail.info.masterId,
type: 'add'
type: 'add',
vipUserId: orderDetail.info.userId?orderDetail.info.userId:''
})
}
@ -228,102 +266,27 @@
if(!canJieZhang){
return
}
const memberId=orderDetail.info.memberId||''
const userId=orderDetail.info.userId||''
clearEmit()
go.to('PAGES_ORDER_PAY', {
tableId: options.tableId|| orderDetail.info.tableId,
tableName: options.name,
masterId: options.masterId,
tableCode: options.tableCode || orderDetail.info.tableCode,
tableName: options.name || orderDetail.info.tableName,
orderId: orderDetail.info.id,
discount: 1,
memberId
userId
})
}
const orderDetail = reactive({
goodsList: [],
info: {},
seatFee: {
totalAmount: 0
}
})
const options = reactive({})
async function init() {
const res = await orderApi.tbOrderInfoDetail(options.id)
if(res.memberId){
queryAllShopUser({id:res.memberId}).then(res=>{
if(res.content[0]){
user.value=res.content[0]
}
})
}
if (res.detailList.length) {
uni.setStorageSync('useType', res.detailList[0].useType)
}
const masterId = res.masterId
options.masterId = res.masterId
// if (res.status == 'unpaid') {
if (false) {
const {
records,
seatFee
} = await Api.getCart({
masterId,
tableId: res.tableId,
page: 1,
size: 200
})
orderDetail.goodsList = records
orderDetail.seatFee = seatFee ? seatFee : orderDetail.seatFee
} else {
const goodsMap = {}
for (let i in res.detailList) {
const goods = res.detailList[i]
if (goods.productName != '客座费') {
if (goodsMap.hasOwnProperty(goods.placeNum)) {
goodsMap[goods.placeNum].push(goods)
} else {
goodsMap[goods.placeNum] = [goods]
}
}
}
console.log(res.seatInfo);
orderDetail.seatFee = res.seatInfo|| {
// name: '',
// number: res.seatCount,
// num: res.seatCount,
// totalNumber: res.seatCount,
// priceAmount: res.seatAmount,
// status:'',
totalNumber:0,
}
orderDetail.goodsList = Object.entries(goodsMap).map(([key, value]) => ({
info: value,
placeNum: key
}))
console.log(orderDetail.goodsList);
}
orderDetail.info = res
}
function watchEmit() {
uni.$off('orderDetail:update')
uni.$once('orderDetail:update', (newval) => {
console.log(newval);
init()
getOrderDetail()
})
}
//
let user = ref({
headImg:'',
telephone:'',
amount:'0.00',
accountPoints:'0.00'
})
//
async function setUser(par) {
const submitPar = {
@ -335,7 +298,7 @@
}
Object.assign(submitPar, par)
const res=await Api.$setUser(submitPar)
init()
getOrderDetail()
return res
}
@ -354,15 +317,7 @@
})
}
onShow(() => {
watchEmit()
watchChooseuser()
init()
})
onLoad((opt) => {
Object.assign(options, opt)
console.log(options);
})
</script>
<style lang="scss" scoped>

View File

@ -1,23 +1,23 @@
<template>
<view class="bg-fff item" @click="toDetail">
<view class="u-flex u-p-b-22 border-bottom u-row-between u-col-center">
<view class="u-flex u-col-bottom">
<view class="u-flex u-col-bottom" style="align-items: center;">
<template v-if="data.tableName">
<view class="u-flex u-col-center">
<view class="u-font-40 color-333">{{data.tableName}}</view>
<view class="line" style="height: 16px;"></view>
</view>
</template>
<view class="">{{data.masterId}}</view>
<!-- <view class="">{{ $dict.getDiceName(data.platformType,'platformType') }}</view> -->
</view>
<view class="u-flex">
<view>
<text :class="[data.status]">{{returnStatus(data.status)}}</text>
<text :class="[data.status]">{{$dict.getDiceName(data.status,'orderStatus')}}</text>
</view>
<view class="line"></view>
<view class=" color-main">
<text>
{{sendTypeFilter(data.sendType)}}
{{$dict.getDiceName(data.dineMode,'dineMode')}}
</text>
</view>
</view>
@ -25,43 +25,25 @@
<view class="u-m-t-26">
<view class="u-flex u-col-bottom u-font-24 color-999">
<up-avatar :size="33"></up-avatar>
<view class="u-m-l-16">{{formatTime(data.createdAt)}}</view>
<view class="u-m-l-16">{{formatTime(data.createTime)}}</view>
</view>
<view class="u-m-t-32">
<view class="u-font-32">{{goosZhonglei}}种商品{{goodsNumber}}</view>
<view class="u-font-32">{{data.goods.length}}件商品</view>
<view class="border-bottom u-p-b-32">
<view class="" v-for="(item,index) in data.detailList" :key="index">
<view class="" v-for="(item,index) in data.goods" :key="index">
<view class="u-flex u-row-between u-col-top u-m-t-32" v-if="item.productId!=-999">
<view>
<view class=""> {{item.productName}}</view>
<view class="color-999 u-font-24 u-m-t-8">
{{item.productSkuName}}
{{item.skuName}}
</view>
</view>
<view class="u-flex u-flex-1 u-row-right">
<view>×{{item.num}}</view>
<template v-if="item.gift||item.userCouponId">
<view class="u-flex u-flex-1 u-row-right" style="align-items: center;">
<view style="margin-right: 10rpx;">×{{item.num}}</view>
<view class="u-text-right u-relative" :style="computedPriceStyle()">
<text class="line-th">{{goodsPriceAmount(item)}}</text>
<view class="u-absolute" style="bottom: 100%;right: 0;">
0
<text>{{item.unitPrice}}</text>
</view>
</view>
</template>
<template v-else-if="item.isMember&&data.memberId&&item.memberPrice&&item.memberPrice!=item.price">
<view class="u-text-right u-relative" :style="computedPriceStyle()">
<text class="line-th">{{goodsPriceAmount(item)}}</text>
<view class="u-absolute" style="bottom: 100%;right: 0;">
{{goodsVipPriceAmount(item)}}
</view>
</view>
</template>
<template v-else>
<view class="u-text-right u-relative" :style="computedPriceStyle()">
<text>{{goodsPriceAmount(item)}}</text>
</view>
</template>
</view>
</view>
</view>
@ -74,7 +56,7 @@
<view class="no-wrap u-m-r-32">打包费</view>
<view>{{data.packFee||0}}</view>
</view>
<view style="height: 32rpx;" v-if="data.packFee>0&&data.seatInfo&&data.seatInfo.priceAmount>0"></view>
<view style="height: 32rpx;" ></view>
<view class="u-flex u-row-between u-col-top" v-if="data.seatInfo&&data.seatInfo.priceAmount>0">
<view class="no-wrap u-m-r-32">{{data.seatInfo.productName}}</view>
<view>{{data.seatInfo.priceAmount}}</view>
@ -105,9 +87,9 @@
<view class="u-m-t-32">
<view class="u-flex u-row-right">
<text>总计</text>
<text class="font-bold u-font-32">{{data.orderAmount}}</text>
<text class="font-bold u-font-32">{{originAmount.toFixed(2)}}</text>
</view>
<view class="u-flex u-row-right u-m-t-24">
<view class="u-flex u-row-right u-m-t-24" v-if="data.status == 'unpaid'||data.status == 'done'">
<view class="print" @click.stop="print(item)">重新打印</view>
</view>
</view>
@ -116,20 +98,11 @@
</template>
<script setup>
import { computed, reactive, ref, watch } from 'vue';
import dayjs from 'dayjs';
import orderEnum from '@/commons/orderEnum.js'
import go from '@/commons/utils/go.js'
import {
isTui,
canTuiKuan,
canTuicai
} from '@/commons/utils/goodsUtil.js'
import {
computed,
reactive,
ref,
watch
} from 'vue';
const emits = defineEmits(['printOrder'])
const props = defineProps({
data: {
@ -141,7 +114,7 @@
productName: '客座费',
priceAmount: 0
},
detailList: []
goods: []
}
}
},
@ -153,73 +126,40 @@
let $goodsMap = {}
let goosZhonglei = ref(0)
let goodsNumber = ref(0)
let originAmount = ref(0)
const priceSize = 9
let minWidth=ref(36)
function goodsPriceAmount(item) {
const total=(item.price * item.num).toFixed(2)
const minW=total.length * priceSize + 15
minWidth.value=minW<minWidth.value?minWidth.value:minW
return total
}
function goodsVipPriceAmount(item) {
const price = item.memberPrice ? item.memberPrice : item.price
return (price * item.num).toFixed(2)
}
// const packeFee=computed(()=>{
// return props.data.detailList.reduce((prve,cur)=>{
// return prve+cur.packAmount
// },0).toFixed(2)
// })
function computedPriceStyle() {
return {
'min-width':minWidth.value + 'px'
}
}
// const computedPriceStyle = computed(() => {
// })
function goodsMapInit() {
for (let i in props.data.detailList) {
const goods = props.data.detailList[i]
for (let i in props.data.goods) {
const goods = props.data.goods[i]
if ($goodsMap.hasOwnProperty(goods.productId)) {
$goodsMap[goods.productId] += goods.num * 1
goodsNumber.value += goods.num * 1
} else {
$goodsMap[goods.productId] = goods.num * 1
goosZhonglei.value += 1
goodsNumber.value += goods.num * 1
}
originAmount.value += goods.unitPrice
}
}
goodsMapInit()
watch(() => props.data.detailList.length, (newval) => {
watch(() => props.data.goods.length, (newval) => {
goodsNumber.value = 0
goodsMapInit()
})
function formatTime(time) {
return dayjs(time).format('YYYY-MM-DD HH:mm:ss');
}
function returnStatus(status) {
const item = orderEnum.status.find(v => v.key == status)
return item ? item.label : ''
}
function sendTypeFilter(t) {
console.log(t);
if (t) {
const item = orderEnum.sendType.find(item => item.key == t)
return item ? item.label : '';
} else {
return t;
}
}
function toDetail() {
go.to('PAGES_ORDER_DETAIL', {
id: props.data.id

View File

@ -3,9 +3,11 @@
<up-sticky offset-top="0">
<view class="top">
<view class="search bg-fff u-p-t-32 u-p-l-28 u-p-r-28 u-p-b-32">
<up-search v-bind="search" v-model="search.val" @search="searchConfirm" @clear="searchConfirm" @custom="searchConfirm"></up-search>
<up-search v-bind="search" v-model="search.val" @search="searchConfirm" @clear="searchConfirm"
@custom="searchConfirm"></up-search>
</view>
<filter-vue @clearUser="clearQueryUser" @updateStatus="updateQuery('status',$event)" v-model:time="order.data.query.createdAt" :user="user" :type="option.type"></filter-vue>
<filter-vue @clearUser="clearQueryUser" @updateStatus="updateQuery('status',$event)"
v-model:time="order.data.query.createdAt" :user="user" :type="option.type"></filter-vue>
</view>
</up-sticky>
@ -18,20 +20,32 @@
</template>
<script setup>
import {onLoad,onShow,onPullDownRefresh} from '@dcloudio/uni-app'
import {
onLoad,
onShow,
onPullDownRefresh
} from '@dcloudio/uni-app'
import * as Api from '@/http/yskApi/order.js'
import {queryAllShopUser} from '@/http/yskApi/shop-user.js'
import {
queryAllShopUser
} from '@/http/yskApi/shop-user.js'
import LIST from '@/commons/class/list.js'
import {$printOrder} from '@/http/yskApi/Instead.js'
import {
$printOrder
} from '@/http/yskApi/Instead.js'
import filterVue from './compoents/filter.vue';
import orderList from './compoents/order-list.vue';
import infoBox from '@/commons/utils/infoBox.js'
import {
reactive, ref, watch
reactive,
ref,
watch
} from 'vue';
import {getTodayTimestamps} from '@/commons/utils/dayjs-time.js';
import {
getTodayTimestamps
} from '@/commons/utils/dayjs-time.js';
const search = reactive({
val: '',
placeholder: '搜索单号/商品名称',
@ -61,15 +75,18 @@
}
})
console.log(order.data);
function clearQueryUser() {
order.setQuery('userId', '')
}
function pageChange(e) {
const newPage = e - 1
order.setVal('page', newPage)
order.setQuery('page', newPage)
init()
}
function updateQuery(key, e) {
order.setQuery(key, e)
}
@ -82,17 +99,23 @@
watch(() => order.data.query.userId, (newval) => {
init()
})
function searchConfirm() {
order.setQuery('page', 0)
init()
}
async function init() {
console.log(order.data.query);
const {content,totalElements}=await Api.tbOrderInfoData({...order.data.query,page:order.data.query.page,keyword:search.val})
const {
data
} = await Api.tbOrderInfoData({
...order.data.query,
page: order.data.query.page,
keyword: search.val
})
uni.stopPullDownRefresh()
order.setVal('list',content)
console.log(order.data.list);
order.setVal('total',totalElements)
order.setVal('list', data.records)
order.setVal('total', data.totalRow)
order.setVal('hasAjax', true)
}
onPullDownRefresh(() => {
@ -103,13 +126,17 @@
let user = ref({
userId: ''
})
const option=reactive({type:''})
const option = reactive({
type: ''
})
onLoad((opt) => {
Object.assign(option, opt)
if (opt && JSON.stringify(opt) != '{}') {
order.setQuery('userId', opt.userId ? opt.userId : '')
if (opt.userId) {
queryAllShopUser({id:opt.userId}).then(res=>{
queryAllShopUser({
id: opt.userId
}).then(res => {
user.value = res.content[0] || opt
})
}
@ -131,6 +158,7 @@
}
}
function onPrintOrder(e) {
console.log(e);
uni.showModal({

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,14 @@
<svg width="121" height="120" viewBox="0 0 121 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_5_38)">
<circle cx="60.2939" cy="60" r="58.5" stroke="white" stroke-width="3"/>
<circle cx="60.2938" cy="60" r="51.1997" stroke="white" stroke-width="2" stroke-dasharray="2 2"/>
<line x1="19.8277" y1="50.637" x2="82.4435" y2="27.8676" stroke="white"/>
<line x1="36.7388" y1="93.3029" x2="99.3547" y2="70.5335" stroke="white"/>
<path d="M22.4599 62.0201C23.1265 62.5176 23.7976 63.0902 24.4821 63.7599L32.6011 60.8049L33.2304 62.3625L16.5189 68.445L18.5688 73.5186C20.4655 78.4692 21.3126 82.6787 21.0559 86.1414L19.2488 85.4463C19.4643 82.4581 18.6888 78.6819 16.8999 74.126L14.2207 67.4948L22.7005 64.4084C22.0609 63.8499 21.4032 63.3746 20.7815 62.9883L22.4599 62.0201ZM22.7471 66.8928L24.4471 66.6825C24.4958 67.3794 24.5266 68.0319 24.5574 68.6843L33.3529 65.483L33.9193 66.8849L24.56 70.2914C24.5039 71.9454 24.3398 73.4601 24.0676 74.8353L28.285 73.3004L27.1971 70.6078L28.8209 70.0168L29.9088 72.7093L34.938 70.8789L35.5224 72.3253L30.4932 74.1558L31.5001 76.648L38.2433 74.1937L38.8367 75.6623L32.0935 78.1167L33.514 81.6326L31.8902 82.2236L30.4697 78.7077L22.3282 81.671L21.7348 80.2023L29.8763 77.239L28.8694 74.7468L22.9606 76.8974L22.0649 75.6409C22.4993 74.2831 22.7672 72.7051 22.846 70.9153L19.4405 72.1547L18.8741 70.7528L22.8659 69.2999C22.8353 68.5198 22.7957 67.7175 22.7471 66.8928ZM35.6949 60.0106L41.8292 57.7779C41.8077 56.8924 41.7637 56.015 41.6655 55.1319L43.3928 54.7329C43.464 55.5493 43.5261 56.3435 43.5658 57.1459L55.1127 52.9431L55.742 54.5008L43.5862 58.9252C43.5249 61.1426 43.1977 63.2781 42.6272 65.3235L47.2034 76.65L45.6247 77.2246L41.8217 67.8118C41.3876 68.9143 40.9129 69.9804 40.3616 71.0489L38.8343 70.1499C40.6237 66.7675 41.6063 63.2448 41.8045 59.5736L36.3242 61.5683L35.6949 60.0106ZM45.8068 68.1992L52.3471 65.8187L51.511 63.7492C52.5088 62.5693 53.394 61.3027 54.1711 59.8967L45.6913 62.9831L45.089 61.4922L55.6436 57.6506L56.246 59.1415C55.4777 60.6974 54.5335 62.2662 53.4045 63.8258L53.9709 65.2277L59.609 63.1756L60.2294 64.711L54.5912 66.7631L56.2905 70.9688C56.8209 72.2817 56.414 73.1955 55.0834 73.6798L52.2644 74.7059L51.2245 73.3487C52.0454 73.0754 52.9114 72.7858 53.836 72.4492C54.5126 72.203 54.7296 71.7156 54.4599 71.048L52.9674 67.3541L46.4272 69.7346L45.8068 68.1992ZM57.6942 50.7528L76.9993 43.7263L77.6286 45.284L70.2313 47.9764C70.194 49.0365 70.08 50.099 69.8894 51.1638L70.303 52.1874C74.7565 52.9658 78.7948 54.125 82.4178 55.6651L81.8432 57.3802C78.698 55.8704 75.0971 54.7051 70.9862 53.8786L75.967 66.2065L74.2981 66.8139L69.1555 54.0855C68.0785 57.4384 66.217 60.7705 63.5756 64.0291L61.9582 63.0352C65.9314 58.2709 68.0832 53.4803 68.4271 48.6331L58.3236 52.3105L57.6942 50.7528ZM82.9851 41.1903L97.1482 36.0354L100.205 43.6012L94.1383 45.8093L95.6308 49.5032L103.073 46.7944L103.702 48.3521L96.2601 51.0609L98.1391 55.7116C99.4425 55.4159 100.989 54.955 102.749 54.3147C104.44 53.6991 105.843 53.1374 106.989 52.6438L107.185 54.4102C105.809 54.9109 104.56 55.3401 103.446 55.7201C99.3998 57.1671 96.5271 57.8043 94.796 57.6176C93.2813 57.4542 91.6187 56.6044 89.8622 55.0741C89.8232 57.5387 89.4373 59.7211 88.6821 61.6296L87.1322 60.7388C88.2721 57.6694 88.4342 54.0369 87.5961 49.8496L89.2916 49.5643C89.5381 50.8784 89.7124 52.1423 89.8056 53.3335C91.7197 55.0617 93.4544 55.9618 95.0413 56.0478C95.4336 56.0582 95.8709 56.0522 96.3669 55.9993L92.492 46.4085L86.0419 48.7561L82.9851 41.1903ZM97.9473 42.6873L96.1222 38.17L85.2293 42.1347L87.0544 46.652L97.9473 42.6873Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_5_38">
<rect width="120" height="120" fill="white" transform="translate(0.293854)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

View File

@ -0,0 +1,14 @@
<svg width="120" height="120" viewBox="0 0 120 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2_36)">
<circle cx="60" cy="60" r="58.5" stroke="white" stroke-width="3"/>
<circle cx="60" cy="60" r="51.1997" stroke="white" stroke-width="2" stroke-dasharray="2 2"/>
<line x1="19.5338" y1="50.637" x2="82.1497" y2="27.8676" stroke="white"/>
<line x1="36.445" y1="93.3029" x2="99.0608" y2="70.5335" stroke="white"/>
<path d="M57.134 66.8373L60.6344 75.5009L58.4994 76.278L57.912 74.8242L41.9748 80.6248L42.5622 82.0786L40.4272 82.8557L36.9269 74.1921L57.134 66.8373ZM41.2076 78.7259L57.1448 72.9253L55.7423 69.4539L39.8051 75.2546L41.2076 78.7259ZM32.5035 63.2439C31.9245 64.8841 31.2192 66.468 30.3698 68.0364L28.8571 66.1707C30.8456 62.2138 31.8241 58.3182 31.7745 54.5246L34.0473 54.1738C34.046 55.1952 34.0028 56.1979 33.8994 57.2225L41.3568 54.5083C40.4981 53.6637 39.6574 52.9487 38.7805 52.3149L40.8618 51.149C41.7145 51.8936 42.5852 52.7679 43.4617 53.7421L52.2121 50.5573L52.9313 52.3374L43.79 55.6646L44.6651 57.8305L52.4833 54.9849L53.1666 56.6761L45.3484 59.5217L46.1875 61.5986L54.0659 58.7311L54.7491 60.4223L46.8708 63.2898L47.7698 65.515L57.3923 62.0127L58.1235 63.8226L35.9919 71.8779L32.5035 63.2439ZM45.6348 66.2921L44.7358 64.0669L36.4364 67.0876L37.3355 69.3128L45.6348 66.2921ZM44.0525 62.3757L43.2134 60.2988L34.914 63.3195L35.7531 65.3964L44.0525 62.3757ZM42.5301 58.6076L41.655 56.4417L33.5661 59.3858C33.5239 59.5373 33.4997 59.6482 33.4875 59.7888L34.2307 61.6283L42.5301 58.6076ZM56.4839 47.471L62.7084 45.2054L62.121 43.7516L64.2259 42.9855L64.8133 44.4393L69.8952 42.5897L70.5185 44.1325L65.4367 45.9821L66.0001 47.3766L70.27 45.8225L70.8454 47.2466L59.6593 51.318L59.0839 49.8939L63.8951 48.1427L63.3317 46.7483L57.1072 49.0138L56.4839 47.471ZM65.8022 52.0091L62.7651 53.1145L63.0168 53.7375C63.1607 54.0936 63.2864 54.4902 63.3701 54.8682L66.4974 53.7299L65.8022 52.0091ZM68.1212 53.1389L70.7674 52.1758L70.0721 50.4549L67.426 51.4181L68.1212 53.1389ZM63.615 56.2425C63.7454 57.7605 63.5032 59.21 62.8703 60.6315L60.9416 59.8701C61.7612 58.1424 61.8294 56.3478 61.0923 54.438L60.3131 52.5095L71.379 48.4818L73.1171 52.784L63.615 56.2425ZM71.9233 40.6944L79.1401 38.0676L80.0991 40.4412C80.2669 40.8566 80.5433 41.0283 80.9342 40.886L83.1894 40.0652L83.8128 41.608L81.1065 42.593C79.9037 43.0308 79.0505 42.6266 78.559 41.4102L78.0795 40.2234L74.2306 41.6243C74.5542 42.4254 74.6495 43.1735 74.5766 43.8466C74.4254 44.5823 74.0097 45.3462 73.3114 46.1789L71.635 45.5299C72.189 44.6816 72.4844 43.9615 72.5694 43.318C72.5942 42.6964 72.3788 41.8218 71.9233 40.6944ZM83.3605 42.7936L83.84 43.9804C83.6458 45.5486 82.9887 47.081 81.8387 48.5886C83.4017 48.5302 85.2234 48.3436 87.3038 48.0288L87.0971 49.9078C84.4457 50.2603 82.2093 50.3595 80.358 50.2166C79.0219 51.5197 77.3552 52.7729 75.358 53.9763L73.9227 52.729C75.6071 51.7756 77.0149 50.8208 78.1882 49.8832C76.5055 49.4747 75.1958 48.7942 74.2712 47.8716L73.0984 48.2984L72.4751 46.7556L83.3605 42.7936ZM75.925 47.2696C76.6817 47.9471 77.9255 48.3793 79.6446 48.5363C80.7641 47.3802 81.5169 46.2553 81.8789 45.1026L75.925 47.2696ZM68.9973 59.4905C68.6716 60.3918 68.2738 61.2853 67.8219 62.1304L65.6343 61.6674C66.8993 59.5054 67.5631 57.392 67.6858 55.3053L69.8683 54.9874C69.8194 55.7199 69.7283 56.4337 69.6134 57.0882L83.8967 51.8895L84.6639 53.7883L77.0862 56.5464L78.177 59.2463L89.6338 55.0764L90.401 56.9753L78.9442 61.1452L80.3468 64.6166L87.2328 62.1103L86.2619 59.707L88.3668 58.9409L90.5605 64.3705L88.4556 65.1366L87.988 63.9795L71.9907 69.802L72.4582 70.9591L70.3533 71.7253L68.1836 66.355L70.2885 65.5889L71.2355 67.9328L78.2118 65.3937L76.8093 61.9223L64.4204 66.4315L63.6532 64.5326L76.0421 60.0234L74.9512 57.3235L68.9973 59.4905Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_2_36">
<rect width="120" height="120" fill="white"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.8 KiB

View File

@ -0,0 +1,14 @@
<svg width="121" height="120" viewBox="0 0 121 120" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2_35)">
<circle cx="60.2939" cy="60" r="58.5" stroke="white" stroke-width="3"/>
<circle cx="60.2938" cy="60" r="51.1997" stroke="white" stroke-width="2" stroke-dasharray="2 2"/>
<line x1="19.8277" y1="50.637" x2="82.4435" y2="27.8676" stroke="white"/>
<line x1="36.7388" y1="93.3029" x2="99.3547" y2="70.5335" stroke="white"/>
<path d="M26.044 58.3135L28.1301 57.5543L29.6698 61.365L39.3392 57.8456L40.1259 59.7927L30.4565 63.3121L32.4456 68.2354L43.6092 64.1722L44.3958 66.1193L35.0929 69.5053C38.3977 72.3226 42.9265 74.2477 48.6624 75.3187L47.9721 77.6119C41.831 76.0184 36.9817 73.5399 33.4578 70.1004L33.2323 70.1825L38.3569 82.8664L36.2708 83.6257L31.1462 70.9418L30.8925 71.0341C30.7058 76.3346 28.8006 81.3035 25.1994 85.9962L23.2907 84.5532C26.8122 80.4638 28.8237 76.1582 29.3138 71.6087L19.9826 75.005L19.196 73.0579L30.3595 68.9947L28.3703 64.0714L18.8982 67.5189L18.1116 65.5718L27.5837 62.1243L26.044 58.3135ZM44.9692 53.2121L66.9298 45.2191L67.7165 47.1662L63.0086 48.8797L65.9867 56.2508L72.1605 54.0037L72.936 55.923L66.7622 58.1701L71.7407 70.4923L69.6828 71.2414L64.7042 58.9191L56.5571 61.8844C57.4609 64.8417 57.8806 67.401 57.799 69.6003C57.6718 72.3267 56.6263 74.7811 54.6624 76.9636L52.8662 75.6392C54.6327 73.5285 55.5541 71.2469 55.6021 68.8046C55.5422 66.9758 55.1727 64.9407 54.4992 62.6334L47.9871 65.0036L47.2117 63.0843L53.8365 60.6731C53.6904 60.3115 53.5837 59.9675 53.4714 59.6893L50.8866 53.2917L45.7559 55.1592L44.9692 53.2121ZM52.9727 52.5324L55.5575 58.93C55.6923 59.2638 55.799 59.6079 55.9226 59.9138L63.9288 56.9998L60.9507 49.6287L52.9727 52.5324ZM100.444 51.1754L103.725 59.2975L101.724 60.026L101.173 58.6631L86.2321 64.1012L86.7828 65.4641L84.7812 66.1927L81.4997 58.0705L100.444 51.1754ZM85.5128 62.321L100.454 56.8829L99.1391 53.6285L84.198 59.0666L85.5128 62.321ZM77.3528 47.8066C76.8099 49.3442 76.1488 50.8292 75.3524 52.2996L73.9343 50.5504C75.7985 46.8408 76.7158 43.1887 76.6693 39.6322L78.8 39.3034C78.7989 40.261 78.7583 41.201 78.6614 42.1616L85.6527 39.6169C84.8477 38.8251 84.0595 38.1548 83.2374 37.5607L85.1887 36.4676C85.9881 37.1657 86.8043 37.9853 87.626 38.8987L95.8295 35.9128L96.5038 37.5818L87.9338 40.701L88.7542 42.7315L96.0838 40.0638L96.7244 41.6493L89.3948 44.317L90.1815 46.2641L97.5675 43.5758L98.208 45.1613L90.8221 47.8496L91.6649 49.9358L100.686 46.6524L101.371 48.3491L80.6231 55.9009L77.3528 47.8066ZM89.6634 50.6643L88.8205 48.5781L81.0399 51.41L81.8827 53.4962L89.6634 50.6643ZM88.1799 46.9926L87.3933 45.0455L79.6126 47.8774L80.3993 49.8245L88.1799 46.9926ZM86.7527 43.46L85.9323 41.4295L78.349 44.1896C78.3094 44.3317 78.2867 44.4356 78.2753 44.5674L78.972 46.292L86.7527 43.46Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_2_35">
<rect width="120" height="120" fill="white" transform="translate(0.293854)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@ -0,0 +1,14 @@
<svg width="121" height="121" viewBox="0 0 121 121" fill="none" xmlns="http://www.w3.org/2000/svg">
<g clip-path="url(#clip0_2_37)">
<circle cx="60.706" cy="60.1438" r="58.5" stroke="white" stroke-width="3"/>
<circle cx="60.706" cy="60.1438" r="51.1997" stroke="white" stroke-width="2" stroke-dasharray="2 2"/>
<line x1="20.2398" y1="50.7807" x2="82.8557" y2="28.0114" stroke="white"/>
<line x1="37.151" y1="93.4466" x2="99.7668" y2="70.6773" stroke="white"/>
<path d="M41.9891 67.1295L24.2853 73.5732L27.6006 81.7788C28.095 83.0027 29.0019 83.4064 30.2987 82.9344L44.4505 77.7836C45.127 77.5373 45.6234 77.1652 45.9114 76.6775C46.273 75.9717 45.9202 74.0581 44.8531 70.9368L47.0737 70.8305C48.1854 74.3822 48.5377 76.615 48.1534 77.5845C47.7692 78.3943 46.9625 79.0389 45.8009 79.5255L30.5215 85.0867C28.2381 85.9178 26.6385 85.16 25.7169 82.8791L19.8169 68.276L21.8466 67.5372L23.5099 71.6539L39.1557 65.9593L36.2226 58.6994L17.4193 65.5433L16.6326 63.5962L37.4938 56.0033L41.9891 67.1295ZM43.6958 53.746L68.7574 44.6243L69.5553 46.5992L57.3205 51.0523L59.0175 55.2525C63.2099 55.7047 67.5711 56.4146 72.101 57.3821L71.6081 59.6035C66.8697 58.5204 62.9482 57.7781 59.8716 57.3664L66.2549 73.1657L64.1969 73.9147L55.2626 51.8013L44.4937 55.7209L43.6958 53.746ZM86.686 38.737L95.7634 35.4331L99.6406 45.0294L90.5631 48.3333L86.686 38.737ZM96.9649 43.9294L94.5487 37.949L89.3334 39.8473L91.7496 45.8276L96.9649 43.9294ZM75.9761 40.4016L77.9495 39.6834L78.9609 42.1868L84.4581 40.1859C86.3629 44.9805 87.2273 47.9203 87.0456 49.0712C86.8357 50.2324 86.04 51.0644 84.6305 51.5774C84.1795 51.7416 83.6495 51.8707 83.0069 52.0408L81.769 50.4174L83.432 49.9717C84.4357 49.5745 84.9379 48.9769 84.9389 48.1789C84.8947 47.4292 84.3052 45.5699 83.1815 42.6288L79.5167 43.9626C80.5827 48.0415 80.0148 51.5983 77.8133 54.633L75.791 53.8695C77.823 51.2155 78.4015 48.1653 77.5434 44.6809L73.4557 46.1687L72.759 44.4441L76.9876 42.905L75.9761 40.4016ZM77.6697 56.9187L88.8896 52.835L87.9793 50.5819L90.009 49.8431L90.9193 52.0962L102.167 48.0022L102.932 49.8937L93.5441 53.3104C96.3883 54.8277 100.451 55.6783 105.709 55.8065L104.996 58.0441C99.2876 57.4416 94.9159 56.0655 91.8527 53.9261L91.6835 53.9876L95.1337 62.527L93.1039 63.2658L89.6538 54.7264L89.5128 54.7777C88.7079 58.708 86.3138 62.5466 82.3811 66.339L80.4836 64.9239C84.269 61.7275 86.7018 58.5448 87.7932 55.4036L78.4339 58.8101L77.6697 56.9187Z" fill="white"/>
</g>
<defs>
<clipPath id="clip0_2_37">
<rect width="120" height="120" fill="white" transform="translate(0.706001 0.143768)"/>
</clipPath>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

View File

@ -11,7 +11,13 @@ export default defineConfig({
target: 'http://101.37.12.135:8080', // 目标服务
changeOrigin: true,
rewrite: path => path.replace(/^\/server3/, ''),
}
},
"/ysk" : {
// 需要被代理的后台地址
"target" : "http://192.168.1.31",
"changeOrigin": true,
rewrite: (path) => path.replace(/^\/ysk/, '')
},
}
}
})

View File

@ -31,6 +31,13 @@ module.exports = {
target: 'http://101.37.12.135:8080', // 目标服务器地址
changeOrigin: true, // 是否改变源地址
rewrite: '/' // 重写路径
},
"/ysk": {
"target": "http://192.168.1.31",
changeOrigin: true,
pathRewrite: {
"^/ysk": ""
}
}
}
},

View File

@ -6,9 +6,9 @@
发布APP: HBuilderX 3.6.5 ( 3.6.11 app调试报错 )
H5, 不影响。
### 调试注意
* pad安装软件密码g415404390
* pad安装软件密码czg123456
* hbuder运行时如果是华为手机连接方式改为音源输入ipa也是
* 登录 13718478323 123
### 全局文件结构
* commons->utils>hasPermission.js 全局权限验证文件
* commons->style->global.scss 全局公共样式文件