Browse Source

Merge branch 'feature_会员权益' of elab-damai-h5/h5-dm-orderFront into master

tangy 3 weeks ago
parent
commit
b576eb48a3

+ 25 - 0
src/api/membership.ts

@@ -0,0 +1,25 @@
+import request from '@/utils/request'
+
+export function queryMember(params?: any) {
+    return request.post({ url: '/membership/queryMember', params }, { urlPrefix: '/elab-marketing-content' })
+}
+
+export function queryBenefits(params?: any) {
+    return request.post({ url: '/membership/queryBenefits', params }, { urlPrefix: '/elab-marketing-content' })
+}
+
+export function queryMemberUser(params?: any) {
+    return request.post({ url: '/membership/queryMemberUser', params }, { urlPrefix: '/elab-marketing-content' })
+}
+
+export function saveBenefits(params?: any) {
+    return request.post({ url: '/membership/saveBenefits', params }, { urlPrefix: '/elab-marketing-content' })
+}
+
+export function saveMember(params?: any) {
+    return request.post({ url: '/membership/saveMember', params }, { urlPrefix: '/elab-marketing-content' })
+}
+
+export function saveMemberBenefits(params?: any) {
+    return request.post({ url: '/membership/saveMemberBenefits', params }, { urlPrefix: '/elab-marketing-content' })
+}

+ 1 - 1
src/config/index.ts

@@ -4,7 +4,7 @@ const config = {
     version: '1.4.0', //版本号
     baseUrl: `${import.meta.env.VITE_APP_BASE_URL || 'https://gatewaytest1.elab-plus.com'}/`, //请求接口域名 http://192.168.50.19:5555/elab-marketing-file
     urlPrefix: 'elab-marketing-file/api', //请求默认前缀
-    timeout: 10 * 1000 //请求超时时长
+    timeout: 40 * 1000 //请求超时时长
 }
 
 export default config

+ 62 - 0
src/hooks/useElabPaging.ts

@@ -0,0 +1,62 @@
+import { reactive, toRaw } from 'vue'
+
+// 分页钩子函数
+interface Options {
+    page?: number
+    size?: number
+    fetchFun: (_arg: any) => Promise<any>
+    params?: Record<any, any>
+    firstLoading?: boolean
+}
+
+export function useElabPaging(options: Options) {
+    const { page = 1, size = 15, fetchFun, params = {}, firstLoading = false } = options
+    // 记录分页初始参数
+    const paramsInit: Record<any, any> = Object.assign({}, toRaw(params))
+    // 分页数据
+    const pager = reactive({
+        page,
+        size,
+        loading: firstLoading,
+        count: 0,
+        lists: [] as any[]
+    })
+    // 请求分页接口
+    const getLists = () => {
+        pager.loading = true
+        return fetchFun({
+            pageNo: pager.page,
+            pageSize: pager.size,
+            ...params
+        })
+            .then((res: any) => {
+                pager.count = res?.pageModel.rowTotal
+                pager.lists = res?.pageModel.resultSet
+                return Promise.resolve(res)
+            })
+            .catch((err: any) => {
+                return Promise.reject(err)
+            })
+            .finally(() => {
+                pager.loading = false
+            })
+    }
+    // 重置为第一页
+    const resetPage = () => {
+        pager.page = 1
+        getLists()
+    }
+    // 重置参数
+    const resetParams = () => {
+        Object.keys(paramsInit).forEach((item) => {
+            params[item] = paramsInit[item]
+        })
+        getLists()
+    }
+    return {
+        pager,
+        getLists,
+        resetParams,
+        resetPage
+    }
+}

+ 1 - 1
src/utils/request/index.ts

@@ -87,7 +87,7 @@ const axiosHooks: AxiosHooks = {
             case RequestCodeEnum.SYSTEM_ERROR:
             case RequestCodeEnum.VERIFICATION_CODE_ERROR:
                 msg && feedback.msgError(msg)
-                return Promise.reject(data)
+                return Promise.reject(response.data)
 
             case RequestCodeEnum.TOKEN_INVALID:
             case RequestCodeEnum.TOKEN_EMPTY:

+ 2 - 1
src/views/board/number/index.vue

@@ -52,6 +52,7 @@
                 :data="pager.lists"
             >
                 <el-table-column type="selection" width="55" />
+                <el-table-column label="ID" prop="id" min-width="60" />
                 <el-table-column
                     label="桌号名称"
                     prop="name"
@@ -181,7 +182,7 @@ const handleCreate = (id: number, name: any) => {
             feedback.messageBox(`<img src="${url}" alt="示例图片"  />`,url, fileName)
         })
     })
-    
+
     console.log('创建桌号二维码' + id)
 }
 

+ 138 - 0
src/views/membership/benefits/benefits.vue

@@ -0,0 +1,138 @@
+<template>
+  <div>
+    <el-card class="!border-none" shadow="never">
+      <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+        <el-form-item label="权益名称">
+          <el-input
+              class="w-[280px]"
+              v-model="queryParams.name"
+              placeholder="精准匹配"
+              clearable
+              @keyup.enter="resetPage"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="resetPage">查询</el-button>
+          <el-button @click="resetParams">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card class="!border-none mt-4" shadow="never" v-loading="pager.loading">
+      <div>
+        <el-button v-perms="['article:cate:add']" type="primary" @click="handleAdd()">
+          <template #icon>
+            <icon name="el-icon-Plus"/>
+          </template>
+          新增权益配置
+        </el-button>
+      </div>
+      <el-table class="mt-4" size="large" :data="pager.lists">
+        <el-table-column type="index" width="55"/>
+        <el-table-column label="权益图标" min-width="100">
+          <template #default="{ row }">
+            <image-contain
+                v-if="row.icon"
+                :src="row.icon"
+                :width="60"
+                :height="45"
+                fit="contain"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column label="权益名称" prop="name" min-width="120" show-tooltip-when-overflow/>
+        <el-table-column label="权益价值(元)" prop="value" min-width="80"/>
+        <el-table-column label="使用方式" prop="useMethod" min-width="100" :formatter="useMethodFormatter"/>
+        <el-table-column label="备注" prop="remark" min-width="120"/>
+        <el-table-column label="操作" min-width="180" fixed="right">
+          <template #default="{ row }">
+            <el-button
+                v-perms="['article:cate:edit']"
+                type="primary"
+                link
+                @click="handleEdit(row)"
+            >
+              编辑
+            </el-button>
+<!--            <el-button-->
+<!--                v-perms="['article:cate:del']"-->
+<!--                type="danger"-->
+<!--                link-->
+<!--                @click="handleDelete(row.id)"-->
+<!--            >-->
+<!--              删除-->
+<!--            </el-button>-->
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="flex justify-end mt-4">
+        <pagination v-model="pager" @change="getLists"/>
+      </div>
+    </el-card>
+    <edit-popup v-if="showEdit" ref="editRef" @success="getLists" @close="showEdit = false"/>
+  </div>
+</template>
+<script lang="ts" setup>
+import { useElabPaging } from '@/hooks/useElabPaging'
+import feedback from '@/utils/feedback'
+import EditPopup from './edit.vue'
+import {queryBenefits} from "@/api/membership";
+
+const queryParams = reactive({
+  name: ''
+})
+const { pager, getLists, resetPage, resetParams } = useElabPaging({
+  fetchFun: queryBenefits,
+  params: queryParams
+})
+const editRef = shallowRef<InstanceType<typeof EditPopup>>()
+const showEdit = ref(false)
+
+const handleAdd = async () => {
+  showEdit.value = true
+  await nextTick()
+  editRef.value?.open('add')
+}
+
+const handleEdit = async (data: any) => {
+  showEdit.value = true
+  await nextTick()
+  editRef.value?.open('edit')
+  editRef.value?.getDetail(data)
+}
+
+const useMethodFormatter = (row: any) => {
+  return row.useMethod == 0 ? '仅展示': ''
+}
+const volumeFormatter = (row: any) => {
+  if (row.volume == 0) {
+    return '大'
+  } else if (row.volume == 1) {
+    return '中'
+  } else if (row.volume == 2) {
+    return '小'
+  } else if (row.volume == 3) {
+    return '关闭'
+  } else {
+    return '大'
+  }
+}
+
+const handleDelete = async (id: number) => {
+  await feedback.confirm('确定要删除?')
+  // await articleCateDelete({id})
+  await delPrinter({id})
+  feedback.msgSuccess('删除成功')
+  getLists()
+}
+
+const changeStatus = async (id: number, status: any) => {
+  try {
+    await editPrinter({id, status})
+    feedback.msgSuccess('修改成功')
+    getLists()
+  } catch (error) {
+    getLists()
+  }
+}
+getLists()
+</script>

