Mr.Shi
2023-09-19 7d13bbe39257ab5231d062e431fbb920c60d8ed5
企业端
已添加4个文件
已修改34个文件
1403 ■■■■■ 文件已修改
company_admin/package-lock.json 160 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/.env.development 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/.env.staging 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/package.json 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/public/template/goods_import_modle.xlsx 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/api/business/goods.js 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/OperaGoodsWindow.vue 311 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/business/selectProduct.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/ImportButton.vue 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/ImportWindow.vue 205 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/components/common/UploadImage.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/baseData.vue 126 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/company.vue 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/src/views/business/goods.vue 85 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
platform/vue.config.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/java/com/doumee/CompanyApplication.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/java/com/doumee/api/business/CategoryController.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/java/com/doumee/api/business/GoodsController.java 19 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/company/src/main/java/com/doumee/config/shiro/ShiroRealm.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/pom.xml 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/shiro/ShiroSessionDAO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/platform/src/main/java/com/doumee/task/ScheduleTool.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/core/utils/Constants.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/CateParamSelectMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/dao/business/model/BaseData.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/CateParamSelectService.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/BaseGoodsService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/BaseCategoryServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java 80 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/BaseGoodsServiceImpl.java 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/BrandServiceImpl.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java 115 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/impl/CateParamSelectServiceImpl.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/service/src/main/resources/mappers/CateParamSelectMapper.xml 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
company_admin/package-lock.json
@@ -1814,63 +1814,6 @@
          "integrity": "sha1-/q7SVZc9LndVW4PbwIhRpsY1IPo=",
          "dev": true
        },
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmjs.org/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "ssri": {
          "version": "8.0.1",
          "resolved": "https://registry.npm.taobao.org/ssri/download/ssri-8.0.1.tgz?cache=0&sync_timestamp=1617826515595&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fssri%2Fdownload%2Fssri-8.0.1.tgz",
@@ -1878,28 +1821,6 @@
          "dev": true,
          "requires": {
            "minipass": "^3.1.1"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        },
        "vue-loader-v16": {
          "version": "npm:vue-loader@16.8.3",
          "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-16.8.3.tgz",
          "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
          "dev": true,
          "optional": true,
          "requires": {
            "chalk": "^4.1.0",
            "hash-sum": "^2.0.0",
            "loader-utils": "^2.0.0"
          }
        }
      }
