Преглед изворни кода

Merge branch '04/22-index' into test

mo пре 4 година
родитељ
комит
c23cc99f08

Разлика између датотеке није приказан због своје велике величине
+ 485 - 363
src/views/businessManager/shopManager/shopList.vue


+ 409 - 358
src/views/businessManager/shopManager/shopOperation.vue

@@ -1,71 +1,80 @@
 <template>
   <div class="m-container">
     <h2>
-      <el-page-header @back="onCancel"
-                      :content="(pageTitle[pageType]) + '商品'"></el-page-header>
+      <el-page-header
+        @back="onCancel"
+        :content="pageTitle[pageType] + '商品'"
+      ></el-page-header>
     </h2>
 
     <div class="m-core">
-      <el-form :model="form"
-               :rules="rules"
-               ref="form"
-               label-width="120px">
-        <el-form-item label="货号"
-                      prop="sn">
-          <el-input v-model.trim="form.sn"
-                    :disabled="pageDisabled"
-                    placeholder="请输入货号"
-                    style="width: 400px"></el-input>
+      <el-form :model="form" :rules="rules" ref="form" label-width="120px">
+        <el-form-item label="货号" prop="sn">
+          <el-input
+            v-model.trim="form.sn"
+            :disabled="pageDisabled"
+            placeholder="请输入货号"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="品牌"
-                      prop="brand">
-          <el-input v-model.trim="form.brand"
-                    :disabled="pageDisabled"
-                    placeholder="请输入品牌"
-                    style="width: 400px"></el-input>
+        <el-form-item label="品牌" prop="brand">
+          <el-input
+            v-model.trim="form.brand"
+            :disabled="pageDisabled"
+            placeholder="请输入品牌"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
         <!-- <el-form-item label="备查货号" prop="supplyChannel" v-if="pageType == 'create'">
           <el-input v-model.trim="form.supplyChannel" placeholder="请输入备查货号" style="width: 400px"></el-input>
         </el-form-item> -->
-        <el-form-item label="商品名称"
-                      prop="name">
-          <el-input v-model.trim="form.name"
-                    placeholder="请输入商品名称"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品名称" prop="name">
+          <el-input
+            v-model.trim="form.name"
+            placeholder="请输入商品名称"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="商品类型"
-                      prop="type">
-          <el-select v-model.trim="form.type"
-                     placeholder="请选择商品类型"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;">
-            <el-option v-for="(item, index) in goodsType"
-                       :key="index"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+        <el-form-item label="商品类型" prop="type">
+          <el-select
+            v-model.trim="form.type"
+            placeholder="请选择商品类型"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option
+              v-for="(item, index) in goodsType"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="商品分类"
-                      prop="goodsCategoryId">
-          <el-select v-model.trim="form.goodsCategoryId"
-                     placeholder="请选择商品分类"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;"
-                     filterable>
-            <el-option v-for="item in categoryList"
-                       :key="item.value"
-                       :label="item.label"
-                       :value="item.value">
+        <el-form-item label="商品分类" prop="goodsCategoryId">
+          <el-select
+            v-model.trim="form.goodsCategoryId"
+            placeholder="请选择商品分类"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+            filterable
+          >
+            <el-option
+              v-for="item in categoryList"
+              :key="item.value"
+              :label="item.label"
+              :value="item.value"
+            >
             </el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="商品型号"
-                      prop="specification">
-          <el-input v-model.trim="form.specification"
-                    placeholder="请输入商品型号"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品型号" prop="specification">
+          <el-input
+            v-model.trim="form.specification"
+            placeholder="请输入商品型号"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
         <!-- <el-form-item label="内部库存" prop="stockCount">
           <el-input type="number" :disabled="pageType != 'create'" v-model.trim="form.stockCount" placeholder="请输入内部库存" style="width: 400px"></el-input>
@@ -73,124 +82,138 @@
         <el-form-item label="税务库存" prop="taxStockCount">
           <el-input type="number" :disabled="pageType != 'create'" v-model.trim="form.taxStockCount" placeholder="请输入税务库存" style="width: 400px"></el-input>
         </el-form-item> -->