+ 118 - 0
src/views/membership/benefits/edit.vue

@@ -0,0 +1,118 @@
+<template>
+  <div class="edit-popup">
+    <popup
+        ref="popupRef"
+        :title="popupTitle"
+        :async="true"
+        width="550px"
+        @confirm="handleSubmit"
+        @close="handleClose"
+    >
+      <el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
+        <el-form-item label="权益名称" prop="name">
+          <el-input v-model="formData.name" placeholder="请输入权益名称" :maxlength="10" clearable/>
+        </el-form-item>
+        <el-form-item label="权益图标" prop="icon">
+          <material-picker v-model="formData.icon" :limit="1" />
+        </el-form-item>
+        <el-form-item label="权益价值" prop="value">
+            <el-input v-model="formData.value" type="number" placeholder="请输入权益价值" clearable />
+        </el-form-item>
+        <el-form-item label="使用方式" prop="useMethod">
+          <el-select v-model="formData.useMethod" placeholder="请选择权益使用方式">
+            <el-option label="仅展示" :value="0"/>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="formData.remark" type="textarea" clearable />
+        </el-form-item>
+      </el-form>
+    </popup>
+  </div>
+</template>
+<script lang="ts" setup>
+import type {FormInstance} from 'element-plus'
+import Popup from '@/components/popup/index.vue'
+import feedback from '@/utils/feedback'
+import {addPrinter, editPrinter, getPrinterDetail} from '@/api/shop'
+import {saveBenefits} from "@/api/membership";
+
+const emit = defineEmits(['success', 'close'])
+const formRef = shallowRef<FormInstance>()
+const popupRef = shallowRef<InstanceType<typeof Popup>>()
+const mode = ref('add')
+const popupTitle = computed(() => {
+  return mode.value == 'edit' ? '编辑' : '新增'
+})
+const formData = reactive({
+  id: '',
+  name: '',
+  icon: '',
+  value: '',
+  useMethod: 0,
+  remark: ''
+})
+
+const formRules = {
+  name: [
+    {
+      required: true,
+      message: '请输入名称',
+      trigger: ['blur']
+    }
+  ],
+  icon: [
+    {
+      required: true,
+      message: '请上传图标',
+      trigger: ['blur']
+    }
+  ],
+  useMethod: [
+    {
+      required: true,
+      message: '请选择使用方式',
+      trigger: ['blur']
+    }
+  ]
+}
+
+const handleSubmit = async () => {
+  await formRef.value?.validate()
+  await saveBenefits(formData)
+  feedback.msgSuccess('操作成功')
+  popupRef.value?.close()
+  emit('success')
+}
+
+const open = (type = 'add') => {
+  mode.value = type
+  popupRef.value?.open()
+}
+
+const setFormData = (data: Record<any, any>) => {
+  for (const key in formData) {
+    if (data[key] != null && data[key] != undefined) {
+      //@ts-ignore
+      formData[key] = data[key]
+    }
+  }
+}
+
+const getDetail = async (row: Record<string, any>) => {
+  // const data = await getPrinterDetail({
+  //   id: row.id
+  // })
+  setFormData(row)
+}
+
+const handleClose = () => {
+  emit('close')
+}
+
+defineExpose({
+  open,
+  setFormData,
+  getDetail
+})
+</script>

+ 120 - 0
src/views/membership/member/edit.vue

@@ -0,0 +1,120 @@
+<template>
+  <div class="edit-popup">
+    <popup
+        ref="popupRef"
+        :title="popupTitle"
+        :async="true"
+        width="550px"
+        @confirm="handleSubmit"
+        @close="handleClose"
+    >
+      <el-form ref="formRef" :model="formData" label-width="120px" :rules="formRules">
+        <el-form-item label="会员名称" prop="name">
+          <el-input v-model="formData.name" placeholder="请输入会员名称" :maxlength="10" clearable/>
+        </el-form-item>
+        <el-form-item label="会员等级" prop="level">
+          <el-input v-model="formData.level" type="number" placeholder="请输入会员等级" clearable/>
+        </el-form-item>
+        <el-form-item label="首充金额" prop="chargeAmount">
+            <el-input v-model="formData.chargeAmount" type="number" placeholder="请输入首充金额" clearable />
+        </el-form-item>
+        <el-form-item label="赠送金额" prop="giftAmount">
+            <el-input v-model="formData.giftAmount" type="number" placeholder="请输入赠送金额" clearable />
+        </el-form-item>
+        <el-form-item label="入园次数" prop="enterCount">
+            <el-input v-model="formData.enterCount" type="number" placeholder="请输入入园次数" clearable />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="formData.remark" type="textarea" clearable />
+        </el-form-item>
+      </el-form>
+    </popup>
+  </div>
+</template>
+<script lang="ts" setup>
+import type {FormInstance} from 'element-plus'
+// import {articleCateEdit} from '@/api/article'
+import Popup from '@/components/popup/index.vue'
+import feedback from '@/utils/feedback'
+import { saveMember} from '@/api/membership'
+
+const emit = defineEmits(['success', 'close'])
+const formRef = shallowRef<FormInstance>()
+const popupRef = shallowRef<InstanceType<typeof Popup>>()
+const mode = ref('add')
+const popupTitle = computed(() => {
+  return mode.value == 'edit' ? '编辑' : '新增'
+})
+const formData = reactive({
+  id: '',
+  name: '',
+  level: 1,
+  chargeAmount: '',
+  giftAmount: '',
+  enterCount: '',
+  remark: ''
+})
+
+const formRules = {
+  name: [
+    {
+      required: true,
+      message: '请输入名称',
+      trigger: ['blur']
+    }
+  ],
+  level: [
+    {
+      required: true,
+      message: '请输入会员等级',
+      trigger: ['blur']
+    }
+  ],
+  chargeAmount: [
+    {
+      required: true,
+      message: '请输入首充金额',
+      trigger: ['blur']
+    }
+  ]
+}
+
+const handleSubmit = async () => {
+  await formRef.value?.validate()
+  await saveMember(formData)
+  feedback.msgSuccess('操作成功')
+  popupRef.value?.close()
+  emit('success')
+}
+
+const open = (type = 'add') => {
+  mode.value = type
+  popupRef.value?.open()
+}
+
+const setFormData = (data: Record<any, any>) => {
+  for (const key in formData) {
+    if (data[key] != null && data[key] != undefined) {
+      //@ts-ignore
+      formData[key] = data[key]
+    }
+  }
+}
+
+const getDetail = async (row: Record<string, any>) => {
+  // const data = await getPrinterDetail({
+  //   id: row.id
+  // })
+  setFormData(row)
+}
+
+const handleClose = () => {
+  emit('close')
+}
+
+defineExpose({
+  open,
+  setFormData,
+  getDetail
+})
+</script>

