Explorar o código

提交一下

1
mo %!s(int64=3) %!d(string=hai) anos
pai
achega
7b04785acf

+ 7 - 0
src/constant/index.js

@@ -328,3 +328,10 @@ export const orderType = {
   ADD_STUDENT: '进行中乐团加学员',
   OTHER: "其他",
 }
+
+export const backType = {
+  VIP:'vip',
+  PRACTICE :'网管课',
+  MUSIC :'退团',
+  GOODS:'商品'
+}

+ 1 - 0
src/router/index.js

@@ -456,6 +456,7 @@ export const asyncRoutes = {
   activeMarketing:()=>import ('@/views/activityScheduling/activeMarketing'),
   // 2021双11
   '2021double11List':()=>import ('@/views/activityScheduling/2021double11List'),
+  backManager:()=>import ('@/views/backManager')
 }
 
 export default router

+ 2 - 1
src/utils/searchArray.js

@@ -1,5 +1,5 @@
 // 搜索用的下拉数据列表
-import { payOrderType, auditType, auditPaymentType, orderServerType, orderAuditType, rewardModeType,classTime,musicClassType,ProbationPeriodStatus,downListType,musicGroupType,conclusion,vipResetType,courseViewType,clientType,couponType } from '../constant'
+import { payOrderType, auditType, auditPaymentType, orderServerType, orderAuditType, rewardModeType,classTime,musicClassType,ProbationPeriodStatus,downListType,musicGroupType,conclusion,vipResetType,courseViewType,clientType,couponType,backType } from '../constant'
 // 课程类型
 export const courseType = [
   { label: "声部课", value: "SINGLE" },
@@ -238,6 +238,7 @@ export const downTypeList = getValueForKey(downListType)
 export const conclusionList = getValueForKey(conclusion)
 export const clientList = getValueForKey(clientType)
 export const couponTypeList = getValueForKey(couponType)
+export const backTypeList =  getValueForKey(backType)
 //downListType
 function getValueForKey (obj) {
   let arr = []

+ 4 - 1
src/utils/vueFilter.js

@@ -642,7 +642,10 @@ Vue.filter('feeProject', value => {
 Vue.filter('saleType', value => {
   return constant.saleType[value]
 })
-
+// 退费类型 backType
+Vue.filter('backType', value => {
+  return constant.backType[value]
+})
 // 缴费状态
 
 Vue.filter('teamPayStatus', value => {

+ 8 - 1
src/views/attendanceManager/attendanceList/index.vue

@@ -14,10 +14,11 @@
       >
         <el-form-item>
           <el-input
+            class="search"
             v-model.trim="searchForm.search"
             clearable
             @keyup.enter.native="search"
-            placeholder="课程编号、名称、乐团名称"
+            placeholder="课程编号、名称、乐团名称、老师"
           ></el-input>
         </el-form-item>
         <el-form-item prop="organId">
@@ -262,4 +263,10 @@ export default {
 };
 </script>
 <style lang='scss' scoped>
+.search {
+  // width: 220px!important;
+  /deep/.el-input__inner {
+     width: 260px!important;
+  }
+}
 </style>

+ 11 - 0
src/views/backManager/api.js

@@ -0,0 +1,11 @@
+import request2 from '@/utils/request2'
+import qs from 'qs'
+let api = '/api-web'
+export function getUserCashAccountLog(data) {
+  return request2({
+    url: api + '/userCashAccountLog/queryPage',
+    method: 'get',
+    params:data,
+    requestType: 'form'
+  })
+}

+ 296 - 0
src/views/backManager/index.vue

@@ -0,0 +1,296 @@
+<!--  -->
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      退费记录
+    </h2>
+    <div class="m-core">
+      <save-form
+        :inline="true"
+        :model="searchForm"
+        ref="searchForm"
+        @submit="search"
+        @reset="onReSet"
+      >
+        <el-form-item prop="search">
+          <el-input
+            class="search"
+            v-model.trim="searchForm.search"
+            clearable
+            @keyup.enter.native="search"
+            placeholder="退费编号、学员、课程组、流水号"
+          ></el-input>
+        </el-form-item>
+        <el-form-item prop="organId">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.organId"
+            filterable
+            clearable
+            placeholder="请选择分部"
+          >
+            <el-option
+              v-for="(item, index) in selects.branchs"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="returnFeeType">
+          <el-select
+            class="multiple"
+            v-model.trim="searchForm.returnFeeType"
+            filterable
+            clearable
+            placeholder="请选择退费类型"
+          >
+            <el-option
+              v-for="(item, index) in backTypeList"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item prop="backTime">
+          <el-date-picker
+            v-model.trim="searchForm.backTime"
+            style="width: 400px"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="退费开始日期"
+            end-placeholder="退费结束日期"
+            value-format="yyyy-MM-dd"
+            :picker-options="{
+              firstDayOfWeek: 1,
+            }"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item prop="payTime">
+          <el-date-picker
+            v-model.trim="searchForm.payTime"
+            style="width: 400px"
+            type="daterange"
+            range-separator="至"
+            start-placeholder="打款开始日期"
+            end-placeholder="打款结束日期"
+            value-format="yyyy-MM-dd"
+            :picker-options="{
+              firstDayOfWeek: 1,
+            }"
+          ></el-date-picker>
+        </el-form-item>
+        <el-form-item>
+          <el-button native-type="submit" type="primary">搜索</el-button>
+          <el-button native-type="reset" type="danger">重置</el-button>
+        </el-form-item>
+      </save-form>
+      <div class="tableWrap">
+        <el-table
+          style="width: 100%"
+          :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+          :data="tableList"
+        >
+          <el-table-column
+            align="center"
+            prop="id"
+            label="退费编号"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="学员">
+            <template slot-scope="scope">
+              <div>
+                <p>{{ scope.row.username }}</p>
+                <p>{{ scope.row.userId }}</p>
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="organName"
+            label="分部"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="groupId"
+            label="课程组编号"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="退费金额">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.amount | moneyFormat }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="studentId" label="退费类型">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.returnFeeType | backType }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="studentId"
+            label="退费时间"
+            width="100px"
+          >
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.createTime }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column
+            align="center"
+            prop="transNo"
+            label="交易流水号"
+          ></el-table-column>
+          <el-table-column
+            align="center"
+            prop="payTime"
+            label="打款时间"
+            width="100px"
+          ></el-table-column>
+          <el-table-column align="center" prop="studentId" label="退费状态">
+            <template slot-scope="scope">
+              <div>
+                {{ scope.row.transNo ? "已打款" : "未打款" }}
+              </div>
+            </template>
+          </el-table-column>
+          <el-table-column align="center" prop="studentId" label="操作">
+            <template slot-scope="scope">
+              <div>
+                <el-button type="text" @click="resetBackForm(scope.row)"
+                  >修改</el-button
+                >
+              </div>
+            </template>
+          </el-table-column>
+        </el-table>
+        <pagination
+          sync
+          :total.sync="rules.total"
+          :page.sync="rules.page"
+          :limit.sync="rules.limit"
+          :page-sizes="rules.page_size"
+          @pagination="getList"
+        />
+      </div>
+    </div>
+    <el-dialog :visible.sync="resetVisible" title="修改退费记录" width="400px">
+      <el-form :model="form" :rules="rules">
+        <el-form-item label="编号">{{ form.id }}</el-form-item>
+        <el-form-item label="学员">{{ form.username }}</el-form-item>
+        <el-form-item label="课程组编号">{{ form.groupId }}</el-form-item>
+        <el-form-item label="金额">{{
+          form.amount | moneyFormat
+        }}</el-form-item>
+        <el-form-item label="交易流水号"
+          ><el-input v-model="form.transNo"></el-input
+        ></el-form-item>
+        <el-form-item v-if="form.transNo" label="打款时间">
+          <el-date-picker
+            style="width: 400px"
+            v-model="musicForm.date"
+            clearable
+            type="datetime"
+            value-format="yyyy-MM-dd HH:mm:ss"
+            default-time="23:59:59"
+            :picker-options="{firstDayOfWeek: 1,}"
+            placeholder="打款结束日期"
+          >
+          </el-date-picker>
+        </el-form-item>
+      </el-form>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import axios from "axios";
+import { getToken } from "@/utils/auth";
+import pagination from "@/components/Pagination/index";
+import { getTimes } from "@/utils";
+import load from "@/utils/loading";
+import { backTypeList } from "@/utils/searchArray";
+import { getUserCashAccountLog } from "./api";
+export default {
+  components: { pagination },
+  data() {
+    return {
+      searchForm: {
+        search: null,
+        returnFeeType: null,
+        organId: null,
+        backTime: [],
+        payTime: [],
+      },
+      backTypeList,
+      tableList: [],
+      activeRow: null,
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      form: {},
+      resetVisible: false,
+    };
+  },
+  //生命周期 - 创建完成(可以访问当前this实例)
+  created() {},
+  //生命周期 - 挂载完成(可以访问DOM元素)
+  async mounted() {
+    // 获取分部
+    await this.$store.dispatch("setBranchs");
+    this.init();
+  },
+  methods: {
+    init() {
+      this.getList();
+    },
+    async getList() {
+      let { backTime, payTime, ...rest } = this.searchForm;
+      let params = {
+        ...rest,
+        page: this.rules.page,
+        rows: this.rules.limit,
+        ...getTimes(backTime, ["createStartTime", "createEndTime"]),
+        ...getTimes(payTime, ["payStartTime", "payEndTime"]),
+      };
+      try {
+        const res = await getUserCashAccountLog(params);
+        this.tableList = res.data.rows;
+        this.rules.total = res.data.total;
+      } catch (e) {
+        console.log(e);
+      }
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.$refs["searchForm"].resetFields();
+      this.search();
+    },
+    resetBackForm(row) {
+      this.activeRow = row;
+      this.form = { ...row };
+      this.resetVisible = true;
+    },
+  },
+};
+</script>
+<style lang='scss' scoped>
+.search {
+  /deep/.el-input__inner {
+    width: 260px !important;
+  }
+}
+</style>

+ 14 - 31
src/views/teamBuild/forecastName.vue

@@ -331,34 +331,12 @@
       @close="onClose('extendForm')"
       width="400px"
     >
-      <el-form
-        label-width="110px"
-        :model="extendForm"
-        ref="extendForm"
-        :rules="extendRule"
-      >
-        <el-form-item label="家长会时间" prop="meetingDate">
-          <el-date-picker
-            style="width: 100% !important"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            v-model.trim="extendForm.meetingDate"
-            type="datetime"
-            :picker-options="applyDates"
-            placeholder="请选择家长会时间"
-          >
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="家长会地址" prop="address">
-          <el-input
-            v-model="extendForm.address"
-            placeholder="请输入家长会地址"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="短信内容">
-          <p class="msgP" v-html="sysMsgStr"></p>
-        </el-form-item>
-        <p style="color: red">确认后该短信将发送给已填写预报名问卷的学员</p>
-      </el-form>
+      <parentsMeeting
+      v-if="extendPaymentStatus"
+        :extendForm="extendForm"
+        :sysMsgStr="sysMsgStr"
+        :msg="'确认后该短信将发送给已填写预报名问卷的学员'"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button @click="extendPaymentStatus = false">取 消</el-button>
         <el-button type="primary" @click="onExtendPayment('extendForm')"
@@ -418,6 +396,7 @@ import { vaildStudentUrl, vaildTeachingUrl } from "@/utils/validate";
 import { Export } from "@/utils/downLoadFile";
 import visitModel from "@/views/withdrawal-application/modals/visit";
 import intentionModel from "./modals/intention";
+import parentsMeeting from './modals/parentsMeeting'
 import {
   queryPreApplyList,
   finishPreApply,
@@ -426,7 +405,7 @@ import {
 } from "./api";
 export default {
   name: "forecastName",
-  components: { pagination, qrCode, visitModel, intentionModel },
+  components: { pagination, qrCode, visitModel, intentionModel,parentsMeeting },
   props: ["isedit"],
   data() {
     const query = this.$route.query;
@@ -566,10 +545,14 @@ export default {
       // this.visitDetail = rows
     },
     onClose(formName) {
-      this.$refs[formName].resetFields();
+        this.extendForm= {
+        meetingDate: null,
+        address: null,
+      }
+    //  this.$refs[formName].$refs[formName].resetFields();
     },
     onExtendPayment(formName) {
-      this.$refs[formName].validate(async (valid) => {
+      this.$refs[formName].$refs[formName].validate(async (valid) => {
         if (valid) {
           try {
             await this.$confirm("您是否确定发送家长会通知?", "提示", {

+ 38 - 40
src/views/teamBuild/initiationList.vue

@@ -13,7 +13,10 @@
         >预报名详情</el-button
       > -->
 
-      <auth :auths="['musicEnlightenmentQuestionnaire/sendParentMeetingNotice']" v-if="isedit">
+      <auth
+        :auths="['musicEnlightenmentQuestionnaire/sendParentMeetingNotice']"
+        v-if="isedit"
+      >
         <el-button type="primary" @click="extendPaymentStatus = true"
           >启蒙课家长会通知</el-button
         >
@@ -28,7 +31,11 @@
           >启蒙课问卷导出</el-button
         >
       </auth>
-      <auth :auths="['musicEnlightenmentQuestionnaire/musicEnlightenmentQuestionnaireStat']">
+      <auth
+        :auths="[
+          'musicEnlightenmentQuestionnaire/musicEnlightenmentQuestionnaireStat',
+        ]"
+      >
         <el-button type="primary" @click="subjectVisible = true"
           >启蒙课问卷统计</el-button
         >
@@ -140,7 +147,7 @@
             <template slot-scope="scope">
               <div>
                 {{
-                  scope.row.teacherRecommandSubjectId!=-1
+                  scope.row.teacherRecommandSubjectId != -1
                     ? scope.row.subjectName
                     : "无"
                 }}
@@ -223,34 +230,13 @@
       @close="onClose('extendForm')"
       width="400px"
     >
-      <el-form
-        label-width="110px"
-        :model="extendForm"
+      <parentsMeeting
+        v-if="extendPaymentStatus"
         ref="extendForm"
-        :rules="extendRule"
-      >
-        <el-form-item label="家长会时间" prop="meetingDate">
-          <el-date-picker
-            style="width: 100% !important"
-            value-format="yyyy-MM-dd HH:mm:ss"
-            v-model.trim="extendForm.meetingDate"
-            type="datetime"
-            :picker-options="applyDates"
-            placeholder="请选择家长会时间"
-          >
-          </el-date-picker>
-        </el-form-item>
-        <el-form-item label="家长会地址" prop="address">
-          <el-input
-            v-model="extendForm.address"
-            placeholder="请输入家长会地址"
-          ></el-input>
-        </el-form-item>
-        <el-form-item label="短信内容" >
-          <p class="msgP" v-html="sysMsgStr"></p> </el-form-item>
-        <p style="color:red">确认后该短信将发送给已填写启蒙课问卷且【报名参加管乐团家长会了解相关情况】选择【是】的学员</p>
-      </el-form>
-
+        :extendForm="extendForm"
+        :sysMsgStr="sysMsgStr"
+        :msg="'确认后该短信将发送给已填写启蒙课问卷且【报名参加管乐团家长会了解相关情况】选择【是】的学员'"
+      />
       <div slot="footer" class="dialog-footer">
         <el-button @click="extendPaymentStatus = false">取 消</el-button>
         <el-button type="primary" @click="onExtendPayment('extendForm')"
@@ -299,9 +285,16 @@ import {
   sendEnlighParentMeetingNotice,
   getMusicEnlighList,
 } from "./api";
+import parentsMeeting from "./modals/parentsMeeting";
 export default {
   name: "forecastName",
-  components: { pagination, qrCode, visitModel, intentionModel },
+  components: {
+    pagination,
+    qrCode,
+    visitModel,
+    intentionModel,
+    parentsMeeting,
+  },
   props: ["isedit"],
   data() {
     const query = this.$route.query;
@@ -351,13 +344,13 @@ export default {
       gradeList: [],
       preLookVisible: false,
       sysMsg: "",
-      subjectList:[]
+      subjectList: [],
     };
   },
- async mounted() {
-  await  this.$store.dispatch("setSubjects");
-this.subjectList = [...this.selects.subjects]
-this.subjectList.push({id:-1,name:'无'})
+  async mounted() {
+    await this.$store.dispatch("setSubjects");
+    this.subjectList = [...this.selects.subjects];
+    this.subjectList.push({ id: -1, name: "无" });
     this.init();
   },
   methods: {
@@ -380,7 +373,7 @@ this.subjectList.push({id:-1,name:'无'})
       const rus = await getSysMessageConfig({
         type: "STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE",
       });
-     this.sysMsg = rus.data?.content||'';
+      this.sysMsg = rus.data?.content || "";
       this.getList();
     },
     permission,
@@ -458,10 +451,13 @@ this.subjectList.push({id:-1,name:'无'})
       // this.visitDetail = rows
     },
     onClose(formName) {
-      this.$refs[formName].resetFields();
+      this.extendForm = {
+        meetingDate: null,
+        address: null,
+      };
     },
     onExtendPayment(formName) {
-      this.$refs[formName].validate(async (valid) => {
+      this.$refs[formName].$refs[formName].validate(async (valid) => {
         if (valid) {
           try {
             await this.$confirm("您是否确定发送家长会通知?", "提示", {
@@ -502,7 +498,9 @@ this.subjectList.push({id:-1,name:'无'})
       if (strArr.length == 3) {
         return `${strArr[0]}<span style="color:red">"${
           this.extendForm.meetingDate ? this.extendForm.meetingDate : "--"
-        }"</span>${strArr[1]}<span style="color:red">"${this.extendForm.address ? this.extendForm.address:"--"}"</span>
+        }"</span>${strArr[1]}<span style="color:red">"${
+          this.extendForm.address ? this.extendForm.address : "--"
+        }"</span>
         ${strArr[2]}`;
       } else {
         return ``;

+ 66 - 0
src/views/teamBuild/modals/parentsMeeting.vue

@@ -0,0 +1,66 @@
+<template>
+  <div>
+    <el-form
+      label-width="110px"
+      :model="extendForm"
+      ref="extendForm"
+      :rules="extendRule"
+    >
+      <el-form-item label="家长会时间" prop="meetingDate">
+        <el-date-picker
+          style="width: 100% !important"
+          value-format="yyyy-MM-dd HH:mm:ss"
+          v-model.trim="extendForm.meetingDate"
+          type="datetime"
+          :picker-options="applyDates"
+          placeholder="请选择家长会时间"
+        >
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item label="家长会地址" prop="address">
+        <el-input
+          v-model="extendForm.address"
+          placeholder="请输入家长会地址"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="短信内容">
+        <p class="msgP" v-html="sysMsgStr"></p>
+      </el-form-item>
+      <p style="color: red">{{ msg }}</p>
+    </el-form>
+  </div>
+</template>
+<script>
+export default {
+  props: ["extendForm", "sysMsgStr", "msg"],
+  data() {
+    return {
+      extendRule: {
+        meetingDate: [
+          { required: true, message: "请选择家长会时间", trigger: "change" },
+        ],
+        address: [
+          { required: true, message: "请输入家长会地址", trigger: "blur" },
+        ],
+      },
+    };
+  },
+  methods: {
+    applyDates() {
+      return {
+        firstDayOfWeek: 1,
+        disabledDate(time) {
+          if (end) {
+            return new Date(end).getTime() - 86400000 >= time.getTime();
+          } else {
+            return time.getTime() + 86400000 < Date.now();
+            //开始时间不选时,结束时间最大值小于等于当天
+          }
+        },
+      };
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+</style>

+ 107 - 12
src/views/teamBuild/signupList.vue

@@ -69,6 +69,13 @@
             延长缴费
           </div>
 
+          <!-- 家长会 -->
+          <auth
+            :auths="['musicGroup/sendParentMeetingNotice']"
+            v-if="status == 'PAY'"
+          >
+            <div class="newBand" @click="meetingStatus = true">家长会通知</div>
+          </auth>
           <div
             class="newBand"
             @click="onCreateQRCode('payment')"
@@ -623,8 +630,10 @@
         </el-table-column>
         <el-table-column label="年级班级" align="center">
           <template slot-scope="scope">
-            <div v-if=" gradeListObj[scope.row.currentGrade]">
-              {{ gradeListObj[scope.row.currentGrade] + scope.row.currentClass }}
+            <div v-if="gradeListObj[scope.row.currentGrade]">
+              {{
+                gradeListObj[scope.row.currentGrade] + scope.row.currentClass
+              }}
             </div>
           </template>
         </el-table-column>
@@ -993,7 +1002,7 @@
       :visible.sync="quitVisible"
     >
       <quiteTeam :quitForm="quitForm" :activeRow="activeRow" ref="quitForm" />
-       <p style="color:red;paddingLeft:150px">退费金额暂不进入账户余额</p>
+      <p style="color: red; paddingleft: 150px">退费金额暂不进入账户余额</p>
       <span slot="footer" class="dialog-footer question">
         <div>
           <el-popover placement="right" width="500" trigger="click">
@@ -1050,11 +1059,33 @@
         :voiceList="leftList"
       />
     </el-dialog>
+    <!-- 家长会通知 -->
+    <el-dialog
+      title="预报名家长会通知"
+      :visible.sync="meetingStatus"
+      @close="onCloseMeet('extendForm')"
+      width="400px"
+    >
+      <parentsMeeting
+        v-if="meetingStatus"
+        :extendForm="meetingForm"
+        :sysMsgStr="sysMsgStr"
+        ref="meetingForm"
+        :msg="'确认后该短信将发送给已缴费的学员'"
+      />
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="meetingStatus = false">取 消</el-button>
+        <el-button type="primary" @click="onMeetingPayment('extendForm')"
+          >确 定</el-button
+        >
+      </div>
+    </el-dialog>
   </div>
 </template>
 <script>
 import pagination from "@/components/Pagination/index";
 import qrCode from "@/components/QrCode/index";
+
 import {
   getintoClass,
   getStudentList,
@@ -1074,7 +1105,12 @@ import {
   getRefundsDetail,
   applyMusicGroupQuit,
 } from "@/api/buildTeam";
-import { setNoneCloudTeacher, setCloudTeacherToFailed } from "./api";
+import {
+  setNoneCloudTeacher,
+  setCloudTeacherToFailed,
+  sendParentMeetingNotice,
+  getSysMessageConfig,
+} from "./api";
 import mergeMusic from "./components/merge-music";
 import forecastList from "./components/forecast-list";
 import newForecastList from "./components/newForecast-list";
@@ -1093,6 +1129,7 @@ import changeVoice from "./modals/change-voice";
 import visit from "@/views/withdrawal-application/modals/visit";
 import quiteTeam from "@/views/teamDetail/components/modals/quite-team";
 import { courseType } from "@/constant/index";
+ import parentsMeeting from './modals/parentsMeeting'
 export default {
   name: "signupList",
   components: {
@@ -1104,6 +1141,7 @@ export default {
     visit,
     newForecastList,
     quiteTeam,
+    parentsMeeting
   },
   data() {
     return {
@@ -1244,11 +1282,17 @@ export default {
       ischeckCanReg: false,
       courseViewType: null, // 乐团模式
       isManage: false,
-      gradeListObj:{}
+      gradeListObj: {},
+      meetingStatus: false,
+      meetingForm: {
+        meetingDate: null,
+        address: null,
+      },
+      sysMsg:''
     };
   },
   created() {},
-  mounted() {
+  async mounted() {
     // 通过乐团状态判断显示隐藏的东西
     let isSuperAdmin = this.$store.getters.isSuperAdmin;
     let roles = this.$store.getters.roles;
@@ -1264,6 +1308,13 @@ export default {
     if (roles.indexOf(3) != -1 && roles.indexOf(4) != -1) {
       this.isManage = "super";
     }
+
+    // 获取短信模板
+    const rus = await getSysMessageConfig({
+      type: "STUDENT_SMS_IM_MUSIC_GROUP_PARENT_MEETING_NOTICE",
+    });
+    this.sysMsg = rus.data?.content || "";
+
     this.init();
   },
   activated() {
@@ -1301,7 +1352,7 @@ export default {
 
       getMusicGroupGradeList({ musicGroupId: this.id }).then((res) => {
         let result = res.data;
-        this.gradeListObj = res.data
+        this.gradeListObj = res.data;
         if (res.code == 200 && result) {
           for (let i in result) {
             this.gradeList.push({
@@ -1722,7 +1773,10 @@ export default {
           paymentList.forEach((item) => {
             if (item.type == "MAINTENANCE") {
               item.name = "乐器保养";
-            } else if (item.type == "CLOUD_TEACHER" || item.type == "CLOUD_TEACHER_PLUS") {
+            } else if (
+              item.type == "CLOUD_TEACHER" ||
+              item.type == "CLOUD_TEACHER_PLUS"
+            ) {
               item.name = "乐器练习云教练";
             } else if (item.type == "COURSE") {
               item.name = "课程";
@@ -1864,10 +1918,10 @@ export default {
                     reason: "",
                     userComment: null,
                   };
-                  if(this.isManage == "super") {
-                     this.$message.success("退团成功");
-                  }else{
-                     this.$message.success("退团申请成功");
+                  if (this.isManage == "super") {
+                    this.$message.success("退团成功");
+                  } else {
+                    this.$message.success("退团申请成功");
                   }
 
                   this.getList();
@@ -2078,6 +2132,32 @@ export default {
       this.searchFrom.paymentStatus = 2 + "";
       this.search();
     },
+    onCloseMeet() {
+      this.meetingForm = {
+        meetingDate: null,
+        address: null,
+      };
+    },
+    onMeetingPayment(formName) {
+      console.log(this.$refs.meetingForm.$refs[formName])
+      this.$refs.meetingForm.$refs[formName].validate(async (valid) => {
+        if (valid) {
+          try {
+            await this.$confirm("您是否确定发送家长会通知?", "提示", {
+              confirmButtonText: "确定",
+              cancelButtonText: "取消",
+              type: "warning",
+            });
+            await sendParentMeetingNotice({
+              ...this.meetingForm,
+              musicGroupId: this.id,
+            });
+            this.$message.success("家长会通知已发送");
+            this.meetingStatus = false;
+          } catch (error) {}
+        }
+      });
+    },
   },
   watch: {
     "quitForm.isMaintenanceFee"(val) {
@@ -2135,6 +2215,21 @@ export default {
     //   }
     // },
   },
+  computed: {
+    sysMsgStr() {
+      let strArr = this.sysMsg.split("{}");
+      if (strArr.length == 3) {
+        return `${strArr[0]}<span style="color:red">"${
+          this.meetingForm.meetingDate ? this.meetingForm.meetingDate : "--"
+        }"</span>${strArr[1]}<span style="color:red">"${
+          this.meetingForm.address ? this.meetingForm.address : "--"
+        }"</span>
+        ${strArr[2]}`;
+      } else {
+        return ``;
+      }
+    },
+  },
 };
 </script>
 <style lang="scss" scoped>

+ 7 - 5
src/views/teamDetail/componentCourse/studentWork.vue

@@ -6,8 +6,10 @@
     :description="content">
   </el-alert> -->
     <div class="workTitle">
-      训练标题 : <span> {{ content }}</span>
+       {{ title }}:<span>{{ content }}</span>
+
     </div>
+
     <el-form :inline="true" class="workForm" style="padding: 0 25px">
       <el-form-item label="应交学生数">
         <!-- <el-input disabled
@@ -235,6 +237,7 @@ export default {
       repliedNum: null,
       activeUrl: null,
       content: null,
+      title:null,
       activeRow: null,
       swiperOptions: {
         loop: true,
@@ -262,7 +265,7 @@ export default {
     },
   },
   mounted() {
-    console.log(this.$route)
+    console.log(this.$route);
     this.init();
   },
   activated() {
@@ -289,11 +292,10 @@ export default {
         if (res.code == 200) {
           if (res.data) {
             this.content = res.data.content;
+            this.title = res.data.title
           }
 
-          this.content
-            ? this.content
-            : (this.content = "");
+          this.content ? this.content : (this.content = "");
         }
       });
       this.getList();

+ 14 - 1
src/views/withdrawal-application/api.js

@@ -3,7 +3,9 @@ import request from '@/utils/request2'
 export const musicGroupQuitQeryPage = data => {
   return request({
     url: '/api-web/musicGroupQuit/queryPage',
-    params: data
+    params: data ,
+    method: 'get',
+    requestType: 'form'
   })
 }
 
@@ -14,3 +16,14 @@ export const getStudentHomeWorks = data => {
     params: data
   })
 }
+
+
+// 批量退团审核
+export const batchQuitMusicGroup = data => {
+  return request({
+    url: '/api-web/musicGroupQuit/batchQuitMusicGroup',
+    data: data ,
+    method: 'post',
+    requestType: 'json'
+  })
+}

+ 114 - 12
src/views/withdrawal-application/index.vue

@@ -21,10 +21,10 @@
           <el-input
             v-model.trim="searchForm.search"
             clearable
-            placeholder="学员(乐团)编号"
+            placeholder="学员(乐团)编号、名称"
           ></el-input>
         </el-form-item>
-         <el-form-item prop="organId">
+        <el-form-item prop="organId">
           <el-select
             class="multiple"
             style="width: 180px !important"
@@ -77,11 +77,23 @@
           >
         </el-form-item>
       </save-form>
+      <div class="btnList">
+        <auth :auths="['musicGroupQuit/batchQuitMusicGroup']">
+          <el-button type="primary" @click="quiteTeamAll">批量处理</el-button>
+        </auth>
+      </div>
       <el-table
         :data="list"
         style="width: 100%"
         :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        @selection-change="handleSelectionChange"
       >
+        <el-table-column
+          type="selection"
+          width="55"
+          :selectable="checkSeleabled"
+        >
+        </el-table-column>
         <el-table-column prop="userId" label="学员编号">
           <copy-text slot-scope="scope">{{ scope.row.userId }}</copy-text>
         </el-table-column>
@@ -90,10 +102,8 @@
             scope.row.user.username
           }}</copy-text>
         </el-table-column>
-            <el-table-column prop="organName" label="所属分部">
-          <div slot-scope="scope">{{
-            scope.row.musicGroup.organName
-          }}</div>
+        <el-table-column prop="organName" label="所属分部">
+          <div slot-scope="scope">{{ scope.row.musicGroup.organName }}</div>
         </el-table-column>
         <el-table-column prop="musicGroupId" label="所属乐团">
           <copy-text slot-scope="scope">{{
@@ -225,7 +235,7 @@
         :isDisabled="isDisabled"
         ref="musicForm"
       />
-       <p style="color:red;paddingLeft:150px">退费金额暂不进入账户余额</p>
+      <p style="color: red; paddingleft: 150px">退费金额暂不进入账户余额</p>
       <span slot="footer" class="dialog-footer question">
         <div>
           <el-popover placement="right" width="500" trigger="click">
@@ -297,14 +307,14 @@ import visit from "./modals/visit";
 import { Export } from "@/utils/downLoadFile";
 import { quitMusicGroup } from "@/api/journal";
 import qs from "qs";
-import { musicGroupQuitQeryPage } from "./api";
+import { musicGroupQuitQeryPage, batchQuitMusicGroup } from "./api";
 import cleanDeep from "clean-deep";
 import { musicGroupQuit } from "@/api/journal";
 import { withdrawalStatus } from "@/constant";
 const initSearch = {
   search: "",
   status: null,
-  organId:''
+  organId: "",
 };
 export default {
   components: { pagination, quitModal, quitOnlyModal, visit },
@@ -341,9 +351,10 @@ export default {
       },
       isManage: false,
       isDisabled: false,
+      multipleSelection: [],
     };
   },
- async mounted() {
+  async mounted() {
     let isSuperAdmin = this.$store.getters.isSuperAdmin;
     let roles = this.$store.getters.roles;
     await this.$store.dispatch("setBranchs");
@@ -356,8 +367,8 @@ export default {
         this.isManage = false;
       }
     }
-    if(roles.indexOf(3) != -1&&roles.indexOf(4) != -1){
-       this.isManage = "super";
+    if (roles.indexOf(3) != -1 && roles.indexOf(4) != -1) {
+      this.isManage = "super";
     }
     this.FetchList();
   },
@@ -475,6 +486,84 @@ export default {
         });
       // 乐团主管这里
     },
+    handleSelectionChange(val) {
+      this.multipleSelection = val;
+    },
+    quiteTeamAll() {
+      if (this.multipleSelection.length < 1) {
+        this.$message.error("请至少选择一名学员");
+        return;
+      }
+      let str = "";
+      this.multipleSelection.forEach((stu) => {
+        console.log(stu);
+        str += stu.user.username + ",";
+      });
+      str += "的退团申请将批量处理";
+      this.$prompt(str, "提示", {
+        distinguishCancelAndClose: true,
+        confirmButtonText: "同意",
+        cancelButtonText: "拒绝",
+        confirmButtonClass: "el-button--primary",
+        cancelButtonClass: "el-button--danger",
+        closeOnClickModal: false,
+        inputPattern: /\S/,
+        inputType: "textarea",
+        inputErrorMessage: "请输入审批理由",
+        inputPlaceholder: "请输入审批理由",
+        beforeClose: async (val, instance, done) => {
+          if (val == "confirm") {
+            // reason
+            let objList = this.multipleSelection.map((stu) => {
+              return {
+                id: stu.id,
+                status: "APPROVED",
+                reason: instance.inputValue,
+              };
+            });
+            try {
+              const res = await batchQuitMusicGroup(objList);
+              this.$message.success("审批成功");
+              done();
+            } catch (e) {
+              console.log(e);
+            }
+          } else if (val == "cancel") {
+            instance.validate();
+            let objList = this.multipleSelection.map((stu) => {
+              return {
+                id: stu.id,
+                status: "DENIED",
+                reason: instance.inputValue,
+              };
+            });
+            try {
+              const res = await batchQuitMusicGroup(objList);
+              this.$message.success("审批成功");
+              done();
+            } catch (e) {
+              console.log(e);
+            }
+          } else {
+            done();
+          }
+        },
+      })
+        .then(() => {
+          // 同意
+        })
+        .catch((msg) => {
+          // close,cancel
+          console.log(msg);
+        });
+    },
+    checkSeleabled(row) {
+      if (row.status == "PROCESSING") {
+        return 1;
+      } else {
+        return 0;
+      }
+    },
   },
 };
 </script>
@@ -484,4 +573,17 @@ export default {
   flex-direction: row;
   justify-content: space-between;
 }
+.btnList {
+  margin-bottom: 20px;
+}
+.confirmButton {
+  color: #fff;
+  background-color: #f56c6c;
+  border-color: #f56c6c;
+}
+.cancelButton {
+  color: #fff;
+  background-color: #14928a;
+  border-color: #14928a;
+}
 </style>