@@ -13290,6 +13211,87 @@
        }
      }
    },
    "vue-loader-v16": {
      "version": "npm:vue-loader@16.8.3",
      "resolved": "https://registry.npmmirror.com/vue-loader/-/vue-loader-16.8.3.tgz",
      "integrity": "sha512-7vKN45IxsKxe5GcVCbc2qFU5aWzyiLrYJyUuMz4BQLKctCj/fmCa0w6fGiiQ2cLFetNcek1ppGJQDCup0c1hpA==",
      "dev": true,
      "optional": true,
      "requires": {
        "chalk": "^4.1.0",
        "hash-sum": "^2.0.0",
        "loader-utils": "^2.0.0"
      },
      "dependencies": {
        "ansi-styles": {
          "version": "4.3.0",
          "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz",
          "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-convert": "^2.0.1"
          }
        },
        "chalk": {
          "version": "4.1.2",
          "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz",
          "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==",
          "dev": true,
          "optional": true,
          "requires": {
            "ansi-styles": "^4.1.0",
            "supports-color": "^7.1.0"
          }
        },
        "color-convert": {
          "version": "2.0.1",
          "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz",
          "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==",
          "dev": true,
          "optional": true,
          "requires": {
            "color-name": "~1.1.4"
          }
        },
        "color-name": {
          "version": "1.1.4",
          "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz",
          "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==",
          "dev": true,
          "optional": true
        },
        "has-flag": {
          "version": "4.0.0",
          "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz",
          "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==",
          "dev": true,
          "optional": true
        },
        "loader-utils": {
          "version": "2.0.4",
          "resolved": "https://registry.npmmirror.com/loader-utils/-/loader-utils-2.0.4.tgz",
          "integrity": "sha512-xXqpXoINfFhgua9xiqD8fPFHgkoq1mmmpE92WlDbm9rNRd/EbRb+Gqf908T2DMfuHjjJlksiK2RbHVOdD/MqSw==",
          "dev": true,
          "optional": true,
          "requires": {
            "big.js": "^5.2.2",
            "emojis-list": "^3.0.0",
            "json5": "^2.1.2"
          }
        },
        "supports-color": {
          "version": "7.2.0",
          "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz",
          "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==",
          "dev": true,
          "optional": true,
          "requires": {
            "has-flag": "^4.0.0"
          }
        }
      }
    },
    "vue-router": {
      "version": "3.5.1",
      "resolved": "https://registry.nlark.com/vue-router/download/vue-router-3.5.1.tgz?cache=0&sync_timestamp=1620899536020&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fvue-router%2Fdownload%2Fvue-router-3.5.1.tgz",
platform/.env.development
@@ -1,9 +1,15 @@
# å¼€å‘环境配置
NODE_ENV = 'development'
VUE_APP_CONTEXT_PATH = '/'
VUE_APP_API_PREFIX = '/api'
# ä»»åº·
# VUE_APP_API = 'http://192.168.0.15:10017/'
# ç„¦æ¾
VUE_APP_API = 'http://192.168.0.36:10011'
# æ±Ÿè
VUE_APP_API = 'http://192.168.0.35:10011'
#测试服务器
# VUE_APP_API = 'https://dmtest.ahapp.net/preselect_admin_interface'
platform/.env.staging
@@ -1,2 +1,9 @@
# æµ‹è¯•环境配置
NODE_ENV = 'production'
VUE_APP_CONTEXT_PATH = '/preselect_admin'
VUE_APP_API_PREFIX = '/preselect_admin_interface'
# https://dmtest.ahapp.net/preselect_admin_interface/doc.html
VUE_APP_API = 'https://dmtest.ahapp.net/preselect_admin_interface'
platform/package.json
@@ -5,7 +5,7 @@
  "scripts": {
    "serve": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:staging": "vue-cli-service build --mode staging",
    "build:dev": "vue-cli-service build --mode staging",
    "lint": "vue-cli-service lint",
    "fix": "eslint --ext .js,.vue src --fix"
  },
platform/public/template/goods_import_modle.xlsx
Binary files differ
platform/src/api/business/goods.js
@@ -30,7 +30,7 @@
// ä¿®æ”¹
export function updateById (data) {
  return request.post('/business/baseGoods/updateById', data)
  return request.post('/business/baseGoods/update', data)
}
// åˆ é™¤
@@ -62,5 +62,5 @@
// æ ¹æ®ID查询
export function queryById (id) {
  return request.get(`business/baseGoods/${id}`)
  return request.get(`/business/baseGoods/${id}`)
}
platform/src/components/business/OperaGoodsWindow.vue
@@ -1,11 +1,6 @@
<template>
  <GlobalWindow
    :title="title"
    :visible.sync="visible"
    :confirm-working="isWorking"
    @confirm="confirm"
    width="800px"
  >
  <GlobalWindow :title="title" :visible.sync="visible" :confirm-working="isWorking" @confirm="confirm" width="800px"
    v-loading="isUploading">
    <el-form :model="form" ref="form" label-width="120px" :rules="rules">
      <div style="font-size: 18px;font-weight: bold;">基本信息</div>
      <el-form-item label="商品名称" prop="name">
@@ -13,81 +8,38 @@
      </el-form-item>
      <el-form-item label="商品品牌" prop="brandId">
        <el-select v-model="form.brandId" placeholder="请选择,单选">
          <el-option
            v-for="item in brandList"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          <el-option v-for="item in brandList()" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item label="商品类别" prop="categoryId">
        <!-- @change="changeCategory(form.categoryId)" -->
        <el-select v-model="form.categoryId" placeholder="请选择,单选">
          <el-option
            v-for="item in categoryList"
            :key="item.id"
            :label="item.name"
            :value="item.id">
        <el-select v-model="form.categoryId" placeholder="请选择,单选" @change="categorySelect">
          <el-option v-for="item in categoryList()" :key="item.id" :label="item.name" :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <!-- <el-form-item :label="name1" prop="attrFirstIds" v-if="name1">
        <el-select v-model="form.attrFirstIds" multiple placeholder="请选择,支持多选">
          <el-option
            v-for="item in form.attrFirstList"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item>
      <el-form-item :label="name2" prop="attrSecodIds" v-if="name2">
        <el-select v-model="form.attrSecodIds" multiple placeholder="请选择,支持多选">
          <el-option
            v-for="item in form.attrSecodList"
            :key="item.id"
            :label="item.name"
            :value="item.id">
          </el-option>
        </el-select>
      </el-form-item> -->
      <el-form-item label="指导价(元)" prop="zdPrice">
        <el-input v-model="form.zdPrice" @input="priceCHANEG(form.zdPrice, 1)" type="number" placeholder="建议录入整数,单位元" v-trim/>
        <el-input v-model="form.zdPrice" @input="priceCHANEG(form.zdPrice, 1)" type="number" placeholder="建议录入整数,单位元"
          v-trim />
      </el-form-item>
      <el-form-item label="入手价(元)" prop="price">
        <el-input v-model="form.price" @input="priceCHANEG(form.price, 2)" type="number" placeholder="建议录入整数,单位元" v-trim/>
        <el-input v-model="form.price" @input="priceCHANEG(form.price, 2)" type="number" placeholder="建议录入整数,单位元"
          v-trim />
      </el-form-item>
      <el-form-item label="商品主图">
        <el-upload
          :action="action"
          :file-list="form.ztList"
          :data="{ folder: 'goods_img' }"
          list-type="picture-card"
          :limit="1"
          :on-success="fileSuccess"
          :on-exceed="exceed"
          :on-remove="handleRemove">
          <i class="el-icon-plus"></i>
          <div slot="tip" class="el-upload__tip">只能上传图片格式,png格式,建议尺寸140*140px</div>
        </el-upload>
        <UploadAvatarImage :file="{ 'imgurlfull': form.imgfullurl, 'imgurl': form.imgurl }" :uploadData="uploadData"
          tipsLabel="" @uploadSuccess="uploadReverseSuccess" @uploadEnd="isUploading = false"
          @uploadBegin="isUploading = true" />
        åªèƒ½ä¸Šä¼ å›¾ç‰‡æ ¼å¼ï¼Œpng格式,建议尺寸140px*140px
      </el-form-item>
  <el-form-item label="商品图片">
        <el-upload
          :action="action"
          :file-list="form.files"
          :multiple="true"
          :data="{ folder: 'goods_img' }"
          list-type="picture-card"
          :on-success="fileSuccess1"
          :on-remove="handleRemove1">
          <i class="el-icon-plus"></i>
          <div slot="tip" class="el-upload__tip">只能上传图片格式,png格式,建议尺寸600*600px</div>
        </el-upload>
        <UploadImage :fileList="form.multifileList" :uploadData="uploadData" @beginUpload="isUploading = true" @endUpload="isUploading = false" />
        åªèƒ½ä¸Šä¼ å›¾ç‰‡æ ¼å¼ï¼Œpng格式,建议尺寸600*600px
      </el-form-item>
      <template v-if="form.goodsParamList && form.goodsParamList.length > 0">
        <div style="font-size: 18px;font-weight: bold;">参数属性值配置 <span style="font-size: 13px; font-weight: 500;">按需配置当前商品的产品参数值,单个参数值不超过30个字</span></div>
        <el-form-item :label="item.name" v-for="(item, index) in form.goodsParamList" :key="index">
      <template v-if="form.baseGoodsParamList && form.baseGoodsParamList.length > 0">
        <div style="font-size: 18px;font-weight: bold;">参数属性值配置 <span
            style="font-size: 13px; font-weight: 500;">按需配置当前商品的产品参数值,单个参数值不超过30个字</span></div>
        <el-form-item :label="item.name" v-for="(item, index) in form.baseGoodsParamList" :key="index">
          <el-input v-model="item.val" maxlength="30" type="text" placeholder="请输入" v-trim/>
        </el-form-item>
      </template>
@@ -98,18 +50,21 @@
<script>
import BaseOpera from '@/components/base/BaseOpera'
import GlobalWindow from '@/components/common/GlobalWindow'
import UploadAvatarImage from '@/components/common/UploadAvatarImage.vue'
import UploadImage from '@/components/common/UploadImage.vue'
import { baseCategory,brand } from '@/api/system/common.js'
import {  create, updateById, companyCreate, companyUpdateById } from '@/api/business/goods.js'
import { companyCreate, companyUpdateById } from '@/api/business/goods.js'
export default {
  name: 'OperaGoodsWindow',
  extends: BaseOpera,
  components: { GlobalWindow },
  components: { GlobalWindow, UploadAvatarImage, UploadImage },
  data () {
    return {
      action: process.env.VUE_APP_API_PREFIX + '/public/upload',
      name1: '',
      name2: '',
      // è¡¨å•数据
      isUploading: false,
      form: {
        id: null,
        name: '',
@@ -117,17 +72,13 @@
        brandId: '',
        zdPrice: '',
        price: '',
        attrFirstIds: [],
        attrFirstNames: '',
        attrSecodIds: [],
        attrSecodNames: '',
        imgurl: '',
        imgfullurl: '',
        multifileList: [],
        files: [],
        ztList: [],
        goodsParamList: [],
        attrFirstList: [],
        attrSecodList: []
        baseGoodsParamList: [],
      },
      uploadData: {
        folder: 'goods_img'
      },
      // éªŒè¯è§„则
      rules: {
@@ -147,77 +98,44 @@
          { required: true, message: '不能为空', trigger: 'blur' }
        ]
      },
      options: [],
      categoryList: [],
      brandList: []
      options: []
    }
  },
  inject: ['categoryList', 'brandList'],
  created () {
    this.config({
      api: '/business/goods',
      'field.id': 'id'
    })
    this.getbrand()
    this.getcategory()
  },
  watch: {
    'form.categoryId': {
      immediate: true,
      handler(news, old) {
        if (news) {
          this.name1 = ''
          this.name2 = ''
          if (old) {
            this.form.attrFirstIds = []
            this.form.attrSecodIds = []
            this.form.goodsParamList = []
          }
          this.categoryList.forEach(item => {
            if (item.id === news) {
              this.name1 = item.attrFirst
              this.name2 = item.attrSecond
              this.form.attrFirstList = item.attrFirstList.length > 0 ? item.attrFirstList : []
              this.form.attrSecodList = item.attrSecondList.length > 0 ? item.attrSecondList : []
              this.form.goodsParamList = JSON.parse(JSON.stringify(item.paramList))
              this.form.goodsParamList.forEach(item => {
                item.pramaId = item.id
              })
              console.log(this.form.goodsParamList)
            }
          })
          this.getcategory(1)
        }
      }
    },
    visible: {
      handler(news, old) {
        if (!news) {
          this.name1 = ''
          this.name2 = ''
          this.form = {
            id: null,
            name: '',
            categoryId: '',
            brandId: '',
            zdPrice: '',
            price: '',
            attrFirstIds: [],
            attrFirstNames: '',
            attrSecodIds: [],
            attrSecodNames: '',
            imgurl: '',
            multifileList: [],
            files: [],
            ztList: [],
            goodsParamList: [],
            attrFirstList: [],
            attrSecodList: []
          }
        }
      }
    }
    // this.getbrand()
    // this.getcategory()
  },
  methods: {
    open(title, target) {
      this.title = title
      this.visible = true
      // æ–°å»º
      if (target == null) {
        this.$nextTick(() => {
          this.$refs.form.resetFields()
          this.form.imgurl = ''
          this.form.imgfullurl = ''
          this.form.multifileList = []
          this.form.baseGoodsParamList = []
          this.form[this.configData['field.id']] = null
        })
        return
      }
      // ç¼–辑
      this.$nextTick(() => {
        for (const key in this.form) {
          this.form[key] = target[key]
        }
        this.form.multifileList.forEach(item => {
          item.url = item.filefullurl
        })
      })
    },
    priceCHANEG(val, type) {
      if (!/^[1-9]+[0-9]*$/.test(val)) {
        this.$message.warning('只能输入正整数')
@@ -228,114 +146,19 @@
        }
      }
    },
    confirm() {
      this.$refs.form.validate((valid) => {
        if (valid) {
          if (this.form.attrFirstIds.length > 0) {
            let arr = []
            this.form.attrFirstIds.forEach(element => {
              this.form.attrFirstList.forEach(item => {
                if (element === item.id) {
                  arr.push(item.name)
                }
              })
            })
            this.form.attrFirstNames = arr.join(',')
            this.form.attrFirstIds = this.form.attrFirstIds.join(',')
          } else {
            this.form.attrFirstNames = ''
            this.form.attrFirstIds = ''
          }
          if (this.form.attrSecodIds.length > 0) {
            let arr = []
            this.form.attrSecodIds.forEach(element => {
              this.form.attrSecodList.forEach(item => {
                if (element === item.id) {
                  arr.push(item.name)
                }
              })
            })
            this.form.attrSecodNames = arr.join(',')
            this.form.attrSecodIds = this.form.attrSecodIds.join(',')
          } else {
            this.form.attrSecodNames = ''
            this.form.attrSecodIds = ''
          }
          if (!this.form.id) {
            companyCreate({...this.form, type: 0})
              .then(() => {
                this.visible = false
                this.$tip.apiSuccess('新建成功')
                this.$emit('success')
              })
              .catch(e => {
                this.$tip.apiFailed(e)
              })
              .finally(() => {
                this.isWorking = false
              })
          } else {
            companyUpdateById({...this.form, type: 0})
              .then(() => {
                this.visible = false
                this.$tip.apiSuccess('编辑成功')
                this.$emit('success')
              })
              .catch(e => {
                this.$tip.apiFailed(e)
              })
              .finally(() => {
                this.isWorking = false
              })
          }
        } else {
          return false;
        }
      });
    },
    exceed() {
      this.$message.warning({
        message: '只能上传一个图标'
      })
    },
    fileSuccess1(response, file, fileList) {
      this.form.files = fileList
      this.form.multifileList.push({ fileurl: response.data.imgaddr, name: response.data.imgname, url: response.data.url })
    },
    handleRemove1(file, fileList) {
      this.form.files = fileList
      this.form.multifileList = fileList
    },
    fileSuccess(response) {
      this.form.ztList.push({ imgaddr: response.data.imgaddr, url: response.data.url })
      this.form.imgurl = response.data.imgaddr
    },
    handleRemove() {
      this.form.ztList = []
      this.form.imgurl = ''
    },
      getbrand() {
        brand({status:0})
          .then(res => {
            this.brandList = res
          })
      },
      getcategory(type) {
        baseCategory({status:0 , type:1})
          .then(res => {
            this.categoryList = res
            if (type === 1) {
              this.categoryList.forEach(item => {
                if (item.id === this.form.categoryId) {
                  this.form.goodsParamList = JSON.parse(JSON.stringify(item.paramList))
                  this.form.goodsParamList.forEach(item => {
    categorySelect(v) {
      this.categoryList().forEach(item => {
        if (item.id === v) {
          this.form.baseGoodsParamList = JSON.parse(JSON.stringify(item.baseCateParamList))
          this.form.baseGoodsParamList.forEach(item => {
                    item.pramaId = item.id
                  })
                  console.log(this.form.goodsParamList)
                }
              })
            }
          })
    },
    uploadReverseSuccess(file) {
      this.form.imgurl = file.imgurl;
      this.form.imgfullurl = file.imgurlfull;
      }
  }
}
platform/src/components/business/selectProduct.vue
@@ -62,7 +62,7 @@
    },
    created() {
      this.config({
        api: '/business/anchor',
        api: '/business/goods',
        'field.id': 'id'
      })
    },
platform/src/components/common/ImportButton.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,37 @@
<template>
  <div class="import-button">
    <el-button type="primary" @click="$refs.importWindow.open(text)">{{text}}</el-button>
    <ImportWindow :action="action" :template-path="templatePath" :template-name="templateName" ref="importWindow" @success="handleSuccess"/>
  </div>
</template>
<script>
import ImportWindow from './ImportWindow'
export default {
  name: 'ImportButton',
  components: { ImportWindow },
  props: {
    // æŒ‰é’®æ–‡æ¡ˆ
    text: {
      default: '导入'
    },
    // æ¨¡ç‰ˆåœ°å€
    templatePath: {
      required: true
    },
    // ä¸‹è½½åŽçš„æ¨¡ç‰ˆæ–‡ä»¶åç§°
    templateName: {
      required: true
    },
    // å¯¼å…¥æŽ¥å£åœ°å€
    action: {
      required: true
    }
  },
  methods: {
    handleSuccess () {
      this.$emit('success')
    }
  }
}
</script>
platform/src/components/common/ImportWindow.vue
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,205 @@
<template>
  <el-dialog
    width="500px"
    :title="title"
    :visible.sync="visible"
    append-to-body
    custom-class="eva-dialog import-window"
    :close-on-click-modal="false"
    :close-on-press-escape="false"
    :show-close="false"
  >
    <el-form>
      <el-form-item>
        <el-upload
          drag
          :show-file-list="false"
          action="none"
          accept=".xlsx, .xls"
          :before-upload="handleBeforeUpload"
        >
          <template v-if="form.file == null">
            <i class="el-icon-upload"></i>
            <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
          </template>
          <template v-else>
            <i class="el-icon-files"></i>
            <div class="el-upload__text">{{form.file.name}}<em></em></div>
          </template>
        </el-upload>
      </el-form-item>
    </el-form>
    <div slot="footer" class="import-window__footer">
      <!-- <div class="sync-exists">
        <el-checkbox v-model="form.sync"/><span>同步已存在的数据</span>
      </div> -->
      <div class="opera">
        <a href=""></a>
        <el-button type="text" icon="el-icon-download" @click="downloadTemplate">下载模版</el-button>
        <el-button @click="cancel">{{cancelText}}</el-button>
        <el-button type="primary" @click="confirm" :loading="isWorking">{{confirmText}}</el-button>
      </div>
    </div>
  </el-dialog>
</template>
<script>
import request from '@/utils/request'
export default {
  name: 'ImportWindow',
  props: {
    // å¯¼å…¥æŽ¥å£åœ°å€
    action: {
      required: true
    },
    // ç¡®è®¤æŒ‰é’®æ–‡æ¡ˆ
    confirmText: {
      type: String,
      default: '导入'
    },
    // å–消按钮文案
    cancelText: {
      type: String,
      default: '取消'
    },
    // æ¨¡ç‰ˆåœ°å€
    templatePath: {
      required: true
    },
    // ä¸‹è½½åŽçš„æ¨¡ç‰ˆæ–‡ä»¶åç§°
    templateName: {
      required: true
    }
  },
  data () {
    return {
      visible: false,
      isWorking: false,
      title: '导入数据',
      form: {
        sync: false,
        file: false,
        categoryId: ''
      }
    }
  },
  methods: {
    /**
     * æ‰“开窗口
     *
     * @param title çª—口标题
     */
    open (title) {
      this.visible = true
      this.title = title
      this.form.sync = false
      this.form.file = null
    },
    /**
     * ç¡®å®šå¯¼å…¥
     */
    confirm () {
      if (this.form.file == null) {
        this.$message.warning('请选择文件')
        return
      }
      this.isWorking = true
      const param = new FormData()
      param.set('file', this.form.file)
      request.post(this.action, param, {
        headers: {
          'Content-Type': 'multipart/form-data;charset=UTF-8'
        }
      })
        .then(() => {
          this.$message.success('导入成功')
          this.visible = false
          this.$emit('success')
        })
        .catch(e => {
          this.$message.error(e)
        })
        .finally(() => {
          this.isWorking = false
        })
    },
    /**
     * å–消
     */
    cancel () {
      this.visible = false
    },
    /**
     * ä¸‹è½½æ¨¡ç‰ˆ
     */
    downloadTemplate () {
      const link = document.createElement('a')
      link.setAttribute('download', this.templateName) //下载的文件名
      // console.log(`window.location.origin`, window.location.origin);
      // console.log(`process.env.VUE_APP_CONTEXT_PATH`, process.env.VUE_APP_CONTEXT_PATH);
      // console.log(`this.templatePath`, this.templatePath);
      link.href = `${window.location.origin}${process.env.VUE_APP_CONTEXT_PATH}${this.templatePath}`  //文件url
      link.click()
    },
    /**
     * æ–‡ä»¶ä¸Šä¼ å‰å­˜å‚¨ä¸Šä¼ çš„æ–‡ä»¶
     *
     * @param file éœ€å¯¼å…¥çš„æ–‡ä»¶
     */
    handleBeforeUpload (file) {
      this.form.file = file
      return false
    }
  }
}
</script>
<style lang="scss">
@import "../../assets/style/variables";
.import-window {
  .el-upload {
    width: 100%;
    .el-upload-dragger {
      width: 100%;
      .el-icon-upload, .el-icon-files {
        font-size: 67px;
        color: #C0C4CC;
        margin: 40px 0 16px;
        line-height: 50px;
      }
    }
  }
  .import-window__footer {
    display: flex;
    .sync-exists {
      width: 200px;
      flex-shrink: 0;
      text-align: left;
      font-size: 13px;
      display: flex;
      align-items: center;
      .el-checkbox {
        margin-right: 10px;
      }
      & > * {
        vertical-align: middle;
      }
    }
    .opera {
      flex-grow: 1;
      a {
        font-size: 12px;
        margin-right: 10px;
        text-decoration: none;
        .el-icon-download {
          font-size: 15px;
          position: relative;
          top: 2px;
        }
      }
    }
  }
}
</style>
platform/src/components/common/UploadImage.vue
@@ -59,7 +59,7 @@
  },
  data() {
    return {
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/uploadLocal',
      uploadImgUrl: process.env.VUE_APP_API_PREFIX + '/public/upload',
      
      realList: [],
      srcList: [],
platform/src/views/business/baseData.vue
@@ -23,38 +23,27 @@
      </el-form-item>
      <section>
        <el-button type="primary" @click="search">搜索</el-button>
<!--
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:basedata:exportExcel']" @click="exportExcel">导出</el-button>
-->
        <el-button @click="reset">重置</el-button>
      </section>
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:basedata:create', 'business:basedata:delete']">
<!--
        <li><el-button type="primary" @click="$refs.operaBaseDataWindow.open('新建商品源数据信息表')" icon="el-icon-plus" v-permissions="['business:basedata:create']">新建</el-button></li>
-->
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:basedata:delete']">批量删除</el-button></li>
        <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete"
            v-permissions="['business:basedata:delete']">批量删除</el-button></li>
      </ul>
      <el-table
        v-loading="isWorking.search"
        :data="tableData.list"
        stripe
        @selection-change="handleSelectionChange"
      >
      <el-table v-loading="isWorking.search" :data="tableData.list" border stripe @selection-change="handleSelectionChange">
        <el-table-column type="selection" width="55"></el-table-column>
        <el-table-column prop="id" label="主键" min-width="100px"></el-table-column>
        <el-table-column prop="createDate" label="创建时间" min-width="100px"></el-table-column>
        <el-table-column prop="name" label="商品主图" min-width="80px">
          <template slot-scope="{row}">
           <a :href="`${row.url}`" target="_blank">
             <div style="display: flex; align-items: center;">
               <div style="width: 70px; height: 70px; flex-shrink: 0;">
                 <el-image v-if="row.imgurl" style="width: 70px; height: 70px" :src="row.imgurl"
                           :preview-src-list="[row.imgurl]" fit="cover"></el-image>
               </div>
             </div> </a>
              </div>
          </template>
        </el-table-column>
        <el-table-column prop="name" label="商品名称" min-width="150px">
@@ -69,98 +58,45 @@
        <el-table-column prop="price" label="价格(元)" min-width="100px"></el-table-column>
        <el-table-column prop="saleprice" label="采购价格(元)" min-width="100px"></el-table-column>
        <el-table-column prop="haveStock" label="库存情况" min-width="100px"></el-table-column>
        <el-table-column prop="bgImg" label="大图1" min-width="80px">
        <el-table-column prop="bgImgs" label="大图" min-width="80px">
          <template slot-scope="{row}">
            <div style="display: flex; align-items: center;">
            <el-button type="text" @click="showImage(row.bgImgs)">查看大图</el-button>
            <!-- <div style="display: flex; align-items: center;">
              <div style="width: 70px; height: 70px; flex-shrink: 0;">
                <el-image v-if="row.bgImg" style="width: 70px; height: 70px" :src="row.bgImg"
                          :preview-src-list="[row.bgImg]" fit="cover"></el-image>
                <el-image v-if="row.bgImgs" style="width: 70px; height: 70px" :src="row.bgImgs"
                  :preview-src-list="row.bgImgs" fit="cover"></el-image>
              </div>
            </div>
            </div> -->
          </template>
        </el-table-column>
        <el-table-column prop="bgImg2" label="大图2" min-width="80px">
          <template slot-scope="{row}">
            <div style="display: flex; align-items: center;">
              <div style="width: 70px; height: 70px; flex-shrink: 0;">
                <el-image v-if="row.bgImg2" style="width: 70px; height: 70px" :src="row.bgImg2"
                          :preview-src-list="[row.bgImg2]" fit="cover"></el-image>
              </div>
            </div>
          </template>
        </el-table-column>
        <el-table-column prop="bgImg3" label="大图3" min-width="80px">
          <template slot-scope="{row}">
            <div style="display: flex; align-items: center;">
              <div style="width: 70px; height: 70px; flex-shrink: 0;">
                <el-image v-if="row.bgImg3" style="width: 70px; height: 70px" :src="row.bgImg3"
                          :preview-src-list="[row.bgImg3]" fit="cover"></el-image>
              </div>
            </div>
          </template>
        </el-table-column>
<!--        <el-table-column prop="attr1" label="属性1" min-width="100px"></el-table-column>
        <el-table-column prop="attr2" label="属性2" min-width="100px"></el-table-column>
        <el-table-column prop="attr3" label="属性3" min-width="100px"></el-table-column>
        <el-table-column prop="attr4" label="属性4" min-width="100px"></el-table-column>
        <el-table-column prop="attr5" label="属性5" min-width="100px"></el-table-column>
        <el-table-column prop="attr6" label="属性6" min-width="100px"></el-table-column>
        <el-table-column prop="attr7" label="属性7" min-width="100px"></el-table-column>
        <el-table-column prop="attr8" label="属性8" min-width="100px"></el-table-column>
        <el-table-column prop="attr9" label="属性9" min-width="100px"></el-table-column>
        <el-table-column prop="attr10" label="属性10" min-width="100px"></el-table-column>
        <el-table-column prop="attr11" label="属性11" min-width="100px"></el-table-column>
        <el-table-column prop="attr12" label="属性12" min-width="100px"></el-table-column>
        <el-table-column prop="attr13" label="属性13" min-width="100px"></el-table-column>
        <el-table-column prop="attr14" label="属性14" min-width="100px"></el-table-column>
        <el-table-column prop="attr15" label="属性15" min-width="100px"></el-table-column>
        <el-table-column prop="attr16" label="属性16" min-width="100px"></el-table-column>
        <el-table-column prop="attr17" label="属性17" min-width="100px"></el-table-column>
        <el-table-column prop="attr18" label="属性18" min-width="100px"></el-table-column>
        <el-table-column prop="attr19" label="属性19" min-width="100px"></el-table-column>
        <el-table-column prop="attr20" label="属性20" min-width="100px"></el-table-column>
        <el-table-column prop="attr21" label="属性21" min-width="100px"></el-table-column>
        <el-table-column prop="attr22" label="属性22" min-width="100px"></el-table-column>
        <el-table-column prop="attr23" label="属性23" min-width="100px"></el-table-column>
        <el-table-column prop="attr24" label="属性24" min-width="100px"></el-table-column>
        <el-table-column prop="attr25" label="属性25" min-width="100px"></el-table-column>
        <el-table-column prop="attr26" label="属性26" min-width="100px"></el-table-column>
        <el-table-column prop="attr27" label="属性27" min-width="100px"></el-table-column>
        <el-table-column prop="attr28" label="属性28" min-width="100px"></el-table-column>
        <el-table-column prop="attr29" label="属性29" min-width="100px"></el-table-column>
        <el-table-column prop="attr30" label="属性30" min-width="100px"></el-table-column>
        <el-table-column prop="attr31" label="属性31" min-width="100px"></el-table-column>
        <el-table-column prop="attr32" label="属性32" min-width="100px"></el-table-column>
        <el-table-column prop="attr33" label="属性33" min-width="100px"></el-table-column>
        <el-table-column prop="attr34" label="属性34" min-width="100px"></el-table-column>
        --><el-table-column prop="status" label="处理状态" min-width="100px">
        <el-table-column prop="status" label="处理状态" min-width="100px">
        <template slot-scope="{row}">
          {{row.status==1?"已处理":"未处理"}}
        </template>
      </el-table-column>
        <el-table-column
          v-if="containPermissions(['business:basedata:update', 'business:basedata:delete'])"
          label="操作"
          min-width="80"
          fixed="right"
        >
        <el-table-column v-if="containPermissions(['business:basedata:update', 'business:basedata:delete'])" label="操作"
          min-width="80" fixed="right">
          <template slot-scope="{row}">
<!--
            <el-button type="text" @click="$refs.operaBaseDataWindow.open('编辑商品源数据信息表', row)" icon="el-icon-edit" v-permissions="['business:basedata:update']">编辑</el-button>
-->
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:basedata:delete']">删除</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:basedata:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <pagination
        @size-change="handleSizeChange"
        @current-change="handlePageChange"
        :pagination="tableData.pagination"
      >
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
    <!-- æ–°å»º/修改 -->
    <OperaBaseDataWindow ref="operaBaseDataWindow" @success="handlePageChange"/>
    <el-image-viewer
      v-if="showViewer"
      :on-close="closeViewer"
      :initialIndex="0"
      :url-list="srcList"
      :z-index="3000"
    />
  </TableLayout>
</template>
@@ -169,12 +105,15 @@
import TableLayout from '@/layouts/TableLayout'
import Pagination from '@/components/common/Pagination'
import OperaBaseDataWindow from '@/components/business/OperaBaseDataWindow'
import ElImageViewer from 'element-ui/packages/image/src/image-viewer'
export default {
  name: 'BaseData',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaBaseDataWindow },
  components: { TableLayout, Pagination, OperaBaseDataWindow, ElImageViewer },
  data () {
    return {
      showViewer: false,
      srcList: [],
      // æœç´¢
      searchForm: {
        name: '',
@@ -197,6 +136,17 @@
      'field.main': 'id'
    })
    this.search()
  },
  methods: {
    showImage(imgs) {
      this.srcList = []
      this.srcList = imgs
      this.showViewer = true
    },
    closeViewer() {
      this.showViewer = false
  }
  },
}
</script>
platform/src/views/business/company.vue
@@ -35,6 +35,7 @@
      <el-table v-loading="isWorking.search" :data="tableData.list" border stripe
        @selection-change="handleSelectionChange">
        <!-- <el-table-column type="selection" width="55" align="center"></el-table-column> -->
        <el-table-column prop="id" label="企业编号" min-width="80px" align="center"></el-table-column>
        <el-table-column prop="name" label="企业名称" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="managerUserName" label="管理员账号" min-width="100px" align="center"></el-table-column>
        <el-table-column prop="linkname" label="联系人" min-width="100px" align="center"></el-table-column>
platform/src/views/business/goods.vue
@@ -1,6 +1,6 @@
<template>
  <TableLayout :permissions="['business:goods:query']">
  <TableLayout :permissions="['business:basegoods:query']">
    <!-- æœç´¢è¡¨å• -->
    <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline>
      <el-form-item label="商品名称" prop="name">
@@ -37,15 +37,17 @@
    </el-form>
    <!-- è¡¨æ ¼å’Œåˆ†é¡µ -->
    <template v-slot:table-wrap>
      <ul class="toolbar" v-permissions="['business:goods:create', 'business:goods:delete']">
        <li><el-button type="primary" @click="$refs.operaGoodsWindow.open('新建商品')" icon="el-icon-plus"
            v-permissions="['business:goods:create']">新建</el-button></li>
      <ul class="toolbar" v-permissions="['business:basegoods:create', 'business:basegoods:delete']">
        <li v-permissions="['business:basegoods:create']">
          <el-button type="primary" @click="$refs.operaGoodsWindow.open('新建商品')" icon="el-icon-plus">新建</el-button>
        </li>
        <!-- <el-button type="primary" :loading="isWorking.export"
          @click="$refs.selectProduct.open('选择平台商品')">选择平台商品</el-button> -->
        <el-button type="primary" :loading="isWorking.export" v-permissions="['business:goods:exportExcel']"
          @click="importFile">导入</el-button>
        <el-button type="primary" :loading="isWorking.export" @click="downloadFile">下载模板</el-button>
        <li v-permissions="['business:basegoods:exportExcel']">
          <ImportButton text="导入" template-name="goods_import_modle.xlsx"
            template-path="/template/goods_import_modle.xlsx" action="/business/baseGoods/importExcel"
            @success="search" />
        </li>
        <el-button type="primary" :loading="isWorking.export" @click="bulkOperation(0)">批量上架</el-button>
        <el-button type="primary" :loading="isWorking.export" @click="bulkOperation(1)">批量下架</el-button>
        <!-- <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:goods:delete']">删除</el-button></li> -->
@@ -77,17 +79,16 @@
            </el-switch>
          </template>
        </el-table-column>
        <el-table-column v-if="containPermissions(['business:goods:update', 'business:goods:delete'])" label="操作"
        <el-table-column v-if="containPermissions(['business:basegoods:update', 'business:basegoods:delete'])" label="操作"
          min-width="120" fixed="right">
          <template slot-scope="{row}">
            <el-button type="text" @click="edit(row.id)" icon="el-icon-edit"
              v-permissions="['business:goods:update']">编辑</el-button>
              v-permissions="['business:basegoods:update']">编辑</el-button>
            <el-button type="text" @click="deleteById(row)" icon="el-icon-delete"
              v-permissions="['business:goods:delete']">删除</el-button>
              v-permissions="['business:basegoods:delete']">删除</el-button>
          </template>
        </el-table-column>
      </el-table>
      <input type="file" ref="upload" style="display: none;" @change="uplaodFile" />
      <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination">
      </pagination>
    </template>
@@ -104,12 +105,13 @@
import Pagination from '@/components/common/Pagination'
import OperaGoodsWindow from '@/components/business/OperaGoodsWindow'
import selectProduct from '@/components/business/selectProduct'
import ImportButton from '@/components/common/ImportButton'
import { brand, baseCategory, importExcel } from '@/api/system/common.js'
import { updateStatus, queryById, exportDoc } from '@/api/business/goods.js'
export default {
  name: 'Goods',
  extends: BaseTable,
  components: { TableLayout, Pagination, OperaGoodsWindow, selectProduct },
  components: { TableLayout, Pagination, OperaGoodsWindow, selectProduct, ImportButton },
  data() {
    return {
      // æœç´¢
@@ -130,6 +132,12 @@
      ]
    }
  },
  provide() {
    return {
      brandList: () => this.brandList,
      categoryList: () => this.categoryList
    }
  },
  created() {
    this.config({
      module: '商品',
@@ -146,7 +154,6 @@
      let arr = e.map(item => item.id)
      this.ids = arr.join(',')
      this.idList = arr;
      console.log(this.ids)
    },
    // æ‰¹é‡ä¸Šä¸‹æž¶
    bulkOperation(type) {
@@ -175,52 +182,10 @@
    rowStyle() {
      return "text-align:center";
    },
    importFile() {
      this.$refs.upload.click()
    },
    uplaodFile(e) {
      const FORMDATE = new FormData()
      FORMDATE.append('file', e.target.files[0])
      // è¯·æ±‚接口
      importExcel(FORMDATE)
        .then(res => {
          console.log(res)
          this.search()
        })
        .catch((err) => {
          this.$message.error(err.message)
        })
      this.$refs.upload.value = null
    },
    edit(id) {
      queryById(id)
        .then(res => {
          let obj = {
            id: res.id,
            name: res.name,
            categoryId: res.categoryId,
            brandId: res.brandId,
            zdPrice: res.zdPrice,
            price: res.price,
            attrFirstIds: res.attrFirstIds ? this.turnNum(res.attrFirstIds.split(',')) : [],
            attrFirstNames: res.attrFirstNames,
            attrSecodIds: res.attrSecodIds ? this.turnNum(res.attrSecodIds.split(',')) : [],
            attrSecodNames: res.attrSecodNames,
            imgurl: res.imgurl,
            multifileList: [],
            files: [],
            ztList: res.imgurl ? [{ url: res.prefixUrl + res.imgurl }] : [],
            pzList: [],
            attrFirstList: [],
            attrSecodList: []
          }
          if (res.multifileList.length > 0) {
            res.multifileList.forEach(item => {
              obj.multifileList.push({ fileurl: item.fileurl, name: item.name, url: res.prefixUrl + item.fileurl })
              obj.files.push({ fileurl: item.fileurl, name: item.name, url: res.prefixUrl + item.fileurl })
            })
          }
          this.$refs.operaGoodsWindow.open('编辑商品', obj)
          this.$refs.operaGoodsWindow.open('编辑商品', res)
        })
    },
    changeStatus(item) {
@@ -232,12 +197,6 @@
      }).finally(() => {
        // this.search()
      })
    },
    turnNum(nums) {
      for (let i = 0; i < nums.length; i++) {
        nums[i] = parseInt(nums[i])
      }
      return nums;
    },
    getbrand() {
      brand({type:1})
platform/vue.config.js
@@ -1,9 +1,8 @@
// è¯¦ç»†é…ç½®è¯·å‚考https://cli.vuejs.org/zh/config/#vue-config-js
// const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length - 1)
// outputDir === '/' ? 'dist' : outputDir
const outputDir = process.env.VUE_APP_CONTEXT_PATH.substring(1, process.env.VUE_APP_CONTEXT_PATH.length)
module.exports = {
  publicPath: process.env.VUE_APP_CONTEXT_PATH,
  outputDir: 'dist',
  publicPath: './',
  outputDir: outputDir || 'web',
  assetsDir: 'static',
  lintOnSave: false,
  devServer: {
server/company/src/main/java/com/doumee/CompanyApplication.java
@@ -6,6 +6,7 @@
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.context.ApplicationContext;
import org.springframework.scheduling.annotation.EnableAsync;
/**
 * å¯åŠ¨ç±»
@@ -15,6 +16,7 @@
@Slf4j
@SpringBootApplication
@MapperScan("com.doumee.dao")
@EnableAsync
public class CompanyApplication {
    public static void main(String[] args) {
        ApplicationContext context = SpringApplication.run(CompanyApplication.class);
server/company/src/main/java/com/doumee/api/business/CategoryController.java
@@ -13,6 +13,7 @@
import com.doumee.dao.business.model.BaseCateParam;
import com.doumee.dao.business.model.BaseCategory;
import com.doumee.dao.business.model.Category;
import com.doumee.service.CateParamSelectService;
import com.doumee.service.business.BaseCateParamService;
import com.doumee.service.business.BaseCategoryService;
import com.doumee.service.business.CategoryService;
@@ -45,6 +46,8 @@
    @Autowired
    private BaseCateParamService baseCateParamService;
    @Autowired
    private CateParamSelectService cateParamSelectService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -97,6 +100,7 @@
    @RequiresPermissions("business:category:update")
    public ApiResponse companyUpdateById(@RequestBody Category category) {
        categoryService.companyUpdateById(category);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success(null);
    }
@@ -156,7 +160,6 @@
        BaseCategory baseCategory = new BaseCategory();
        baseCategory.setIsdeleted(Constants.ZERO);
        baseCategory.setStatus(Constants.ZERO);
        baseCategoryService.findList(baseCategory);
        List list = baseCategoryService.findList(baseCategory);
        return ApiResponse.success(list);
    }
server/company/src/main/java/com/doumee/api/business/GoodsController.java
@@ -10,8 +10,10 @@
import com.doumee.dao.business.model.dto.BatchDisableDTO;
import com.doumee.dao.business.model.dto.GoodCreatePlatRequest;
import com.doumee.dao.business.model.dto.GoodsRequest;
import com.doumee.service.CateParamSelectService;
import com.doumee.service.business.GoodsService;
import io.swagger.annotations.*;
import lombok.extern.java.Log;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.beans.factory.annotation.Autowired;
@@ -36,6 +38,8 @@
    @Autowired
    private GoodsService goodsService;
    @Autowired
    private CateParamSelectService cateParamSelectService;
    @PreventRepeat
    @ApiOperation("新建")
@@ -52,7 +56,9 @@
    @PostMapping("/companyCreate")
//    @RequiresPermissions("business:goods:create")
    public ApiResponse companyCreate(@RequestBody Goods goods) {
        return ApiResponse.success(goodsService.companyCreate(goods));
        goodsService.companyCreate(goods);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success("操作成功");
    }
    @PreventRepeat
@@ -60,7 +66,9 @@
    @PostMapping("/createPlat")
    @RequiresPermissions("business:goods:create")
    public ApiResponse createPlat(@RequestBody GoodCreatePlatRequest param) {
        return ApiResponse.success(goodsService.createPlat(param));
        goodsService.createPlat(param);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success("操作成功");
    }
    @ApiOperation("根据ID删除")
@@ -68,6 +76,7 @@
    @RequiresPermissions("business:goods:delete")
    public ApiResponse deleteById(@PathVariable Integer id) {
        goodsService.deleteById(id);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success(null);
    }
@@ -81,6 +90,7 @@
            idList.add(Integer.valueOf(id));
        }
        goodsService.deleteByIdInBatch(idList);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success(null);
    }
@@ -97,6 +107,7 @@
    @RequiresPermissions("business:goods:update")
    public ApiResponse companyUpdateById(@RequestBody Goods goods) {
        goodsService.companyUpdateById(goods);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success(null);
    }
@@ -130,7 +141,9 @@
    })
//    @RequiresPermissions("business:goods:create")
    public ApiResponse<Integer> importExcel (@ApiParam(value = "file") MultipartFile file) {
        return ApiResponse.success(goodsService.importBatch(file));
        Integer val = goodsService.importBatch(file);
        cateParamSelectService.dealCateParamSelect();
        return ApiResponse.success(val);
    }
server/company/src/main/java/com/doumee/config/shiro/ShiroRealm.java
@@ -4,9 +4,12 @@
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.system.model.SystemPermission;
import com.doumee.dao.system.model.SystemRole;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.service.business.CompanyService;
import com.doumee.service.system.SystemDataPermissionService;
import com.doumee.service.system.SystemPermissionService;
import com.doumee.service.system.SystemRoleService;
@@ -23,6 +26,7 @@
import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
/**
@@ -47,6 +51,10 @@
    @Lazy
    @Autowired
    private SystemPermissionService systemPermissionService;
    @Lazy
    @Autowired
    private CompanyService companyService;
    /**
     * æƒé™å¤„理
@@ -86,6 +94,15 @@
        if(!Constants.equalsInteger(user.getStatus(),Constants.ZERO)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,账号信息已被禁用,如有疑问请联系系统管理员!");
        }
        if(!user.getType().equals(Constants.UserType.SYSTEM)){
            Company company = companyService.findById(user.getCompanyId());
            if(company.getStatus().equals(Constants.ONE)){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,企业信息已被禁用,如有疑问请联系系统管理员!");
            }
            if(DateUtil.compareDate(new Date(),DateUtil.addDaysToDate(company.getOepnValidDate(),1))<=Constants.ZERO){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,企业信息已过期,如有疑问请联系系统管理员!");
            }
        }
        // èŽ·å–ç™»å½•ç”¨æˆ·ä¿¡æ¯
        List<SystemRole> roles = systemRoleService.findByUserId(user.getId());
server/platform/pom.xml
@@ -47,11 +47,6 @@
                    </execution>
                </executions>
            </plugin>
            <!--<plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-war-plugin</artifactId>
            <version>2.6</version>
            </plugin>-->
        </plugins>
    </build>
server/platform/src/main/java/com/doumee/shiro/ShiroSessionDAO.java
@@ -25,7 +25,7 @@
@Component
public class ShiroSessionDAO implements SessionDAO {
    private static final String KEY_PREFIX = "shiro:session:";
    private static final String KEY_PREFIX = "shiro:session:admin:";
    @Autowired
    private ShiroCache shiroCache;
server/platform/src/main/java/com/doumee/task/ScheduleTool.java
@@ -24,7 +24,7 @@
     * å®šæ—¶å¤„理爬虫源数据,生成素材库数据
     * @throws Exception
     */
    @Scheduled(fixedDelay=10*60*1000)
    @Scheduled(fixedDelay=30*60*1000)
    public void dealBaseData() throws Exception {
        baseDataService.dealBaseData();
    }
server/pom.xml
@@ -34,7 +34,6 @@
    <oshi.version>5.7.0</oshi.version>
    <jna.version>5.7.0</jna.version>
    <poi.version>5.0.0</poi.version>
    <maven.build.timestamp.format>yyyy-MM-dd-HH-mm</maven.build.timestamp.format>
  </properties>
  <dependencies>
@@ -202,26 +201,7 @@
      <artifactId>jxl</artifactId>
      <version>2.6.12</version>
    </dependency>
  </dependencies>
  <profiles>
    <profile>
      <id>dev</id>
      <properties>
        <evn>dev</evn>
      </properties>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
    </profile>
    <profile>
      <id>test</id>
      <properties>
        <evn>test</evn>
      </properties>
    </profile>
  </profiles>
  <build>
    <plugins>
      <plugin>
@@ -234,28 +214,4 @@
      </plugin>
    </plugins>
  </build>
  <!--<build>
    <finalName>${project.artifactId}</finalName>
    <resources>
      <resource>
        <directory>service/src/main/resources</directory>
&lt;!&ndash;        <filtering>true</filtering>&ndash;&gt;
      </resource>
    </resources>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <mainClass>com.doumee.Application</mainClass>
        </configuration>
      </plugin>
    </plugins>
  </build>-->
</project>
server/service/src/main/java/com/doumee/biz/system/impl/SystemUserBizImpl.java
@@ -7,11 +7,13 @@
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.model.Company;
import com.doumee.dao.system.dto.*;
import com.doumee.dao.system.model.SystemDepartment;
import com.doumee.dao.system.model.SystemDepartmentUser;
import com.doumee.dao.system.model.SystemUser;
import com.doumee.dao.system.model.SystemUserRole;
import com.doumee.service.business.CompanyService;
import com.doumee.service.system.*;
import org.apache.commons.lang3.RandomStringUtils;
import org.apache.commons.lang3.StringUtils;
@@ -32,6 +34,9 @@
    @Autowired
    private SystemUserService systemUserService;
    @Autowired
    private CompanyService companyService;
    @Autowired
    private SystemUserRoleService systemUserRoleService;
@@ -247,6 +252,16 @@
        if (user != null) {
            throw new BusinessException(ResponseStatus.DATA_EXISTS.getCode(), "用户名已存在");
        }
        if(createCompanyUserDTO.getType().equals(Constants.UserType.ZHUBO.getKey())){
            Company company = companyService.findById(loginUserInfo.getCompanyId());
            SystemUser zbUserNum = new SystemUser();
            zbUserNum.setCompanyId(loginUserInfo.getCompanyId());
            zbUserNum.setDeleted(Boolean.FALSE);
            zbUserNum.setType(Constants.UserType.ZHUBO.getKey());
            if(systemUserService.findList(zbUserNum).size()>=company.getUserNum()){
                throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"对不起,已超出企业可分配主播数量,如有疑问请联系系统管理员!");
            }
        }
        SystemUser systemUser  = new SystemUser();
        BeanUtils.copyProperties(createCompanyUserDTO,systemUser);
        systemUser.setCompanyId(loginUserInfo.getCompanyId());
server/service/src/main/java/com/doumee/core/utils/Constants.java
@@ -29,6 +29,7 @@
    public static final String TOP_IMG = "TOP_IMG";
    public static final String PK_IMG = "PK_IMG";
    public static final String RANGE_SIZE = "RANGE_SIZE";
    public static final String CATE_PARAM_OPEN = "_CATE_PARAM_OPEN";
    public static final String SYSTEM ="SYSTEM";
server/service/src/main/java/com/doumee/dao/business/CateParamSelectMapper.java
@@ -3,10 +3,14 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.CateParamSelect;
import java.util.List;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/09/11 14:45
 */
public interface CateParamSelectMapper extends BaseMapper<CateParamSelect> {
    void insertBatch(Integer companyId,Integer userId);
}
server/service/src/main/java/com/doumee/dao/business/model/BaseData.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -241,4 +242,9 @@
    @ExcelColumn(name="处理状态 0待处理 1已处理")
    private Integer status;
    @ApiModelProperty(value = "流程")
    @TableField(exist = false)
    private String[] bgImgs;
}
server/service/src/main/java/com/doumee/service/CateParamSelectService.java
@@ -1,5 +1,6 @@
package com.doumee.service;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.CateParamSelect;
@@ -95,4 +96,6 @@
     * @return long
     */
    long count(CateParamSelect cateParamSelect);
    void dealCateParamSelect();
}
server/service/src/main/java/com/doumee/service/business/BaseGoodsService.java
@@ -125,6 +125,16 @@
     */
    PageData<BaseGoods> findPage(PageWrap<BaseGoods> pageWrap);
    /**
     * å…¬å¸æŸ¥è¯¢å¹³å°å•†å“
     *
     * @param pageWrap åˆ†é¡µå¯¹è±¡
     * @return PageData<BaseGoods>
     */
    PageData<BaseGoods> findCompanyPage(PageWrap<BaseGoods> pageWrap,Integer companyId);
    /**
     * æ¡ä»¶ç»Ÿè®¡
     *
server/service/src/main/java/com/doumee/service/business/impl/BaseCategoryServiceImpl.java
@@ -257,8 +257,9 @@
    @Override
    public List<BaseCategory> findList(BaseCategory baseCategory) {
        baseCategory.setIsdeleted(Constants.ZERO);
        QueryWrapper<BaseCategory> wrapper = new QueryWrapper<>(baseCategory);
        wrapper.eq("ISDELETED",Constants.ZERO);
        wrapper.eq("STATUS",Constants.ZERO);
        List<BaseCategory> list = baseCategoryMapper.selectList(wrapper);
        list.forEach(i->{
            if(StringUtils.isNotBlank(i.getImgurl())){
server/service/src/main/java/com/doumee/service/business/impl/BaseDataServiceImpl.java
@@ -20,7 +20,9 @@
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
@@ -290,7 +292,19 @@
                queryWrapper.orderByAsc(sortData.getProperty());
            }
        }
        return PageData.from(baseDataMapper.selectPage(page, queryWrapper));
        IPage<BaseData> result =baseDataMapper.selectPage(page, queryWrapper);
        if(result!=null && result.getRecords()!=null){
            for(BaseData data :result.getRecords()){
                //多图,英文逗号隔开
                if(StringUtils.isNotBlank(data.getBgImg())){
                    String tImg =  data.getBgImg().replace(",", ",").replace(".avif", "");
                    String[] imgs =tImg.split(",");
                    data.setBgImgs(imgs);
                }
            }
        }
        return PageData.from(result);
    }
    @Override
@@ -300,7 +314,7 @@
    }
    public static   boolean IS_RUNNING = false;
    @Override
    @Transactional
    @Async
    public   void dealBaseData() {
        if(IS_RUNNING){
            return;
@@ -336,18 +350,25 @@
            OssModel ossModel = initOssModel();
            Date date = new Date();
            for(BaseData data : allLis){
              dealPerData(ossModel,rate,date,data,cateList,brandList,paramList);
            }
            log.info("开始处理源数据=================success================处理数据共("+allLis.size()+")个===");
        }catch (Exception e){
            e.printStackTrace();
            log.info("开始处理源数据=================error==================="+e.getMessage());
        }finally {
            IS_RUNNING = false;
            log.info("开始处理源数据=================end===================");
        }
    }
    @Transactional(isolation = Isolation.READ_UNCOMMITTED)
    private void dealPerData(OssModel ossModel, BigDecimal rate, Date date, BaseData data, List<BaseCategory> cateList, List<Brand> brandList, List<BaseCateParam> paramList) {
                BaseGoods goods = new BaseGoods();
                goods.setBaseDataId(data.getId());
                goods.setIsdeleted(Constants.ZERO);
                if(baseGoodsMapper.selectCount(new QueryWrapper<>(goods)) >0){
                    //如果已经存在,逻辑删除旧的商品数据
                    UpdateWrapper<BaseGoods> updateModel = new UpdateWrapper<>();
                    updateModel.lambda().set(BaseGoods::getIsdeleted,Constants.ONE);
                    updateModel.lambda().set(BaseGoods::getEditDate, new Date());
                    updateModel.lambda().eq(BaseGoods::getBaseDataId, data.getId());
                    baseGoodsMapper.update(null, updateModel);
                }
                goods.setCreateDate(date);
        //查询是否存在商品
        BaseGoods model = baseGoodsMapper.selectOne(new QueryWrapper<>(goods).last(" limit 1"));
                goods.setName(StringUtils.defaultString(data.getName(),data.getTitle()));
                goods.setRemark(data.getTitle());
                goods.setContent(data.getTitle());
@@ -367,8 +388,34 @@
                }
                goods.setImgurl(getOssImgurl(ossModel,ossModel.getGoodsFolder(), data.getImgurl()));
                goods.setPrice(Constants.formatBigdecimal(data.getSaleprice()).multiply(Constants.formatBigdecimal(cModel.getPriceRate())));
         if(model!=null){
            //如果已经存在,逻辑删除旧的商品数据
//            UpdateWrapper<BaseGoods> updateModel = new UpdateWrapper<>();
//            updateModel.lambda().set(BaseGoods::getIsdeleted,Constants.ONE);
//            updateModel.lambda().set(BaseGoods::getEditDate, new Date());
//            updateModel.lambda().eq(BaseGoods::getBaseDataId, data.getId());
//            baseGoodsMapper.update(null, updateModel);
             goods.setEditDate(date);
             goods.setId(model.getId());
             baseGoodsMapper.updateById(goods);
             //删除原有附件大图
             UpdateWrapper<Multifile> updateModel = new UpdateWrapper<>();
             updateModel.lambda().set(Multifile::getIsdeleted,Constants.ONE);
             updateModel.lambda().set(Multifile::getEditDate, new Date());
             updateModel.lambda().eq(Multifile::getObjId, goods.getId());
             updateModel.lambda().eq(Multifile::getObjType, Constants.ZERO);
             multifileMapper.delete(updateModel);
             //删除原有商品属性
             UpdateWrapper<BaseGoodsParam> bgModel = new UpdateWrapper<>();
             bgModel.lambda().set(BaseGoodsParam::getIsdeleted,Constants.ONE);
             bgModel.lambda().set(BaseGoodsParam::getEditDate, new Date());
             bgModel.lambda().eq(BaseGoodsParam::getGoodsId, goods.getId());
             baseGoodsParamMapper.delete(bgModel);
        }else{
                //插入新商品数据
            goods.setCreateDate(date);
                baseGoodsMapper.insert(goods);
        }
                //处理分类属性
                dealCateParamAll(cModel.getId(),goods.getId(),data,paramList);
                //处理背景图
@@ -379,22 +426,13 @@
                //更新数据处理状态
                baseDataMapper.updateById(data);
            }
            log.info("开始处理源数据=================success================处理数据共("+allLis.size()+")个===");
        }catch (Exception e){
            e.printStackTrace();
            log.info("开始处理源数据=================error==================="+e.getMessage());
        }finally {
            IS_RUNNING = false;
            log.info("开始处理源数据=================end===================");
        }
    }
    private void dealBgImgAll(OssModel ossModel, Integer id, BaseData data) {
        int i =0;
        //多图,英文逗号隔开
        if(StringUtils.isNotBlank(data.getBgImg())){
           String tImg =  data.getBgImg().replace(",", ",");
           String tImg =  data.getBgImg().replace(",", ",").replace(".avif", "");
            String[] imgs =tImg.split(",");
            for (int j = 0; j < imgs.length; j++) {
                if(StringUtils.isNotBlank(imgs[j])){
server/service/src/main/java/com/doumee/service/business/impl/BaseGoodsServiceImpl.java
@@ -94,7 +94,8 @@
        insert.setIsdeleted(Constants.ZERO);
        insert.setRemark(baseGoods.getRemark());
        insert.setName(baseGoods.getName());
        insert.setStatus(Constants.ZERO);
        //默认下架
        insert.setStatus(Constants.ONE);
        insert.setSortnum(integer+Constants.ONE);
        insert.setImgurl(baseGoods.getImgurl());
        insert.setCategoryId(baseGoods.getCategoryId());
@@ -370,6 +371,51 @@
        return pageData;
    }
    @Override
    public PageData<BaseGoods> findCompanyPage(PageWrap<BaseGoods> pageWrap ,Integer companyId) {
        //查询企业已经存在的商品
        List<Integer> collect = new ArrayList<>();
        if(Objects.nonNull(companyId)){
            QueryWrapper<Goods> goodsQuery = new QueryWrapper<>();
            goodsQuery.lambda().eq(Goods::getIsdeleted,Constants.ZERO)
                    .eq(Goods::getCompanyId,companyId)
                    .isNotNull(Goods::getGoodsId);
            List<Goods> goods = goodsMapper.selectList(goodsQuery);
            if (CollectionUtils.isEmpty(goods)){
                 collect = goods.stream().map(s -> s.getGoodsId()).collect(Collectors.toList());
            }
        }
        pageWrap.getModel().setIsdeleted(Constants.ZERO);
        IPage<BaseGoods> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
        MPJLambdaWrapper<BaseGoods> queryWrapper = new MPJLambdaWrapper<>();
        Utils.MP.blankToNull(pageWrap.getModel());
        queryWrapper.leftJoin(Brand.class,Brand::getId,BaseGoods::getBrandId)
                .leftJoin(BaseCategory.class,BaseCategory::getId,BaseGoods::getCategoryId)
                .selectAll(BaseGoods.class)
                .selectAs(Brand::getName,BaseGoods::getBrandName)
                .selectAs(BaseCategory::getName,BaseGoods::getCategoryName)
                .eq(BaseGoods::getStatus, Constants.ZERO)
                .eq(BaseGoods::getIsdeleted, Constants.ZERO)
                .like(StringUtils.isNotBlank(pageWrap.getModel().getName()), BaseGoods::getName,pageWrap.getModel().getName())
                .like(pageWrap.getModel().getId()!=null,BaseGoods::getId, pageWrap.getModel().getId())
                .eq(pageWrap.getModel().getCategoryId()!=null,BaseGoods::getCategoryId, pageWrap.getModel().getCategoryId())
                .eq(pageWrap.getModel().getBrandId()!=null,BaseGoods::getBrandId, pageWrap.getModel().getBrandId())
                .eq(pageWrap.getModel().getStatus()!=null,BaseGoods::getStatus, pageWrap.getModel().getStatus())
                .notIn(!CollectionUtils.isEmpty(collect),BaseGoods::getId, collect);
        queryWrapper.orderByDesc(Goods::getId);
        PageData<BaseGoods> pageData =PageData.from(baseGoodsJoinMapper.selectJoinPage(page,BaseGoods.class,queryWrapper));
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        pageData.getRecords().forEach(i->{
            i.setFullImgUrl(prefixUrl + i.getImgurl());
        });
        return pageData;
    }
    @Override
    public long count(BaseGoods baseGoods) {
        QueryWrapper<BaseGoods> wrapper = new QueryWrapper<>(baseGoods);
server/service/src/main/java/com/doumee/service/business/impl/BrandServiceImpl.java
@@ -159,7 +159,7 @@
            wrapper.lambda().eq(Brand::getType,Constants.ONE);
        }else {
            wrapper.lambda().and(i->i.eq(Brand::getCompanyId,user.getCompanyId())
                            .or().eq(Brand::getType,Constants.ZERO)
                            .or().eq(Brand::getType,Constants.ONE)
            );
        }
        List<Brand> list = brandMapper.selectList(wrapper);
@@ -186,6 +186,9 @@
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(Brand::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(Brand::getType, pageWrap.getModel().getType());
        }
        // ç±»åž‹ 0企业 1平台
        if (Objects.isNull(user.getCompanyId())) {
            queryWrapper.lambda().eq(Brand::getType,Constants.ONE);
server/service/src/main/java/com/doumee/service/business/impl/CategoryServiceImpl.java
@@ -279,7 +279,8 @@
    @Override
    public void companyUpdateById(Category category) {
        LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        if(categoryMapper.selectCount(new QueryWrapper<Category>().eq("ISDELETED",Constants.ZERO).ne("id",category.getId()).eq("name",category.getName()))>0){
        if(categoryMapper.selectCount(new QueryWrapper<Category>().eq("ISDELETED",Constants.ZERO).eq("COMPANY_ID",user.getCompanyId())
                .ne("id",category.getId()).eq("name",category.getName()))>0){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"【"+category.getName()+"】已存在");
        };
        category.setStatus(Constants.ZERO);
@@ -489,9 +490,11 @@
    @Override
    public List<Category> findListForGoods(Integer goodsId) {
        LoginUserInfo loginUserInfo = (LoginUserInfo)SecurityUtils.getSubject().getPrincipal();
        QueryWrapper<Category> wrapper = new QueryWrapper<Category>()
                .eq("STATUS",Constants.ZERO)
                .eq("ISDELETED",Constants.ZERO)
                .eq("COMPANY_ID",loginUserInfo.getCompanyId())
                .orderByAsc(" SORTNUM ");
        List<Category> list = categoryMapper.selectList(wrapper);
        String prefixUrl = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode()
@@ -521,6 +524,9 @@
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.lambda().eq(Category::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.lambda().eq(Category::getType, pageWrap.getModel().getType());
        }
        if (pageWrap.getModel().getCompanyId() != null) {
            queryWrapper.lambda().eq(Category::getCompanyId, pageWrap.getModel().getCompanyId());
        }
server/service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -223,19 +223,19 @@
                goodsParamMapper.insert(goodsParam);
                //存储 cate_param_select æŸ¥è¯¢æ˜¯å¦å·²å­˜åœ¨
                if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
                        .eq("PARAM_ID",goodsParam.getPramaId()).eq("NAME",goodsParam.getName()))<=Constants.ZERO){
                    CateParamSelect cateParamSelect = new CateParamSelect();
                    cateParamSelect.setCreator(user.getId());
                    cateParamSelect.setCreateDate(new Date());
                    cateParamSelect.setName(goodsParam.getVal());
                    cateParamSelect.setIsdeleted(Constants.ZERO);
                    cateParamSelect.setStatus(Constants.ZERO);
                    cateParamSelect.setParamId(goodsParam.getPramaId());
                    cateParamSelect.setCategoryId(goods.getCategoryId());
                    cateParamSelect.setStatus(Constants.ZERO);
                    cateParamSelectMapper.insert(cateParamSelect);
                };
//                if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
//                        .eq("PARAM_ID",goodsParam.getPramaId()).eq("NAME",goodsParam.getName()))<=Constants.ZERO){
//                    CateParamSelect cateParamSelect = new CateParamSelect();
//                    cateParamSelect.setCreator(user.getId());
//                    cateParamSelect.setCreateDate(new Date());
//                    cateParamSelect.setName(goodsParam.getVal());
//                    cateParamSelect.setIsdeleted(Constants.ZERO);
//                    cateParamSelect.setStatus(Constants.ZERO);
//                    cateParamSelect.setParamId(goodsParam.getPramaId());
//                    cateParamSelect.setCategoryId(goods.getCategoryId());
//                    cateParamSelect.setStatus(Constants.ZERO);
//                    cateParamSelectMapper.insert(cateParamSelect);
//                };
            }
        }
@@ -360,19 +360,19 @@
                goodsParam.setGoodsId(goods.getId());
                goodsParamMapper.insert(goodsParam);
                //存储 cate_param_select æŸ¥è¯¢æ˜¯å¦å·²å­˜åœ¨
                if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
                        .eq("PARAM_ID",goodsParam.getPramaId()).eq("NAME",goodsParam.getName()))<=Constants.ZERO){
                    CateParamSelect cateParamSelect = new CateParamSelect();
                    cateParamSelect.setCreator(user.getId());
                    cateParamSelect.setCreateDate(new Date());
                    cateParamSelect.setName(goodsParam.getVal());
                    cateParamSelect.setIsdeleted(Constants.ZERO);
                    cateParamSelect.setStatus(Constants.ZERO);
                    cateParamSelect.setParamId(goodsParam.getPramaId());
                    cateParamSelect.setCategoryId(goods.getCategoryId());
                    cateParamSelect.setStatus(Constants.ZERO);
                    cateParamSelectMapper.insert(cateParamSelect);
                };
//                if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
//                        .eq("PARAM_ID",goodsParam.getPramaId()).eq("NAME",goodsParam.getName()))<=Constants.ZERO){
//                    CateParamSelect cateParamSelect = new CateParamSelect();
//                    cateParamSelect.setCreator(user.getId());
//                    cateParamSelect.setCreateDate(new Date());
//                    cateParamSelect.setName(goodsParam.getVal());
//                    cateParamSelect.setIsdeleted(Constants.ZERO);
//                    cateParamSelect.setStatus(Constants.ZERO);
//                    cateParamSelect.setParamId(goodsParam.getPramaId());
//                    cateParamSelect.setCategoryId(goods.getCategoryId());
//                    cateParamSelect.setStatus(Constants.ZERO);
//                    cateParamSelectMapper.insert(cateParamSelect);
//                };
            }
        }
        return goods.getId();
@@ -469,7 +469,8 @@
        goods.setShortPinyin(PinYinUtil.getFirstSpell(goods.getName()));
        goodsMapper.updateById(goods);
        multifileMapper.delete(new QueryWrapper<Multifile>().eq("OBJ_ID",goods.getId()));
        multifileMapper.delete(new QueryWrapper<Multifile>().eq("OBJ_ID",goods.getId())
                .eq("OBJ_TYPE",0).eq("COMPANY_ID",user.getCompanyId()));
        List<Multifile> multifileList = goods.getMultifileList();
        if(!Objects.isNull(multifileList)&&multifileList.size()>Constants.ZERO){
            for (int i = 0; i < multifileList.size(); i++) {
@@ -497,19 +498,19 @@
                goodsParam.setGoodsId(goods.getId());
                goodsParamMapper.insert(goodsParam);
                //存储 cate_param_select æŸ¥è¯¢æ˜¯å¦å·²å­˜åœ¨
                if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
                        .eq("PARAM_ID",goodsParam.getPramaId()).eq("NAME",goodsParam.getName()))<=Constants.ZERO){
                    CateParamSelect cateParamSelect = new CateParamSelect();
                    cateParamSelect.setCreator(user.getId());
                    cateParamSelect.setCreateDate(new Date());
                    cateParamSelect.setName(goodsParam.getVal());
                    cateParamSelect.setIsdeleted(Constants.ZERO);
                    cateParamSelect.setStatus(Constants.ZERO);
                    cateParamSelect.setParamId(goodsParam.getPramaId());
                    cateParamSelect.setCategoryId(goods.getCategoryId());
                    cateParamSelect.setStatus(Constants.ZERO);
                    cateParamSelectMapper.insert(cateParamSelect);
                };
//                if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
//                        .eq("PARAM_ID",goodsParam.getPramaId()).eq("NAME",goodsParam.getName()))<=Constants.ZERO){
//                    CateParamSelect cateParamSelect = new CateParamSelect();
//                    cateParamSelect.setCreator(user.getId());
//                    cateParamSelect.setCreateDate(new Date());
//                    cateParamSelect.setName(goodsParam.getVal());
//                    cateParamSelect.setIsdeleted(Constants.ZERO);
//                    cateParamSelect.setStatus(Constants.ZERO);
//                    cateParamSelect.setParamId(goodsParam.getPramaId());
//                    cateParamSelect.setCategoryId(goods.getCategoryId());
//                    cateParamSelect.setStatus(Constants.ZERO);
//                    cateParamSelectMapper.insert(cateParamSelect);
//                };
            }
        }
    }
@@ -677,7 +678,9 @@
        if (pageWrap.getModel().getStatus() != null) {
            queryWrapper.eq(Goods::getStatus, pageWrap.getModel().getStatus());
        }
        if (pageWrap.getModel().getType() != null) {
            queryWrapper.eq(Goods::getType, pageWrap.getModel().getType());
        }
        if (pageWrap.getModel().getCategoryId() != null) {
            queryWrapper.eq(Goods::getCategoryId, pageWrap.getModel().getCategoryId());
        }
@@ -693,10 +696,6 @@
                + systemDictDataBiz.queryByCode(Constants.OSS, Constants.GOODS_IMG).getCode();
        goodsIPage.getRecords().forEach(i->{
            i.setPrefixUrl(prefixUrl);
            if(i.getType().equals(Constants.ONE)){
                i.setBasePrice(i.getBasePrice().multiply(i.getBasePriceRate()));
            }
        });
        return PageData.from(goodsIPage);
    }
@@ -875,19 +874,19 @@
                    //插入产品参数关联表
                    goodsParamMapper.insert(gp);
                    //存储 cate_param_select æŸ¥è¯¢æ˜¯å¦å·²å­˜åœ¨
                    if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
                            .eq("PARAM_ID",gp.getPramaId()).eq("NAME",gp.getName()))<=Constants.ZERO){
                        CateParamSelect cateParamSelect = new CateParamSelect();
                        cateParamSelect.setCreator(user.getId());
                        cateParamSelect.setCreateDate(new Date());
                        cateParamSelect.setName(gp.getVal());
                        cateParamSelect.setIsdeleted(Constants.ZERO);
                        cateParamSelect.setStatus(Constants.ZERO);
                        cateParamSelect.setParamId(gp.getPramaId());
                        cateParamSelect.setCategoryId(newModel.getCategoryId());
                        cateParamSelect.setStatus(Constants.ZERO);
                        cateParamSelectMapper.insert(cateParamSelect);
                    };
//                    if(cateParamSelectMapper.selectCount(new QueryWrapper<CateParamSelect>()
//                            .eq("PARAM_ID",gp.getPramaId()).eq("NAME",gp.getName()))<=Constants.ZERO){
//                        CateParamSelect cateParamSelect = new CateParamSelect();
//                        cateParamSelect.setCreator(user.getId());
//                        cateParamSelect.setCreateDate(new Date());
//                        cateParamSelect.setName(gp.getVal());
//                        cateParamSelect.setIsdeleted(Constants.ZERO);
//                        cateParamSelect.setStatus(Constants.ZERO);
//                        cateParamSelect.setParamId(gp.getPramaId());
//                        cateParamSelect.setCategoryId(newModel.getCategoryId());
//                        cateParamSelect.setStatus(Constants.ZERO);
//                        cateParamSelectMapper.insert(cateParamSelect);
//                    };
                }
            }
            if(mulFiles !=null && mulFiles.size()>0){
server/service/src/main/java/com/doumee/service/impl/CateParamSelectServiceImpl.java
@@ -4,13 +4,18 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.CateParamSelectMapper;
import com.doumee.dao.business.model.CateParamSelect;
import com.doumee.service.CateParamSelectService;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
@@ -23,6 +28,9 @@
 */
@Service
public class CateParamSelectServiceImpl implements CateParamSelectService {
    @Autowired
    private RedisTemplate redisTemplate;
    @Autowired
    private CateParamSelectMapper cateParamSelectMapper;
@@ -142,4 +150,25 @@
        QueryWrapper<CateParamSelect> wrapper = new QueryWrapper<>(cateParamSelect);
        return cateParamSelectMapper.selectCount(wrapper);
    }
    @Override
    @Async
    public   void dealCateParamSelect() {
        LoginUserInfo loginUserInfo = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal();
        Boolean  isGrouping = (Boolean)redisTemplate.opsForValue().get(loginUserInfo.getCompanyId()+Constants.CATE_PARAM_OPEN);
        if(isGrouping!=null && isGrouping ){
            return;
        }
        redisTemplate.opsForValue().set(loginUserInfo.getCompanyId()+Constants.CATE_PARAM_OPEN,true);
        try {
            //删除企业下历史数据
            cateParamSelectMapper.delete(new QueryWrapper<CateParamSelect>().exists(" select 1 from category c where c.id = cate_param_select.category_id and  c.company_id = "+loginUserInfo.getCompanyId()+"   "));
            //新增当前企业可以使用的数据
            cateParamSelectMapper.insertBatch(loginUserInfo.getCompanyId(),loginUserInfo.getId());
        }catch (Exception e){
        }finally {
            redisTemplate.opsForValue().set(loginUserInfo.getCompanyId()+Constants.CATE_PARAM_OPEN,false);
        }
    }
}
server/service/src/main/java/com/doumee/service/system/impl/SystemLoginServiceImpl.java
@@ -1,5 +1,6 @@
package com.doumee.service.system.impl;
import com.baomidou.mybatisplus.extension.api.R;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
@@ -21,6 +22,7 @@
import javax.servlet.http.HttpServletRequest;
import java.util.Date;
import java.util.Objects;
@Slf4j
@Service
@@ -77,7 +79,7 @@
            loginLog.setReason(e.getMessage().length() > 200 ? (e.getMessage().substring(0, 190) + "...") : e.getMessage());
            loginLog.setSuccess(Boolean.FALSE);
            systemLoginLogService.create(loginLog);
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT.getCode(), Objects.isNull(e.getCause())?ResponseStatus.ACCOUNT_INCORRECT.getMessage():e.getCause().getMessage());
        }
    }
}
server/service/src/main/resources/mappers/CateParamSelectMapper.xml
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,19 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.doumee.dao.business.CateParamSelectMapper">
    <insert id="insertBatch"  >
        INSERT INTO `cate_param_select`
            (`CREATOR`, `CREATE_DATE`, `EDITOR`, `EDIT_DATE`, `ISDELETED`, `REMARK`, `NAME`, `PARAM_ID`, `CATEGORY_ID`,
             `STATUS`, `SORTNUM`)
            select #{userId} , now(),null , null , 0 , null , a.VAL , a.PRAMA_ID , b.CATEGORY_ID , 0 , null  from goods_param a  inner join goods  b on a.GOODS_ID = b.ID
                and a.PRAMA_ID is not null AND a.VAL is not null
                and a.ISDELETED = 0
                and a.`STATUS` = 0
                and b.`STATUS` = 0
                and b.ISDELETED = 0
                AND b.company_id = #{companyId}
    </insert>
</mapper>