-        <el-form-item label="库存类型"
-                      prop="stockType">
-          <el-select v-model="form.stockType"
-                     placeholder="请选择库存类型"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;">
-            <el-option v-for="(item, index) in stockType"
-                       :key="index"
-                       :label="item.label"
-                       :value="item.value"></el-option>
+        <el-form-item label="库存类型" prop="stockType">
+          <el-select
+            v-model="form.stockType"
+            placeholder="请选择库存类型"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option
+              v-for="(item, index) in stockType"
+              :key="index"
+              :label="item.label"
+              :value="item.value"
+            ></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="市场价"
-                      prop="marketPrice">
-          <el-input type="number"
-                    placeholder="请输入市场价"
-                    :disabled="pageDisabled"
-                    @mousewheel.native.prevent
-                    v-model.trim="form.marketPrice"
-                    style="width: 400px"></el-input>
+        <el-form-item label="市场价" prop="marketPrice">
+          <el-input
+            type="number"
+            placeholder="请输入市场价"
+            :disabled="pageDisabled"
+            @mousewheel.native.prevent
+            v-model.trim="form.marketPrice"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="零售价"
-                      prop="discountPrice">
-          <el-input type="number"
-                    placeholder="请输入零售价"
-                    @mousewheel.native.prevent
-                    :disabled="pageDisabled"
-                    v-model.trim="form.discountPrice"
-                    style="width: 400px"></el-input>
+        <el-form-item label="零售价" prop="discountPrice">
+          <el-input
+            type="number"
+            placeholder="请输入零售价"
+            @mousewheel.native.prevent
+            :disabled="pageDisabled"
+            v-model.trim="form.discountPrice"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="商品团购价"
-                      prop="groupPurchasePrice">
-          <el-input type="number"
-                    placeholder="请输入商品团购价"
-                    @mousewheel.native.prevent
-                    :disabled="pageDisabled"
-                    v-model.trim="form.groupPurchasePrice"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品团购价" prop="groupPurchasePrice">
+          <el-input
+            type="number"
+            placeholder="请输入商品团购价"
+            @mousewheel.native.prevent
+            :disabled="pageDisabled"
+            v-model.trim="form.groupPurchasePrice"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="学员是否展示"
-                      prop="clientShow">
-          <el-select v-model="form.clientShow"
-                     placeholder="请选择学员是否展示"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="学员是否展示" prop="clientShow">
+          <el-select
+            v-model="form.clientShow"
+            placeholder="请选择学员是否展示"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="教务端是否展示"
-                      prop="educationalShow">
-          <el-select v-model="form.educationalShow"
-                     placeholder="请选择教务端是否展示"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="教务端是否展示" prop="educationalShow">
+          <el-select
+            v-model="form.educationalShow"
+            placeholder="请选择教务端是否展示"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="乐团是否展示"
-                      prop="musicGroupShow">
-          <el-select v-model="form.musicGroupShow"
-                     placeholder="请选择乐团是否展示"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="乐团是否展示" prop="musicGroupShow">
+          <el-select
+            v-model="form.musicGroupShow"
+            placeholder="请选择乐团是否展示"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="是否库存预警"
-                      prop="stockWarning">
-          <el-select v-model="form.stockWarning"
-                     placeholder="请选择库存预警"
-                     :disabled="pageDisabled"
-                     style="width: 400px !important;">
-            <el-option label="是"
-                       :value="1"></el-option>
-            <el-option label="否"
-                       :value="0"></el-option>
+        <el-form-item label="是否库存预警" prop="stockWarning">
+          <el-select
+            v-model="form.stockWarning"
+            placeholder="请选择库存预警"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
           </el-select>
         </el-form-item>
-        <el-form-item label="商品图片"
-                      prop="image">
-          <el-upload class="avatar-uploader"
-                     action="/api-web/uploadFile"
-                     accept=".jpg, .jpeg, .png"
-                     :headers="headers"
-                     :disabled="pageDisabled"
-                     :show-file-list="false"
-                     :on-success="handleAvatarSuccess"
-                     :before-upload="beforeAvatarUpload">
-            <img v-if="form.image"
-                 :src="form.image"
-                 class="avatar">
-            <i v-else
-               class="el-icon-plus avatar-uploader-icon"></i>
+        <el-form-item label="是否参与置换" prop="replacementShow">
+          <el-select
+            v-model="form.replacementShow"
+            placeholder="请选择库存预警"
+            :disabled="pageDisabled"
+            style="width: 400px !important"
+          >
+            <el-option label="是" :value="1"></el-option>
+            <el-option label="否" :value="0"></el-option>
+          </el-select>
+        </el-form-item>
+        <el-form-item label="商品图片" prop="image">
+          <el-upload
+            class="avatar-uploader"
+            action="/api-web/uploadFile"
+            accept=".jpg, .jpeg, .png"
+            :headers="headers"
+            :disabled="pageDisabled"
+            :show-file-list="false"
+            :on-success="handleAvatarSuccess"
+            :before-upload="beforeAvatarUpload"
+          >
+            <img v-if="form.image" :src="form.image" class="avatar" />
+            <i v-else class="el-icon-plus avatar-uploader-icon"></i>
           </el-upload>
         </el-form-item>
-        <el-form-item label="商品描述"
-                      prop="brief">
-          <el-input type="textarea"
-                    v-model.trim="form.brief"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品描述" prop="brief">
+          <el-input
+            type="textarea"
+            v-model.trim="form.brief"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
-        <el-form-item label="商品详情"
-                      prop="desc">
-          <el-input type="textarea"
-                    v-model.trim="form.desc"
-                    :disabled="pageDisabled"
-                    style="width: 400px"></el-input>
+        <el-form-item label="商品详情" prop="desc">
+          <el-input
+            type="textarea"
+            v-model.trim="form.desc"
+            :disabled="pageDisabled"
+            style="width: 400px"
+          ></el-input>
         </el-form-item>
         <el-form-item v-if="!pageDisabled">
-          <el-button @click="onSubmit('form')"
-                     type="primary">立即{{ pageType == "create" ? '创建' : '修改' }}</el-button>
+          <el-button @click="onSubmit('form')" type="primary"
+            >立即{{ pageType == "create" ? "创建" : "修改" }}</el-button
+          >
           <el-button @click="onReSet('form')">重置</el-button>
         </el-form-item>
       </el-form>
