afterWork.tsx 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  1. import { defineComponent, onMounted, reactive, ref } from 'vue';
  2. import styles from '../index.module.less';
  3. import {
  4. NButton,
  5. NDataTable,
  6. NForm,
  7. NFormItem,
  8. NImage,
  9. NModal,
  10. NSelect,
  11. NSpace
  12. } from 'naive-ui';
  13. import SearchInput from '@/components/searchInput';
  14. import CSelect from '@/components/CSelect';
  15. import Pagination from '@/components/pagination';
  16. import { getTrainingList } from '../api';
  17. import add from './images/add.png';
  18. import { useRoute, useRouter } from 'vue-router';
  19. import CDatePicker from '/src/components/CDatePicker';
  20. import {
  21. getNowDateAndMonday,
  22. getNowDateAndSunday,
  23. getTimes
  24. } from '@/utils/dateFormat';
  25. import dayjs from 'dayjs';
  26. import TrainSettings from '../../attend-class/model/train-settings';
  27. import { use } from 'echarts';
  28. export default defineComponent({
  29. name: 'afterWork',
  30. setup(props, { emit }) {
  31. const timer = ref<[number, number]>([
  32. getNowDateAndMonday(new Date().getTime()),
  33. getNowDateAndSunday(new Date().getTime())
  34. ]);
  35. const state = reactive({
  36. searchForm: {
  37. status: null as any
  38. },
  39. loading: false,
  40. pagination: {
  41. page: 1,
  42. rows: 10,
  43. pageTotal: 4
  44. },
  45. tableList: [] as any,
  46. addWorkVisible: false
  47. });
  48. const router = useRouter();
  49. const route = useRoute();
  50. const search = () => {
  51. state.pagination.page = 1;
  52. getList();
  53. };
  54. const onReset = () => {
  55. timer.value = [
  56. getNowDateAndMonday(new Date().getTime()),
  57. getNowDateAndSunday(new Date().getTime())
  58. ];
  59. state.searchForm = {
  60. status: null as any
  61. };
  62. search();
  63. };
  64. const getList = async () => {
  65. state.loading = true;
  66. try {
  67. const res = await getTrainingList({
  68. classGroupId: route.query.id,
  69. ...state.searchForm,
  70. ...state.pagination,
  71. ...getTimes(timer.value, ['startTime', 'endTime'], 'YYYY-MM-DD')
  72. });
  73. state.tableList = res.data.rows;
  74. state.pagination.pageTotal = res.data.total;
  75. state.loading = false;
  76. } catch (e) {
  77. state.loading = false;
  78. console.log(e);
  79. }
  80. };
  81. onMounted(() => {
  82. getList();
  83. });
  84. const columns = () => {
  85. return [
  86. {
  87. title: '布置老师',
  88. key: 'teacherName'
  89. },
  90. {
  91. title: '布置时间',
  92. key: 'createTime',
  93. render(row: any) {
  94. return <>{dayjs(row.createTime).format('YYYY-MM-DD')}</>;
  95. }
  96. },
  97. {
  98. title: '截止时间',
  99. key: 'expireDate',
  100. render(row: any) {
  101. return <>{dayjs(row.expireDate).format('YYYY-MM-DD')}</>;
  102. }
  103. },
  104. {
  105. title: '训练状态',
  106. key: 'status',
  107. render(row: any) {
  108. return row.status == 0 ? (
  109. <div class={styles.indDot}>
  110. {' '}
  111. <span></span> 进行中
  112. </div>
  113. ) : (
  114. <div class={styles.endDot}>
  115. <span></span>已结束
  116. </div>
  117. );
  118. }
  119. },
  120. {
  121. title: '布置人数',
  122. key: 'expectNum'
  123. },
  124. {
  125. title: '提交人数',
  126. key: 'trainingNum'
  127. },
  128. {
  129. title: '合格人数',
  130. key: 'standardNum'
  131. },
  132. {
  133. title: '提交率',
  134. key: 'trainingRate',
  135. render(row: any) {
  136. return <>{row.trainingRate}%</>;
  137. }
  138. },
  139. {
  140. title: '合格率',
  141. key: 'qualifiedRate',
  142. render(row: any) {
  143. return <>{row.qualifiedRate}%</>;
  144. }
  145. },
  146. // {
  147. // title: '',
  148. // key: 'sex',
  149. // render(row: any) {
  150. // return <>{row.sex == '0' ? '女' : '男'}</>;
  151. // }
  152. // },
  153. {
  154. title: '操作',
  155. key: 'id',
  156. render(row: any) {
  157. return (
  158. <NButton text type="primary" onClick={() => gotoWorkDetail(row)}>
  159. 详情
  160. </NButton>
  161. );
  162. }
  163. }
  164. ];
  165. };
  166. const gotoWorkDetail = (row: any) => {
  167. console.log(row);
  168. router.push({
  169. path: '/afterWorkDetail',
  170. query: {
  171. ...route.query,
  172. teacherName: row.teacherName,
  173. trainingId: row.id
  174. }
  175. });
  176. };
  177. return () => (
  178. <div>
  179. <div class={styles.searchList}>
  180. <NForm label-placement="left" inline>
  181. <NFormItem>
  182. <CDatePicker
  183. v-model:value={timer.value}
  184. separator={'至'}
  185. type="daterange"
  186. timerValue={timer.value}></CDatePicker>
  187. </NFormItem>
  188. <NFormItem>
  189. <CSelect
  190. {...({
  191. options: [
  192. {
  193. label: '训练状态',
  194. value: null
  195. },
  196. {
  197. label: '已结束',
  198. value: 1
  199. },
  200. {
  201. label: '进行中',
  202. value: 0
  203. }
  204. ],
  205. placeholder: '训练状态',
  206. clearable: true,
  207. inline: true
  208. } as any)}
  209. v-model:value={state.searchForm.status}></CSelect>
  210. </NFormItem>
  211. <NFormItem>
  212. <NSpace justify="end">
  213. <NButton type="primary" class="searchBtn" onClick={search}>
  214. 搜索
  215. </NButton>
  216. <NButton
  217. type="primary"
  218. ghost
  219. class="resetBtn"
  220. onClick={onReset}>
  221. 重置
  222. </NButton>
  223. </NSpace>
  224. </NFormItem>
  225. </NForm>
  226. </div>
  227. <NButton
  228. class={styles.addBtn}
  229. type="primary"
  230. onClick={() => (state.addWorkVisible = true)}>
  231. 布置训练
  232. </NButton>
  233. <div class={styles.tableWrap}>
  234. <NDataTable
  235. class={styles.classTable}
  236. loading={state.loading}
  237. columns={columns()}
  238. data={state.tableList}></NDataTable>
  239. <Pagination
  240. v-model:page={state.pagination.page}
  241. v-model:pageSize={state.pagination.rows}
  242. v-model:pageTotal={state.pagination.pageTotal}
  243. onList={getList}
  244. sync
  245. saveKey="orchestraRegistration-key"
  246. />
  247. </div>
  248. <NModal
  249. v-model:show={state.addWorkVisible}
  250. preset="card"
  251. class={[styles.attendClassModal, styles.trainClassModal]}
  252. title={'训练设置'}>
  253. <TrainSettings
  254. classGroupId={route.query.id as string}
  255. onClose={() => {
  256. getList();
  257. state.addWorkVisible = false;
  258. }}
  259. />
  260. </NModal>
  261. </div>
  262. );
  263. }
  264. });