index.tsx 8.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264
  1. import MHeader from '@/components/m-header';
  2. import MSticky from '@/components/m-sticky';
  3. import {
  4. CellGroup,
  5. DropdownItem,
  6. DropdownMenu,
  7. List,
  8. Skeleton,
  9. Tab,
  10. Tabs
  11. } from 'vant';
  12. import { defineComponent, onMounted, reactive, ref } from 'vue';
  13. import styles from './index.module.less';
  14. import MFullRefresh from '@/components/m-full-refresh';
  15. import ListItem from './list-item';
  16. import SkeletionItem from './skeletion-item';
  17. import MEmpty from '@/components/m-empty';
  18. import MSearch from '@/components/m-search';
  19. import DropDownModal from '../site-management/drop-down-modal';
  20. import { musicGroupQuitQueryPage } from './api';
  21. import { MusicGroupQuitPageDto } from './schedule';
  22. import { useRouter } from 'vue-router';
  23. export default defineComponent({
  24. name: 'schedule-manage',
  25. setup() {
  26. const router = useRouter();
  27. const todoData = reactive({
  28. examineLoading: true,
  29. refreshLoading: false,
  30. examineFinish: false,
  31. /** 待审批列表 */
  32. examineList: [] as MusicGroupQuitPageDto[],
  33. examinePage: {
  34. page: 1,
  35. rows: 20
  36. },
  37. examineSkelet: true,
  38. /** 完成列表 */
  39. completeList: [] as MusicGroupQuitPageDto[],
  40. completePage: {
  41. page: 1,
  42. rows: 20
  43. },
  44. completeResh: false,
  45. completeLoading: false,
  46. completeSkelet: true,
  47. completeFinish: false,
  48. completeActive: '',
  49. completeColumns: [{ text: '全部活动', value: '' }],
  50. options: [
  51. { text: '全部状态', value: '' },
  52. { text: '已通过', value: 'PASS' },
  53. { text: '未通过', value: 'REJECT' }
  54. ],
  55. optionTitle: '全部状态',
  56. activeOption: '' as any,
  57. search: ''
  58. });
  59. const getExamine = async () => {
  60. console.log('请求');
  61. todoData.examineLoading = true;
  62. if (todoData.refreshLoading) {
  63. todoData.examineList = [];
  64. }
  65. musicGroupQuitQueryPage({
  66. page: todoData.examinePage.page,
  67. rows: todoData.examinePage.rows
  68. })
  69. .then(res => {
  70. const rows: MusicGroupQuitPageDto[] = Array.isArray(res?.data?.rows)
  71. ? res.data.rows
  72. : [];
  73. todoData.examineList = todoData.examineList.concat(rows);
  74. if (!rows.length) {
  75. todoData.examineFinish = true;
  76. }
  77. })
  78. .catch(() => {
  79. todoData.examineFinish = true;
  80. })
  81. .finally(() => {
  82. todoData.examineLoading = false;
  83. setTimeout(() => {
  84. todoData.refreshLoading = false;
  85. todoData.examineSkelet = false;
  86. }, 500);
  87. });
  88. };
  89. const getComplete = () => {
  90. console.log('请求');
  91. todoData.completeLoading = true;
  92. musicGroupQuitQueryPage({
  93. page: todoData.examinePage.page,
  94. rows: todoData.examinePage.rows,
  95. search: todoData.search,
  96. status: todoData.activeOption
  97. })
  98. .then(res => {
  99. if (todoData.completeResh){
  100. todoData.completeList = []
  101. }
  102. const rows: MusicGroupQuitPageDto[] = Array.isArray(res?.data?.rows)
  103. ? res.data.rows
  104. : [];
  105. todoData.completeList = todoData.completeList.concat(rows);
  106. if (!rows.length) {
  107. todoData.completeFinish = true;
  108. }
  109. })
  110. .catch(() => {
  111. todoData.completeFinish = true;
  112. })
  113. .finally(() => {
  114. todoData.completeLoading = false;
  115. setTimeout(() => {
  116. todoData.completeResh = false;
  117. todoData.completeSkelet = false;
  118. }, 500);
  119. });
  120. };
  121. onMounted(() => {
  122. getExamine();
  123. getComplete();
  124. });
  125. /** 下载菜单改变 */
  126. const changeDropTitle = (option: any) => {
  127. // console.log(option, todoData.activeOption);
  128. todoData.optionTitle =
  129. todoData.activeOption === 'PASS'
  130. ? '已通过'
  131. : todoData.activeOption === 'REJECT'
  132. ? '未通过'
  133. : '全部状态';
  134. };
  135. /** 去详情页 */
  136. const handleGoto = (item: MusicGroupQuitPageDto) => {
  137. router.push({
  138. path: 'schedule-manage-detail',
  139. query: {
  140. musicGroupQuitId: item.musicGroupQuitId
  141. }
  142. });
  143. };
  144. return () => (
  145. <div class={styles['schedule-manage']}>
  146. <MSticky position="top">
  147. <MHeader></MHeader>
  148. </MSticky>
  149. <Tabs swipeable animated>
  150. <Tab name="待审批" title="待审批">
  151. <List
  152. loading={todoData.examineLoading}
  153. finished={todoData.examineFinish}
  154. class={styles.list}
  155. onLoad={getExamine}>
  156. <MFullRefresh
  157. v-model:modelValue={todoData.refreshLoading}
  158. onRefresh={() => {
  159. todoData.examinePage.page = 1;
  160. todoData.examineFinish = false;
  161. getExamine();
  162. }}>
  163. {todoData.examineSkelet && (
  164. <div class={[styles.list, styles.listHide]}>
  165. <Skeleton loading={true}>
  166. {{
  167. template: () => (
  168. <div style={{ width: '100%' }}>
  169. {new Array(10).fill(1).map((item: any) => (
  170. <SkeletionItem />
  171. ))}
  172. </div>
  173. )
  174. }}
  175. </Skeleton>
  176. </div>
  177. )}
  178. {todoData.examineList.map((item: MusicGroupQuitPageDto) => (
  179. <ListItem status="success" onGoto={() => handleGoto(item)} />
  180. ))}
  181. {!todoData.examineList.length && (
  182. <MEmpty
  183. description="暂无数据"
  184. style={{
  185. minHeight: '100%'
  186. }}
  187. />
  188. )}
  189. </MFullRefresh>
  190. </List>
  191. </Tab>
  192. <Tab name="已完成" title="已完成">
  193. <div class={styles.menubox}>
  194. <DropdownMenu>
  195. <DropdownItem
  196. teleport="body"
  197. title={todoData.optionTitle}
  198. v-model={todoData.activeOption}
  199. options={todoData.options}
  200. onChange={changeDropTitle}
  201. />
  202. </DropdownMenu>
  203. <MSearch
  204. placeholder="请输入学员名称"
  205. v-model:modelValue={todoData.search}
  206. onSearch={() => {
  207. todoData.examinePage.page = 1;
  208. todoData.completeFinish = false;
  209. getComplete();
  210. }}
  211. />
  212. </div>
  213. <List
  214. loading={todoData.completeLoading}
  215. finished={todoData.completeFinish}
  216. class={styles.list}
  217. onLoad={getComplete}>
  218. <MFullRefresh
  219. v-model:modelValue={todoData.completeResh}
  220. onRefresh={() => {
  221. todoData.examinePage.page = 1;
  222. todoData.completeFinish = false;
  223. getComplete();
  224. }}>
  225. {todoData.completeSkelet && (
  226. <div class={[styles.list, styles.listHide]}>
  227. <Skeleton loading={true}>
  228. {{
  229. template: () => (
  230. <div style={{ width: '100%' }}>
  231. {new Array(10).fill(1).map((item: any) => (
  232. <SkeletionItem />
  233. ))}
  234. </div>
  235. )
  236. }}
  237. </Skeleton>
  238. </div>
  239. )}
  240. {todoData.completeList.map((item: any) => (
  241. <ListItem status="success" />
  242. ))}
  243. {!todoData.examineList.length && (
  244. <MEmpty
  245. description="暂无数据"
  246. style={{
  247. minHeight: '100%'
  248. }}
  249. />
  250. )}
  251. </MFullRefresh>
  252. </List>
  253. </Tab>
  254. </Tabs>
  255. </div>
  256. );
  257. }
  258. });