@@ -202,48 +225,46 @@ import {
   categoryListTree,
   goodsAdd,
   goodsUpdate,
-  goodsSingleQuery
-} from '@/api/businessManager'
-import {
-  getToken
-} from '@/utils/auth'
-import { goodsType, stockType } from '@/utils/searchArray'
+  goodsSingleQuery,
+} from "@/api/businessManager";
+import { getToken } from "@/utils/auth";
+import { goodsType, stockType } from "@/utils/searchArray";
 let validPrice = (rule, value, callback) => {
-  if (value == '' && typeof value == 'string' || value == null) {
-    callback(new Error('请输入金额'))
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入金额"));
   } else if (value < 0) {
-    callback(new Error('输入金额必须大于或等于0'))
+    callback(new Error("输入金额必须大于或等于0"));
   } else if (value >= 100000) {
-    callback(new Error('输入金额必须小于100000'))
+    callback(new Error("输入金额必须小于100000"));
   } else {
-    callback()
+    callback();
   }
-}
+};
 let validStock = (rule, value, callback) => {
-  if (value == '' && typeof value == 'string' || value == null) {
-    callback(new Error('请输入库存'))
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入库存"));
   } else if (value < 0) {
-    callback(new Error('库存数量必须大于或等于0'))
+    callback(new Error("库存数量必须大于或等于0"));
   } else {
-    callback()
+    callback();
   }
-}
+};
 export default {
-  name: 'shopOperation',
-  data () {
+  name: "shopOperation",
+  data() {
     return {
       goodsType: goodsType,
       stockType: stockType,
       categoryList: [],
       pageType: null,
       pageTitle: {
-        'create': '添加',
-        'update': '修改',
-        'look': '查看',
+        create: "添加",
+        update: "修改",
+        look: "查看",
       },
       pageDisabled: false,
       headers: {
-        Authorization: getToken()
+        Authorization: getToken(),
       },
       form: {
         sn: null,
@@ -265,186 +286,215 @@ export default {
         stockWarning: null,
         image: null,
         brief: null,
-        desc: null
+        desc: null,
+        replacementShow:null
+
       },
       rules: {
-        sn: [{ required: true, message: '请输入商品货号', trigger: 'blur' }],
-        brand: [{
-          required: true,
-          message: '请输入品牌',
-          trigger: 'blur'
-        },
-        {
-          min: 2,
-          max: 30,
-          message: '长度在 2 到 30 个字符',
-          trigger: 'blur'
-        }
+        sn: [{ required: true, message: "请输入商品货号", trigger: "blur" }],
+        brand: [
+          {
+            required: true,
+            message: "请输入品牌",
+            trigger: "blur",
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur",
+          },
         ],
         supplyChannel: [
-          { required: true, message: '请输入备查货号', trigger: 'blur' }
+          { required: true, message: "请输入备查货号", trigger: "blur" },
         ],
-        name: [{
-          required: true,
-          message: '请输入商品名称',
-          trigger: 'blur'
-        },
-        {
-          min: 2,
-          max: 30,
-          message: '长度在 2 到 30 个字符',
-          trigger: 'blur'
-        }
+        name: [
+          {
+            required: true,
+            message: "请输入商品名称",
+            trigger: "blur",
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur",
+          },
         ],
-        type: [{
-          required: true,
-          message: '请选择商品分类',
-          trigger: 'change'
-        }],
-        goodsCategoryId: [{
-          required: true,
-          message: '请选择商品类型',
-          trigger: 'change'
-        }],
-        specification: [{
-          required: true,
-          message: '请输入商品型号',
-          trigger: 'blur'
-        },
-        {
-          min: 2,
-          max: 30,
-          message: '长度在 2 到 30 个字符',
-          trigger: 'blur'
-        }
+        type: [
+          {
+            required: true,
+            message: "请选择商品分类",
+            trigger: "change",
+          },
+        ],
+        goodsCategoryId: [
+          {
+            required: true,
+            message: "请选择商品类型",
+            trigger: "change",
+          },
+        ],
+        specification: [
+          {
+            required: true,
+            message: "请输入商品型号",
+            trigger: "blur",
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur",
+          },
         ],
         stockCount: [
-          { required: true, validator: validStock, trigger: 'blur' }
+          { required: true, validator: validStock, trigger: "blur" },
         ],
         taxStockCount: [
-          { required: true, validator: validStock, trigger: 'blur' }
+          { required: true, validator: validStock, trigger: "blur" },
         ],
         stockType: [
-          { required: true, message: '请选择库存类型', trigger: 'change' }
+          { required: true, message: "请选择库存类型", trigger: "change" },
+        ],
+        marketPrice: [
+          {
+            required: true,
+            validator: validPrice,
+            trigger: "blur",
+          },
+        ],
+        discountPrice: [
+          {
+            required: true,
+            validator: validPrice,
+            trigger: "blur",
+          },
+        ],
+        groupPurchasePrice: [
+          {
+            required: true,
+            validator: validPrice,
+            trigger: "blur",
+          },
         ],
-        marketPrice: [{
-          required: true,
-          validator: validPrice,
-          trigger: 'blur'
-        }],
-        discountPrice: [{
-          required: true,
-          validator: validPrice,
-          trigger: 'blur'
-        }],
-        groupPurchasePrice: [{
-          required: true,
-          validator: validPrice,
-          trigger: 'blur'
-        }],
         clientShow: [
-          { required: true, message: '请选择学员是否展示', trigger: 'change' }
+          { required: true, message: "请选择学员是否展示", trigger: "change" },
+        ],
+        replacementShow:[
+          { required: true, message: "是否参与乐器置换", trigger: "change" },
         ],
         educationalShow: [
-          { required: true, message: '请选择教务端是否展示', trigger: 'change' }
+          {
+            required: true,
+            message: "请选择教务端是否展示",
+            trigger: "change",
+          },
         ],
         musicGroupShow: [
-          { required: true, message: '请选择乐团是否展示', trigger: 'change' }
+          { required: true, message: "请选择乐团是否展示", trigger: "change" },
         ],
         stockWarning: [
-          { required: true, message: '请选择是否库存预警', trigger: 'change' }
+          { required: true, message: "请选择是否库存预警", trigger: "change" },
+        ],
+        image: [
+          {
+            required: true,
+            message: "请选择图片",
+            trigger: "blur",
+          },
+        ],
+        brief: [
+          {
+            required: true,
+            message: "请输入商品描述",
+            trigger: "blur",
+          },
+        ],
+        desc: [
+          {
+            required: true,
+            message: "请输入商品详情",
+            trigger: "blur",
+          },
         ],
-        image: [{
-          required: true,
-          message: '请选择图片',
-          trigger: 'blur'
-        }],
-        brief: [{
-          required: true,
-          message: '请输入商品描述',
-          trigger: 'blur'
-        }],
-        desc: [{
-          required: true,
-          message: '请输入商品详情',
-          trigger: 'blur'
-        }]
       },
       Fsearch: null,
       Frules: null,
       imageWidthM: 400,
-      imageHeightM: 400
-    }
+      imageHeightM: 400,
+    };
   },
-  mounted () {
-    this.init()
+  mounted() {
+    this.init();
   },
   methods: {
-    init () {
-      let query = this.$route.query
+    init() {
+      let query = this.$route.query;
       if (query.paramInfo) {
-        let paramInfo = JSON.parse(query.paramInfo)
-        this.pageType = paramInfo.type
-        this.id = paramInfo.id
+        let paramInfo = JSON.parse(query.paramInfo);
+        this.pageType = paramInfo.type;
+        this.id = paramInfo.id;
       }
-      this.pageDisabled = this.pageType == 'look' ? true : false
-      this.getList()
-      this.getCatagory()
+      this.pageDisabled = this.pageType == "look" ? true : false;
+      this.getList();
+      this.getCatagory();
     },
-    onSubmit (formName) {
+    onSubmit(formName) {
       this.$refs[formName].validate((valid) => {
         if (valid) {
-          if (this.pageType == 'create') {
-            if (this.form.id) { // 判断有没有Id,如果有则删除
-              delete this.form.id
+          if (this.pageType == "create") {
+            if (this.form.id) {
+              // 判断有没有Id,如果有则删除
+              delete this.form.id;
             }
-            this.form.status = 'NO' // 默认上架
-            goodsAdd(this.form).then(res => {
-              this.messageTips('添加', res)
-            })
-          } else if (this.pageType == 'update') {
-            goodsUpdate(this.form).then(res => {
-              this.messageTips('修改', res)
-            })
+            this.form.status = "NO"; // 默认上架
+            goodsAdd(this.form).then((res) => {
+              this.messageTips("添加", res);
+            });
+          } else if (this.pageType == "update") {
+            goodsUpdate(this.form).then((res) => {
+              this.messageTips("修改", res);
+            });
           }
         } else {
           this.$nextTick(() => {
-            let isError = document.getElementsByClassName('is-error')
+            let isError = document.getElementsByClassName("is-error");
             isError[0].scrollIntoView({
-              block: 'center',
-              behavior: 'smooth',
-            })
-          })
-          return false
+              block: "center",
+              behavior: "smooth",
+            });
+          });
+          return false;
         }
-      })
+      });
     },
-    messageTips (title, res) {
+    messageTips(title, res) {
       if (res.code == 200) {
-        this.$message.success(title + '成功')
-        this.$store.dispatch('delVisitedViews', this.$route)
+        this.$message.success(title + "成功");
+        this.$store.dispatch("delVisitedViews", this.$route);
         this.$router.push({
-          path: '/shopManager/shopManager',
+          path: "/shopManager/shopManager",
           query: {
             pageInfo: this.Frules,
-            searchForm: this.Fsearch
-          }
-        })
+            searchForm: this.Fsearch,
+          },
+        });
       } else {
-        this.$message.error(res.msg)
+        this.$message.error(res.msg);
       }
     },
-    onCancel () {
-      this.$store.dispatch('delVisitedViews', this.$route)
+    onCancel() {
+      this.$store.dispatch("delVisitedViews", this.$route);
       this.$router.push({
-        path: '/shopManager/shopManager'
-      })
+        path: "/shopManager/shopManager",
+      });
     },
-    onReSet (formName) {
-      this.$refs[formName].resetFields()
+    onReSet(formName) {
+      this.$refs[formName].resetFields();
     },
-    getList () {
-      if (this.pageType == 'create') {
+    getList() {
+      if (this.pageType == "create") {
         this.form = {
           sn: null,
           brand: null,
@@ -465,16 +515,15 @@ export default {
           stockWarning: null,
           image: null,
           brief: null,
-          desc: null
-        }
-        if (this.$refs['form']) {
-          this.$refs['form'].resetFields();
+          desc: null,
+        };
+        if (this.$refs["form"]) {
+          this.$refs["form"].resetFields();
         }
-
       } else {
-        goodsSingleQuery(this.id).then(res => {
+        goodsSingleQuery(this.id).then((res) => {
           if (res.code == 200) {
-            let result = res.data
+            let result = res.data;
             this.form = {
               id: result.id,
               sn: result.sn,
@@ -496,83 +545,85 @@ export default {
               stockWarning: result.stockWarning,
               image: result.image,
               brief: result.brief,
-              desc: result.desc
-            }
+              desc: result.desc,
+              replacementShow:result.replacementShow
+            };
           }
-        })
+        });
       }
-
     },
-    getCatagory () {
+    getCatagory() {
       categoryListTree({
         delFlag: 0,
-        rows: 9999
-      }).then(res => {
-        let result = res.data
+        rows: 9999,
+      }).then((res) => {
+        let result = res.data;
         if (res.code == 200) {
-          let tempArray = []
-          result.rows.forEach(row => {
+          let tempArray = [];
+          result.rows.forEach((row) => {
             tempArray.push({
               label: row.name,
-              value: row.id
-            })
-          })
-          this.categoryList = tempArray
+              value: row.id,
+            });
+          });
+          this.categoryList = tempArray;
         }
-      })
+      });
     },
-    handleAvatarSuccess (res, file) {
-      this.form.image = res.data.url
-
+    handleAvatarSuccess(res, file) {
+      this.form.image = res.data.url;
     },
-    beforeAvatarUpload (file) {
+    beforeAvatarUpload(file) {
       const imageType = {
-        'image/png': true,
-        'image/jpeg': true
-      }
-      const isImage = imageType[file.type]
-      const isLt2M = file.size / 1024 / 1024 < 2
-      const imageWidth = this.imageWidthM
-      const imageHeigh = this.imageHeightM
-      const _URL = window.URL || window.webkitURL
+        "image/png": true,
+        "image/jpeg": true,
+      };
+      const isImage = imageType[file.type];
+      const isLt2M = file.size / 1024 / 1024 < 2;
+      const imageWidth = this.imageWidthM;
+      const imageHeigh = this.imageHeightM;
+      const _URL = window.URL || window.webkitURL;
       const isSize = new Promise((resolve, reject) => {
-        const img = new Image()
+        const img = new Image();
         img.onload = function () {
-
           if (imageWidth && imageHeigh) {
-            this.width === imageWidth && this.height === imageHeigh ? resolve() : reject(`请上传${imageWidth}x${imageHeigh}尺寸图片`)
+            this.width === imageWidth && this.height === imageHeigh
+              ? resolve()
+              : reject(`请上传${imageWidth}x${imageHeigh}尺寸图片`);
           } else if (imageWidth && !imageHeigh) {
-            this.width === imageWidth ? resolve() : reject(`请上传宽为${imageWidth}的图片`)
+            this.width === imageWidth
+              ? resolve()
+              : reject(`请上传宽为${imageWidth}的图片`);
           } else if (!imageWidth && imageHeigh) {
-            this.height === imageHeigh ? resolve() : reject(`请上传高为${imageHeigh}的图片`)
+            this.height === imageHeigh
+              ? resolve()
+              : reject(`请上传高为${imageHeigh}的图片`);
+          } else {
+            resolve();
           }
-          else {
-            resolve()
-          }
-
-        }
-        img.src = _URL.createObjectURL(file)
+        };
+        img.src = _URL.createObjectURL(file);
       }).then(
         () => {
-          return file
+          return file;
         },
         (src) => {
           this.$message.error(src);
-          this.uploadImgLoading = false
-          return Promise.reject()
+          this.uploadImgLoading = false;
+          return Promise.reject();
         }
-      )
-      console.log(isSize)
+      );
+      console.log(isSize);
       if (!isImage) {
-        this.$message.error('只能上传图片格式!')
+        this.$message.error("只能上传图片格式!");
       }
       if (!isLt2M) {
-        this.$message.error('上传头像图片大小不能超过 2MB!')
+        this.$message.error("上传头像图片大小不能超过 2MB!");
       }
       return isImage && isLt2M && isSize;
     },
-  }
-}
+  },
+};
 </script>
 <style lang="scss" scoped>
 .el-button--primary {

+ 47 - 11
src/views/main/baseinfo/curriculum.vue

@@ -10,7 +10,7 @@
         :isShowQuert="true"
       />
     </div>
-    <statistic class="statistic" :cols="0">
+    <statistic class="statistic" :cols="0" :col="5">
       <statistic-item
         v-for="(item, key) in items"
         :key="key"
@@ -77,6 +77,8 @@ export default {
       return {
         MUSIC_GROUP_COURSE: this.data["MUSIC_GROUP_COURSE"] || {},
         VIP_GROUP_COURSE: this.data["VIP_GROUP_COURSE"] || {},
+        VIP_GROUP_ONLINE_COURSE: this.data["VIP_GROUP_ONLINE_COURSE"] || {},
+        VIP_GROUP_OFFLINE_COURSE: this.data["VIP_GROUP_OFFLINE_COURSE"] || {},
         PRACTICE_GROUP_COURSE: this.data["PRACTICE_GROUP_COURSE"] || {},
       };
     },
@@ -145,13 +147,13 @@ export default {
         },
         yAxis: {
           //纵轴标尺固定
-          minInterval:1,
+          minInterval: 1,
           type: "value",
           scale: true,
           min: 0,
-            axisLabel:{
-            formatter:'{value}节'
-          }
+          axisLabel: {
+            formatter: "{value}节",
+          },
         },
         tooltip: {
           axisPointer: {
@@ -160,14 +162,50 @@ export default {
               color: "rgba(150,150,150,0.2)",
             },
           },
-
           formatter: (item) => {
-            return [
-              item[0].axisValueLabel,
+            let str = "";
+            let strArr = [];
+            let dotStr =
+              '<span style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;opacity:0;"></span>';
+            let array = [
               ...item.map(
                 (d) => `<br/>${d.marker}${d.seriesName}: ${d.value[1]}节`
               ),
-            ].join("");
+            ];
+            if (
+              this.items["VIP_GROUP_COURSE"]["indexMonthData"][
+                item[0].dataIndex
+              ]?.extendInfo
+            ) {
+              str = this.items["VIP_GROUP_COURSE"]["indexMonthData"][
+                item[0].dataIndex
+              ]?.extendInfo;
+              str.replace("/", "");
+              try {
+                let strObj = JSON.parse(str);
+                for (let item in strObj) {
+                  strArr.push({ name: item, num: strObj[item] });
+                }
+                // console.log(strArr)
+              } catch (e) {
+                console.log(e);
+                str = "";
+              }
+              // console.log(lodash.valuesIn(str))
+
+              let vipIndex = 0;
+              item.forEach((i, indx) => {
+                if (i.seriesName == "VIP课") {
+                  vipIndex = indx;
+                }
+              });
+              array.splice(
+                vipIndex + 1,
+                0,
+                ...strArr.map((d) => `<br/>${dotStr}${d.name}: ${d.num}节`)
+              );
+            }
+            return [item[0].axisValueLabel, ...array].join("");
           },
         },
       };
