afterWork.tsx 7.9 KB

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