dining.js 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276
  1. import { api } from '@/utils/request.js';
  2. import { BASE_API_URL } from '@/settings/siteSetting.js';
  3. import { useUserStore } from '@/store/user.js';
  4. import { rewriteM2DocumentedApiPath, isM2GenericPricingApiActive } from '@/utils/m2GenericApiPath.js';
  5. // 微信登录
  6. export const DiningUserWechatLogin = (params) => api.post({ url: '/dining/user/wechatLogin', params });
  7. // 获取用户信息(GET /dining/user/getUserInfo),登录后调用以拿到头像等
  8. export const GetUserInfo = () => api.get({ url: '/dining/user/getUserInfo' });
  9. // 更新用户个人信息(POST /dining/user/updateProfile,body 为 dto)
  10. export const PostUpdateProfile = (dto) =>
  11. api.post({ url: '/dining/user/updateProfile', params: dto });
  12. // 文件上传(POST /file/upload,multipart,返回图片 URL/path 供 avatarUrl 使用)
  13. function uploadFileToServerImpl(filePath) {
  14. const userStore = useUserStore();
  15. return new Promise((resolve, reject) => {
  16. uni.uploadFile({
  17. url: BASE_API_URL+'/dining/file/upload',
  18. filePath,
  19. name: 'file',
  20. header: { Authorization: userStore.getToken || '' },
  21. success: (res) => {
  22. if (res.statusCode === 200) {
  23. try {
  24. const data = typeof res.data === 'string' ? JSON.parse(res.data) : res.data;
  25. const payload = data?.data ?? data;
  26. const url = payload?.url ?? payload?.path ?? payload?.relativePath ?? (typeof payload === 'string' ? payload : '');
  27. resolve(url || '');
  28. } catch (e) {
  29. reject(e);
  30. }
  31. } else {
  32. reject(new Error(res.data || '上传失败'));
  33. }
  34. },
  35. fail: reject
  36. });
  37. });
  38. }
  39. export const uploadFileToServer = uploadFileToServerImpl;
  40. export const uploadFileToSever = uploadFileToServerImpl; // 兼容拼写错误
  41. // 点餐页数据(入参 dinerCount 就餐人数、tableId 桌号)
  42. export const DiningOrderFood = (params) => api.get({ url: '/store/dining/page-info', params });
  43. // 服务费估算(GET /store/dining/service-fee/estimate,query:storeId、tableId、dinerCount、goodsSubtotal 菜品成交价小计元)
  44. export const GetServiceFeeEstimate = (params) => {
  45. const q = {};
  46. if (params?.storeId != null && params.storeId !== '') q.storeId = String(params.storeId);
  47. if (params?.tableId != null && params.tableId !== '') q.tableId = String(params.tableId);
  48. if (params?.dinerCount != null && params.dinerCount !== '') q.dinerCount = params.dinerCount;
  49. if (params?.goodsSubtotal != null && params.goodsSubtotal !== '') q.goodsSubtotal = params.goodsSubtotal;
  50. return api.get({ url: '/store/dining/service-fee/estimate', params: q, loading: false });
  51. };
  52. // 桌台预约记录详情(GET /store/dining/reservation/detail-by-store-table-record,query:storeId、userReservationTableId 用户预约餐桌记录ID)
  53. export const GetReservationDetailByStoreTableRecord = (params) => {
  54. const q = {};
  55. if (params?.storeId != null && params?.storeId !== '') q.storeId = String(params.storeId);
  56. if (params?.userReservationTableId != null && params?.userReservationTableId !== '') {
  57. q.userReservationTableId = String(params.userReservationTableId);
  58. }
  59. return api.get({
  60. url: '/store/dining/reservation/detail-by-store-table-record',
  61. params: q,
  62. loading: false
  63. });
  64. };
  65. // 查询桌位是否已选就餐人数(GET /store/dining/table-dining-status?tableId=xxx,返回含 tableNumber 等)
  66. export const GetTableDiningStatus = (tableId, extra = {}) =>
  67. api.get({
  68. url: '/store/dining/table-dining-status',
  69. params: { tableId: tableId != null && tableId !== '' ? String(tableId) : '' },
  70. ...extra
  71. });
  72. // 到店就餐信息提交(POST /store/dining/walk-in/reservation,body:DiningWalkInReservationDTO;startTime/endTime 为 yyyy-MM-dd HH:mm)
  73. export const PostDiningWalkInReservation = (dto) =>
  74. api.post({ url: '/store/dining/walk-in/reservation', params: dto });
  75. // 门店详情(GET /store/info/detail/{storeId},入参 storeId)
  76. export const GetStoreDetail = (storeId) =>
  77. api.get({ url: `/store/info/detail/${encodeURIComponent(storeId)}` });
  78. // 菜品种类(入参 storeId,GET /store/info/categories?storeId=)
  79. export const GetStoreCategories = (params) => api.get({ url: '/store/info/categories', params });
  80. // 根据菜品种类获取菜品(入参 categoryId,GET /store/info/cuisines?categoryId=)
  81. export const GetStoreCuisines = (params) => api.get({ url: '/store/info/cuisines', params });
  82. // 左侧分类+右侧菜品一体(GET /store/info/categories-with-cuisines;扫码 m=2 通用价目时传 menuType=2)
  83. export const GetCategoriesWithCuisines = (params) => {
  84. const q = { ...(params || {}) };
  85. if (isM2GenericPricingApiActive()) q.menuType = 2;
  86. return api.get({ url: '/store/info/categories-with-cuisines', params: q });
  87. };
  88. // 菜品详情(GET /store/dining/cuisine/{cuisineId},入参 cuisineId 菜品ID、tableId 桌号ID 传 query)
  89. export const GetCuisineDetail = (cuisineId, tableId) => {
  90. const id = cuisineId != null ? encodeURIComponent(cuisineId) : '';
  91. const url = id ? `/store/dining/cuisine/${id}` : '/store/dining/cuisine/0';
  92. const params = tableId != null && tableId !== '' ? { tableId } : {};
  93. return api.get({ url, params });
  94. };
  95. // 门店全部优惠券列表(GET /dining/coupon/getStoreAllCouponList,分页 page、size 每页10条)
  96. function getStoreAllCouponListImpl(params) {
  97. return api.get({
  98. url: '/dining/coupon/getStoreAllCouponList',
  99. params: {
  100. storeId: params?.storeId,
  101. tab: 1,
  102. page: params?.page ?? 1,
  103. size: params?.size ?? 10
  104. }
  105. });
  106. }
  107. export const GetStoreAllCouponList = getStoreAllCouponListImpl;
  108. // 兼容旧引用
  109. export const GetStoreUsableCouponList = getStoreAllCouponListImpl;
  110. // 用户已领/可用优惠券(GET /dining/coupon/userOwnedByStore,入参 storeId 门店ID)
  111. function getUserOwnedCouponListImpl(params) {
  112. return api.get({
  113. url: '/dining/coupon/userOwnedByStore',
  114. params: {
  115. storeId: params?.storeId
  116. }
  117. });
  118. }
  119. export const GetUserOwnedCouponList = getUserOwnedCouponListImpl;
  120. // 用户优惠券列表(GET /dining/coupon/getUserCouponList,入参 storeId、tabType、page、size)
  121. export const GetUserCouponList = (params) =>
  122. api.get({
  123. url: '/dining/coupon/getUserCouponList',
  124. params: {
  125. storeId: params?.storeId,
  126. tabType: params?.tabType ?? 0,
  127. page: params?.page ?? 1,
  128. size: params?.size ?? 20
  129. }
  130. });
  131. // 获取购物车(GET /store/order/cart/{tableId},建立 SSE 连接之后调用)
  132. export const GetOrderCart = (tableId) =>
  133. api.get({ url: `/store/order/cart/${encodeURIComponent(tableId)}` });
  134. // 加入购物车(POST /store/order/cart/add,dto: { cuisineId 菜品ID, quantity 数量, tableId 桌号ID })
  135. export const PostOrderCartAdd = (dto) =>
  136. api.post({ url: '/store/order/cart/add', params: dto });
  137. // 更新购物车(PUT /store/order/cart/update,请求类型 x-www-form-urlencoded,由 request 层 formUrlEncoded 封装)
  138. export const PostOrderCartUpdate = (params) =>
  139. api.put({ url: '/store/order/cart/update', params, formUrlEncoded: true });
  140. // 清空购物车(DELETE /store/order/cart/clear,入参 tableId:query + body 双传,兼容不同后端)
  141. export const PostOrderCartClear = (tableId) => {
  142. const id = tableId != null ? String(tableId) : '';
  143. const url = id ? `/store/order/cart/clear?tableId=${encodeURIComponent(id)}` : '/store/order/cart/clear';
  144. return api.delete({ url, params: id ? { tableId: id } : {} });
  145. };
  146. // 锁定订单(POST /store/dining/order/lock,入参 tableId 桌号ID)
  147. function postOrderLockImpl(params) {
  148. const tableId = params?.tableId != null ? String(params.tableId) : '';
  149. const url = tableId ? `/store/dining/order/lock?tableId=${encodeURIComponent(tableId)}` : '/store/dining/order/lock';
  150. return api.post({ url, params: {} });
  151. }
  152. export const PostOrderLock = postOrderLockImpl;
  153. // 解锁订单(POST /store/dining/order/unlock,入参 tableId 桌号ID,与 lock 请求方式一致)
  154. function postOrderUnlockImpl(params) {
  155. const tableId = params?.tableId != null ? String(params.tableId) : '';
  156. const url = tableId ? `/store/dining/order/unlock?tableId=${encodeURIComponent(tableId)}` : '/store/dining/order/unlock';
  157. return api.post({ url, params: {} });
  158. }
  159. export const PostOrderUnlock = postOrderUnlockImpl;
  160. // 兼容:通过 diningApi.postOrderUnlock 调用
  161. export const postOrderUnlock = postOrderUnlockImpl;
  162. // 结算页锁定订单(POST /store/dining/order/settlement/lock,入参 orderId 订单ID)
  163. function postOrderSettlementLockImpl(params) {
  164. const orderId = params?.orderId != null ? String(params.orderId) : '';
  165. const url = orderId ? `/store/dining/order/settlement/lock?orderId=${encodeURIComponent(orderId)}` : '/store/dining/order/settlement/lock';
  166. return api.post({ url, params: {} });
  167. }
  168. export const PostOrderSettlementLock = postOrderSettlementLockImpl;
  169. // 结算页解锁订单(POST /store/dining/order/settlement/unlock,入参 orderId 订单ID)
  170. function postOrderSettlementUnlockImpl(params) {
  171. const orderId = params?.orderId != null ? String(params.orderId) : '';
  172. const url = orderId ? `/store/dining/order/settlement/unlock?orderId=${encodeURIComponent(orderId)}` : '/store/dining/order/settlement/unlock';
  173. return api.post({ url, params: {} });
  174. }
  175. export const PostOrderSettlementUnlock = postOrderSettlementUnlockImpl;
  176. // 创建订单(POST /store/order/create,入参 dto:tableId、contactPhone、totalAmount 菜品金额、serviceFee 服务费、tablewareFee(可传 0)、payAmount、couponId、discountAmount、dinerCount、immediatePay、remark 等)
  177. export const PostOrderCreate = (dto) =>
  178. api.post({ url: '/store/order/create', params: dto });
  179. // 订单分页列表(GET /store/order/page,入参 current 页码、size 每页数量、keyword 搜索关键词(订单编号或菜品名称限15字)、orderStatus 0=进行中 3=已完成、storeId 门店ID、tableId 桌号ID)
  180. export const GetOrderPage = (params) =>
  181. api.get({ url: '/store/order/page', params });
  182. // 我的订单(GET /store/order/my-orders,入参 current 页码、size 每页数量、type 订单类型 0未支付 1历史)
  183. export const GetMyOrders = (params) =>
  184. api.get({ url: '/store/order/my-orders', params });
  185. // 订单详情(GET /store/order/info/{orderId},入参 orderId 订单ID)
  186. export const GetOrderInfo = (orderId) =>
  187. api.get({ url: `/store/order/info/${encodeURIComponent(orderId)}` });
  188. // 订单支付(GET /payment/prePay,入参 orderNo、payType、payer、price、subject、storeId、couponId、payerId、discountAmount 优惠金额、payAmount 支付金额;返回微信支付调起参数)
  189. export const PostOrderPay = (params) => {
  190. const query = {
  191. orderNo: params.orderNo,
  192. payType: 'wechatPayMininProgram',
  193. payer: params.payer,
  194. price: params.price,
  195. subject: params.subject ?? '订单支付',
  196. storeId: params.storeId
  197. };
  198. if (params.couponId != null && params.couponId !== '') {
  199. query.couponId = params.couponId;
  200. }
  201. if (params.payerId != null && params.payerId !== '') {
  202. query.payerId = params.payerId;
  203. }
  204. if (params.discountAmount != null && params.discountAmount !== '') {
  205. query.discountAmount = params.discountAmount;
  206. }
  207. if (params.payAmount != null && params.payAmount !== '') {
  208. query.payAmount = params.payAmount;
  209. }
  210. return api.get({
  211. url: '/payment/prePay',
  212. params: query
  213. });
  214. };
  215. // 根据第三方订单号查询支付结果(GET /payment/searchOrderByOutTradeNoPath,入参 payType、transactionId、storeId)
  216. // 支付页调用时不显示全局 loading
  217. export const GetSearchOrderByOutTradeNoPath = (params) =>
  218. api.get({
  219. url: '/payment/searchOrderByOutTradeNoPath',
  220. params: {
  221. payType: params.payType ?? 'wechatPayMininProgram',
  222. transactionId: params.transactionId,
  223. storeId: params.storeId
  224. },
  225. loading: false
  226. });
  227. // 订单翻转/完成(POST /store/order/complete/{orderId},入参 orderId)
  228. // 支付页调用时不显示全局 loading
  229. export const PostOrderComplete = (orderId) =>
  230. api.post({ url: `/store/order/complete/${encodeURIComponent(orderId)}`, loading: false });
  231. /**
  232. * 订单 SSE 接口配置(GET /store/order/sse/{tableId})
  233. * 仅提供 URL 与 header,实际连接请使用 utils/sse.js 的 createSSEConnection 封装
  234. */
  235. export function getOrderSseConfig(tableId) {
  236. const userStore = useUserStore();
  237. const path = rewriteM2DocumentedApiPath(`/store/order/sse/${encodeURIComponent(tableId)}`);
  238. return {
  239. url: `${BASE_API_URL}${path}`,
  240. header: { Authorization: userStore.getToken || '' },
  241. timeout: 0
  242. };
  243. }