@@ -202,7 +240,6 @@ export default {
         for (const item of res.data) {
           // 再循环一遍
           for (const key in this.items) {
-
             if (item.dataType == key) {
               data[item.dataType] = {
                 ...item,
@@ -220,7 +257,6 @@ export default {
       this.$emit("resetDate", data);
     },
     isDayOrMoth(arr) {
-
       if (!arr || arr.length < 1) {
         this.timer = "day";
       } else {

+ 93 - 81
src/views/studentManager/studentList.vue

@@ -22,7 +22,8 @@
         :model.sync="searchForm"
       >
         <el-form-item>
-          <el-input clearable
+          <el-input
+            clearable
             placeholder="学生姓名或电话"
             @keyup.enter.native="onSearch"
             v-model.trim="searchForm.search"
@@ -46,7 +47,10 @@
         </el-form-item>
 
         <el-form-item>
-            <remote-search :commit="'setTeachers'" v-model="searchForm.teacherId" />
+          <remote-search
+            :commit="'setTeachers'"
+            v-model="searchForm.teacherId"
+          />
           <!-- <el-select
             placeholder="指导老师"
             v-model="searchForm.teacherId"
@@ -136,44 +140,33 @@
           :data="tableList"
           :header-cell-style="{ background: '#EDEEF0', color: '#444' }"
         >
-          <el-table-column
-            align="center"
-            prop="userId"
-            label="学员编号"
-          >
-             <template slot-scope="scope">
+          <el-table-column align="center" prop="userId" label="学员编号">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.userId }}</copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="username"
-            label="学员姓名"
-          >
-           <template slot-scope="scope">
+          <el-table-column align="center" prop="username" label="学员姓名">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.username }}</copy-text>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="organName"
-            label="所属分部"
-          >
-          <template slot-scope="scope">
+          <el-table-column align="center" prop="organName" label="所属分部">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.organName }}</copy-text>
             </template>
           </el-table-column>
           <el-table-column
             align="center"
-            prop="subjectName"
-            label="声部"
+            prop="cooperationOrganName"
+            label="所属学校"
           ></el-table-column>
           <el-table-column
             align="center"
-            prop="teacherName"
-            label="指导老师"
-          >
-             <template slot-scope="scope">
+            prop="subjectName"
+            label="声部"
+          ></el-table-column>
+          <el-table-column align="center" prop="teacherName" label="指导老师">
+            <template slot-scope="scope">
               <copy-text>{{ scope.row.teacherName }}</copy-text>
             </template>
           </el-table-column>
@@ -193,14 +186,12 @@
             prop="parentsPhone"
             label="家长联系电话"
           ></el-table-column>
-          <el-table-column align="center" >
+          <el-table-column align="center">
             <template slot="header">
               <p style="position: relative">
                 是否激活
                 <el-tooltip placement="top" popper-class="mTooltip">
-                  <div slot="content">
-                    学员是否设置密码
-                  </div>
+                  <div slot="content">学员是否设置密码</div>
                   <i
                     class="el-icon-question"
                     style="font-size: 18px; color: #f56c6c"
@@ -265,19 +256,15 @@
               </div>
             </template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="carePackage"
-            label="关心包"
-          >
-            <template slot-scope="scope">{{ scope.row.carePackage | studentPackage }}</template>
+          <el-table-column align="center" prop="carePackage" label="关心包">
+            <template slot-scope="scope">{{
+              scope.row.carePackage | studentPackage
+            }}</template>
           </el-table-column>
-          <el-table-column
-            align="center"
-            prop="comeOnPackage"
-            label="加油包"
-          >
-            <template slot-scope="scope">{{ scope.row.comeOnPackage | studentPackage }}</template>
+          <el-table-column align="center" prop="comeOnPackage" label="加油包">
+            <template slot-scope="scope">{{
+              scope.row.comeOnPackage | studentPackage
+            }}</template>
           </el-table-column>
           <el-table-column
             align="center"
@@ -293,10 +280,11 @@
                   path: `/studentManager/studentDetail`,
                   query: { ...scope.row },
                 }"
