Browse Source

09/21 优化完毕 等待勇哥联调

1
mo 2 years ago
parent
commit
1b766fbcd1

+ 1 - 1
src/api/buildTeam.js

@@ -1489,7 +1489,7 @@ export function getInstrument(data) {
   });
 }
 
-// 获取乐保列表
+// 删除乐保列表
 export function studentInstrumentDel(data) {
   return request2({
     url: api + `/studentInstrument/del`,

+ 2 - 0
src/router/index.js

@@ -561,6 +561,8 @@ export const asyncRoutes = {
   // 小小艺术家训练营
   littleArtistCamp:()=>import('@/views/littleArtistCamp'),
   liveShopManger:()=>import('@/views/liveShopManger'),
+  // 学员乐保
+  studentLebaoManager:()=>import('@/views/studentLebaoManager'),
 }
 
 export default router

+ 40 - 1
src/views/liveClassManager/liveClassDetail.vue

@@ -56,7 +56,7 @@
           <el-input
             v-model.trim="searchForm.search"
             clearable
-              @keyup.enter.native="
+            @keyup.enter.native="
               (e) => {
                 e.target.blur();
                 $refs.searchForm.save();
@@ -69,6 +69,15 @@
         <el-form-item>
           <el-button native-type="submit" type="primary">搜索</el-button>
           <el-button native-type="reset" type="danger">重置</el-button>
+          <el-button
+            type="primary"
+            v-if="tableList.length > 0"
+            v-permission="
+              'export/liveBroadcastRoomMember'
+            "
+            @click="exportStudent"
+            >导出</el-button
+          >
         </el-form-item>
       </save-form>
       <div class="tableWrap">
@@ -82,6 +91,7 @@
             prop="studentId"
             label="学员编号"
           ></el-table-column>
+
           <el-table-column
             align="center"
             prop="studentName"
@@ -89,6 +99,16 @@
           ></el-table-column>
           <el-table-column
             align="center"
+            prop="organName"
+            label="分部"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="musicGroupName"
+            label="乐团"
+          ></el-table-column>
+          <el-table-column
+            align="center"
             prop="phone"
             label="手机号"
           ></el-table-column>
@@ -184,6 +204,7 @@ import {
   getLiveBroadcastRoomDetail,
   getLiveBroadcastRoomDetailList,
 } from "./api";
+import { Export } from "@/utils/downLoadFile";
 export default {
   components: { pagination },
   data() {
@@ -264,6 +285,24 @@ export default {
       this.activeVideo = row;
       this.videoVisible = true;
     },
+    exportStudent() {
+      let obj = {
+          rows: this.rules.limit,
+          page: this.rules.page,
+          roomUid: this.$route.query.roomUid,
+          search: this.searchForm.search,
+        };
+      Export(
+        this,
+        {
+          url: "/api-web/export/liveBroadcastRoomMember",
+          fileName: `"${this.detail.roomTitle}"参与学员.xls`,
+          method: "post",
+          params: obj,
+        },
+        `您确定导出"${this.detail.roomTitle}"参与学员?`
+      );
+    },
   },
 };
 </script>

+ 31 - 6
src/views/reportForm/index.vue

@@ -181,6 +181,18 @@
                 :value="item.id"
               ></el-option>
             </el-select>
+            <el-date-picker
+              v-model.trim="cloudTimer"
+              style="width: 360px; margin-left: 15px"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              range-separator="至"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期"
+              :picker-options="{
+                firstDayOfWeek: 1,
+              }"
+            ></el-date-picker>
             <!-- <el-button
               style="margin-left: 10px"
               type="primary"
@@ -768,7 +780,10 @@
           <template slot="title">
             <p class="wrapTitle">财务数据</p>
           </template>
-          <div class="m-wrap" v-permission="'export/EXPORT_OPERATING_REPORT_NEW'">
+          <div
+            class="m-wrap"
+            v-permission="'export/EXPORT_OPERATING_REPORT_NEW'"
+          >
             <div class="title">经营报表导出:</div>
             <el-date-picker
               v-model="operatingMouth"
@@ -1046,7 +1061,8 @@ export default {
       trainingOrganId: [],
       trainingTimer: [],
       visitmouth: "",
-      operatingMouth:''
+      operatingMouth: "",
+      cloudTimer: [],
     };
   },
   mounted() {
@@ -1776,9 +1792,18 @@ export default {
       };
     },
     exportTrain() {
-      return {
-        organId: this.trainOrganId,
-      };
+      let cloudTeacherTrainStartDate, cloudTeacherTrainEndDate;
+      if (this.cloudTimer && this.cloudTimer.length > 0) {
+        cloudTeacherTrainStartDate = this.cloudTimer[0];
+        cloudTeacherTrainEndDate = this.cloudTimer[1];
+      } else {
+        cloudTeacherTrainStartDate = null;
+        cloudTeacherTrainEndDate = null;
+      }
+
+      let obj = { organId: this.trainOrganId,cloudTeacherTrainStartDate, cloudTeacherTrainEndDate};
+      console.log(obj,'exportTrain')
+      return obj;
     },
     exportDefaultSalary() {
       let organIdList = this.teacherDefaultSalaryOrganId.join(",");
@@ -1871,7 +1896,7 @@ export default {
       let data = { date: this.mouth };
       return data;
     },
-    exportOperating(){
+    exportOperating() {
       let data = { date: this.operatingMouth };
       return data;
     },

+ 8 - 3
src/views/smallStudentManager/components/index.vue

@@ -1,6 +1,6 @@
 <template>
   <div class="statistics">
-    <el-collapse v-model="activeNames" class="statisticsCollapse">
+    <el-collapse v-model="activeNames" class="statisticsCollapse" accordion @change="changeCollapse">
       <el-collapse-item name="1">
         <template slot="title">
           <div class="titleWrap">
@@ -66,6 +66,11 @@ export default {
         this.statistic = res.data || {};
       } catch {}
     },
+    changeCollapse(val){
+    if(val==1){
+      this.getList()
+    }
+    }
   },
   computed: {
     organIds() {
@@ -74,9 +79,8 @@ export default {
     isSearchs: {
       get() {
         let flag = this.isSearch();
-        if(this.flag != flag){
+        if((this.flag != flag)&&this.activeNames==1){
            this.getList()
-                 console.log('调用isSearchTable',flag)
         }
        this.flag = flag
 
@@ -84,6 +88,7 @@ export default {
       },
     },
   },
+
 };
 </script>
 

+ 307 - 0
src/views/studentLebaoManager/index.vue

@@ -0,0 +1,307 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      学员乐保
+    </h2>
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        class="searchForm"
+        ref="searchForm"
+        :model="searchForm"
+        @submit="onSearch"
+        @reset="onReSet"
+      >
+        <el-form-item prop="search">
+          <el-input
+            placeholder="学员编号/姓名"
+            clearable
+            @keyup.enter.native="
+              (e) => {
+                e.target.blur();
+                $refs.searchForm.save();
+                onSearch();
+              }
+            "
+            v-model.trim="searchForm.search"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="specification">
+          <el-input
+            placeholder="具体型号"
+            clearable
+            @keyup.enter.native="
+              (e) => {
+                e.target.blur();
+                $refs.searchForm.save();
+                onSearch();
+              }
+            "
+            v-model.trim="searchForm.specification"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="goodsCategoryId">
+          <el-select
+            v-model.trim="searchForm.goodsCategoryId"
+            clearable
+            placeholder="乐器分类"
+          >
+            <el-option
+              v-for="(item, index) in categoryList"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="status">
+          <el-select
+            v-model.trim="searchForm.status"
+            filterable
+            clearable
+            placeholder="是否乐保"
+          >
+            <el-option value="0" label="否"></el-option>
+            <el-option value="1" label="是"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="danger">搜索</el-button>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" native-type="reset">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <el-button
+        @click="operationStudent('create')"
+        type="primary"
+        v-permission="'studentInstrument/add'"
+        >新增乐器</el-button
+      >
+      <div class="tableWrap">
+        <el-table
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column label="学员信息" align="center">
+            <template slot-scope="scope">
+              <div @click="gotoStudent(scope.row.studentId)">
+                <p>
+                  <el-button type="text"
+                    >{{ scope.row.studentName }}<br />
+                    ({{ scope.row.studentId }})</el-button
+                  >
+                </p>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="学员声部" align="center">
+            <template slot-scope="scope">
+              <div>
+                <p>
+                  {{ scope.row.subjectName }}
+                </p>
+              </div>
+            </template>
+          </el-table-column>
+
+          <el-table-column label="乐器名称" align="center">
+            <template slot-scope="scope">
+              <copy-text>{{ scope.row.goodsName }}</copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column label="具体型号" align="center">
+            <template slot-scope="scope">
+              <copy-text>{{ scope.row.specification }}</copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column label="乐器分类" align="center">
+            <template slot-scope="scope">
+              <copy-text>{{ scope.row.goodsCategoryName }}</copy-text>
+            </template>
+          </el-table-column>
+          <el-table-column label="是否乐保" align="center" prop="teacherName">
+            <template slot-scope="scope">
+              {{ scope.row.status ? "是" : "否" }}
+            </template>
+          </el-table-column>
+          <el-table-column
+            label="乐保有效期"
+            align="center"
+            width="350px"
+            prop="studentNum"
+          >
+            <template slot-scope="scope">
+              <div v-if="scope.row.startTime && scope.row.endTime">
+                {{ scope.row.startTime }}~{{ scope.row.endTime }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center">
+            <template slot-scope="scope">
+              <auth :auths="['studentInstrument/update']">
+                <el-button
+                  type="text"
+                  @click="operationStudent('update', scope.row)"
+                  >修改</el-button
+                >
+              </auth>
+              <auth :auths="['studentInstrument/del']">
+                <el-button type="text" @click="removeMusic(scope.row)"
+                  >删除</el-button
+                >
+              </auth>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="pageInfo.total"
+          :page.sync="pageInfo.page"
+          :limit.sync="pageInfo.limit"
+          :page-sizes="pageInfo.page_size"
+          @pagination="getList"
+        />
+      </div>
+      <el-dialog
+        :title="operationStatus == 'create' ? '新增乐器' : '修改乐器'"
+        width="600px"
+        :visible.sync="addMusicVisible"
+        v-if="addMusicVisible"
+      >
+        <addMusic
+          :categoryList="categoryList"
+          :operationData="operationData"
+          :operationStatus="operationStatus"
+          :chioseStudent="true"
+          ref="addMusic"
+          @getList="getList"
+          @close="addMusicVisible = false"
+        />
+        <span slot="footer" class="dialog-footer">
+          <el-button @click="addMusicVisible = false">取 消</el-button>
+          <el-button type="primary" @click="addMusicSubmit">确 定</el-button>
+        </span>
+      </el-dialog>
+    </div>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import addMusic from "@/views/studentManager/modals/addMusic";
+import { getInstrument, studentInstrumentDel } from "@/api/buildTeam";
+import { categoryListTree } from "@/api/businessManager";
+
+export default {
+  components: { pagination, addMusic },
+  data() {
+    return {
+      soundLists: [],
+      tableList: [],
+      searchForm: {
+        specification: "",
+        goodsCategoryId: "",
+        studentId: "",
+      },
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      operationStatus: "create",
+      operationData: null,
+      addMusicVisible: false,
+      categoryList: [],
+    };
+  },
+  mounted() {
+    this.getCategory();
+    this.getList();
+  },
+  methods: {
+    onSearch() {
+      this.pageInfo.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs["searchForm"].resetFields();
+      this.getList();
+    },
+    async getList() {
+      try {
+        const res = await getInstrument({
+          ...this.searchForm,
+          rows: this.pageInfo.limit,
+          page: this.pageInfo.page,
+        });
+        this.tableList = res.data.rows;
+        this.pageInfo.total = res.data.total;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    addMusicSubmit() {
+      this.$refs.addMusic.addMusicSubmit();
+    },
+    operationStudent(type, row) {
+      if (type == "update") {
+        this.operationData = row;
+      } else if (type == "create") {
+        this.operationData = null;
+      }
+      this.operationStatus = type;
+      this.addMusicVisible = true;
+    },
+    removeMusic(row) {
+      // 删除乐器
+      this.$confirm(`您确定删除吗?`, "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(async () => {
+        try {
+          let res = await studentInstrumentDel({
+            id: row.id,
+            studentId: this.searchForm.studentId,
+          });
+          this.$message.success("修改成功");
+          this.getList();
+        } catch {}
+      });
+    },
+    getCategory() {
+      let params = {
+        delFlag: 0,
+        rows: 9999,
+      };
+      categoryListTree(params).then((res) => {
+        let result = res.data;
+        if (res.code == 200) {
+          let tempArray = [];
+          result.rows.forEach((row) => {
+            tempArray.push({
+              label: row.name,
+              value: row.id,
+            });
+          });
+          this.categoryList = tempArray;
+        }
+      });
+    },
+    gotoStudent(search) {
+      this.$router.push({
+        name: "studentList",
+        params: { search: search },
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.tableWrap {
+  margin-top: 20px;
+}
+</style>

+ 118 - 32
src/views/studentManager/modals/addMusic.vue

@@ -1,6 +1,32 @@
 <template>
   <div>
     <el-form :model="musicForm" label-width="110px" ref="form">
+      <el-form-item label="选择学员" prop="studentId" v-if="this.chioseStudent"  :rules="[
+          { required: true, message: '请选择学员', trigger: 'blur' },
+        ]">
+        <el-select
+        style="width: 400px !important"
+          v-model.trim="musicForm.studentId"
+          clearable
+          placeholder="请选择"
+          remote
+          filterable
+          :remote-method="remoteMethod"
+          :loading="remoteLoading"
+        >
+          <el-option
+            v-for="item in studentList"
+            :key="item.userId"
+            :label="item.username"
+            :value="item.userId"
+          >
+            <span style="float: left">{{ item.username }}</span>
+            <span style="float: right; color: #8492a6; font-size: 13px">{{
+              item.parentsPhone
+            }}</span>
+          </el-option>
+        </el-select>
+      </el-form-item>
       <el-form-item
         label="乐器分类"
         prop="goodsCategoryId"
@@ -92,10 +118,12 @@
 <script>
 import { goodsQuery } from "@/api/businessManager";
 import { addStudentInstrument, updateStudentInstrument } from "@/api/buildTeam";
+import { getToken, getTenantId } from "@/utils/auth";
 import { getTimes } from "@/utils";
-import dayjs from 'dayjs'
+import axios from "axios";
+import dayjs from "dayjs";
 export default {
-  props: ["categoryList", "operationData", "operationStatus"],
+  props: ["categoryList", "operationData", "operationStatus", "chioseStudent"],
   data() {
     return {
       musicForm: {
@@ -108,30 +136,32 @@ export default {
       pickerOptions: {
         firstDayOfWeek: 1,
         disabledDate(time) {
-          let times = dayjs(dayjs().format('YYYY-MM-DD')).valueOf()
+          let times = dayjs(dayjs().format("YYYY-MM-DD")).valueOf();
           return times > time.getTime();
         },
       },
       typeList: this.categoryList,
       musicList: [],
+      remoteLoading: false,
+      studentList: [],
     };
   },
   async mounted() {
-    console.log(this.operationData)
-    let operationData = this.operationData
-    if(operationData) {
-      let musicForm = this.musicForm
-      musicForm.goodsCategoryId = operationData.goodsCategoryId
-      if(operationData.goodsCategoryId) {
-        await this.changeCategory(operationData.goodsCategoryId)
+    console.log(this.operationData);
+    let operationData = this.operationData;
+    if (operationData) {
+      let musicForm = this.musicForm;
+      musicForm.goodsCategoryId = operationData.goodsCategoryId;
+      if (operationData.goodsCategoryId) {
+        await this.changeCategory(operationData.goodsCategoryId);
       }
-      musicForm.goodsId = operationData.goodsId
-      musicForm.goodsName = operationData.goodsName
-      musicForm.status = operationData.status + ''
-      musicForm.date = operationData.endTime || null
-
-
-      musicForm.id = operationData.id
+      musicForm.studentId = operationData.studentId;
+      musicForm.goodsId = operationData.goodsId;
+      musicForm.goodsName = operationData.goodsName;
+      musicForm.status = operationData.status + "";
+      musicForm.date = operationData.endTime || null;
+      musicForm.id = operationData.id;
+      this.remoteMethod(musicForm.studentId);
     }
   },
   methods: {
@@ -139,7 +169,11 @@ export default {
       this.musicForm.goodsName = "";
       this.musicForm.goodsId = null;
       if (val) {
-        goodsQuery({ goodsCategoryId: val, rows: 99999, type: 'INSTRUMENT' }).then((res) => {
+        goodsQuery({
+          goodsCategoryId: val,
+          rows: 99999,
+          type: "INSTRUMENT",
+        }).then((res) => {
           if (res.code == 200 && res.data) {
             this.musicList = res.data.rows;
           }
@@ -153,37 +187,89 @@ export default {
             const { date, status, ...rest } = this.musicForm;
             let obj = {
               ...rest,
-              status
+              status,
             };
             // 是否有乐保
-            if(status == 1) {
-              if(this.operationData && this.operationData.startTime) {
-                obj.startTime = this.operationData.startTime
+            if (status == 1) {
+              if (this.operationData && this.operationData.startTime) {
+                obj.startTime = this.operationData.startTime;
               } else {
-                obj.startTime = dayjs().format('YYYY-MM-DD HH:mm') + ':00'
+                obj.startTime = dayjs().format("YYYY-MM-DD HH:mm") + ":00";
               }
-              obj.endTime = date
+              obj.endTime = date;
             } else {
-              obj.startTime = ''
-              obj.endTime = ''
+              obj.startTime = "";
+              obj.endTime = "";
             }
-            if(this.operationStatus == 'create') {
+            if (this.operationStatus == "create") {
               const res = await addStudentInstrument(obj);
-              this.$message.success('添加成功')
-            } else if(this.operationStatus == 'update') {
+              this.$message.success("添加成功");
+            } else if (this.operationStatus == "update") {
               const res = await updateStudentInstrument(obj);
-              this.$message.success('修改成功')
+              this.$message.success("修改成功");
             }
-            this.$emit('close')
-            this.$emit('getList')
+            this.$emit("close");
+            this.$emit("getList");
           } catch (e) {
             console.log(e);
           }
         }
       });
     },
+    remoteMethod(query) {
+      if (query !== "") {
+        this.remoteLoading = true;
+        // 发请求搜索
+        const url = "/api-web/studentManage/queryStudentList";
+        const options = {
+          method: "post",
+          headers: {
+            Authorization: getToken(),
+            tenantId: getTenantId(),
+          },
+          data: {
+            rows: 999999,
+            search: query,
+          },
+          url,
+        };
+        this.remoteLoading = true;
+        // this.studentList = []
+        axios(options).then((res) => {
+          this.remoteLoading = false;
+          let result = res.data;
+          if (result.code == 200) {
+            // Array.prototype.splice.apply(this.studentList, result.data.rows);
+            if (result.data.rows && result.data.rows.length > 0) {
+              result.data.rows.forEach((item) => {
+                this.studentList.unshift(item);
+              });
+              this.studentList = this.deweight(this.studentList, "studentId");
+            }
+            // this.studentList = this.studentList.concat(result.data.rows);
+          }
+        });
+      }
+    },
+    // 制定属性去重
+    deweight(arr, key) {
+      let res = [];
+      arr.forEach((item) => {
+        let list = [];
+        res.forEach((resitem) => {
+          list.push(resitem[key]);
+        });
+        if (list.indexOf(item[key]) === -1) {
+          res.push(item);
+        }
+      });
+      return res;
+    },
   },
 };
 </script>
 <style lang="scss" scoped>
+  .width100 {
+    width: 100%!important;
+  }
 </style>