lex-xin 3 tahun lalu
induk
melakukan
7bc113f2bc

+ 0 - 1
src/components/serviceRemind/index.vue

@@ -94,7 +94,6 @@ export default {
     __init() {
       const { path, query } = this.$route
       const tenantInfo = this.tenantInfo
-      console.log(+new Date(), '__init', tenantInfo)
       const tenantRenewStatus = sessionStorage.getItem('tenantRenewStatus')
       if(tenantRenewStatus) {
         this.dialogFormVisible = false

+ 22 - 4
src/layout/components/Navbar.vue

@@ -45,7 +45,15 @@
       </el-scrollbar>
     </div>
     <div class="right-menu">
-      <el-popover
+      <el-tooltip style="display: flex;" effect="dark" v-if="tenantForm.tenantId == 1" content="点击进入OA系统" placement="bottom">
+        <div
+          class="msginfo right-position"
+          @click="gotoOa"
+        >
+          <i class="icon_admin_oa operationSize"></i>
+        </div>
+      </el-tooltip>
+      <!-- <el-popover
         placement="bottom"
         trigger="hover"
         style="display: flex;"
@@ -60,7 +68,7 @@
         >
           <i class="icon_admin_oa operationSize"></i>
         </div>
-      </el-popover>
+      </el-popover> -->
       <!-- <el-popover
         v-if="isShowIns"
         placement="bottom"
@@ -78,7 +86,7 @@
         </div>
       </el-popover> -->
 
-      <el-popover
+      <!-- <el-popover
         placement="bottom"
         trigger="hover"
         style="display: flex;"
@@ -92,7 +100,16 @@
         >
           <i class="icon_admin_message operationSize"></i>
         </div>
-      </el-popover>
+      </el-popover> -->
+      <el-tooltip style="display: flex;" effect="dark" content="点击查看系统日志" placement="bottom">
+        <div
+          class="msginfo right-position"
+          v-permission="'/journal'"
+          @click="gotoRecode"
+        >
+          <i class="icon_admin_message operationSize"></i>
+        </div>
+      </el-tooltip>
 
       <div class="left-menu" style="margin-right: 12px">
         <el-popover
@@ -821,6 +838,7 @@ export default {
   overflow: hidden;
 }
 .positionName {
+  padding-top: 5px;
   font-size: 12px;
   width: 145px;
   white-space: nowrap;

+ 5 - 1
src/router/index.js

@@ -519,7 +519,11 @@ export const asyncRoutes = {
   // 平台员工管理
   staffPlatManager: () => import('@/views/categroyManager/insideSetting/staffPlatManager'),
   //邮件配置服务
-  mailInfoManager:()=>import('@/views/mailInfoManager')
+  mailInfoManager:()=>import('@/views/mailInfoManager'),
+  // 机构协议管理
+  protocolManagement:()=>import('@/views/protocolManagement'),
+  // 机构协议管理
+  studentGroupPractice:()=>import('@/views/studentManager/studentGroupPractice'),
 }
 
 export default router

+ 5 - 3
src/utils/request2.js

@@ -90,13 +90,15 @@ service.interceptors.request.use(
     if(tenantConfig.tenantId && tenantConfig.tenantId != 'undefined') {
       config.headers['tenantId'] = tenantConfig.tenantId
     }
+    // 是否进行数据过滤
+    const noCleanDeep = config.noCleanDeep || false
     if (config.requestType === 'form') {
       config.headers['Content-Type'] = 'application/x-www-form-urlencoded'
-      config.data = qs.stringify(cleanDeep(config.data))
+      config.data = qs.stringify(noCleanDeep ? config.data : cleanDeep(config.data))
     } else {
-      config.data = cleanDeep(config.data)
+      config.data = noCleanDeep ? config.data : cleanDeep(config.data)
     }
-    config.params = cleanDeep(config.params)
+    config.params = noCleanDeep ? config.data : cleanDeep(config.params)
     return config
   },
   error => {

+ 2 - 0
src/views/organManager/api.js

@@ -11,12 +11,14 @@ export const tenantInfoQueryPage = (data) => request2({
 export const tenantInfoAdd = data => request2({
   url: '/api-web/tenantInfo/add',
   method: 'post',
+  noCleanDeep: true,
   data,
 })
 
 export const tenantInfoUpdate = data => request2({
   url: '/api-web/tenantInfo/update',
   method: 'post',
+  noCleanDeep: true,
   data,
 })
 

+ 3 - 1
src/views/organManager/components/memberSetting.vue

@@ -177,7 +177,9 @@ export default {
   methods: {
     async __init() {
       try {
-        const res = await queryTree({ enable: 1 })
+        // 如果有机构编号则传,没有则传平台编号
+        const tenantId = this.$route.query.id || -1
+        const res = await queryTree({ enable: 1, tenantId })
         const rows = res.data || []
         rows.forEach(item => {
           let children = []

+ 26 - 29
src/views/organManager/components/organInfo.vue

@@ -39,7 +39,7 @@
               placeholder="请输入机构简介"
             ></el-input>
           </el-form-item>
-          <el-form-item label="主题" v-if="tenantInfo == 'SETTING'" prop="theme" :rules="[{ required: true, message: '请选择主题', trigger: 'change' }]">
+          <!-- <el-form-item label="主题" v-if="tenantInfo == 'SETTING'" prop="theme" :rules="[{ required: true, message: '请选择主题', trigger: 'change' }]">
             <el-select
               v-model="form.theme"
               :disabled="isDisabled"
@@ -48,16 +48,16 @@
             >
               <el-option v-for="item in themeList" :key="item.color" :label="item.name" :value="item.value"></el-option>
             </el-select>
-          </el-form-item>
-          <!-- <el-form-item label="主题" v-if="tenantInfo == 'SETTING'" prop="themeColor" :rules="[{ required: true, message: '请选择主题', trigger: 'change' }]">
+          </el-form-item> -->
+          <el-form-item label="主题" v-if="tenantInfo == 'SETTING'" prop="theme" :rules="[{ required: true, message: '请选择主题', trigger: 'change' }]">
             <div style="width: 300px !important">
               <div class="themeColor">
                 <el-tooltip v-for="item in themeList" :key="item.color" effect="dark" :content="item.name" placement="top">
-                    <div class="themeColor-block" @click="onSelectTheme(item)" :style="item.style"><i class="el-icon-check" v-show="item.selected"></i></div>
+                    <div class="themeColor-block" @click="themeChange(item)" :style="{ backgroundColor: item.color }"><i class="el-icon-check" v-show="item.selected"></i></div>
                 </el-tooltip>
               </div>
             </div>
-          </el-form-item> -->
+          </el-form-item>
         </el-col>
         <el-form-item label="机构全称" prop="tsignName"
           :rules="[{ required: true, message: '请输入机构全称', trigger: 'blur' }]">
@@ -163,7 +163,6 @@
         <el-form-item label="机构客服电话" prop="customerServicePhone">
           <el-input
             v-model.trim="form.customerServicePhone"
-            type="number"
             maxlength="13"
             minlength="11"
             :disabled="isDisabled"
@@ -192,19 +191,23 @@ export default {
       themeList: [{
         name: "亚丁绿",
         value: "adenGreen",
-        color: "#00A79D"
+        color: "#00A79D",
+        selected: false,
       }, {
         name: "暮云灰",
         value: "cloudAshes",
-        color: "#444D5C"
+        color: "#444D5C",
+        selected: false,
       }, {
         name: "柏林蓝",
         value: "berlinBlue",
-        color: "#2B78CC"
+        color: "#2B78CC",
+        selected: false,
       }, {
         name: "火山红",
         value: "volcanicRed",
-        color: "#BC3030"
+        color: "#BC3030",
+        selected: false,
       }],
       form: {
         tsignName: null,
@@ -236,13 +239,13 @@ export default {
       this.payState = this.data.payState
     }
     // 选中默认颜色
-    // this.themeList.forEach(theme => {
-    //   if(theme.color == this.form.themeColor) {
-    //     theme.selected = true
-    //   } else {
-    //     theme.selected = false
-    //   }
-    // })
+    this.themeList.forEach(theme => {
+      if(theme.color == this.form.themeColor) {
+        theme.selected = true
+      } else {
+        theme.selected = false
+      }
+    })
     // 判断是否有城市编号
     if(this.form.areaId) {
       await getParentArea({ id: this.form.areaId }).then(async (res) => {
@@ -272,21 +275,15 @@ export default {
     }
   },
   methods: {
-    themeChange(val) {
+    themeChange(item) {
       // 切换主题时设置跟主题对应的主题色
       this.themeList.forEach(theme => {
-        if(theme.value == val) {
-          this.form.themeColor = theme.color
-        }
-      });
+        theme.selected = false
+      })
+      item.selected = true
+      this.form.theme = item.value
+      this.form.themeColor = item.color
     },
-    // onSelectTheme(item) {
-    //   this.themeList.forEach(theme => {
-    //     theme.selected = false
-    //   })
-    //   item.selected = true
-    //   this.form.themeColor = item.color
-    // },
     onSubmit() {
       let state = false
       this.$refs.form.validate(_ => {

+ 26 - 0
src/views/protocolManagement/api.js

@@ -0,0 +1,26 @@
+
+import request2 from '@/utils/request2'
+
+export const platformProductAdd = data => request2({
+  url: '/api-web/platformProduct/add',
+  method: 'post',
+  data,
+})
+
+export const platformProductUpdate = data => request2({
+  url: '/api-web/platformProduct/update',
+  method: 'post',
+  data,
+})
+
+export const platformProductDelete = data => request2({
+  url: '/api-web/platformProduct/delete/' + data.id,
+  method: 'get'
+})
+
+
+export const platformProductQueryPage = data => request2({
+  url: '/api-web/platformProduct/queryPage',
+  method: 'get',
+  params: data,
+})

+ 164 - 0
src/views/protocolManagement/index.vue

@@ -0,0 +1,164 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      机构协议管理
+    </h2>
+    <save-form
+      :inline="true"
+      class="searchForm"
+      ref="searchForm"
+      @submit="search"
+      @reset="reset"
+      :saveKey="'platformProductManager'"
+      :model.sync="searchForm"
+    >
+      <el-form-item :rules="[]">
+        <el-input v-model="searchForm.search" placeholder="产品名称"></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-button native-type="submit" type="danger">搜索</el-button>
+        <el-button native-type="reset" type="primary">重置</el-button>
+      </el-form-item>
+    </save-form>
+    <el-button  style="margin-bottom: 20px;" type="primary" v-permission="'platformProduct/add'" @click="openProduct('create')" icon="el-icon-plus">添加</el-button>
+    <!-- 列表 -->
+    <div class="tableWrap">
+      <el-table
+        :data="tableList"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+      >
+        <el-table-column align="center" label="产品编号" prop="id">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="name"
+          label="产品名称"
+        ></el-table-column>
+        <el-table-column align="center" label="产品描述" prop="remark">
+          <template slot-scope="scope">
+            <tooltip :content="scope.row.remark" />
+          </template>
+        </el-table-column>
+        <el-table-column align="center" label="操作">
+          <template slot-scope="scope">
+            <el-button
+              @click="resetProduct(scope.row)"
+              v-permission="'platformProduct/update'"
+              type="text"
+              >修改</el-button
+            >
+            <el-button
+              @click="delProduct(scope.row)"
+              v-permission="'platformProduct/delete'"
+              type="text"
+              >删除</el-button
+            >
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination
+       :saveKey="'platformProductManager'"
+        sync
+        :total.sync="pageInfo.total"
+        :page.sync="pageInfo.page"
+        :limit.sync="pageInfo.limit"
+        :page-sizes="pageInfo.page_size"
+        @pagination="getList"
+      />
+    </div>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { platformProductQueryPage,platformProductDelete } from "./api";
+const initSearch = {
+  search: null
+};
+export default {
+  components: { pagination },
+  data() {
+    return {
+      tableList: [],
+      pageType: 'create',
+      pageInfo: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      searchForm: { ...initSearch },
+      isAdd: true,
+      courseVisible: false,
+      activeRow: null,
+    };
+  },
+  mounted() {
+    this.$store.dispatch("setBranchs");
+    this.getList();
+  },
+  methods: {
+    async getList() {
+      try {
+        const res = await platformProductQueryPage({
+          ...this.searchForm,
+          page: this.pageInfo.page,
+          rows: this.pageInfo.limit,
+        });
+        this.pageInfo.total = res.data.total;
+        //  res.data.rows
+        this.tableList = res.data.rows;
+      } catch (e) {}
+    },
+    search() {
+      this.pageInfo.page = 1;
+      this.$refs.searchForm.save(this.searchForm);
+      this.$refs.searchForm.save(this.pageInfo, "page");
+      this.getList();
+    },
+    reset() {
+      this.searchForm = { ...initSearch };
+      this.search();
+    },
+    resetProduct(row) {
+      this.isAdd = false;
+      this.activeRow = row;
+      this.pageType = 'update'
+      this.courseVisible = true;
+    },
+    submitInfo() {
+      const str = this.isAdd ? "create" : "update";
+      this.$refs.operationModel.submitInfo(str);
+    },
+    close() {
+      this.courseVisible = false;
+      this.getList();
+    },
+    openProduct() {
+      this.isAdd = true;
+      this.activeRow = null;
+      this.pageType = 'create'
+      this.courseVisible = true;
+    },
+    async delProduct(row) {
+      this.$confirm("是否删除?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then( async() => {
+        try{
+         const res =   await platformProductDelete({ id:row.id})
+         this.$message.success('删除成功')
+         this.getList()
+        }catch{}
+      });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+.courseMask .el-dialog__body {
+  padding-bottom: 0;
+}
+</style>

+ 181 - 0
src/views/studentManager/studentGroupPractice.vue

@@ -0,0 +1,181 @@
+<template>
+  <div class="m-container">
+    <h2>
+      <div class="squrt"></div>
+      待激活团练宝
+    </h2>
+    <el-form :inline="true" :model="searchForm">
+      <el-form-item>
+        <el-input
+          v-model.trim="searchForm.queryCondition"
+          @keyup.enter.native="queryCondition"
+          clearable
+          placeholder="学生姓名/编号/电话"
+        ></el-input>
+      </el-form-item>
+      <el-form-item>
+        <el-select
+          v-model.trim="searchForm.subjectId"
+          style="width: 180px"
+          clearable
+          filterable
+          placeholder="请选择声部"
+        >
+          <el-option
+            v-for="(item, index) in soundList"
+            :key="index"
+            :label="item.name"
+            :value="item.id"
+          ></el-option>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button @click="search" type="danger">搜索</el-button>
+        <el-button @click="onReSet" type="primary">重置</el-button>
+      </el-form-item>
+    </el-form>
+    <!-- <div class="newBand"
+         @click="resetPays"
+         v-permission="'musicGroupStudentFee/batchUpdateCourseFee'">修改缴费金额</div> -->
+    <el-button @click="addMember" v-if="$helpers.permission('cloudTeacherOrder/pay')" type="primary" style="margin-bottom: 20px">激活会员</el-button>
+
+    <div class="tableWrap">
+      <el-table
+        style="width: 100%"
+        :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
+        :data="tableList"
+        ref="multipleTable"
+        @selection-change="handleSelectionChange"
+      >
+        <el-table-column type="selection" width="55"> </el-table-column>
+        <el-table-column
+          align="center"
+          prop="studentId"
+          label="学员编号"
+        ></el-table-column>
+        <el-table-column align="center" prop="name" label="学员姓名">
+        </el-table-column>
+        <el-table-column align="center" prop="phone" label="手机号">
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="subjectName"
+          label="学员声部"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          prop="type"
+          label="团练宝类型"
+        >
+          <template slot-scope="scope">
+            {{ scope.row.type | memberEnumType }}
+          </template>
+        </el-table-column>
+        <el-table-column
+          align="center"
+          prop="time"
+          label="数量"
+        ></el-table-column>
+        <el-table-column
+          align="center"
+          label="缴费金额(元)"
+        >
+          <template slot-scope="scope">
+            {{ scope.row.amount | hasMoneyFormat }}
+          </template>
+        </el-table-column>
+        <!-- <el-table-column align="center"
+                         label="操作">
+          <template slot-scope="scope">
+            <div>
+              <el-button type="text"
+                         v-permission="'musicGroupStudentFee/batchUpdateCourseFee'"
+                         @click="resetPay(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>
+
+    <el-dialog
+      title="激活会员"
+      :visible.sync="giveMemberVisible"
+      width="1000px"
+      v-if="giveMemberVisible"
+      append-to-body
+    >
+      <giveMemberModel :tableList="selectStudentList" @getList="getList" @close="giveMemberVisible = false" />
+    </el-dialog>
+  </div>
+</template>
+<script>
+import pagination from "@/components/Pagination/index";
+import { queryInactive } from '@/views/resetTeaming/api'
+import giveMemberModel from "@/views/resetTeaming/modals/giveMemberModel";
+export default {
+  components: { pagination, giveMemberModel },
+  data() {
+    let musicGroupId = this.$route.query.id;
+    return {
+      musicGroupId,
+      giveMemberVisible: false,
+      searchForm: {
+        queryCondition: "",
+        subjectId: "",
+      },
+      soundList: [],
+      tableList: [],
+      rules: {
+        // 分页规则
+        limit: 10, // 限制显示条数
+        page: 1, // 当前页
+        total: 0, // 总条数
+        page_size: [10, 20, 40, 50], // 选择限制显示条数
+      },
+      selectStudentList: [], // 选中的学生列表
+    };
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    async getList() {
+      try {
+        const res = await queryInactive({
+          ...this.searchForm,
+          page: this.rules.page,
+          rows: this.rules.limit,
+        });
+        this.rules.total = res.data.total;
+        this.tableList = res.data.rows;
+      } catch (e) { }
+      queryInactive
+    },
+    handleSelectionChange(val) {
+      this.selectStudentList = val || []
+    },
+    search() {
+      this.rules.page = 1;
+      this.getList();
+    },
+    onReSet() {
+      this.searchForm = { search: "", subjectId: "" };
+    },
+    addMember(){
+      if(this.selectStudentList.length <= 0) {
+        this.$message.error('至少选择一名学生')
+        return
+      }
+      this.giveMemberVisible = true
+    }
+  },
+};
+</script>

+ 2 - 2
src/views/teamBuild/components/teamBaseInfo.vue

@@ -353,7 +353,7 @@
           </el-switch>
         </el-form-item>
 
-        <el-form-item
+        <!-- <el-form-item
           label="是否显示免费课程"
           prop="memberCourseShowFlag"
           label-width="200px"
@@ -378,7 +378,7 @@
             :inactive-value="0"
           >
           </el-switch>
-        </el-form-item>
+        </el-form-item> -->
         <!-- <el-form-item label prop="isClass">
           <el-checkbox v-model.trim="topFrom.isClass" :disabled="basdisabled"
             >课堂课乐团</el-checkbox