-                >查看</router-link>
+                >查看</router-link
+              >
               <el-button
                 type="text"
-                style="padding-left: 10px;"
+                style="padding-left: 10px"
                 v-permission="'studentManage/studentUpdate'"
                 @click="resetStudent(scope.row)"
                 >修改</el-button
@@ -309,7 +297,7 @@
                 >修改密码</el-button
               >
               <el-button
-              v-if="scope.row.isSignedContract"
+                v-if="scope.row.isSignedContract"
                 type="text"
                 @click="lookContracts(scope.row)"
                 v-permission="'sysUserContracts/getLatest'"
@@ -349,7 +337,7 @@
           title="课程信息"
           type="info"
           :closable="false"
-          style="margin-bottom: 15px;"
+          style="margin-bottom: 15px"
         ></el-alert>
         <el-form-item label="学生姓名" prop="name">
           <el-input v-model.trim="studentForm.name"></el-input>
@@ -425,6 +413,7 @@
             clearable
             placeholder="请选择分部"
             @change="changeStudentOrgan"
+
           >
             <el-option
               v-for="(item, index) in selects.branchs"
@@ -434,6 +423,17 @@
             ></el-option>
           </el-select>
         </el-form-item>
+        <el-form-item prop="school" label="所属学校">
+          <el-select v-model.trim="studentForm.school" filterable clearable  :disabled='!studentForm.organId'>
+            <el-option
+              v-for="(item, index) in cooperationList"
+              :key="index"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+
         <el-form-item label="指导老师" prop="teacherId">
           <el-select
             class="multiple"
