index.vue 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247
  1. <template>
  2. <BasicTable @register="registerTable">
  3. <!--插槽:table标题-->
  4. <template #tableTitle>
  5. <div class="flex items-center p3">
  6. <a-button type="primary" @click="handleExport">导出赛事报名表</a-button>
  7. </div>
  8. </template>
  9. <!--操作栏-->
  10. <template #action="{ record }">
  11. <TableAction :actions="getTableAction(record)" :dropDownActions="getDropDownAction(record)" />
  12. </template>
  13. <template #goods="{ record }">
  14. <div class="flex items-center h-20px text-16px">
  15. <div class="font-semibold">订单编号:{{ record.orderCode }}</div>
  16. <div class="ml3">下单时间:{{ record.createTime }}</div>
  17. <div class="ml3 truncate w300px"
  18. >店铺名称:
  19. <a-tooltip>
  20. <template #title>{{ record.orderType == 3 || record.orderType == 4 ? record.departName : record.siteName }} </template>
  21. {{ record.orderType == 3 || record.orderType == 4 ? record.departName : record.siteName }}
  22. </a-tooltip>
  23. </div>
  24. </div>
  25. <div class="mt3 flex items-center border-b border-solid pb-3 h-90px" v-for="item in record.orderProInfoList" :key="item.id">
  26. <Image :width="80" :height="80" class="rounded-16px" :src="item.productImage.split(',')[0]" v-if="item.productImage" />
  27. <div class="ml3">{{ item.productName }}</div>
  28. </div>
  29. </template>
  30. <template #price="{ record }">
  31. <div class="h-20px"></div>
  32. <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
  33. <div class="flex items-center" v-if="item.price>0">
  34. <div>¥{{ item.price || 0 }}</div>
  35. <div class="line-through ml-3 text-gray">¥{{ item.originalPrice || 0 }}</div>
  36. </div>
  37. <div class="flex items-center" v-else>
  38. <div>¥{{ item.originalPrice || 0 }}</div>
  39. <!-- <div class="line-through ml-3 text-gray">¥{{ item.originalPrice || 0 }}</div>-->
  40. </div>
  41. <div class="text-gray">x{{ item.quantity }}</div>
  42. </div>
  43. </template>
  44. <template #user="{ record }">
  45. <div class="h-20px"></div>
  46. <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
  47. <div>{{ item.userName || item.ticketNo || '无' }}</div>
  48. <div class="text-gray">{{ item.userPhone }}</div>
  49. </div>
  50. </template>
  51. <template #status="{ record }">
  52. <div class="h-20px"></div>
  53. <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
  54. <div v-if="item.type != 6">{{ orderStatus[item.orderStatus] }}</div>
  55. <div v-else>无</div>
  56. </div>
  57. </template>
  58. <template #After="{ record }">
  59. <div class="h-20px"></div>
  60. <div class="mt3 h-90px flex flex-col justify-center border-b border-solid" v-for="item in record.orderProInfoList" :key="item.id">
  61. <div v-if="item.type != 6">{{ afterSaleStatus[item.afterSaleStatus] }}</div>
  62. <div v-else>无</div>
  63. </div>
  64. </template>
  65. </BasicTable>
  66. <orderModelView @register="registerModal"></orderModelView>
  67. <a-modal v-model:open="openExportData" title="导出赛事名单" @ok="handleExportData" :confirmLoading="exportLoading">
  68. <BasicForm :showActionButtonGroup="false" @register="registerForm" style="margin: 50px 50px 0 50px" />
  69. </a-modal>
  70. </template>
  71. <script setup lang="ts">
  72. import orderModelView from './components/orderModelView.vue';
  73. import { Image, message, Modal, QRCode } from 'ant-design-vue';
  74. import { ref, reactive, computed, unref } from 'vue';
  75. import { BasicTable, TableAction } from '/@/components/Table';
  76. import { useForm, BasicForm, FormSchema } from '/@/components/Form';
  77. import { useModal } from '/@/components/Modal';
  78. import { useListPage } from '/@/hooks/system/useListPage';
  79. import { columns, searchFormSchema, afterSaleStatus, orderStatus } from './order.data';
  80. import { list, exportData, queryEvents, queryProject } from './order.api';
  81. import { useUserStore } from '/@/store/modules/user';
  82. const queryParam = reactive<any>({});
  83. const userStore = useUserStore();
  84. //注册model
  85. const [registerModal, { openModal }] = useModal();
  86. //注册table数据
  87. const { prefixCls, tableContext } = useListPage({
  88. tableProps: {
  89. api: list,
  90. columns,
  91. formConfig: {
  92. schemas: searchFormSchema,
  93. autoSubmitOnEnter: true,
  94. showAdvancedButton: true,
  95. fieldMapToNumber: [],
  96. fieldMapToTime: [['time', ['startTime', 'endTime'], 'YYYY-MM-DD HH:mm:ss']],
  97. },
  98. inset: true,
  99. actionColumn: {
  100. width: 120,
  101. fixed: 'right',
  102. },
  103. beforeFetch: (params) => {
  104. return Object.assign(params, { ...queryParam, orgCode: userStore.userInfo?.orgCode });
  105. },
  106. },
  107. });
  108. const [registerTable, { reload }, { selectedRowKeys }] = tableContext;
  109. //自定义表单字段
  110. const formSchemas: FormSchema[] = [
  111. {
  112. label: '赛事名称',
  113. field: 'name',
  114. component: 'ApiSelect',
  115. required: true,
  116. labelWidth: 100,
  117. componentProps: {
  118. api: queryEvents,
  119. fieldNames: {
  120. label: 'name',
  121. value: 'id',
  122. },
  123. onChange: (value) => {
  124. exportQueryParam.gameId = value;
  125. },
  126. },
  127. },
  128. {
  129. label: '比赛项目',
  130. field: 'project',
  131. component: 'ApiSelect',
  132. required: true,
  133. labelWidth: 100,
  134. componentProps: {
  135. api: queryProject,
  136. fieldNames: {
  137. label: 'name',
  138. value: 'id',
  139. },
  140. params: computed(() => {
  141. return exportQueryParam.gameId ? { gameId: exportQueryParam.gameId } : {};
  142. }),
  143. onChange: (value) => {
  144. exportQueryParam.projectId = value;
  145. },
  146. },
  147. },
  148. {
  149. label: '报名结束时间',
  150. field: 'entryTime',
  151. component: 'RangePicker',
  152. labelWidth: 100,
  153. required: true,
  154. componentProps: {
  155. onChange: (value) => {
  156. exportQueryParam.startTime = value[0];
  157. exportQueryParam.endTime = value[1];
  158. console.log(value);
  159. },
  160. },
  161. },
  162. ];
  163. /**
  164. * BasicForm绑定注册;
  165. */
  166. const [registerForm] = useForm({
  167. //注册表单列
  168. schemas: formSchemas,
  169. showResetButton: false,
  170. submitButtonOptions: { text: '提交', preIcon: '' },
  171. actionColOptions: { span: 17 },
  172. });
  173. /**
  174. * 编辑事件
  175. */
  176. function handleEdit(record: Recordable) {
  177. openModal(true, {
  178. record,
  179. });
  180. }
  181. /**
  182. * 操作栏
  183. */
  184. function getTableAction(record) {
  185. return [
  186. {
  187. label: '查看',
  188. onClick: handleEdit.bind(null, record),
  189. // auth: 'feedback:nm_feedback:edit',
  190. },
  191. ];
  192. }
  193. /**
  194. * 下拉操作栏
  195. */
  196. function getDropDownAction(record) {
  197. return [];
  198. }
  199. const openExportData = ref(false);
  200. function handleExport() {
  201. openExportData.value = true;
  202. // message.error('记得提醒搞导出,现在暂时没有这个功能!');
  203. }
  204. // 提交导出
  205. const exportQueryParam = reactive<any>({
  206. gameId: null,
  207. projectId: null,
  208. startTime: null,
  209. endTime: null,
  210. });
  211. const exportLoading = ref(false);
  212. const handleExportData = async () => {
  213. exportLoading.value = true;
  214. try {
  215. const response = await exportData(exportQueryParam);
  216. const blob = new Blob([response], { type: 'application/vnd.ms-excel' });
  217. const downloadUrl = window.URL.createObjectURL(blob);
  218. const link = document.createElement('a');
  219. link.href = downloadUrl;
  220. link.download = '赛事名单.xlsx';
  221. document.body.appendChild(link);
  222. link.click();
  223. document.body.removeChild(link);
  224. window.URL.revokeObjectURL(downloadUrl);
  225. message.success('导出成功!');
  226. } catch (error) {
  227. console.error('导出失败:', error);
  228. message.error('导出失败,请稍后重试');
  229. } finally {
  230. exportLoading.value = false;
  231. openExportData.value = false;
  232. }
  233. };
  234. </script>
  235. <style scoped></style>