lex 1 рік тому
батько
коміт
caecd43664

+ 821 - 0
src/views/businessManager/shopManager/model/combinationProducts.vue

@@ -0,0 +1,821 @@
+<template>
+  <div>
+    <el-form :model="form" :rules="rules" ref="ruleForm" :inline="true">
+      <el-alert title="基础信息" :closable="false" class="alert" type="info" />
+      <el-form-item label="商品名称" prop="name" :label-width="formLabelWidth">
+        <el-input
+          style="width: 220px !important"
+          placeholder="请输入商品名称"
+          type="text"
+          :disabled="addDisabled"
+          v-model.trim="form.name"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="货号" prop="sn" :label-width="formLabelWidth">
+        <el-input
+          style="width: 220px !important"
+          placeholder="请输入货号"
+          type="text"
+          :disabled="addDisabled"
+          v-model.trim="form.sn"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="品牌" prop="brand" :label-width="formLabelWidth">
+        <el-input
+          style="width: 220px !important"
+          v-model.trim="form.brand"
+          :disabled="addDisabled"
+          placeholder="请输入品牌"
+        ></el-input>
+      </el-form-item>
+      <!-- <el-form-item label="所属分部" :label-width="formLabelWidth" prop="organIdList">
+          <select-all v-model.trim="form.organIdList"
+                     filterable
+                     placeholder="请选择所属分部"
+                     style="width: 100% !important"
+                     multiple
+                     :disabled="addDisabled || addType == 'update'"
+                     @change="onOrganChange"
+                     clearable>
+            <el-option v-for="item in selects.branchs"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id.toString()"></el-option>
+          </select-all>
+        </el-form-item> -->
+      <el-form-item label="商品类型" prop="type" :label-width="formLabelWidth">
+        <el-select
+          v-model.trim="form.type"
+          :disabled="addDisabled"
+          style="width: 220px !important"
+          placeholder="请选择商品类型"
+        >
+          <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"
+        :label-width="formLabelWidth"
+      >
+        <el-select
+          v-model.trim="form.goodsCategoryId"
+          style="width: 220px !important"
+          placeholder="请选择商品分类"
+          :disabled="addDisabled"
+          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"
+        :label-width="formLabelWidth"
+      >
+        <el-input
+          v-model.trim="form.specification"
+          :disabled="addDisabled"
+          style="width: 220px !important"
+          placeholder="请输入商品型号"
+        ></el-input>
+      </el-form-item>
+
+      <div v-for="(goodsList, index) in form.goodsList" :key="index">
+        <el-form-item
+          :label="'商品' + (index + 1)"
+          :label-width="formLabelWidth"
+          style="display: inline-block; width: 80% !important"
+          :prop="'goodsList.' + index + '.id'"
+          :rules="[
+            { required: true, message: '请选择商品', trigger: 'change' }
+          ]"
+        >
+          <el-select
+            v-model.trim="goodsList.id"
+            @change="onGoodsChange"
+            filterable
+            style="width: 220px !important"
+            :disabled="addDisabled"
+            placeholder="请选择商品"
+          >
+            <el-option
+              v-for="(item, index) in selectGoodsList"
+              :key="index"
+              :disabled="item.disabled"
+              :label="item.name"
+              :value="item.id"
+            ></el-option>
+          </el-select>
+        </el-form-item>
+        <div v-if="!addDisabled" style="display: inline-block">
+          <el-button
+            icon="el-icon-minus"
+            v-if="form.goodsList.length > 1"
+            @click.prevent="removeGoodsList(goodsList)"
+            circle
+          ></el-button>
+          <el-button
+            icon="el-icon-plus"
+            @click.prevent="addGoodsList"
+            circle
+            style="margin-left: 5px"
+          ></el-button>
+        </div>
+      </div>
+      <el-alert title="价格信息" :closable="false" class="alert" type="info" />
+      <el-form-item
+        label="市场价"
+        class="hiddenStart"
+        prop="marketPrice"
+        :label-width="formLabelWidth"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            市场价
+            <el-tooltip placement="top" popper-class="mTooltip">
+              <div slot="content">
+                商品标价,仅在商品购买时做展示,不以该价格向学员销售商品
+              </div>
+              <i
+                class="el-icon-question"
+                style="
+                    font-size: 18px;
+                    color: #f56c6c;
+                    position: relative;
+                    top: 2px;
+                  "
+              ></i>
+            </el-tooltip>
+          </p>
+        </template>
+        <el-input
+          type="number"
+          placeholder="请输入市场价"
+          :disabled="addDisabled"
+          @mousewheel.native.prevent
+          v-model.trim="form.marketPrice"
+          style="width: 220px !important"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="零售价"
+        class="hiddenStart"
+        prop="discountPrice"
+        :label-width="formLabelWidth"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            零售价
+            <el-tooltip placement="top" popper-class="mTooltip">
+              <div slot="content">
+                管理端APP、乐器维修时学员购买该商品的价格
+              </div>
+              <i
+                class="el-icon-question"
+                style="
+                    font-size: 18px;
+                    color: #f56c6c;
+                    position: relative;
+                    top: 2px;
+                  "
+              ></i>
+            </el-tooltip>
+          </p>
+        </template>
+        <el-input
+          type="number"
+          placeholder="请输入零售价"
+          :disabled="addDisabled"
+          @mousewheel.native.prevent
+          v-model.trim="form.discountPrice"
+          style="width: 220px !important"
+        ></el-input>
+      </el-form-item>
+      <el-form-item
+        label="商品团购价"
+        prop="groupPurchasePrice"
+        class="hiddenStart"
+        :label-width="formLabelWidth"
+      >
+        <template slot="label">
+          <p style="position: relative">
+            <span style="color: #f56c6c; margin-right: 4px">*</span>
+            团购价
+            <el-tooltip placement="top" popper-class="mTooltip">
+              <div slot="content">乐团报名缴费时学员购买该商品的价格</div>
+              <i
+                class="el-icon-question"
+                style="
+                    font-size: 18px;
+                    color: #f56c6c;
+                    position: relative;
+                    top: 2px;
+                  "
+              ></i>
+            </el-tooltip>
+          </p>
+        </template>
+        <el-input
+          type="number"
+          placeholder="请输入商品团购价"
+          :disabled="addDisabled"
+          @mousewheel.native.prevent
+          v-model.trim="form.groupPurchasePrice"
+          style="width: 220px !important"
+        ></el-input>
+      </el-form-item>
+      <el-alert title="销售渠道" :closable="false" class="alert" type="info" />
+      <el-form-item
+        label="移动端可售分部"
+        prop="educationShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.educationShowOrganId"
+          filterable
+          placeholder="移动端可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <!--   :disabled="pageDisabled || pageType == 'update'" -->
+      <el-form-item
+        label="课程收费乐团可售分部"
+        prop="courseFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.courseFeeShowOrganId"
+          filterable
+          placeholder="课程收费乐团可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <!--  :disabled="pageDisabled || pageType == 'update'" -->
+      <el-form-item
+        label="会员收费乐团可售分部"
+        prop="memberFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.memberFeeShowOrganId"
+          filterable
+          placeholder="请选择会员收费团可见分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-form-item
+        label="免费乐团可售分部"
+        prop="freeFeeShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.freeFeeShowOrganId"
+          filterable
+          placeholder="请选择会员收费团可见分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <!--  :disabled="pageDisabled || pageType == 'update'"  -->
+      <el-form-item
+        v-if="tenantId == 1"
+        label="乐器置换可售分部"
+        prop="replacementShowOrganId"
+        :label-width="formLabelWidth"
+      >
+        <select-all
+          v-model.trim="form.replacementShowOrganId"
+          filterable
+          placeholder="请选择乐器置换可售分部"
+          style="width: 400px !important"
+          multiple
+          clearable
+          :disabled="addDisabled"
+        >
+          <el-option
+            v-for="item in selects.branchs"
+            :key="item.id"
+            :label="item.name"
+            :value="item.id.toString()"
+          ></el-option>
+        </select-all>
+      </el-form-item>
+      <el-alert title="商品信息" :closable="false" class="alert" type="info" />
+      <el-form-item label="商品图片" prop="image" :label-width="formLabelWidth">
+        <image-cropper
+          :options="cropperOptions"
+          :disabled="addDisabled"
+          :imgSize="2"
+          :imageUrl="form.image"
+          @crop-upload-success="cropSuccess"
+          bucket_name="mall"
+        />
+        <p style="color: red">请上传大小2M以内,格式为jpg、png、gif图片</p>
+      </el-form-item>
+      <br />
+      <el-form-item label="商品描述" prop="brief" :label-width="formLabelWidth">
+        <el-input
+          type="textarea"
+          :disabled="addDisabled"
+          v-model.trim="form.brief"
+          style="width: 400px"
+        ></el-input>
+      </el-form-item>
+      <el-form-item label="商品详情" prop="desc" :label-width="formLabelWidth">
+        <el-input
+          type="textarea"
+          :disabled="addDisabled"
+          v-model.trim="form.desc"
+          style="width: 400px"
+        ></el-input>
+      </el-form-item>
+    </el-form>
+    <span slot="footer" v-if="!addDisabled" class="dialog-footer">
+      <el-button @click="routeShopStatus = false">取 消</el-button>
+      <el-button @click="onShopSubmit('ruleForm')" type="primary"
+        >确 定</el-button
+      >
+    </span>
+  </div>
+</template>
+<script>
+import {
+  categoryListTree,
+  goodsQuery,
+  goodsAdd,
+  goodsUpdate,
+  goodsDelete,
+  updateGoodsStatus
+} from "@/api/businessManager";
+import cleanDeep from "clean-deep";
+import ImageCropper from "@/components/ImageCropper";
+import { goodsType } from "@/utils/searchArray";
+let validPrice = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入金额"));
+  } else if (value < 0) {
+    callback(new Error("输入金额必须大于或等于0"));
+  } else if (value >= 100000) {
+    callback(new Error("输入金额必须小于100000"));
+  } else {
+    callback();
+  }
+};
+let validStock = (rule, value, callback) => {
+  if ((value == "" && typeof value == "string") || value == null) {
+    callback(new Error("请输入库存"));
+  } else if (value < 0) {
+    callback(new Error("库存数量必须大于或等于0"));
+  } else {
+    callback();
+  }
+};
+export default {
+  props: ["addDisabled", "categoryList", "selectGoodsList", "tenantId"],
+  components: {
+    ImageCropper
+  },
+  data() {
+    return {
+      goodsType: goodsType,
+      formLabelWidth: "160px",
+      form: {
+        sn: null,
+        brand: null,
+        supplyChannel: null,
+        name: null,
+        type: null,
+        organIdList: [],
+        goodsCategoryId: null,
+        specification: null,
+        marketPrice: null,
+        discountPrice: null,
+        groupPurchasePrice: null,
+        clientShow: null,
+        educationalShow: null,
+        musicGroupShow: null,
+        courseViewType: [],
+        stockWarning: null,
+        image: null,
+        complementGoodsIdList: null,
+        goodsList: [
+          {
+            id: null
+          }
+        ],
+        brief: null,
+        desc: null,
+        replacementShow: null,
+        studentShowOrganId: null,
+        educationShowOrganId: null,
+        courseFeeShowOrganId: null,
+        memberFeeShowOrganId: null,
+        freeFeeShowOrganId: null,
+        replacementShowOrganId: null
+      },
+      goodsTree: [], // 选择商品列表
+      rules: {
+        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"
+          }
+        ],
+        name: [
+          {
+            required: true,
+            message: "请输入商品名称",
+            trigger: "blur"
+          },
+          {
+            min: 2,
+            max: 30,
+            message: "长度在 2 到 30 个字符",
+            trigger: "blur"
+          }
+        ],
+        type: [
+          {
+            required: true,
+            message: "请选择商品分类",
+            trigger: "change"
+          }
+        ],
+        organIdList: [
+          {
+            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"
+          }
+        ],
+        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"
+          }
+        ],
+        educationalShow: [
+          {
+            required: true,
+            message: "请选择教务端是否展示",
+            trigger: "change"
+          }
+        ],
+        musicGroupShow: [
+          {
+            required: true,
+            message: "请选择乐团是否展示",
+            trigger: "change"
+          }
+        ],
+        courseViewType: [
+          { required: true, message: "请选乐团收费模式", trigger: "change" }
+        ],
+        replacementShow: [
+          {
+            required: true,
+            message: "请选择是否参与置换",
+            trigger: "change"
+          }
+        ],
+        stockWarning: [
+          {
+            required: true,
+            message: "请选择是否库存预警",
+            trigger: "change"
+          }
+        ],
+        image: [
+          {
+            required: true,
+            message: "请选择图片",
+            trigger: "blur"
+          }
+        ],
+        brief: [
+          {
+            required: true,
+            message: "请输入商品描述",
+            trigger: "blur"
+          }
+        ],
+        desc: [
+          {
+            required: true,
+            message: "请输入商品详情",
+            trigger: "blur"
+          }
+        ]
+      },
+      cropperOptions: {
+        autoCrop: true, //是否默认生成截图框
+        autoCropWidth: 300, //默认生成截图框宽度
+        autoCropHeight: 300, //默认生成截图框高度
+        fixedBox: true, //是否固定截图框大小 不允许改变
+        previewsCircle: false, //预览图是否是圆形
+        title: "商品图片" //模态框上显示的标题
+      }
+    };
+  },
+  mounted() {},
+  methods: {
+    onShopSubmit(formName) {
+      this.$refs[formName].validate(valid => {
+        if (valid) {
+          let form = Object.assign({}, this.form);
+          let tempIds = [];
+          form.goodsList.forEach(item => {
+            if (item.id) {
+              tempIds.push(item.id);
+            }
+          });
+          form.complementGoodsIdList = tempIds.join(",");
+          // form.courseViewType = form.courseViewType.join(",");
+          // form.organIdList = form.courseViewType.join(",");
+          if (form.studentShowOrganId) {
+            form.studentShowOrganId = form.studentShowOrganId.join(",");
+          }
+          if (form.educationShowOrganId) {
+            form.educationShowOrganId = form.educationShowOrganId.join(",");
+          }
+
+          if (form.courseFeeShowOrganId) {
+            form.courseFeeShowOrganId = form.courseFeeShowOrganId.join(",");
+          }
+          if (form.memberFeeShowOrganId) {
+            form.memberFeeShowOrganId = form.memberFeeShowOrganId.join(",");
+          }
+          if (form.freeFeeShowOrganId) {
+            form.freeFeeShowOrganId = form.freeFeeShowOrganId.join(",");
+          }
+          if (form.replacementShowOrganId) {
+            form.replacementShowOrganId = form.replacementShowOrganId.join(",");
+          }
+          if (
+            !form.studentShowOrganId &&
+            !form.educationShowOrganId &&
+            !form.courseFeeShowOrganId &&
+            !form.freeFeeShowOrganId &&
+            !form.replacementShowOrganId
+          ) {
+            this.$message.error("请至少选择一个可见分部");
+            return;
+          }
+          form.goodsList = null;
+          if (this.addType == "create" || this.addType == "copy") {
+            if (this.form.id) {
+              // 判断有没有Id,如果有则删除
+              delete this.form.id;
+            }
+            form.status = "NO"; // 默认上架
+            goodsAdd(cleanDeep(form)).then(res => {
+              this.messageTips("保存", res);
+            });
+          } else if (this.addType == "update") {
+            goodsUpdate(cleanDeep(form)).then(res => {
+              this.messageTips("保存", res);
+            });
+          }
+        } else {
+          this.$nextTick(() => {
+            let isError = document.getElementsByClassName("is-error");
+            isError[0].scrollIntoView({
+              block: "center",
+              behavior: "smooth"
+            });
+          });
+          return false;
+        }
+      });
+    },
+    messageTips(title, res) {
+      if (res.code == 200) {
+        this.$message.success(title + "成功");
+        this.getList();
+        this.routeShopStatus = false;
+      } else {
+        this.$message.error(res.msg);
+      }
+    },
+    onGoodsChange() {
+      let selectGoodsList = this.selectGoodsList;
+      let goodsList = this.form.goodsList;
+      let tempIds = [];
+      goodsList.forEach(item => {
+        if (item.id) {
+          tempIds.push(item.id);
+        }
+      });
+      selectGoodsList.forEach(item => {
+        if (tempIds.includes(item.id)) {
+          item.disabled = true;
+        } else {
+          item.disabled = false;
+        }
+      });
+
+      this.calcPrice();
+    },
+    removeGoodsList(item) {
+      let tempId = item.id;
+      let selectGoodsList = this.selectGoodsList;
+      selectGoodsList.forEach(item => {
+        if (item.id == tempId) {
+          item.disabled = false;
+        }
+      });
+
+      const index = this.form.goodsList.indexOf(item);
+      if (index !== -1) {
+        this.form.goodsList.splice(index, 1);
+      }
+
+      this.calcPrice();
+    },
+    addGoodsList() {
+      this.form.goodsList.push({
+        id: null
+      });
+    },
+
+    calcPrice() {
+      let selectGoodsList = this.selectGoodsList;
+      let form = this.form;
+      let goodsList = form.goodsList;
+      let tempIds = [];
+      goodsList.forEach(item => {
+        if (item.id) {
+          tempIds.push(item.id);
+        }
+      });
+      let groupPurchasePrice = 0,
+        marketPrice = 0,
+        discountPrice = 0;
+      selectGoodsList.forEach(item => {
+        if (tempIds.includes(item.id)) {
+          groupPurchasePrice += item.groupPurchasePrice;
+          marketPrice += item.marketPrice;
+          discountPrice += item.discountPrice;
+        }
+      });
+
+      form.groupPurchasePrice = Number(groupPurchasePrice.toFixed(2));
+      form.discountPrice = Number(discountPrice.toFixed(2));
+      form.marketPrice = Number(marketPrice.toFixed(2));
+    },
+    onFormClose(formName) {
+      // 关闭弹窗重置验证
+      this.$refs[formName].resetFields();
+    },
+    cropSuccess(data) {
+      this.form.image = data.data.url;
+    }
+  }
+};
+</script>
+<style lang="scss" scoped>
+.alert {
+  margin-bottom: 22px;
+}
+.shopImage {
+  width: 60px;
+  height: 60px;
+}
+.shopDesc {
+  max-height: 70px;
+  overflow: hidden;
+}
+
+.el-select__tags .el-tag.el-tag--info.el-tag--small.el-tag--light {
+  max-width: 95px;
+}
+.hiddenStart {
+  ::v-deep .el-form-item__label:before {
+    content: "" !important;
+    position: absolute;
+    color: transparent;
+    margin-right: 4px;
+  }
+}
+
+.dialog-footer {
+  display: block;
+  text-align: right;
+}
+</style>

Різницю між файлами не показано, бо вона завелика
+ 22 - 867
src/views/businessManager/shopManager/shopList.vue


+ 2 - 2
vue.config.js

@@ -15,11 +15,11 @@ const name = defaultSettings.title || "管乐迷后台管理系统"; // page tit
 // const port = process.env.port || process.env.npm_config_port || 9528 // dev port
 // http://47.99.212.176:8000
 //  https://online.dayaedu.com
-let target = "https://online.dayaedu.com"; //线上
+// let target = "https://online.dayaedu.com"; //线上
 // let target = 'http://192.168.3.20:8000' //邹璇
 // let target = "http://192.168.0.127:8000"; //勇哥
 // let target = "http://192.168.3.14:8005"; // 原谅
-// let target = "https://test.dayaedu.com"; //测试环境
+let target = "https://dev.dayaedu.com"; //测试环境
 // All configuration item explanations can be find in https://cli.vuejs.org/config/
 module.exports = {
   /**

Деякі файли не було показано, через те що забагато файлів було змінено