+ 118 - 0
src/views/membership/member/member.vue

@@ -0,0 +1,118 @@
+<template>
+  <div>
+    <el-card class="!border-none" shadow="never">
+      <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+        <el-form-item label="会员名称">
+          <el-input
+              class="w-[280px]"
+              v-model="queryParams.name"
+              placeholder="精准匹配"
+              clearable
+              @keyup.enter="resetPage"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="resetPage">查询</el-button>
+          <el-button @click="resetParams">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card class="!border-none mt-4" shadow="never" v-loading="pager.loading">
+      <div>
+        <el-button v-perms="['article:cate:add']" type="primary" @click="handleAdd()">
+          <template #icon>
+            <icon name="el-icon-Plus"/>
+          </template>
+          新增会员配置
+        </el-button>
+      </div>
+      <el-table class="mt-4" size="large" :data="pager.lists">
+        <el-table-column type="index" width="55"/>
+        <el-table-column label="会员名称" prop="name" min-width="120" show-tooltip-when-overflow/>
+        <el-table-column label="会员等级" prop="level" min-width="80"/>
+        <el-table-column label="首充金额(元)" prop="chargeAmount" min-width="100" :formatter="chargeAmountFormatter"/>
+        <el-table-column label="赠送金额(元)" prop="giftAmount" min-width="100" :formatter="giftAmountFormatter"/>
+        <el-table-column label="入园次数" prop="enterCount" min-width="80"/>
+        <el-table-column label="操作" min-width="180" fixed="right">
+          <template #default="{ row }">
+            <el-button
+                v-perms="['article:cate:edit']"
+                type="primary"
+                link
+                @click="handleEdit(row)"
+            >
+              编辑
+            </el-button>
+<!--            <el-button-->
+<!--                v-perms="['article:cate:del']"-->
+<!--                type="danger"-->
+<!--                link-->
+<!--                @click="handleDelete(row.id)"-->
+<!--            >-->
+<!--              删除-->
+<!--            </el-button>-->
+          </template>
+        </el-table-column>
+      </el-table>
+      <div class="flex justify-end mt-4">
+        <pagination v-model="pager" @change="getLists"/>
+      </div>
+    </el-card>
+    <edit-popup v-if="showEdit" ref="editRef" @success="getLists" @close="showEdit = false"/>
+  </div>
+</template>
+<script lang="ts" setup>
+import { useElabPaging } from '@/hooks/useElabPaging'
+import feedback from '@/utils/feedback'
+import EditPopup from './edit.vue'
+import {queryMember} from "@/api/membership";
+
+const queryParams = reactive({
+  name: ''
+})
+const { pager, getLists, resetPage, resetParams } = useElabPaging({
+  fetchFun: queryMember,
+  params: queryParams
+})
+const editRef = shallowRef<InstanceType<typeof EditPopup>>()
+const showEdit = ref(false)
+
+const handleAdd = async () => {
+  showEdit.value = true
+  await nextTick()
+  editRef.value?.open('add')
+}
+
+const handleEdit = async (data: any) => {
+  showEdit.value = true
+  await nextTick()
+  editRef.value?.open('edit')
+  editRef.value?.getDetail(data)
+}
+
+const chargeAmountFormatter = (row: any) => {
+  return row.chargeAmount / 100
+}
+const giftAmountFormatter = (row: any) => {
+  return row.giftAmount / 100
+}
+
+const handleDelete = async (id: number) => {
+  await feedback.confirm('确定要删除?')
+  // await articleCateDelete({id})
+  await delPrinter({id})
+  feedback.msgSuccess('删除成功')
+  getLists()
+}
+
+const changeStatus = async (id: number, status: any) => {
+  try {
+    await editPrinter({id, status})
+    feedback.msgSuccess('修改成功')
+    getLists()
+  } catch (error) {
+    getLists()
+  }
+}
+getLists()
+</script>

+ 104 - 0
src/views/membership/user/user.vue

@@ -0,0 +1,104 @@
+<template>
+  <div>
+    <el-card class="!border-none" shadow="never">
+      <el-form ref="formRef" class="mb-[-16px]" :model="queryParams" :inline="true">
+        <el-form-item label="手机号">
+          <el-input
+              class="w-[280px]"
+              v-model="queryParams.mobile"
+              placeholder="模糊匹配"
+              clearable
+              @keyup.enter="resetPage"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" @click="resetPage">查询</el-button>
+          <el-button @click="resetParams">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </el-card>
+    <el-card class="!border-none mt-4" shadow="never" v-loading="pager.loading">
+      <el-table class="mt-4" size="large" :data="pager.lists">
+        <el-table-column type="index" width="55"/>
+        <el-table-column label="用户id" prop="userId" min-width="120" show-tooltip-when-overflow/>
+        <el-table-column label="手机号" prop="userMobile" min-width="120" show-tooltip-when-overflow/>
+        <el-table-column label="会员名称" prop="membershipName" min-width="80"/>
+        <el-table-column label="会员编号" prop="membershipNo" min-width="100"/>
+        <el-table-column label="账户余额(元)" prop="accountAmount" min-width="100"/>
+        <el-table-column label="入会时间" prop="time" min-width="120"/>
+<!--        <el-table-column label="操作" min-width="180" fixed="right">-->
+<!--          <template #default="{ row }">-->
+<!--            -->
+<!--          </template>-->
+<!--        </el-table-column>-->
+      </el-table>
+      <div class="flex justify-end mt-4">
+        <pagination v-model="pager" @change="getLists"/>
+      </div>
+    </el-card>
+  </div>
+</template>
+<script lang="ts" setup>
+import { useElabPaging } from '@/hooks/useElabPaging'
+import feedback from '@/utils/feedback'
+import {queryMemberUser} from "@/api/membership";
+
+const queryParams = reactive({
+  mobile: ''
+})
+const { pager, getLists, resetPage, resetParams } = useElabPaging({
+  fetchFun: queryMemberUser,
+  params: queryParams
+})
+const editRef = shallowRef<InstanceType<typeof EditPopup>>()
+const showEdit = ref(false)
+
+const handleAdd = async () => {
+  showEdit.value = true
+  await nextTick()
+  editRef.value?.open('add')
+}
+
+const handleEdit = async (data: any) => {
+  showEdit.value = true
+  await nextTick()
+  editRef.value?.open('edit')
+  editRef.value?.getDetail(data)
+}
+
+const useMethodFormatter = (row: any) => {
+  return row.useMethod == 0 ? '仅展示': ''
+}
+const volumeFormatter = (row: any) => {
+  if (row.volume == 0) {
+    return '大'
+  } else if (row.volume == 1) {
+    return '中'
+  } else if (row.volume == 2) {
+    return '小'
+  } else if (row.volume == 3) {
+    return '关闭'
+  } else {
+    return '大'
+  }
+}
+
+const handleDelete = async (id: number) => {
+  await feedback.confirm('确定要删除?')
+  // await articleCateDelete({id})
+  await delPrinter({id})
+  feedback.msgSuccess('删除成功')
+  getLists()
+}
+
+const changeStatus = async (id: number, status: any) => {
+  try {
+    await editPrinter({id, status})
+    feedback.msgSuccess('修改成功')
+    getLists()
+  } catch (error) {
+    getLists()
+  }
+}
+getLists()
+</script>

+ 277 - 175
src/views/order/console.vue

@@ -113,9 +113,7 @@
                     </div></el-scrollbar
                 >
             </div>
