index.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304
  1. <template>
  2. <ContentWrap>
  3. <el-tabs v-model="activeName">
  4. <el-tab-pane :label="t('score.allOrders')" name="first"/>
  5. </el-tabs>
  6. <el-form-item :label="t('score.orderStatus')" >
  7. <el-radio-group v-model="orderStatus" size="large" fill="#DC143C" @change="queryOrderStatus">
  8. <el-radio-button label="-1">{{t('score.all')}}</el-radio-button>
  9. <el-radio-button label="3">{{t('score.toBePaid')}}</el-radio-button>
  10. <el-radio-button label="0">{{t('score.toBeShipped')}}</el-radio-button>
  11. <el-radio-button label="1">{{t('score.toBeReceived')}}</el-radio-button>
  12. <el-radio-button label="2">{{t('score.completed')}}</el-radio-button>
  13. </el-radio-group>
  14. </el-form-item>
  15. <!-- 搜索工作栏 -->
  16. <el-form
  17. class="-mb-15px"
  18. :model="queryParams"
  19. ref="queryFormRef"
  20. :inline="true"
  21. label-width="68px"
  22. >
  23. <el-form-item :label="t('score.userName')" prop="userId">
  24. <el-input
  25. v-model="queryParams.customerPhone"
  26. :placeholder="t('score.pleaseEnterYourPhoneNumber')"
  27. clearable
  28. @keyup.enter="handleQuery"
  29. class="!w-240px"
  30. />
  31. </el-form-item>
  32. <el-form-item :label="t('score.orderNo')" prop="number">
  33. <el-input
  34. v-model="queryParams.orderId"
  35. :placeholder="t('score.pleaseEnterTheOrderNumber')"
  36. clearable
  37. @keyup.enter="handleQuery"
  38. class="!w-240px"
  39. />
  40. </el-form-item>
  41. <el-form-item>
  42. <el-button @click="handleQuery"><Icon icon="ep:search" class="mr-5px" /> {{t('common.search')}}</el-button>
  43. <el-button @click="resetQuery"><Icon icon="ep:refresh" class="mr-5px" /> {{t('common.reset')}}</el-button>
  44. <!-- <el-button
  45. type="success"
  46. plain
  47. @click="handleExport"
  48. :loading="exportLoading"
  49. v-hasPermi="['score:order:export']"
  50. >
  51. <Icon icon="ep:download" class="mr-5px" /> {{t('action.export')}}
  52. </el-button> -->
  53. </el-form-item>
  54. </el-form>
  55. </ContentWrap>
  56. <!-- 列表 -->
  57. <ContentWrap>
  58. <el-table v-loading="loading" :data="list">
  59. <el-table-column label="id" align="center" prop="id" />
  60. <el-table-column :label="t('score.orderNo')" align="center" prop="orderId" width="190" />
  61. <el-table-column :label="t('score.userIdNickname')" align="center" prop="uid" width="150">
  62. <template #default="score">
  63. <span>{{ score.row.uid }}|{{ score.row.userRespVO ? score.row.userRespVO.nickname : t('public.none') }}</span>
  64. </template>
  65. </el-table-column>
  66. <el-table-column :label="t('score.productInformation')" align="center" prop="productId" width="350">
  67. <template #default="score">
  68. <div class="tabBox">
  69. <div class="tabBox_img">
  70. <img :src="convertImageUrl(score.row.scoreProductRespVO.image)" />
  71. </div>
  72. <span class="tabBox_tit">{{ score.row.scoreProductRespVO.title }}</span>
  73. <span class="tabBox_pice">{{ '积分'+ score.row.scoreProductRespVO.score + ' x '+ score.row.number}}</span>
  74. </div>
  75. </template>
  76. </el-table-column>
  77. <!-- <el-table-column :label="t('score.')数量" align="center" prop="number" /> -->
  78. <el-table-column :label="t('score.totalPointsConsumed')" align="center" prop="totalScore" width="150" />
  79. <el-table-column :label="t('score.totalConsumptionAmount')" align="center" prop="totalPrice" width="150" />
  80. <el-table-column :label="t('score.paymentMethod')" align="center">
  81. <template #default="score">
  82. <span v-if="score.row.havePaid == 1">
  83. <span v-if="score.row.payType=='yue'">{{t('score.balancePayment')}}</span>
  84. <span v-if="score.row.payType=='weixin'">{{t('score.weChatPayment')}}</span>
  85. <span v-if="score.row.payType=='alipay'">{{t('score.alipayPayment')}}</span>
  86. <span v-if="score.row.payType=='cash'">{{t('score.cashPayment')}}</span>
  87. </span>
  88. <span v-else>--</span>
  89. </template>
  90. </el-table-column>
  91. <el-table-column :label="t('score.payment')" align="center" prop="havePaid">
  92. <template #default="score">
  93. <span v-if="score.row.havePaid == 0" style="color:#F56C6C">{{t('common.no')}}</span>
  94. <span v-if="score.row.havePaid == 1" style="color:#409EFF">{{t('common.yes')}}</span>
  95. </template>
  96. </el-table-column>
  97. <el-table-column :label="t('score.whetherToShipOrNot')" align="center" prop="haveDelivered">
  98. <template #default="score">
  99. <span v-if="score.row.haveDelivered == 0" style="color:#F56C6C">{{t('common.no')}}</span>
  100. <span v-if="score.row.haveDelivered == 1" style="color:#409EFF">{{t('common.yes')}}</span>
  101. </template>
  102. </el-table-column>
  103. <el-table-column :label="t('score.receiveOrNot')" align="center" prop="haveReceived">
  104. <template #default="score">
  105. <span v-if="score.row.haveReceived == 0" style="color:#F56C6C">{{t('common.no')}}</span>
  106. <span v-if="score.row.haveReceived == 1" style="color:#409EFF">{{t('common.yes')}}</span>
  107. </template>
  108. </el-table-column>
  109. <el-table-column
  110. :label="t('public.addTime')"
  111. align="center"
  112. prop="createTime"
  113. :formatter="dateFormatter"
  114. width="170"
  115. />
  116. <el-table-column :label="t('public.operate')" align="center" fixed="right" width="150">
  117. <template #default="score">
  118. <div class="flex justify-center items-center">
  119. <el-button
  120. link
  121. type="primary"
  122. @click="openForm('orderSend', score.row.id)"
  123. v-if = "score.row.haveDelivered == 0 && score.row.havePaid == 1"
  124. v-hasPermi="['score:order:update']"
  125. >
  126. {{ t('score.shipping') }}
  127. </el-button>
  128. <el-dropdown>
  129. <el-button type="primary" link><Icon icon="ep:d-arrow-right" /> {{t('score.more')}}</el-button>
  130. <template #dropdown>
  131. <el-dropdown-menu>
  132. <el-dropdown-item @click="openForm('orderDetail', score.row.id)">{{t('score.orderDetails')}}</el-dropdown-item>
  133. <el-dropdown-item @click="handleDelete(score.row.id)">{{t('score.deleteOrder')}}</el-dropdown-item>
  134. <el-dropdown-item v-if = "score.row.haveDelivered == 1 && score.row.haveReceived == 0" @click="handleTake(score.row.id)">{{t('score.backstageReceiving')}}</el-dropdown-item>
  135. </el-dropdown-menu>
  136. </template>
  137. </el-dropdown>
  138. </div>
  139. </template>
  140. </el-table-column>
  141. </el-table>
  142. <!-- 分页 -->
  143. <Pagination
  144. :total="total"
  145. v-model:page="queryParams.pageNo"
  146. v-model:limit="queryParams.pageSize"
  147. @pagination="getList"
  148. />
  149. </ContentWrap>
  150. <!-- 表单弹窗:添加/修改 -->
  151. <OrderForm ref="formRef" @success="getList" />
  152. <OrderDetail ref="formRef4" />
  153. </template>
  154. <script setup lang="ts" name="ScoreOrder">
  155. import { dateFormatter } from '@/utils/formatTime'
  156. import download from '@/utils/download'
  157. import * as OrderApi from '@/api/score/order'
  158. import OrderForm from './OrderForm.vue'
  159. import OrderDetail from './OrderDetail.vue'
  160. import { convertImageUrl } from '@/utils/image-helper'
  161. const message = useMessage() // 消息弹窗
  162. const { t } = useI18n() // 国际化
  163. const loading = ref(true) // 列表的加载中
  164. const total = ref(0) // 列表的总页数
  165. const list = ref([]) // 列表的数据
  166. const queryParams = reactive({
  167. pageNo: 1,
  168. pageSize: 10,
  169. orderId: "",
  170. type: -1,
  171. customerName: null,
  172. customerPhone: null,
  173. customerAddress: null,
  174. })
  175. const queryFormRef = ref() // 搜索的表单
  176. const exportLoading = ref(false) // 导出的加载中
  177. const activeName = ref('first')
  178. const orderStatus = ref('-1')
  179. const queryOrderStatus = (value) => {
  180. queryParams.type = value
  181. getList()
  182. }
  183. /** 查询列表 */
  184. const getList = async () => {
  185. loading.value = true
  186. try {
  187. const data = await OrderApi.getOrderPage(queryParams)
  188. list.value = data.list
  189. total.value = data.total
  190. } finally {
  191. loading.value = false
  192. }
  193. }
  194. /** 搜索按钮操作 */
  195. const handleQuery = () => {
  196. queryParams.pageNo = 1
  197. getList()
  198. }
  199. /** 重置按钮操作 */
  200. const resetQuery = () => {
  201. queryFormRef.value.resetFields()
  202. handleQuery()
  203. }
  204. /** 添加/修改操作 */
  205. const formRef = ref()
  206. const formRef4 = ref()
  207. const openForm = (type: string, id?: number) => {
  208. if (type == 'orderSend') {
  209. formRef.value.open(type, id)
  210. }else if (type == 'orderDetail') {
  211. formRef4.value.open(type, id)
  212. }
  213. }
  214. /** 删除按钮操作 */
  215. const handleDelete = async (id: number) => {
  216. try {
  217. // 删除的二次确认
  218. await message.delConfirm()
  219. // 发起删除
  220. await OrderApi.deleteOrder(id)
  221. message.success(t('common.delSuccess'))
  222. // 刷新列表
  223. await getList()
  224. } catch {}
  225. }
  226. /** 导出按钮操作 */
  227. const handleExport = async () => {
  228. try {
  229. // 导出的二次确认
  230. await message.exportConfirm()
  231. // 发起导出
  232. exportLoading.value = true
  233. const data = await OrderApi.exportOrder(queryParams)
  234. download.excel(data, t('score.pointsMallOrdersXls'))
  235. } catch {
  236. } finally {
  237. exportLoading.value = false
  238. }
  239. }
  240. /** 确认收货按钮操作 */
  241. const handleTake = async (id: number) => {
  242. try {
  243. // 删除的二次确认
  244. await message.confirm(t('score.modifyReceivingStatus'))
  245. // 发起删除
  246. await OrderApi.takeStoreOrder(id)
  247. message.success(t('common.updateSuccess'))
  248. // 刷新列表
  249. await getList()
  250. } catch {}
  251. }
  252. /** 初始化 **/
  253. onMounted(() => {
  254. getList()
  255. })
  256. </script>
  257. <style>
  258. .tabBox{
  259. width: 100%;
  260. height: 100%;
  261. display: flex;
  262. align-items: center
  263. }
  264. .tabBox_img{
  265. width: 36px;
  266. height: 36px;
  267. }
  268. .tabBox_img img{
  269. width: 100%;
  270. height: 100%;
  271. }
  272. .tabBox_tit{
  273. /* width :40%; */
  274. font-size: 12px !important;
  275. margin: 0 2px 0 10px;
  276. letter-spacing: 1px;
  277. padding: 5px 0;
  278. box-sizing: border-box;
  279. text-align: left;
  280. }
  281. .tabBox_pice{
  282. /* width :30%; */
  283. font-size: 12px !important;
  284. margin: 0 2px 0 10px;
  285. letter-spacing: 1px;
  286. padding: 5px 0;
  287. box-sizing: border-box;
  288. text-align: left;
  289. }
  290. </style>