Browse Source

代办事项

liushengqiang 2 years ago
parent
commit
a6b0a348f9

+ 16 - 8
src/helpers/constant.ts

@@ -104,13 +104,21 @@ export const activeStatus = {
   END: '已结束'
 } as any;
 
-
 // 考勤类型
 export const clockingIn = {
-  NORMAL: "正常",
-  TRUANT: "旷课",
-  LEAVE: "请假",
-  QUIT_SCHOOL: "休学",
-  DROP_OUT: "退学",
-  LATE: "迟到"
-} as any
+  NORMAL: '正常',
+  TRUANT: '旷课',
+  LEAVE: '请假',
+  QUIT_SCHOOL: '休学',
+  DROP_OUT: '退学',
+  LATE: '迟到'
+} as any;
+
+/** 学生状态 */
+export const STUDENTSTATUS = {
+  GRADUATE: '毕业',
+  NOT_INTERESTED: '不感兴趣',
+  TIME_CONFLICT: '时间冲突',
+  FEELING_UNWELL: '身体不适',
+  OTHER: '其他'
+};

+ 3 - 3
src/views/schedule-manage/api.ts

@@ -21,7 +21,7 @@ export const musicGroupQuitQueryPage = (data: IMusicGroupQuitQueryPage) => {
  * @returns
  */
 export const api_musicGroupQuitGetDetail = (musicGroupQuitId: string) => {
-  return request.get('/api-web/musicGroupQuit/getDetail', {
+  return request.get('/api-web/schoolMusicGroupQuit/getDetail', {
     params: { musicGroupQuitId }
   });
 };
@@ -36,7 +36,7 @@ export const api_musicGroupQuitAuditPass = (
   musicGroupQuitId: number,
   reason: string
 ) => {
-  return request.get(`/api-web/musicGroupQuit/auditPass`, {
+  return request.get(`/api-web/schoolMusicGroupQuit/auditPass`, {
     params: { musicGroupQuitId, reason }
   });
 };
@@ -51,7 +51,7 @@ export const api_musicGroupQuitAuditReject = (
   musicGroupQuitId: number,
   reason: string
 ) => {
-  return request.get('musicGroupQuit/auditReject', {
+  return request.get('schoolMusicGroupQuit/auditReject', {
     params: { musicGroupQuitId, reason }
   });
 };

+ 48 - 25
src/views/schedule-manage/detial/index.tsx

@@ -1,7 +1,14 @@
 import { defineComponent, onMounted, reactive } from 'vue';
 import styles from './index.module.less';
 import Item from './item';
-import { Button, Cell, Field, Skeleton, SkeletonParagraph, showToast } from 'vant';
+import {
+  Button,
+  Cell,
+  Field,
+  Skeleton,
+  SkeletonParagraph,
+  showToast
+} from 'vant';
 import MSticky from '@/components/m-sticky';
 import MHeader from '@/components/m-header';
 import SkeletionDetailItem from './skeletion-detail-item';
@@ -12,6 +19,7 @@ import {
   api_musicGroupQuitAuditReject,
   api_musicGroupQuitGetDetail
 } from '../api';
+import { STUDENTSTATUS } from '@/helpers/constant';
 
 export default defineComponent({
   name: 'schedule-manage-detail',
@@ -19,12 +27,15 @@ export default defineComponent({
     const route = useRoute();
     const detailData = reactive({
       student: {} as MusicGroupQuitDetailDto,
-      skeleton: true
+      skeleton: true,
+      /** 审核意见 */
+      reason: '',
+      musicGroupQuitId: route.query.musicGroupQuitId as any
     });
 
     /** 获取退团详情 */
     const getDetail = async () => {
-      const musicGroupQuitId: string = route.query.musicGroupQuitId as any;
+      const musicGroupQuitId: string = detailData.musicGroupQuitId;
       api_musicGroupQuitGetDetail(musicGroupQuitId)
         .then(res => {
           const data: MusicGroupQuitDetailDto = res?.data || {};
@@ -37,19 +48,27 @@ export default defineComponent({
 
     /** 通过 */
     const musicGroupQuitAuditPass = async () => {
-      await api_musicGroupQuitAuditPass(
-        detailData.student.musicGroupQuitId,
-        detailData.student.reasonEnum
+      if (!detailData.reason) return showToast('请填写审核意见');
+      const res = await api_musicGroupQuitAuditPass(
+        detailData.musicGroupQuitId,
+        detailData.reason
       );
-      showToast('操作成功')
+      showToast('操作成功');
+      if (res.code === 200) {
+        getDetail();
+      }
     };
     /** 拒绝 */
     const musicGroupQuitAuditReject = async () => {
-      await api_musicGroupQuitAuditReject(
-        detailData.student.musicGroupQuitId,
-        detailData.student.reasonEnum
+      if (!detailData.reason) return showToast('请填写审核意见');
+      const res = await api_musicGroupQuitAuditReject(
+        detailData.musicGroupQuitId,
+        detailData.reason
       );
-      showToast('操作成功')
+      showToast('操作成功');
+      if (res.code === 200) {
+        getDetail();
+      }
     };
     onMounted(() => {
       getDetail();
@@ -67,7 +86,7 @@ export default defineComponent({
                 <SkeletionDetailItem />
               </div>
             ),
-            default: () => <Item />
+            default: () => <Item item={detailData.student} />
           }}
         </Skeleton>
 
@@ -84,7 +103,11 @@ export default defineComponent({
                   <SkeletonParagraph />
                 </div>
               ),
-              default: () => <div class={styles.info}>{detailData.student.userComment}</div>
+              default: () => (
+                <div class={styles.info}>
+                  {STUDENTSTATUS[detailData.student.reasonEnum]}
+                </div>
+              )
             }}
           </Skeleton>
 
@@ -102,9 +125,7 @@ export default defineComponent({
                 </div>
               ),
               default: () => (
-                <div class={styles.info}>
-                  {detailData.student.userComment}
-                </div>
+                <div class={styles.info}>{detailData.student.userComment}</div>
               )
             }}
           </Skeleton>
@@ -134,6 +155,7 @@ export default defineComponent({
                       type="textarea"
                       placeholder="请输入审批意见"
                       border={false}
+                      v-model:modelValue={detailData.reason}
                     />
                   ) : (
                     <div class={styles.info}>
@@ -146,17 +168,18 @@ export default defineComponent({
           </Skeleton>
         </div>
 
-        {!detailData.skeleton && detailData.student.status !== 'ING' && (
-          <div class={styles.item}>
-            <div class={styles.itemTitleDes}>
-              <div class={styles.line}></div>
-              <div>审批时间</div>
+        {/* {!detailData.skeleton &&
+          ['PASS', 'REJECT'].includes(detailData.student.status) && (
+            <div class={styles.item}>
+              <div class={styles.itemTitleDes}>
+                <div class={styles.line}></div>
+                <div>审批时间</div>
+              </div>
+              <div class={styles.info}>{}</div>
             </div>
-            <div class={styles.info}>2023-03-24 14:20:32</div>
-          </div>
-        )}
+          )} */}
 
-        {detailData.skeleton && detailData.student.status === 'ING' && (
+        {!detailData.skeleton && detailData.student.status === 'ING' && (
           <div class={[styles.btns, 'van-safe-area-bottom']}>
             <Button
               class={styles.cancelBtn}

+ 20 - 22
src/views/schedule-manage/detial/item.tsx

@@ -1,4 +1,4 @@
-import { PropType, defineComponent } from 'vue';
+import { PropType, defineComponent, toRefs } from 'vue';
 import styles from './index.module.less';
 import icontimer from '@/common/images/icon-timer.png';
 import iconTeacher from '@/common/images/icon-teacher-default.png';
@@ -12,10 +12,6 @@ import { postMessage } from '@/helpers/native-message';
 export default defineComponent({
   name: 'schedule-manage-list-item',
   props: {
-    status: {
-      type: String as PropType<'success' | 'error'>,
-      default: ''
-    },
     item: {
       type: Object as PropType<MusicGroupQuitDetailDto>,
       default: () => ({})
@@ -23,51 +19,53 @@ export default defineComponent({
   },
   emits: ['goto'],
   setup(props, { emit }) {
-    const item = props.item;
-    
+    const { item } = toRefs(props);
+
     /** 去聊天 */
     const openIm = () => {
       postMessage({
         api: 'joinChatGroup',
         content: {
           type: 'single', // single 单人 multi 多人
-          id: item.studentId
+          id: item.value.studentId
         }
-      })
-    }
+      });
+    };
     return () => (
       <div class={styles.item_box}>
         <div class={styles.listItem}>
           <div class={styles.itemTop}>
             <img class={styles.icon} src={icontimer} />
             <span class={styles.timeTitle}>审批时间:</span>
-            <span class={styles.time}>
-              {item.createTime}
-            </span>
+            <span class={styles.time}>{item.value.createTime}</span>
           </div>
-          <Cell center label={item.subjectName}>
+          <Cell center label={item.value.subjectName}>
             {{
               icon: () => (
                 <Image
-                  src={item.studentAvatar || iconTeacher}
+                  src={item.value.studentAvatar || iconTeacher}
                   class={styles.iconTeacher}
                   fit="contain"
                 />
               ),
               title: () => (
                 <div class={styles.cellTitle}>
-                  <span>{item.studentName}</span>
-                  <img class={styles.iconIm} src={iconIm} onClick={() => openIm()} />
+                  <span>{item.value.studentName}</span>
+                  <img
+                    class={styles.iconIm}
+                    src={iconIm}
+                    onClick={() => openIm()}
+                  />
                 </div>
               )
             }}
           </Cell>
         </div>
-        {item.status !== 'ING' && (
-          <img
-            class={styles.iconResult}
-            src={item.status === 'PASS' ? icon_comfirm : icon_cancel}
-          />
+        {item.value.status === 'PASS' && (
+          <img class={styles.iconResult} src={icon_comfirm} />
+        )}
+        {item.value.status === 'REJECT' && (
+          <img class={styles.iconResult} src={icon_cancel} />
         )}
       </div>
     );

+ 1 - 1
src/views/schedule-manage/index.module.less

@@ -99,7 +99,7 @@
       padding: 14px 12px;
     }
 
-    .van-cell__title {
+    .van-cell__title span{
       font-weight: bold;
     }
 

+ 41 - 18
src/views/schedule-manage/index.tsx

@@ -61,20 +61,20 @@ export default defineComponent({
     const getExamine = async () => {
       console.log('请求');
       todoData.examineLoading = true;
-      if (todoData.refreshLoading) {
-        todoData.examineList = [];
-      }
       musicGroupQuitQueryPage({
         page: todoData.examinePage.page,
         rows: todoData.examinePage.rows,
         status: 'ING'
       })
         .then(res => {
+          if (todoData.refreshLoading) {
+            todoData.examineList = [];
+          }
           const rows: MusicGroupQuitPageDto[] = Array.isArray(res?.data?.rows)
             ? res.data.rows
             : [];
           todoData.examineList = todoData.examineList.concat(rows);
-          if (!rows.length) {
+          if (!rows.length || rows.length < todoData.examinePage.rows) {
             todoData.examineFinish = true;
           }
         })
@@ -99,14 +99,14 @@ export default defineComponent({
         status: todoData.activeOption
       })
         .then(res => {
-          if (todoData.completeResh){
-            todoData.completeList = []
+          if (todoData.completeResh) {
+            todoData.completeList = [];
           }
           const rows: MusicGroupQuitPageDto[] = Array.isArray(res?.data?.rows)
             ? res.data.rows
             : [];
           todoData.completeList = todoData.completeList.concat(rows);
-          if (!rows.length) {
+          if (!rows.length || rows.length < todoData.completePage.rows) {
             todoData.completeFinish = true;
           }
         })
@@ -129,13 +129,16 @@ export default defineComponent({
 
     /** 下载菜单改变 */
     const changeDropTitle = (option: any) => {
-      // console.log(option, todoData.activeOption);
       todoData.optionTitle =
         todoData.activeOption === 'PASS'
           ? '已通过'
           : todoData.activeOption === 'REJECT'
           ? '未通过'
           : '全部状态';
+      todoData.examinePage.page = 1;
+      todoData.completeFinish = false;
+      todoData.completeResh = true;
+      getComplete();
     };
 
     /** 去详情页 */
@@ -159,7 +162,10 @@ export default defineComponent({
               loading={todoData.examineLoading}
               finished={todoData.examineFinish}
               class={styles.list}
-              onLoad={getExamine}>
+              onLoad={() => {
+                todoData.examinePage.page++;
+                getExamine();
+              }}>
               <MFullRefresh
                 v-model:modelValue={todoData.refreshLoading}
                 onRefresh={() => {
@@ -182,9 +188,11 @@ export default defineComponent({
                     </Skeleton>
                   </div>
                 )}
-                {todoData.examineList.map((item: MusicGroupQuitPageDto) => (
-                  <ListItem status="success" onGoto={() => handleGoto(item)} />
-                ))}
+                {todoData.examineList.map((item: MusicGroupQuitPageDto) => {
+                  return (
+                    <ListItem isLink={true} item={item} onGoto={() => handleGoto(item)} />
+                  );
+                })}
                 {!todoData.examineList.length && (
                   <MEmpty
                     description="暂无数据"
@@ -209,10 +217,11 @@ export default defineComponent({
               </DropdownMenu>
               <MSearch
                 placeholder="请输入学员名称"
-                v-model:modelValue={todoData.search}
-                onSearch={() => {
+                onSearch={(value) => {
+                  todoData.search = value
                   todoData.examinePage.page = 1;
                   todoData.completeFinish = false;
+                  todoData.completeResh = true;
                   getComplete();
                 }}
               />
@@ -221,7 +230,10 @@ export default defineComponent({
               loading={todoData.completeLoading}
               finished={todoData.completeFinish}
               class={styles.list}
-              onLoad={getComplete}>
+              onLoad={() => {
+                todoData.examinePage.page++;
+                getComplete();
+              }}>
               <MFullRefresh
                 v-model:modelValue={todoData.completeResh}
                 onRefresh={() => {
@@ -244,10 +256,21 @@ export default defineComponent({
                     </Skeleton>
                   </div>
                 )}
-                {todoData.completeList.map((item: any) => (
-                  <ListItem status="success" />
+                {todoData.completeList.map(item => (
+                  <ListItem
+                    item={item}
+                    isLink={true}
+                    onGoto={() => handleGoto(item)}
+                    status={
+                      item.status === 'PASS'
+                        ? 'success'
+                        : item.status === 'REJECT'
+                        ? 'error'
+                        : ''
+                    }
+                  />
                 ))}
-                {!todoData.examineList.length && (
+                {!todoData.completeList.length && (
                   <MEmpty
                     description="暂无数据"
                     style={{

+ 12 - 8
src/views/schedule-manage/list-item.tsx

@@ -1,4 +1,4 @@
-import { PropType, defineComponent } from 'vue';
+import { PropType, defineComponent, toRefs } from 'vue';
 import styles from './index.module.less';
 import icontimer from '@/common/images/icon-timer.png';
 import iconTeacher from '@/common/images/icon-teacher-default.png';
@@ -9,23 +9,27 @@ export default defineComponent({
   name: 'schedule-manage-list-item',
   props: {
     status: {
-      type: String as PropType<'success' | 'error'>,
+      type: String as PropType<'success' | 'error' | ''>,
       default: ''
     },
     item: {
       type: Object as PropType<MusicGroupQuitPageDto>,
       default: () => ({})
+    },
+    isLink: {
+      type: Boolean,
+      default: false
     }
   },
   emits: ['goto'],
   setup(props, { emit }) {
-    const item = props.item
+    const { item, isLink } = toRefs(props);
     return () => (
       <div class={styles.listItem}>
         <div class={styles.itemTop}>
           <img class={styles.icon} src={icontimer} />
           <span class={styles.timeTitle}>审批时间:</span>
-          <span class={styles.time}>{item.createTime}</span>
+          <span class={styles.time}>{item.value.createTime}</span>
           {props.status === 'success' && (
             <div class={[styles.timeBtn, styles.success]}>已通过</div>
           )}
@@ -35,15 +39,15 @@ export default defineComponent({
         </div>
         <Cell
           center
-          title={item.studentName}
-          label={item.subjectName}
+          title={item.value.studentName}
+          label={item.value.subjectName}
           value={'退团申请'}
-          isLink
+          isLink={isLink.value}
           onClick={() => emit('goto')}>
           {{
             icon: () => (
               <Image
-                src={item.studentAvatar || iconTeacher}
+                src={item.value.studentAvatar || iconTeacher}
                 class={styles.iconTeacher}
                 fit="contain"
               />

+ 3 - 1
src/views/student-manage/index.tsx

@@ -175,7 +175,7 @@ export default defineComponent({
         <MSticky position="top">
           <MHeader />
           <MSearch
-            placeholder='请输入学生姓名'
+            placeholder="请输入学生姓名"
             onSearch={value => {
               fromData.keyword = value;
               handleSearch();
@@ -212,6 +212,7 @@ export default defineComponent({
                       studentMagege.musicGroups.find(
                         _item => _item.value == studentMagege.musicGroupId
                       )?.text || '全部乐团';
+                    studentMagege.musicGroupId = '';
                     handleSearch();
                   }}>
                   确定
@@ -247,6 +248,7 @@ export default defineComponent({
                       studentMagege.subjects.find(
                         _item => _item.value == studentMagege.subjectId
                       )?.text || '全部声部';
+                    studentMagege.subjectId = '';
                     handleSearch();
                   }}>
                   确定