-            <div
-                class="p-2 md:w-1/2 w-full md:h-full h-auto float-left flex-wrap"
-            >
+            <div class="p-2 md:w-1/2 w-full md:h-full h-auto float-left flex-wrap">
                 <div class="w-full h-auto">
                     <div class="justify-end flex">
                         <el-input
@@ -126,16 +124,31 @@
                         />
                     </div>
                 </div>
-                <div class="w-full md:h-5/6 h-auto inline-block" style="height: calc(100% - 40px);">
+                <div class="w-full md:h-5/6 h-auto inline-block" style="height: calc(100% - 40px)">
                     <!-- 菜单内容 -->
                     <el-scrollbar height="100%">
                         <div
                             v-for="item in dishList"
                             :key="item.id"
                             class="float-left md:w-40 w-1/2 md:h-38 h-auto p-1"
+                            style="user-select: none"
                         >
-                            <a href="javascript:void(0);" @click="addGoods(item)"
-                                ><el-card shadow="never" :body-style="{ padding: '0px' }">
+                            <a
+                                href="javascript:void(0);"
+                                @click="addGoods(item)"
+                                :class="{ 'pointer-events-none': item.isShow == 0 }"
+                                ><el-card
+                                    shadow="never"
+                                    :body-style="{ padding: '0px' }"
+                                    :class="{ relative: item.isShow == 0 }"
+                                >
+                                    <div
+                                        v-if="item.isShow == 0"
+                                        class="absolute inset-0 bg-white z-10 pointer-events-none flex items-center justify-center select-none"
+                                        style="opacity: 0.5; color: red; font-size: 25px"
+                                    >
+                                        <span class="text-gray-600 font-medium">已售罄</span>
+                                    </div>
                                     <el-image
                                         style="width: 100%; height: 100px"
                                         :src="item.image"
@@ -157,19 +170,36 @@
                 <div class="flex items-center px-4 space-x-5">
                     <div class="relative mr-auto">
                         <el-badge :value="orderData.sumNumSum" :max="99" class="mr-3">
-                            <el-icon size="50" style="width: 32px; height: 32px; font-size: 32px"><ShoppingCart /></el-icon>
+                            <el-icon size="50" style="width: 32px; height: 32px; font-size: 32px"
+                                ><ShoppingCart
+                            /></el-icon>
                         </el-badge>
-                        <span class="ml-5 text-base">合计: ¥{{ orderData.sumPriceSum.toFixed(2) }}</span>
+                        <span class="ml-5 text-base"
+                            >合计: ¥{{ orderData.sumPriceSum.toFixed(2) }}</span
+                        >
                     </div>
-                    <el-button type="primary" class="action-btn !w-[50px] !h-[40px]" @click="toEmpty()"
-                    :disabled="data.selectGoods.length > 0 && data.selectGoods.every(good => good.status === 1)"
-                    >清空</el-button>
+                    <el-button
+                        type="primary"
+                        class="action-btn !w-[50px] !h-[40px]"
+                        @click="toEmpty()"
+                        :disabled="data.selectGoods.length <= 0"
+                        >清空</el-button
+                    >
                     <el-badge :value="params.couponId ? 1 : ''" :hidden="!params.couponId">
-                        <el-button type="primary" class="action-btn !w-[200px] !h-[40px]" @click="showCouponDialog = true">
+                        <el-button
+                            type="primary"
+                            class="action-btn !w-[200px] !h-[40px]"
+                            @click="showCouponDialog = true"
+                        >
                             优惠 {{ params.couponAmount !== '-' ? `¥${params.couponAmount}` : '' }}
                         </el-button>
                     </el-badge>
-                    <el-button type="danger" class="submit-btn !w-[300px] !h-[40px]" @click="submit()">去结算 ¥{{ orderData.payAmount }}</el-button>
+                    <el-button
+                        type="danger"
+                        class="submit-btn !w-[300px] !h-[40px]"
+                        @click="submit()"
+                        >去结算 ¥{{ orderData.payAmount }}</el-button
+                    >
                 </div>
             </template>
         </el-drawer>
@@ -277,48 +307,63 @@
         </div>
         <template #footer>
             <span class="dialog-footer">
-                <el-button type="primary" @click="showCouponDialog = false">确认</el-button>
+                <el-button type="primary" @click="ticketConfirm">确认</el-button>
             </span>
         </template>
     </el-dialog>
     <el-dialog
-            v-model="scanDialogVisible"
-            title="请使用扫码枪扫码支付"
-            width="300px"
-            center
-            :show-close="false"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-        >
-            <div class="text-center">
-                <img
-                    src="@/assets/images/scan.gif"
-                    alt="扫码"
-                    class="mx-auto mb-4"
-                    style="width: 150px"
-                />
+        v-model="scanDialogVisible"
+        title="请引导顾客扫码支付"
+        width="300px"
+        center
+        :show-close="false"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+    >
+        <div class="text-center">
+            <img
+                src="@/assets/images/scan.gif"
+                alt="扫码"
+                class="mx-auto mb-4"
+                style="width: 150px"
+            />
+            <b style="font-size: 20px">金额 {{ orderData.payAmount }} 元</b>
+        </div>
+        <template #footer>
+            <div class="dialog-footer">
+                <el-button @click="scanDialogVisible = false">取消支付</el-button>
             </div>
-            <template #footer>
-                <div class="dialog-footer">
-                    <el-button @click="scanDialogVisible = false">取消支付</el-button>
-                </div>
-            </template>
-        </el-dialog>
-        <el-dialog
-            v-model="payingDialogVisible"
-            title="支付处理中"
-            width="300px"
-            :show-close="false"
-            :close-on-click-modal="false"
-            :close-on-press-escape="false"
-        >
-            <div class="flex flex-col items-center justify-center py-4">
+        </template>
+    </el-dialog>
+    <el-dialog
+        v-model="payingDialogVisible"
+        title="支付处理中"
+        width="300px"
+        :show-close="false"
+        :close-on-click-modal="false"
+        :close-on-press-escape="false"
+    >
+        <div class="flex flex-col items-center justify-center py-4">
             <el-icon class="is-loading mb-4" :size="32">
                 <Loading />
             </el-icon>
             <p class="text-gray-600">正在支付中,请不要关闭或退出界面</p>
-            </div>
-        </el-dialog>
+        </div>
+    </el-dialog>
+    <el-dialog
+        v-model="takeNumberDialogVisible"
+        title="取餐号"
+        width="30%"
+        :close-on-click-modal="false"
+    >
+        <el-input v-model="takeNumber" placeholder="请输入取餐号" maxlength="10" show-word-limit />
+        <template #footer>
+            <span class="dialog-footer">
+                <el-button @click="takeNumberDialogVisible = false">取消</el-button>
+                <el-button type="primary" @click="confirmSubmit">确认结算</el-button>
+            </span>
+        </template>
+    </el-dialog>
 </template>
 
 <script setup lang="ts">
@@ -384,6 +429,9 @@ const params = reactive({
     couponAmount: '-',
     diningMethods: 1 // 就餐方式:1店内就餐 2打包外带
 })