@@ -453,7 +453,7 @@
           title="课程信息"
           type="info"
           :closable="false"
-          style="margin-bottom: 15px;"
+          style="margin-bottom: 15px"
         ></el-alert>
         <el-form-item label="是否运营" prop="operatingTag">
           <el-select
@@ -559,14 +559,14 @@
             },
           ]"
         >
-          <copy-text>{{passwrodForm.phone}}</copy-text>
+          <copy-text>{{ passwrodForm.phone }}</copy-text>
         </el-form-item>
         <el-form-item
           label="输入密码"
           prop="password"
           label-width="120px"
           :rules="[
-             { required: true, message: '密码不能为空', trigger: 'blur' },
+            { required: true, message: '密码不能为空', trigger: 'blur' },
             {
               pattern: /^(?![0-9]+$)(?![a-zA-Z]+$)[0-9A-Za-z]{6,20}$/,
               message: '密码为6-20位数字和字母组合',
@@ -598,11 +598,7 @@
       </span>
     </el-dialog>
 
-    <el-dialog
-      title="协议下载"
-      :visible.sync="protocolVisible"
-      width="600px"
-    >
+    <el-dialog title="协议下载" :visible.sync="protocolVisible" width="600px">
       <div v-if="protocolVisible">
         <!-- <el-alert
           title="点击下载"
@@ -619,18 +615,19 @@
         >
           <el-table-column align="center" prop="studentId" label="协议名称">
             <template slot-scope="scope">
-              产品与服务协议{{ scope.row.version == 2 ? "(含课程)" : "(含系统)" }}
+              产品与服务协议{{
+                scope.row.version == 2 ? "(含课程)" : "(含系统)"
+              }}
             </template>
           </el-table-column>
           <el-table-column align="center" label="签署时间" prop="createTime">
           </el-table-column>
-          <el-table-column align="center"
-                           width="150px"
-                           label="操作">
+          <el-table-column align="center" width="150px" label="操作">
             <template slot-scope="scope">
               <div>
-                <el-button type="text"
-                           @click="onDownloadProtocol(scope.row)">下载</el-button>
+                <el-button type="text" @click="onDownloadProtocol(scope.row)"
+                  >下载</el-button
+                >
               </div>
             </template>
           </el-table-column>
@@ -652,14 +649,15 @@ import {
   studentHasCourse,
   getLatest,
 } from "@/api/studentManager";
-import qrCode from '@/components/QrCode/index';
+import { queryByOrganId } from "@/api/systemManage";
+import qrCode from "@/components/QrCode/index";
 import cleanDeep from "clean-deep";
 import { vaildStudentUrl } from "@/utils/validate";
 import { getEmployeeOrgan, resetPassword2, getTeacher } from "@/api/buildTeam";
 import { subjectListTree } from "@/api/specialSetting";
 import axios from "axios";
 import qs from "qs";
-import { packageStatus } from '@/constant/index'
+import { packageStatus } from "@/constant/index";
 import { getToken } from "@/utils/auth";
 import load from "@/utils/loading";
 import { permission } from "@/utils/directivePage";
@@ -710,10 +708,11 @@ export default {
         isNewUser: null,
         carePackage: 0,
         comeOnPackage: 0,
+        school:null
       },
       studentUpdatePackage: {
         carePackage: 0,
-        comeOnPackage: 0
+        comeOnPackage: 0,
       },
       studentRules: {
         name: [{ required: true, message: "请输入学生姓名" }],
@@ -740,7 +739,8 @@ export default {
       },
       activatedRow: null,
       protocolVisible: false,
-      protocolVersions: []
+      protocolVersions: [],
+      cooperationList: [],
     };
   },
   mounted() {
@@ -756,7 +756,7 @@ export default {
     onCreateQRCode() {
       // 生成报名二维码
       this.qrcodeStatus = true;
-      this.qrcodeUrl = vaildStudentUrl() + `/#/queryStudentPer`
+      this.qrcodeUrl = vaildStudentUrl() + `/#/queryStudentPer`;
     },
     getList() {
       let params = this.searchForm;
@@ -783,7 +783,7 @@ export default {
         serviceTag: null,
         teacherId: null,
       };
-      this.getList()
+      this.getList();
     },
     downLoadStudent() {
       let url = "/api-web/export/studentHasCourse";
@@ -896,7 +896,8 @@ export default {
             isNewUser: studentForm.isNewUser,
             subjectIdList: studentForm.subjectIdList,
             carePackage: studentForm.carePackage,
-            comeOnPackage: studentForm.comeOnPackage
+            comeOnPackage: studentForm.comeOnPackage,
+            cooperationOrganId:studentForm.school
           };
           registerStudent(obj).then((res) => {
             if (res.code == 200) {
@@ -927,7 +928,8 @@ export default {
             isNewUser: studentForm.isNewUser,
             subjectIdList: studentForm.subjectIdList,
             carePackage: studentForm.carePackage,
-            comeOnPackage: studentForm.comeOnPackage
+            comeOnPackage: studentForm.comeOnPackage,
+              cooperationOrganId:studentForm.school
           };
           updateStudent(obj).then((res) => {
             if (res.code == 200) {
@@ -994,12 +996,13 @@ export default {
           isNewUser: row.isNewUser,
           subjectIdList: Number(row.subjectIdList) || null,
           carePackage: row.carePackage,
-          comeOnPackage: row.comeOnPackage
+          comeOnPackage: row.comeOnPackage,
+          school:row.cooperationOrganId
         };
         this.studentUpdatePackage = {
           carePackage: row.carePackage,
-          comeOnPackage: row.comeOnPackage
-        }
+          comeOnPackage: row.comeOnPackage,
+        };
       });
     },
     onMaskClose(formName) {
@@ -1044,25 +1047,34 @@ export default {
     },
     async changeStudentOrgan(val) {
       this.studentForm.teacherId = null;
-      await getTeacher({ organId: val }).then((res) => {
-        if (res.code == 200) {
-          this.maskTeacherList = res.data;
-        }
-      });
+      if (val) {
+        await getTeacher({ organId: val }).then((res) => {
+          if (res.code == 200) {
+            this.maskTeacherList = res.data;
+          }
+        });
+        queryByOrganId({ organId: val }).then((res) => {
+          if (res.code == 200) {
+            this.cooperationList = res.data;
+          }
+        });
+      } else {
+        this.maskTeacherList = [];
+      }
     },
     async lookContracts(row) {
       await getLatest({ userId: row.userId }).then((res) => {
         if (res.code == 200) {
-          if(res.data) {
-            this.protocolVersions = res.data
-            this.protocolVisible = true
+          if (res.data) {
+            this.protocolVersions = res.data;
+            this.protocolVisible = true;
           }
         }
       });
     },
     onDownloadProtocol(item) {
-      window.location.href = item.url
-    }
+      window.location.href = item.url;
+    },
   },
 };
 </script>

Неке датотеке нису приказане због велике количине промена