敢为人鲜小程序前端代码仓库
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

184 lines
5.5 KiB

  1. <template>
  2. <view class="page">
  3. <!-- 导航栏 -->
  4. <navbar title="详情页" leftClick @leftClick="navigateBack" bgColor="#019245" color="#fff" />
  5. <view class="container">
  6. <!-- 修改后 -->
  7. <view class="top-btn-group" v-if="memberRes.status == '2'">
  8. <button class="top-action-btn" @click="test1">通知所有人取餐</button>
  9. <button class="top-action-btn" @click="test2">通知所有人完成订单</button>
  10. </view>
  11. <!-- 成员列表 -->
  12. <view class="member-list">
  13. <!-- 使用封装的成员项组件 -->
  14. <member-food-item v-for="(member, index) in memberRes.orderMemberList" :key="index" :member="member"
  15. :status="memberRes.status" :default-expanded="index === defaultExpandedIndex"
  16. @toggle="handleMemberToggle" @sendNotice="handleSend(member)"
  17. @completeOrder="handleComplete(member)" />
  18. </view>
  19. <!-- 空数据提示 -->
  20. <uv-empty v-if="memberRes.orderMemberList.length === 0" text="暂无成员" mode="list"
  21. style="padding-top: 200rpx;" />
  22. </view>
  23. </view>
  24. </template>
  25. <script>
  26. import navbar from '@/components/base/navbar.vue'
  27. import MemberFoodItem from '../components/order/MemberFoodItem.vue'
  28. import mixinsList from '@/mixins/list'
  29. // 创造了一个新的status 用来代表当前列表应该的状态
  30. // 0 待出餐 1 送餐中 2 待取餐 3 已完成
  31. export default {
  32. mixins: [mixinsList],
  33. components: {
  34. navbar,
  35. MemberFoodItem
  36. },
  37. data() {
  38. return {
  39. mealId: null,
  40. defaultExpandedIndex: -1, // 默认不展开任何成员
  41. mixinsListApi: 'queryLeaderOrderListById',
  42. mixinsListKey: 'memberRes',
  43. memberRes: null,
  44. }
  45. },
  46. onLoad(options) {
  47. if (options.id) {
  48. this.mealId = options.id
  49. }
  50. },
  51. methods: {
  52. navigateBack(){
  53. this.$utils.navigateBack()
  54. },
  55. beforeGetData(){
  56. return {
  57. teambuyOrderLeaderId: this.mealId
  58. }
  59. },
  60. // 通知所有人取餐
  61. test1 () {
  62. this.$api('informOrderAll', { leaderOrderId: this.mealId }, res => {
  63. if (res.code === 200) {
  64. uni.showToast({
  65. title: '通知成功',
  66. icon: 'success'
  67. })
  68. setTimeout(() => {
  69. this.$utils.navigateBack()
  70. }, 500)
  71. }
  72. })
  73. },
  74. // 通知所有人完成订单
  75. test2 () {
  76. this.$api('finishOrderAll', { leaderOrderId: this.mealId }, res => {
  77. if (res.code === 200) {
  78. uni.showToast({
  79. title: '通知成功',
  80. icon: 'success'
  81. })
  82. setTimeout(() => {
  83. this.$utils.navigateBack()
  84. }, 500)
  85. }
  86. })
  87. },
  88. // 处理成员项展开/收起事件
  89. handleMemberToggle(data) {
  90. console.log(`成员 ${data.member.name} ${data.expanded ? '展开' : '收起'} 了餐点列表`);
  91. // 可以在这里添加其他逻辑,如记录统计数据等
  92. },
  93. // 通知取餐
  94. handleSend(member) {
  95. uni.showLoading({
  96. title: '通知中'
  97. })
  98. this.$api('informOrderOne', { memberOrderId: member.id }, res => {
  99. uni.hideLoading()
  100. if (res.code === 200) {
  101. // this.$utils.showToast('通知成功')
  102. uni.showToast({
  103. title: '通知成功',
  104. icon: 'success'
  105. })
  106. setTimeout(() => {
  107. uni.navigateBack()
  108. }, 500)
  109. }
  110. })
  111. },
  112. // 完成取餐
  113. handleComplete(member) {
  114. uni.showLoading({
  115. title: '完成取餐中'
  116. })
  117. this.$api('finishOrderOne', { memberOrderId: member.id }, res => {
  118. uni.hideLoading()
  119. if (res.code === 200) {
  120. // this.$utils.showToast('完成取餐')
  121. uni.showToast({
  122. title: '完成取餐',
  123. icon: 'success'
  124. })
  125. setTimeout(() => {
  126. uni.navigateBack()
  127. }, 500)
  128. }
  129. })
  130. }
  131. }
  132. }
  133. </script>
  134. <style lang="scss" scoped>
  135. .page {
  136. background-color: #f5f5f5;
  137. min-height: 100vh;
  138. }
  139. .container {
  140. padding: 20rpx;
  141. }
  142. .member-list {
  143. // 成员列表样式被移到组件中
  144. }
  145. .top-btn-group {
  146. display: flex;
  147. flex-direction: row;
  148. justify-content: space-between;
  149. gap: 24rpx;
  150. margin-bottom: 32rpx;
  151. margin-top: 16rpx;
  152. padding: 0 20rpx;
  153. }
  154. .top-action-btn {
  155. flex: 1;
  156. background: linear-gradient(90deg, #01c97b 0%, #019245 100%);
  157. color: #fff;
  158. font-size: 32rpx;
  159. font-weight: bold;
  160. border: none;
  161. border-radius: 16rpx;
  162. box-shadow: 0 4rpx 12rpx rgba(1, 146, 69, 0.08);
  163. padding: 24rpx 0;
  164. margin: 0;
  165. transition: background 0.2s;
  166. letter-spacing: 2rpx;
  167. outline: none;
  168. }
  169. .top-action-btn:active {
  170. background: linear-gradient(90deg, #019245 0%, #01c97b 100%);
  171. opacity: 0.85;
  172. }
  173. </style>