+// 添加取餐号相关的变量
+const takeNumberDialogVisible = ref(false)
+const takeNumber = ref('')
 const submit = () => {
     //出单
     if (data.selectGoods.length == 0) {
@@ -394,92 +442,124 @@ const submit = () => {
         feedback.alert('支付金额需大于0!')
         return false
     }
+    // 显示取餐号输入弹框
+    takeNumberDialogVisible.value = true
+}
+// 添加确认提交函数
+const confirmSubmit = () => {
+    if (!takeNumber.value) {
+        feedback.msgError('请输入取餐号')
+        return
+    }
+    takeNumberDialogVisible.value = false
     feedback.loading('正在出单...')
     orderSubmit({
         ...params,
         userId: params.userId || null,
-        couponId: params.couponId || null
-    }).then(() => {
-        // data.selectGoods.length = 0
-        // orderData.priceSum = 0
-        // orderData.numSum = 0
-        //把所有餐品的状态修改为出单
-        data.selectGoods.forEach((good: { status: number }) => {
-            good.status = 1
-        })
-        // emit('init')
-        feedback.closeLoading()
-        // feedback.notifySuccess('出单成功')
-        checkout()
+        couponId: params.couponId || null,
+        mealCode: takeNumber.value
     })
-}
+        .then(() => {
+            // data.selectGoods.length = 0
+            // orderData.priceSum = 0
+            // orderData.numSum = 0
+            //把所有餐品的状态修改为出单
+            data.selectGoods.forEach((good: { status: number }) => {
+                good.status = 1
+            })
+            // emit('init')
+            feedback.closeLoading()
+            // feedback.notifySuccess('出单成功')
+            checkout()
+        }).catch((e)=>{
+          if (e.msg === "券不存在" || e.msg === "券不存在或已过期") {
+            params.couponId = null
+            params.couponAmount = '-'
+            // 计算支付金额
+            orderData.payAmount = Number(orderData.sumPriceSum).toFixed(2)
+            searchUserCoupons()
+          }
 
+    })
+        .finally(() => {
+            feedback.closeLoading()
+        });
+}
 
 // 添加扫码事件监听函数
 const handleScanInput = (event: KeyboardEvent) => {
-    if (event.key === 'Enter') {
-        const code = scanCode.value
-        console.log('扫码内容:', code)
-        if (!data.canScan) {
-            feedback.notifyWarning('正在处理支付,请勿重复扫码')
-            return
-        }
-        data.canScan = false
-        payingDialogVisible.value = true // 显示支付中对话框
 
-        document.removeEventListener('keydown', handleScanInput)
-        // 修改支付处理逻辑
-        orderPay({ oid: params.number, code: code })
-          .then((res) => {
-            console.log(res)
-            // 实际上支付成功之后,res返回的是[],如果不是实时成功,返回的是个对象, 形如:{orderId: '123456789', sn: '7895004131583689'}
-            if (res == null || res.length == 0) {
-              feedback.notifySuccess('成功结账' + orderData.payAmount + '元')
-              scanDialogVisible.value = false
-              payingDialogVisible.value = false // 隐藏支付中对话框
-              showOrderConsole.value = false
-              emit('init')
-            } else {
-              console.log('支付中')
-              return queryPayStatusWithRetry(res)
-                  .then((paySuccess) => {
-                    if (paySuccess) {
-                      feedback.notifySuccess('成功结账' + orderData.payAmount + '元')
-                      scanDialogVisible.value = false
-                      showOrderConsole.value = false
-                      emit('init')
-                    }
-                  })
-            }
-          })
-          .catch(() => {
-            // 支付失败
+  console.log("event.key", event.key)
+  if (event.key === 'Enter') {
+    document.removeEventListener('keydown', handleScanInput)
+    if (!data.canScan) {
+      feedback.notifyWarning('正在处理支付,请勿重复扫码')
+      return
+    }
+    const code = scanCode.value
+    console.log('扫码内容:', code)
+    payingDialogVisible.value = true // 显示支付中对话框
+
+    // 修改支付处理逻辑
+    orderPay({ oid: params.number, code: code })
+        .then((res) => {
+          console.log(res)
+          // 实际上支付成功之后,res返回的是[],如果不是实时成功,返回的是个对象, 形如:{orderId: '123456789', sn: '7895004131583689'}
+          if (res == null || res.length == 0) {
+            feedback.notifySuccess('成功结账' + orderData.payAmount + '元')
+            scanDialogVisible.value = false
             payingDialogVisible.value = false // 隐藏支付中对话框
-            feedback.confirm('支付失败,请重试').then(() => {
-                data.canScan = true
-                scanDialogVisible.value = true
-                // 添加键盘事件监听
-                document.addEventListener('keydown', handleScanInput)
-            })
+            showOrderConsole.value = false
+            emit('init')
+          } else {
+            console.log('支付中')
+            return queryPayStatusWithRetry(res)
+                .then((paySuccess) => {
+                  if (paySuccess) {
+                    feedback.notifySuccess('成功结账' + orderData.payAmount + '元')
+                    scanDialogVisible.value = false
+                    payingDialogVisible.value = false // 隐藏支付中对话框
+                    showOrderConsole.value = false
+                    emit('init')
+                  }
+                })
+          }
+        })
+        .catch((e) => {
+          console.log("=====---", e)
+          // 支付失败
+          payingDialogVisible.value = false // 隐藏支付中对话框
+          feedback.notifySuccess('支付失败,请重试')
+            data.canScan = true
+            scanDialogVisible.value = true
+            // 添加键盘事件监听
+            setTimeout(()=>{
+              scanCode.value = ''
+              document.removeEventListener('keydown', handleScanInput)
+              document.addEventListener('keydown', handleScanInput)
+            }, 2000)
           })
-        scanCode.value = ''
-    } else {
-        scanCode.value += event.key
-    }
+    scanCode.value = ''
+  } else {
+    scanCode.value += event.key
+  }
 }
 
 // 定义查询支付状态的函数
 const queryPayStatusWithRetry = (data): Promise<boolean> => {
-    const intervals = [3000, 5000, 10000]
+    const intervals = [3000, 5000, 10000, 10000, 10000, 10000, 10000]
     let currentIndex = 0
     payingDialogVisible.value = true
 
     const tryQuery = () => {
         return new Promise<boolean>((resolve) => {
             setTimeout(() => {
-                queryPayStatus({ orderId: data.orderId,sn: data.sn })
+                queryPayStatus({ orderId: data.orderId, sn: data.sn })
                     .then((result) => {
-                        if (result.result_code == '200' && result.biz_response.data.order_status == 'SUCCESS') {
+                        if (
+                            result.result_code == '200' &&
+                            result.biz_response.data.order_status == 'SUCCESS'
+                        ) {
                             resolve(true)
                         } else if (currentIndex < intervals.length - 1) {
                             currentIndex++
@@ -503,7 +583,7 @@ const queryPayStatusWithRetry = (data): Promise<boolean> => {
     return tryQuery().then((success) => {
         payingDialogVisible.value = false
         if (!success) {
-            return cancelOrder({ orderId: data.orderId,sn: data.sn })
+            return cancelOrder({ orderId: data.orderId, sn: data.sn })
                 .then(() => {
                     feedback.notifyWarning('支付超时,已自动撤销本次支付')
                     return false
@@ -518,6 +598,17 @@ const queryPayStatusWithRetry = (data): Promise<boolean> => {
     })
 }
 
+const ticketConfirm = () => {
+    if (data.phone == '') {
+        params.couponId = null
+        params.couponAmount = '-'
+        params.userId = null
+        // 计算支付金额
+        orderData.payAmount = Number(orderData.sumPriceSum).toFixed(2)
+    }
+    showCouponDialog.value = false
+}
+
 const checkout = () => {
     refreshdishes()
     //结账
@@ -526,16 +617,20 @@ const checkout = () => {
     //     feedback.notify('请点击商品开始点单吧!')
     //     return false
     // }
-    feedback.confirm('结账金额为' + orderData.payAmount + ',确定要结账吗?').then(() => {
-        data.canScan = true
-        scanDialogVisible.value = true
-        // 添加键盘事件监听
-        document.addEventListener('keydown', handleScanInput)
-    })
+    // feedback.confirm('结账金额为' + orderData.payAmount + ',确定要结账吗?').then(() => {
+
+    scanCode.value = ''
+    data.canScan = true
+    scanDialogVisible.value = true
+    // 添加键盘事件监听
+
+    document.removeEventListener('keydown', handleScanInput)
+    document.addEventListener('keydown', handleScanInput)
+    // })
 }
 // 添加优惠券点击处理方法
 const handleCouponClick = (coupon: any) => {
-    if (orderData.sumPriceSum < coupon.consumeScore / 100) {
+    if (orderData.sumPriceSum <= coupon.consumeScore / 100) {
         return
     }
     if (params.couponId === coupon.ticketRecordId) {
@@ -561,6 +656,7 @@ const open = (item: any, num?: number, orderNumber?: any) => {
     params.number = item.ordersId ? item.ordersId : orderNumber
     params.userId = ''
     params.couponId = ''
+    takeNumber.value = ''
     //查询当前订单下的所有菜品
     deskOrderedDishListAll({ id: params.number }).then((res) => {
         res.forEach((good: { id: number; ordersDishId: number }) => {
@@ -575,6 +671,7 @@ const open = (item: any, num?: number, orderNumber?: any) => {
             params.userId = res[0].userId || null
             params.couponId = res[0].ticketId || null
             params.diningMethods = res[0].diningMethods || 1
+            takeNumber.value = res[0].mealCode || ''
             if (params.couponId && params.userId) {
                 searchUserCoupons()
             }
@@ -604,8 +701,9 @@ const open = (item: any, num?: number, orderNumber?: any) => {
                 0
             )
             orderData.payAmount = Number(
-              orderData.sumPriceSum - (params.couponAmount === '-' ? 0 : Number(params.couponAmount))
-          ).toFixed(2)
+                orderData.sumPriceSum -
+                    (params.couponAmount === '-' ? 0 : Number(params.couponAmount))
+            ).toFixed(2)
         } else {
             orderData.priceSum = 0
             orderData.numSum = 0
@@ -625,52 +723,58 @@ const open = (item: any, num?: number, orderNumber?: any) => {
 
 const refreshdishes = async () => {
     orderLoading.value = true
-    await deskOrderedDishListAll({ id: params.number }).then((res) => {
-        res.forEach((good: { id: number; ordersDishId: number }) => {
-            good.ordersDishId = good.id
+    await deskOrderedDishListAll({ id: params.number })
+        .then((res) => {
+            res.forEach((good: { id: number; ordersDishId: number }) => {
+                good.ordersDishId = good.id
+            })
+            console.log('***refreshdishes***', res)
+            data.selectGoods = res
+            console.log('***res.length***', res.length)
+            if (res.length > 0) {
+                // const _list = res.filter((it: { status: number }) => it.status != 1) //找到没有出单的餐品来计算价格
+                const _list = res
+                orderData.priceSum = _list.reduce(
+                    (accumulator: number, currentValue: { summary: number; num: number }) =>
+                        accumulator + currentValue.summary * currentValue.num,
+                    0
+                )
+                orderData.numSum = _list.reduce(
+                    (accumulator: number, currentValue: { summary: number; num: number }) =>
+                        accumulator + currentValue.num,
+                    0
+                )
+                //所有餐品的总价以及总数量
+                orderData.sumPriceSum = res.reduce(
+                    (accumulator: number, currentValue: { summary: number; num: number }) =>
+                        accumulator + currentValue.summary * currentValue.num,
+                    0
+                )
+                orderData.sumNumSum = res.reduce(
+                    (accumulator: number, currentValue: { summary: number; num: number }) =>
+                        accumulator + currentValue.num,
+                    0
+                )
+                console.log(
+                    '***res[0].payAmount***',
+                    res[0].payAmount,
+                    Number(res[0].payAmount / 100).toFixed(2)
+                )
+                orderData.payAmount = res[0].payAmount
+                    ? Number(res[0].payAmount / 100).toFixed(2)
+                    : Number(orderData.sumPriceSum).toFixed(2)
+                console.log('***orderData***', orderData)
+            } else {
+                orderData.priceSum = 0
+                orderData.numSum = 0
+                orderData.sumPriceSum = 0
+                orderData.sumNumSum = 0
+                orderData.payAmount = 0
+            }
+        })
+        .finally(() => {
+            orderLoading.value = false
         })
-        console.log('***refreshdishes***', res)
-        data.selectGoods = res
-        console.log('***res.length***', res.length)
-        if (res.length > 0) {
-            // const _list = res.filter((it: { status: number }) => it.status != 1) //找到没有出单的餐品来计算价格
-            const _list = res
-            orderData.priceSum = _list.reduce(
-                (accumulator: number, currentValue: { summary: number; num: number }) =>
-                    accumulator + currentValue.summary * currentValue.num,
-                0
-            )
-            orderData.numSum = _list.reduce(
-                (accumulator: number, currentValue: { summary: number; num: number }) =>
-                    accumulator + currentValue.num,
-                0
-            )
-            //所有餐品的总价以及总数量
-            orderData.sumPriceSum = res.reduce(
-                (accumulator: number, currentValue: { summary: number; num: number }) =>
-                    accumulator + currentValue.summary * currentValue.num,
-                0
-            )
-            orderData.sumNumSum = res.reduce(
-                (accumulator: number, currentValue: { summary: number; num: number }) =>
-                    accumulator + currentValue.num,
-                0
-            )
-          console.log('***res[0].payAmount***', res[0].payAmount, Number(res[0].payAmount / 100).toFixed(2))
-            orderData.payAmount = res[0].payAmount
-                ? Number(res[0].payAmount / 100).toFixed(2)
-                : Number(orderData.sumPriceSum).toFixed(2)
-          console.log('***orderData***', orderData)
-        } else {
-          orderData.priceSum = 0
-          orderData.numSum = 0
-          orderData.sumPriceSum = 0
-          orderData.sumNumSum = 0
-          orderData.payAmount = 0
-        }
-    }).finally(() => {
-       orderLoading.value = false
-    })
 }
 watch(search, (value) => {
     if (!value) {
@@ -706,13 +810,10 @@ const clickSortButton = (name: any) => {
 //清空订单下的菜品
 const toEmpty = () => {
     if (data.selectGoods.length != 0) {
-      orderLoading.value = true
-        toEmptyy({ id: params.number }).finally(()=>{
-
+        orderLoading.value = true
+        toEmptyy({ id: params.number }).finally(() => {
             //清空未出单的餐品-保留出单餐品
-            data.selectGoods = data.selectGoods.filter((good: { status: number }) => {
-                return good.status == 1
-            })
+            data.selectGoods = []
             orderData.sumPriceSum = data.selectGoods.reduce(
                 (accumulator: number, currentValue: { summary: number; num: number }) =>
                     accumulator + currentValue.summary * currentValue.num,
@@ -736,10 +837,11 @@ const toEmpty = () => {
                 params.couponAmount = '-'
                 orderData.payAmount = orderData.sumPriceSum
             }
-          orderData.payAmount = Number(
-              orderData.sumPriceSum - (params.couponAmount === '-' ? 0 : Number(params.couponAmount))
-          ).toFixed(2)
-          orderLoading.value = false
+            orderData.payAmount = Number(
+                orderData.sumPriceSum -
+                    (params.couponAmount === '-' ? 0 : Number(params.couponAmount))
+            ).toFixed(2)
+            orderLoading.value = false
         })
     }
 }
@@ -1056,7 +1158,7 @@ defineExpose({
 }
 
 :deep(.el-divider--horizontal) {
-  margin: 8px 0;
+    margin: 8px 0;
 }
 
 .cate-buttons :deep(.el-button) {

+ 2 - 2
src/views/order/goodsItem.vue

@@ -22,8 +22,8 @@
                 }}</span>
                 <span class="float-right">
                     <el-button-group size="small">
-                        <el-button @click="reduce()" :disabled="props.goodsItem.status==1"> - </el-button>
-                        <el-button @click="add()" :disabled="props.goodsItem.status==1"> + </el-button>
+                        <el-button @click="reduce()"> - </el-button>
+                        <el-button @click="add()" :disabled="props.goodsItem.isShow==0"> + </el-button>
                     </el-button-group>
                 </span>
             </div>

+ 104 - 81
src/views/order/index.vue

@@ -62,15 +62,15 @@
                     继续点餐
                 </el-button>
                 <br />
-                <el-button
-                    class="w-full mt-1"
-                    plain
-                    :disabled="currentDeskStatus == 2"
-                    @click="checkout()"
-                >
-                    结账
-                </el-button>
-                <br />
+<!--                <el-button-->
+<!--                    class="w-full mt-1"-->
+<!--                    plain-->
+<!--                    :disabled="currentDeskStatus == 2"-->
+<!--                    @click="checkout()"-->
+<!--                >-->
+<!--                    结账-->
+<!--                </el-button>-->
+<!--                <br />-->
             </div>
             <div v-if="currentDeskStatus == 2">
                 <el-radio-group v-model="data.userNum" size="small">
@@ -85,11 +85,13 @@
                 </el-radio-group>
                 <el-button class="w-full" plain @click="order()">开始点餐</el-button>
             </div>
-            <el-button v-if="currentDeskStatus != 2" class="w-full mt-1" plain @click="rockover()">翻台</el-button>
+            <el-button v-if="currentDeskStatus != 2" class="w-full mt-1" plain @click="rockover()"
+                >翻台</el-button
+            >
         </el-dialog>
         <el-dialog
             v-model="scanDialogVisible"
-            title="请使用扫码枪扫码支付"
+            title="请引导顾客扫码支付"
             width="300px"
             center
             :show-close="false"
@@ -103,6 +105,7 @@
                     class="mx-auto mb-4"
                     style="width: 150px"
                 />
+                <b style="font-size: 20px">金额 {{ currentDeskAmount }} 元</b>
             </div>
             <template #footer>
                 <div class="dialog-footer">
@@ -119,10 +122,10 @@
             :close-on-press-escape="false"
         >
             <div class="flex flex-col items-center justify-center py-4">
-            <el-icon class="is-loading mb-4" :size="32">
-                <Loading />
-            </el-icon>
-            <p class="text-gray-600">正在支付中,请不要关闭或退出界面</p>
+                <el-icon class="is-loading mb-4" :size="32">
+                    <Loading />
+                </el-icon>
+                <p class="text-gray-600">正在支付中,请不要关闭或退出界面</p>
             </div>
         </el-dialog>
     </div>
@@ -132,7 +135,15 @@
 // 在 script setup 部分添加
 import { Loading } from '@element-plus/icons-vue'
 import { postAll } from '@/api/org/post'
-import { orderDeskList, createOrders, orderCheckout, orderPay, queryPayStatus, cancelOrder, rockoverDesk } from '@/api/order'
+import {
+    orderDeskList,
+    createOrders,
+    orderCheckout,
+    orderPay,
+    queryPayStatus,
+    cancelOrder,
+    rockoverDesk
+} from '@/api/order'
 import Console from './console.vue'
 import { getOrdersCurrent } from '@/api/orders'
 import feedback from '@/utils/feedback'
@@ -145,6 +156,7 @@ const dialogVisible = ref(false)
 const isLoading = ref(false)
 const currentDeskStatus = ref()
 const currentDeskMaxNum = ref<number>()
+const currentDeskAmount = ref<number>()
 const areaList = ref<any[]>([])
 const deskList = ref<any[]>([])
 let currentDesk: any = {}
@@ -173,15 +185,18 @@ const order = () => {
     // router.push({ path: '/order/console', query: { deskID: id } })
 }
 const rockover = () => {
-  feedback.confirm('将重置桌号状态, 确定翻台吗?').then(() => {
-    rockoverDesk(data).then(() => {
-      feedback.notifySuccess('翻台成功!')
-      dialogVisible.value = false
-      init()
-    })
-  }).catch(()=>{
-    dialogVisible.value = false
-  })
+    feedback
+        .confirm('将重置桌号状态, 确定翻台吗?')
+        .then(() => {
+            rockoverDesk(data).then(() => {
+                feedback.notifySuccess('翻台成功!')
+                dialogVisible.value = false
+                init()
+            })
+        })
+        .catch(() => {
+            dialogVisible.value = false
+        })
 }
 const reorder = () => {
     dialogVisible.value = false
@@ -200,69 +215,74 @@ const payingDialogVisible = ref(false)
 
 // 添加扫码事件监听函数
 const handleScanInput = (event: KeyboardEvent) => {
-    if (event.key === 'Enter') {
-        const code = scanCode.value
-        console.log('扫码内容:', code)
-        if (!data.canScan) {
-            feedback.notifyWarning('正在处理支付,请勿重复扫码')
-            return
-        }
-        data.canScan = false
-        payingDialogVisible.value = true // 显示支付中对话框
-        document.removeEventListener('keydown', handleScanInput)
+  if (event.key === 'Enter') {
+    const code = scanCode.value
+    console.log('扫码内容:', code)
+    if (!data.canScan) {
+      feedback.notifyWarning('正在处理支付,请勿重复扫码')
+      return
+    }
+    data.canScan = false
+    payingDialogVisible.value = true // 显示支付中对话框
 
-        // 修改支付处理逻辑
-        orderPay({ oid: currentDesk.oid, code: code })
-          .then((res) => {
-            console.log(res)
-            // 实际上支付成功之后,res返回的是[],如果不是实时成功,返回的是个对象, 形如:{orderId: '123456789', sn: '7895004131583689'}
-            if (res == null || res.length == 0) {
-              feedback.notifySuccess('成功结账' + currentDesk.amount + '元')
-              scanDialogVisible.value = false
-              dialogVisible.value = false
-              payingDialogVisible.value = false // 隐藏支付中对话框
-              init()
-            } else {
-              console.log('支付中')
-              return queryPayStatusWithRetry(res)
-                  .then((paySuccess) => {
-                    if (paySuccess) {
-                      feedback.notifySuccess('成功结账' + currentDesk.amount + '元')
-                      scanDialogVisible.value = false
-                      dialogVisible.value = false
-                      init()
-                    }
-                  })
-            }
-          })
-          .catch(() => {
+    document.removeEventListener('keydown', handleScanInput)
+    // 修改支付处理逻辑
+    orderPay({ oid: params.number, code: code })
+        .then((res) => {
+          console.log(res)
+          // 实际上支付成功之后,res返回的是[],如果不是实时成功,返回的是个对象, 形如:{orderId: '123456789', sn: '7895004131583689'}
+          if (res == null || res.length == 0) {
+            feedback.notifySuccess('成功结账' + orderData.payAmount + '元')
+            scanDialogVisible.value = false
             payingDialogVisible.value = false // 隐藏支付中对话框
-
-            feedback.confirm('支付失败,请重试').then(() => {
-                data.canScan = true
-                scanDialogVisible.value = true
-                // 添加键盘事件监听
-                document.addEventListener('keydown', handleScanInput)
-            })
+            showOrderConsole.value = false
+            emit('init')
+          } else {
+            console.log('支付中')
+            return queryPayStatusWithRetry(res)
+                .then((paySuccess) => {
+                  if (paySuccess) {
+                    feedback.notifySuccess('成功结账' + orderData.payAmount + '元')
+                    scanDialogVisible.value = false
+                    payingDialogVisible.value = false // 隐藏支付中对话框
+                    showOrderConsole.value = false
+                    emit('init')
+                  }
+                })
+          }
+        })
+        .catch((e) => {
+          console.log(e)
+          // 支付失败
+          payingDialogVisible.value = false // 隐藏支付中对话框
+          feedback.confirm('支付失败,请重试').then(() => {
+            data.canScan = true
+            scanDialogVisible.value = true
+            // 添加键盘事件监听
+            document.addEventListener('keydown', handleScanInput)
           })
-        scanCode.value = ''
-    } else {
-        scanCode.value += event.key
-    }
+        })
+    scanCode.value = ''
+  } else {
+    scanCode.value += event.key
+  }
 }
 
 // 定义查询支付状态的函数
 const queryPayStatusWithRetry = (data): Promise<boolean> => {
-    const intervals = [3000, 5000, 10000]
+    const intervals = [3000, 5000, 10000, 10000, 10000, 10000, 10000]
     let currentIndex = 0
     payingDialogVisible.value = true
 
     const tryQuery = () => {
         return new Promise<boolean>((resolve) => {
             setTimeout(() => {
-                queryPayStatus({ orderId: data.orderId,sn: data.sn })
+                queryPayStatus({ orderId: data.orderId, sn: data.sn })
                     .then((result) => {
-                        if (result.result_code == '200' && result.biz_response.data.order_status == 'SUCCESS') {
+                        if (
+                            result.result_code == '200' &&
+                            result.biz_response.data.order_status == 'SUCCESS'
+                        ) {
                             resolve(true)
                         } else if (currentIndex < intervals.length - 1) {
                             currentIndex++
@@ -286,7 +306,7 @@ const queryPayStatusWithRetry = (data): Promise<boolean> => {
     return tryQuery().then((success) => {
         payingDialogVisible.value = false
         if (!success) {
-            return cancelOrder({ orderId: data.orderId,sn: data.sn })
+            return cancelOrder({ orderId: data.orderId, sn: data.sn })
                 .then(() => {
                     feedback.notifyWarning('支付超时,已自动撤销本次支付')
                     return false
@@ -312,12 +332,15 @@ const checkout = () => {
     orderCheckout({ did: currentDesk.id }).then((res) => {
         console.log('结账', res)
         currentDesk.oid = res.id
-        feedback.confirm(currentDesk.name + ' 结账金额为' + currentDesk.amount + ',确定要结账吗?').then(() => {
-            data.canScan = true
-            scanDialogVisible.value = true
-            // 添加键盘事件监听
-            document.addEventListener('keydown', handleScanInput)
-        })
+        feedback
+            .confirm(currentDesk.name + ' 结账金额为' + currentDesk.amount + ',确定要结账吗?')
+            .then(() => {
+                data.canScan = true
+                currentDeskAmount.value = currentDesk.amount
+                scanDialogVisible.value = true
+                // 添加键盘事件监听
+                document.addEventListener('keydown', handleScanInput)
+            })
     })
 }
 

+ 13 - 20
src/views/orders/list.vue

@@ -91,36 +91,28 @@
                     </template>
                 </el-table-column>
                 <el-table-column type="index" min-width="80" />
-                <el-table-column label="订单号" prop="number" show-overflow-tooltip></el-table-column>
+                <el-table-column label="订单号" prop="number" min-width="180" show-overflow-tooltip></el-table-column>
                 <el-table-column label="支付金额" min-width="160" prop="amount">
                     <template #default="{ row }">
                         <div>
                             <div :style="row.status > 1 && row.status != 6 ? 'text-decoration: line-through;': ''" v-if="row.status > 1 && row.status != 6">订单金额:¥{{row.amount}}</div>
                             <div style="color: #f01414;" v-if="row.status >= 2 && row.status != 6">
-                              实付:¥{{row.payAmount || row.amount}}   {{row.status==4 ? '退款:¥' + row.refundAmount : ''}}
+                              实付金额:¥{{row.payAmount || row.amount}}
                             </div>
                             <div v-if="row.ticketNo" class="refund-info">
-                                <div style="font-size: 12px;">抵扣券号:{{ row.ticketNo }}</div>
-                                <div style="font-size: 12px;">抵扣金额:¥{{ row.ticketAmount }}</div>
+                                <div style="font-size: 12px;">抵扣券号:{{ row.ticketNo }}</div>
+                                <div style="font-size: 12px;">抵扣金额:¥{{ row.ticketAmount }}</div>
                             </div>
                         </div>
                     </template>
                 </el-table-column>
                 <el-table-column label="桌号" prop="deskName"></el-table-column>
-                <el-table-column label="备注" prop="remark"  min-width="150" show-tooltip-when-overflow>
-                    <!-- <template #default="{ row }">
-                        <div class="remark-text">
-                            {{row.remark}}
-                        </div>
-                    </template> -->
-                </el-table-column>
-                <el-table-column label="类型" prop="type"
-                    :formatter="(row: any) => (row.type == 0 ? '后台点单' : '扫码点单')"></el-table-column>
-                <el-table-column label="状态" min-width="160" prop="status" >
+                <el-table-column label="备注" prop="remark"  min-width="100" show-tooltip-when-overflow></el-table-column>
+                <el-table-column label="状态" min-width="170" prop="status" >
                     <template #default="{ row }">
                         <div>
                             {{ row.status == 4 ? '退款成功' : row.status == 2 ? '已完成' : row.status == 0 ? '待下单'
-                            : row.status == 1 ? '待支付' : row.status == 5 ? '退款中' : '已取消' }}
+                            : row.status == 1 ? '待支付' : row.status == 5 ? '退款中' : row.status == 3 ? '支付失败' : '已关闭' }}
                             <div v-if="row.refundStatus=='SUCCESS'" class="refund-info">
                                 <div>退款时间:{{ row.refundTime }}</div>
                                 <div>退款金额:¥{{ row.refundAmount }}</div>
@@ -128,11 +120,12 @@
                         </div>
                     </template>
                 </el-table-column>
+                <el-table-column label="类型" prop="type" :formatter="(row: any) => (row.type == 0 ? '后台点单' : '扫码点单')"></el-table-column>
                 <el-table-column label="结账时间" prop="checkoutTime"></el-table-column>
                 <el-table-column label="创建时间" prop="createTime"></el-table-column>
-                <el-table-column label="操作" width="200" fixed="right">
+                <el-table-column label="操作" width="60" fixed="right">
                     <template #default="{ row }">
-                        <el-button type="primary" link @click="showDetail(row)">查看已点菜品</el-button>
+<!--                        <el-button type="primary" link @click="showDetail(row)">查看已点菜品</el-button>-->
                         <el-button v-if="row.status=='2' && !row.refundAmount" type="danger" link @click="refund(row)">退款</el-button>
                     </template>
                 </el-table-column>
@@ -210,7 +203,7 @@
     }
     // 添加这些变量到组件顶层
     const refundDialogVisible = ref(false)
-    const refundAmount = ref(0)
+    const refundAmount = ref('')
     var refundOrder: {
         refundTime: string;
         refundAmount: number;
@@ -223,7 +216,7 @@
     // 修改refund函数
     const refund = async (row: any) => {
         refundDialogVisible.value = true
-        refundAmount.value = 0
+        refundAmount.value = ''
         refundOrder = row;
     }
 
@@ -280,7 +273,7 @@
                 // 展开当前行
                 expandRowKeys.value = [row.id]
             } else {
-                feedback.msgError('获取订单详情失败111')
+                feedback.msgError('获取订单详情失败')
             }
         } catch (error) {
             console.error('获取订单详情失败:', error)