index.vue 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. <template>
  2. <div class="order-index">
  3. <el-card shadow="never">
  4. <el-tabs v-model="activeName" @tab-change="tabChange">
  5. <el-tab-pane label="全部餐桌" name="all"></el-tab-pane>
  6. <el-tab-pane
  7. v-for="item in areaList"
  8. :key="item.id"
  9. :label="item.name"
  10. :name="item.name"
  11. ></el-tab-pane>
  12. </el-tabs>
  13. <div
  14. v-for="i in deskList"
  15. :key="i"
  16. class="p-1 flex-wrap float-left text-center md:w-28 h-28 w-1/3"
  17. >
  18. <a href="javascript:void(0);" @click="order_(i)"
  19. ><div
  20. class="rounded w-full h-full pt-3 relative"
  21. :style="
  22. i.status == 2
  23. ? 'background-color: rgba(243, 244, 246);color:rgba(75, 85, 99)'
  24. : 'background-color: rgba(91,136,73);color:rgba(255, 255, 255)'
  25. "
  26. >
  27. <p class="font-semibold text-xl">
  28. {{ i.name }}
  29. </p>
  30. <el-tag round>{{
  31. i.status == 2 ? '空闲' : i.status == 0 ? '点餐中' : '就餐中'
  32. }}</el-tag>
  33. <div class="text-xl font-semibold">
  34. <!-- {{ i.status == 2 ? ' ' : '¥888.88' }} -->
  35. {{ i.amount ? '¥' + i.amount.toFixed(2) : ' ' }}
  36. </div>
  37. <div
  38. class="w-full"
  39. :style="'background-color: rgba(255, 255, 255, 0.4);position: absolute;bottom: 0px;'"
  40. >
  41. {{ (i.userNum ? i.userNum : '0') + '/' + i.num }}
  42. </div>
  43. </div></a
  44. >
  45. </div>
  46. </el-card>
  47. <footer-btns v-perms="['setting:website:save']">
  48. <el-button icon="RefreshRight" :loading="isLoading" type="primary" @click="refresh()"
  49. >刷新桌台</el-button
  50. >
  51. </footer-btns>
  52. <el-dialog
  53. width="300px"
  54. v-model="dialogVisible"
  55. :show-close="false"
  56. center
  57. top="0px"
  58. :title="currentDeskStatus == 2 ? '选择就餐人数' : ''"
  59. >
  60. <div v-if="currentDeskStatus != 2">
  61. <el-button class="w-full" type="primary" plain @click="reorder()">
  62. 继续点餐
  63. </el-button>
  64. <br />
  65. <el-button
  66. class="w-full mt-1"
  67. plain
  68. :disabled="currentDeskStatus == 2"
  69. @click="checkout()"
  70. >
  71. 结账
  72. </el-button>
  73. <br />
  74. </div>
  75. <div v-if="currentDeskStatus == 2">
  76. <el-radio-group v-model="data.userNum" size="small">
  77. <el-radio
  78. class="!mr-1 mb-1"
  79. v-for="item in currentDeskMaxNum"
  80. :key="item"
  81. :label="item"
  82. border
  83. :v-text="item"
  84. ></el-radio>
  85. </el-radio-group>
  86. <el-button class="w-full" plain @click="order()">开始点餐</el-button>
  87. </div>
  88. <el-button class="w-full mt-1" plain @click="dialogVisible = false">关闭</el-button>
  89. </el-dialog>
  90. </div>
  91. <console @init="init()" ref="consoleRef"></console>
  92. </template>
  93. <script lang="ts" setup>
  94. import { postAll } from '@/api/org/post'
  95. import { orderDeskList, createOrders, orderCheckout } from '@/api/order'
  96. import Console from './console.vue'
  97. import { getOrdersCurrent } from '@/api/orders'
  98. import feedback from '@/utils/feedback'
  99. import useUserStore from '@/stores/modules/user'
  100. const userStore = useUserStore()
  101. console.log(userStore.userInfo.id + '开始链接客户端')
  102. // const socketClient = new WebSocket('ws://localhost:8082/backSocket/' + userStore.userInfo.id)
  103. const activeName = ref<any>('all')
  104. const dialogVisible = ref(false)
  105. const isLoading = ref(false)
  106. const currentDeskStatus = ref()
  107. const currentDeskMaxNum = ref<number>()
  108. const areaList = ref<any[]>([])
  109. const deskList = ref<any[]>([])
  110. let currentDesk: any = {}
  111. let deskListAll: any[] = []
  112. const consoleRef = ref<InstanceType<typeof Console>>()
  113. const data = reactive({
  114. userNum: 1, //当前就餐人数
  115. deskId: null,
  116. type: 0 //后台点餐类型:0
  117. })
  118. const order_ = (i: any) => {
  119. dialogVisible.value = true
  120. currentDesk = i
  121. currentDeskStatus.value = i.status
  122. data.deskId = i.id
  123. currentDeskMaxNum.value = i.num
  124. }
  125. const order = () => {
  126. dialogVisible.value = false
  127. createOrders(data).then((res) => {
  128. consoleRef.value?.open(currentDesk, data.userNum, res)
  129. init()
  130. })
  131. console.warn("***order***",currentDesk)
  132. // router.push({ path: '/order/console', query: { deskID: id } })
  133. }
  134. const reorder = () => {
  135. dialogVisible.value = false
  136. consoleRef.value?.open(currentDesk);//继续下单时会把当前餐桌上的订单号ordersId传进去
  137. console.warn("***reorder***",currentDesk)
  138. }
  139. const refresh = () => {
  140. isLoading.value = true
  141. init()
  142. }
  143. const checkout = () => {
  144. refresh()
  145. //结账
  146. console.warn("***结账***",currentDesk)
  147. if(currentDesk && !currentDesk.amount){
  148. feedback.notify('当前桌未出单,无法结账')
  149. return false
  150. }
  151. feedback.confirm('结账金额为' + currentDesk.amount + ',确定要结账吗?').then(() => {
  152. orderCheckout({ did: currentDesk.id }).then(() => {
  153. feedback.notifySuccess('成功结账' + currentDesk.amount + '元')
  154. dialogVisible.value = false
  155. init()
  156. })
  157. })
  158. }
  159. const tabChange = (name: any) => {
  160. if (name != 'all') {
  161. deskList.value = deskListAll.filter((ele: any) => {
  162. return ele.area == name
  163. })
  164. } else {
  165. deskList.value = deskListAll
  166. }
  167. }
  168. const init = async () => {
  169. let _list: any[] = [];
  170. await orderDeskList().then((res: any) => {
  171. // deskList.value = res
  172. deskListAll = res
  173. _list = res;
  174. getOrdersCurrent().then((res) => {
  175. deskList.value = _list.map((item) => {
  176. res.forEach((element: any) => {
  177. if (item.id == element.deskId) {
  178. item.status = element.status
  179. item.userNum = element.userNum
  180. // item.amount = element.amount
  181. item.ordersId = element.number
  182. if (item.amount) {
  183. item.amount += Number.parseFloat(element.amount)
  184. } else {
  185. item.amount = Number.parseFloat(element.amount)
  186. }
  187. }
  188. })
  189. return item
  190. })
  191. })
  192. })
  193. await postAll().then((res) => {
  194. areaList.value = res
  195. })
  196. // socketClient.onopen = () => {
  197. // console.log('websocket成功连接服务器')
  198. // }
  199. // socketClient.onmessage = (msg: any) => {
  200. // console.log('收到消息:' + msg.data)
  201. // const message = JSON.parse(msg.data)
  202. // }
  203. isLoading.value = false
  204. }
  205. onMounted(() => {
  206. init()
  207. })
  208. </script>