提交 df37cab7 编写于 作者: shuang.zhou's avatar shuang.zhou

Merge branch 'teasing/3.21.0' into 'release'

Teasing/3.21.0

See merge request com.pica.cloud.education.frontend/pica.cloud.web-education-admin!353
......@@ -11,9 +11,9 @@
</el-col>
</el-row>
<el-form
ref="formData"
:model="formData"
:rules="rules"
ref="formData3"
:model="formData3"
:rules="rules3"
label-width="150px"
label-suffix=":"
class="basic-form"
......@@ -25,7 +25,7 @@
<el-col :span="13">
<el-input
size="small"
v-model="formData.goodsName"
v-model="formData3.goodsName"
placeholder="请输入商品名称"
show-word-limit
maxlength="60"
......@@ -40,11 +40,12 @@
type="textarea"
rows="4"
size="small"
v-model="formData.goodsDescription"
v-model="formData3.goodsDescription"
placeholder="请输入商品介绍"
maxlength="1000"
maxlength="40"
show-word-limit
></el-input>
<span class="word-tip">此文案可摘取药品说明书【功能主治】or【适应症】</span>
<!-- <span class="word-num">{{(formData.goodsDescription).replace(/\s+/g,"").length}}/1000</span> -->
</el-col>
</el-form-item>
......@@ -56,6 +57,9 @@
:show-file-list="isShowFileList"
action="#"
:before-upload="beforeUploadPic"
multiple
:on-exceed="imgExceed"
:limit="6"
>
<div class="file-pics" v-if="fileGoodsList.length > 0" :key="index" v-for="(item,index) in fileGoodsList">
<img :src="item.url" @mouseover.stop="headIndex=index" class="bg-img"/>
......@@ -68,8 +72,8 @@
<i class="el-icon-delete"></i>
</div>
</div>
<img class="bg-img" src="../../assets/image/small.png" v-if="fileGoodsList.length <10"/>
<div class="limit-text">
<img class="bg-img" src="../../assets/image/small.png" v-if="fileGoodsList.length < 6"/>
<div class="limit-text" v-if="fileGoodsList.length < 6">
<!-- <p>限制大小: 200kb</p> -->
<p>建议尺寸:750*420</p>
<p>支持jpeg, png格式</p>
......@@ -78,13 +82,44 @@
<p class="upload-message" v-if="!isgoodsImages">请上传商品头图</p>
<!-- <p class="upload-message" v-if="uploadImgMessage1">请上传商品头图</p> -->
</el-form-item>
<el-form-item label="商品介绍视频" class="label-video">
<el-upload
accept=".mp4"
:on-remove="handleRemoveVideo"
:file-list="videoList"
:before-upload="beforeVideoUpload"
:show-file-list="false"
:disabled="videoList.length == 1"
:limit="1"
action="#"
class="bg-uploader"
>
<video id="introVideoLecture" :src="videoModel.videoFullPath" controls preload style="width: 100%;" v-if="videoList.length == 1">
视频
</video>
<img class="bg-img" src="../../assets/image/video.png" v-if="videoList.length <1"/>
<div class="limit-text" v-if="videoList.length <1">
<p>建议大小:20M以内</p>
<p>仅支持MP4格式</p>
<P>建议视频文件名格式:举例(GXY_001_02_03.mp4)</P>
</div>
</el-upload>
<el-progress :text-inside="true" :stroke-width="16" :percentage="uploadProgress" status="success" class="video-progress"
v-show="uploadProgress>0&&uploadProgress<100">
</el-progress>
<el-button class="dl-video" icon="el-icon-delete" circle @click="deleteVideo" v-if="videoList.length == 1"></el-button>
</el-form-item>
<el-form-item label="商品类型" prop="goodsType">
<el-select
v-model="formData.goodsType"
v-model="formData3.goodsType"
placeholder="请选择商品类型"
size="small"
:disabled="isEdit"
@change="getGoodsTypes(formData.goodsType,2)">
@change="getGoodsTypes(formData3.goodsType,2)">
<el-option
v-for="(item,index) in oneLever"
:key="item.categoryName+'-'+index"
......@@ -94,7 +129,7 @@
</el-select>
</el-form-item>
<el-form-item label="是否支持售后" prop="expressLimitFlag" v-if="storeType < 3">
<el-radio-group v-model="formData.expressLimitFlag" :disabled="!hasRepoFlag">
<el-radio-group v-model="formData3.expressLimitFlag" :disabled="!hasRepoFlag">
<el-radio :label="1"></el-radio>
<el-radio :label="0"></el-radio>
</el-radio-group>
......@@ -118,7 +153,7 @@
<el-form-item label="条形码" prop="barCode">
<el-col :span="18">
<el-input
:disabled="barAndGoodsFlag"
:disabled="barAndGoodsFlag || idMedicEdit"
size="small"
v-model="formData1.barCode"
placeholder="请输入条形码"
......@@ -133,6 +168,7 @@
<el-input
size="small"
v-model="formData1.approvalNumber"
:disabled="idMedicEdit"
placeholder="请输入批准文号"
style="width:50%;"
></el-input>
......@@ -142,7 +178,7 @@
<el-form-item label="通用名称" prop="medicCommonName">
<el-col :span="13">
<el-input
:disabled="goodDisabled || barAndGoodsFlag"
:disabled="goodDisabled || barAndGoodsFlag || idMedicEdit"
size="small"
v-model="formData1.medicCommonName"
placeholder="请输入通用名称"
......@@ -160,7 +196,7 @@
size="small"
v-model="formData1.medicGoodsName"
placeholder="请输入商品名称"
:disabled="idMedicEdit"
maxlength="60"
show-word-limit
></el-input>
......@@ -174,6 +210,7 @@
size="small"
v-model="formData1.size"
placeholder="请输入规格"
:disabled="idMedicEdit"
style="width:70%;"
></el-input>
......@@ -183,8 +220,8 @@
<div class="inline">
<el-form-item label="是否是处方药" prop="otc1">
<el-col :span="24">
<el-radio size="mini" v-model="formData1.otc1" label="1">处方药</el-radio>
<el-radio v-model="formData1.otc1" label="0">非处方药</el-radio>
<el-radio size="mini" v-model="formData1.otc1" label="1" :disabled="idMedicEdit">处方药</el-radio>
<el-radio v-model="formData1.otc1" label="0" :disabled="idMedicEdit">非处方药</el-radio>
</el-col>
</el-form-item>
<el-form-item label="剂型" prop="dosageId">
......@@ -192,6 +229,7 @@
v-model="formData1.dosageId"
placeholder="请选择药品剂型"
size="small"
:disabled="idMedicEdit"
clearable>
<el-option
v-for="(item,index) in doseAll"
......@@ -209,6 +247,7 @@
v-model="formData1.usage"
placeholder="请输入用法用量"
style="width:70%;"
:disabled="idMedicEdit"
></el-input>
<span class="word-num">例如:每次一袋 每天1-2次</span>
......@@ -284,6 +323,7 @@
v-model="formData1.manufacturer"
placeholder="请输入生产厂家"
style="width:70%;"
:disabled="idMedicEdit"
></el-input>
<span class="word-num"></span>
......@@ -295,6 +335,7 @@
size="small"
v-model="formData1.department"
placeholder="请输入适用科室"
:disabled="idMedicEdit"
></el-input>
<!-- <el-select
......@@ -317,6 +358,7 @@
size="small"
v-model="formData1.treatDisease"
placeholder="请输入治疗疾病"
:disabled="idMedicEdit"
></el-input>
......@@ -332,6 +374,7 @@
v-model="formData1.expiredTime"
placeholder="请输入有效期"
style="width:70%;"
:disabled="idMedicEdit"
></el-input>
<!-- <el-date-picker
v-model="formData.expiredTime"
......@@ -352,6 +395,7 @@
v-model="formData1.modelNo"
placeholder="请输入型号"
style="width:70%;"
:disabled="idMedicEdit"
></el-input>
<span class="word-num"></span>
</el-col>
......@@ -363,6 +407,7 @@
v-model="formData1.standardNo"
placeholder="请输入执行标准号"
style="width:70%;"
:disabled="idMedicEdit"
></el-input>
<span class="word-num"></span>
</el-col>
......@@ -867,12 +912,13 @@
import BreadCrumb from "@/components/breadcrumb.vue";
let vm = null;
import { openLoading, closeLoading } from "../../utils/utils";
import { doUpload, getFilePath } from "../../utils/qiniu-util";
import { isEmptyUtils } from "@/utils/index";
import { doUpload, getFilePath, createFilePath } from "../../utils/qiniu-util";
import { updateGoods ,updateStock,dosageAll,getDeparts,getGoodsList, getGoodDetails, updateGoodsV2, getHospitalInfoByStoreId, getCheckPackageIdList, getTypeCodeList } from '@/utils/goods';
import { getStoreAdressRepot } from "@/utils/shop";
import Cropper from '@/components/common/cropper.vue'
import { originRules1, originRules2, originRules } from './rules';
import { originForm1, originForm2, originForm } from './forms';
import { originRules1, originRules2, originRules, originRules3 } from './rules';
import { originForm1, originForm2, originForm, originForm3 } from './forms';
export default {
components: {
......@@ -964,6 +1010,7 @@
formData: JSON.parse(JSON.stringify(originForm)), // 通用信息
formData1: JSON.parse(JSON.stringify(originForm1)), // 基本信息
formData2: JSON.parse(JSON.stringify(originForm2)),
formData3: JSON.parse(JSON.stringify(originForm3)),
buyLimitDtoList:[],
rules: {},
rules1: {},
......@@ -1003,7 +1050,18 @@
title:"限购条件"
},
storeType: 1, //1: "供货商",2: "小药房",3: "医生小店"
hasRepoFlag: 0 //店铺是否有退货地址
hasRepoFlag: 0, //店铺是否有退货地址
videoList: [],//视频上传文件列表
videoModel:{
videoFullPath: ''
},
sumFile: 0,
uploadProgress:0, // 上传视频进度条
}
},
computed: {
idMedicEdit() {
return this.isEdit && !this.isCheckServe;;
}
},
created() {
......@@ -1020,6 +1078,7 @@
this.rules = originRules;
this.rules1 = originRules1;
this.rules2 = originRules2;
this.rules3 = originRules3
// this.rules2.barCode = originRules.barCode;
this.jumPathThird = '/goods-manage?storeId=' + storeId +'&commissionFlag=' + this.commissionFlag +'&storeType=' + this.storeType;
......@@ -1101,6 +1160,7 @@
this.formData = {...this.formData, ...goodsInfo};
this.formData2 = medicalService;
this.formData = { ...this.formData, ...this.formData2 };
this.formData3 = { ...goodsInfo};
this.buyLimitDtoList = buyLimitDtoList;
this.hasRepoFlag = hasRepoFlag;
this.$set(this.formData2, 'suitableArr', this.formData.suitable.split(','));
......@@ -1109,6 +1169,10 @@
this.formData.stock = this.formData.goodsStock;
this.fileGoodsList = this.getImges(goodsInfo.goodsHeaderImages,1);
this.goodsCheckList = this.getImges(medicalService.goodsCheckImages, goodsType);
if (goodsInfo.goodsVideoList.length > 0) {
this.videoList.push(goodsInfo.goodsVideoList[0]);
this.videoModel.videoFullPath = this.videoList[0].goodsImgUrl;
}
this.rules = {
...this.rules,
......@@ -1140,6 +1204,7 @@
const {goodsList, hasRepoFlag } = res.data;
this.formData1 = goodsList[0];
this.formData = goodsList[0];
this.formData3 = goodsList[0];
this.hasRepoFlag = hasRepoFlag;
this.buyLimitDtoList = this.formData.buyLimitDtoList;
this.formData.optPrice = this.formData.costPrice/100;
......@@ -1147,6 +1212,11 @@
this.fileIntrList = this.getImges(goodsList[0].medicImgList,2);
this.formData.stock = this.formData.goodsStock;
this.formData.otc1 = this.formData.otc ? '1' : '0';
if (goodsList[0].goodsVideoList.length > 0) {
this.videoList.push(goodsList[0].goodsVideoList[0]);
this.videoModel.videoFullPath = this.videoList[0].goodsImgUrl;
}
if(this.isMedic){
this.getLever(5,2,1)
}else{
......@@ -1416,15 +1486,15 @@
complete() {
this.formData1.leastCount = this.formData.leastCount;
this.formData1.mostCount = this.formData.mostCount;
let formNameList = ['formData', 'formData1', 'formData2'];
let formNameList = ['formData', 'formData1', 'formData2', 'formData3'];
// let formName = "formData";
if(this.goodsType == 337 ){
formNameList = ['formData', 'formData2'];
this.formData = { ...this.formData, ...this.formData2 };
formNameList = ['formData', 'formData2', 'formData3'];
this.formData = { ...this.formData, ...this.formData2,...this.formData3 };
}else{
formNameList = ['formData', 'formData1'];
this.formData = { ...this.formData, ...this.formData1 };
formNameList = ['formData', 'formData1', 'formData3'];
this.formData = { ...this.formData, ...this.formData1,...this.formData3 };
}
for(let i=0;i<this.fileGoodsList.length;i++){
this.fileGoodsList[i].imageSort = i+1
......@@ -1440,15 +1510,17 @@
// console.log(this.isgoodStock);
this.formData.goodsImages = this.fileGoodsList;
this.formData.goodsHeaderImages = this.fileGoodsList;
this.formData.goodsVideoList = this.videoList;
this.formData.specificationImages = this.fileIntrList;
this.formData.buyLimitDtoList = this.buyLimitDtoList;
this.isgoodsImages = this.formData.goodsImages.length == 0 ? false :true;
// 如果是【药品】类型的商品
if(this.isMedic){
// if(this.isMedic){
if(!this.isgoodsImages){
return;
}
}
// }
// 如果是【检测服务】类型的商品
if(this.isCheckServe){
this.formData.goodsCheckImages = this.goodsCheckList;
......@@ -1528,11 +1600,17 @@
})
})
},
imgExceed(file) {
if (file.length > 6) {
this.$message.error("最多只能上传6张图片");
};
},
//上传商品头图
beforeUploadPic(file) {
if(this.fileGoodsList.length > 10){
return ;
}
// if(this.fileGoodsList.length > 6){
// this.$message.error("最多只能上传6张图片");
// return ;
// }
let vm = this;
let picTypes = ['image/jpeg','image/png']
......@@ -1826,6 +1904,109 @@
}
})
},
// 视频
deleteVideo(videoList) {
console.log(videoList,'item,fileGoodsListitem,fileGoodsListv')
this.videoList = [];
this.videoModel.videoFullPath='';
},
beforeVideoUpload(file) {
const video2M = file.size / 1024 /1024 < 20;
console.log(file.size, 'video2Mvideo2Mvideo2M')
if (!video2M) {
this.$message.error('上传视频大小不能超过20M!');
}
else {
this.doVideoUpload(file, 1);
}
},
handleRemoveVideo(file, videoList) {
//console.log(this.videoList);
for (let i = 0; i < this.videoList.length; i++) {
if (this.videoList[i].name == file.name) {
this.videoList.splice(i, 1);
console.log("删除" + i);
}
}
},
checkUpdate(name) {
let flag = true;
for(let i=0;i<this.videoList.length;i++) {
if(this.videoList[i].name == name) {
flag = false;
this.$message.warning('上传文件重发');
}
}
console.log('name',name,'',this.videoList)
return flag;
},
doVideoUpload(file, index) {
console.log('file',file);
//console.log('videoList项目列表:',this.videoList);
this.videoModel.videoFullPath = '';
if(file.name.indexOf(' ') != -1){
this.$message.warning('文件名不能包含空格');
return;
}
let updateFlag = this.checkUpdate(file.name);
if(updateFlag == false) {
return;
}
var ext = file.type
var arr = ext.split('/');
var filety = "." + arr[1];
/*if (filety.indexOf(".pdf") < 0 && filety.indexOf(".jpeg") < 0 && filety.indexOf(".jpg") < 0
&& filety.indexOf(".png") < 0 && filety.indexOf(".mp4") < 0) {
this.$message.warning('文件格式错误');
return
}*/
let self = this;
//如果没有选择文件,返回
if (isEmptyUtils(file)) {
return;
}
console.log('file.type', file.type)
if(filety != ".mp4"){
// if (file.type !== 'video/mp4') {
self.$message.error('仅支持上传mp4格式视频');
return;
}
var arr = file.name.split('_');
if(arr.length != 4){
self.$message.error('上传视频文件名格式不正确:举例(GXY_001_02_03.mp4)');
return;
}
self.$message.info('开始上传');
self.videoModel.videoPath = createFilePath(file,file.name)
// let videoPath = createFilePath(file,file.name)
doUpload(self,file,self.videoModel.videoPath,"preview4",
"uploadProgress1",
"").then(function (result) {
console.log('成功result',result);
self.videoModel.videoFullPath = result.fullPath;
// self.model.size = result.size;
// self.model.ext = result.ext;
// self.model.name = self.model.videoPath;
let fileItem = {
goodsImgUrl: result.fullPath,
uid: '',
imageUrl: result.fullPath,
imageType: 9,
goodsId: self.formData.goodsId,
id: null,
deleteFlag: 0
}
self.videoList.push(fileItem);
self.$message.success('上传成功');
console.log('sumFile',self.sumFile,'videoList',self.videoList);
return false;
});
},
},
}
</script>
......@@ -1844,6 +2025,9 @@
color: #449284;
}
}
.word-tip {
color: #e6af7a;
}
}
.suitableList-select {
width: 445px;
......@@ -2065,4 +2249,29 @@
.el-icon-minus {
color:#ffffff;
}
#introVideoLecture {
height: 140px;
}
.video-progress {
width: 20%;
}
.el-upload-list {
width: 30%;
}
.label-video {
position: relative;
.el-button:focus, .el-button:hover {
color: #449284;
border-color: #449284;
background-color: #ecf5ff;
}
.dl-video {
position: absolute;
top: 50%;
left: 35%;
transform: translate(-50%,-50%);
}
}
</style>
......@@ -69,7 +69,17 @@ const form = {
expressLimitFlag: 0, //是否支持退货退款
};
const form3 = {
goodsName: "",
goodsDescription: "",
goodsHeaderImages: [],
goodsVideoList: [],
goodsType: "",
expressLimitFlag: 0, //是否支持退货退款
};
export const originForm1 = form1;
export const originForm2 = form2;
export const originForm3 = form3;
export const originForm = form;
......@@ -94,8 +94,8 @@
</el-col>
<el-col :span="12" style="text-align: right">
<el-button v-if="commissionFlag == 2" type="primary" size="small" @click="batchSetPrice()">批量设置分佣</el-button>
<el-button type="primary" size="small" @click="exportOpt">批量导出商品</el-button>
<el-button v-if="commissionFlag == 2" type="primary" size="small" @click="batchSetPrice()" :disabled="tableData.length == 0">批量设置分佣</el-button>
<el-button type="primary" size="small" @click="exportOpt" :disabled="tableData.length == 0">批量导出商品</el-button>
<el-button v-if="isSSO" type="primary" size="small" @click="batchOpt(3)">批量导入商品</el-button>
<el-button type="primary" size="small" @click="edit('add')">新建单个商品</el-button>
</el-col>
......@@ -121,6 +121,7 @@
<span>{{ scope.row.goodsStatus | rangeStatus }}</span>
</template>
</el-table-column>
<el-table-column prop="goodsHisStock" label="商品总库存" width="100" align="center"></el-table-column>
<el-table-column prop="quantityOfSale" label="有效销量" width="120" align="center">
</el-table-column>
......@@ -161,6 +162,16 @@
</el-table-column>
<el-table-column prop="saleTime" label="发布时间" width="170" align="center">
</el-table-column>
<el-table-column prop="modifiedIdStr" label="最近操作人" width="170" align="center">
<template slot-scope="scope">
<span>{{ scope.row.modifiedIdStr || '--' }}</span>
</template>
</el-table-column>
<el-table-column prop="modifiedTime" label="最近操作时间" width="170" align="center">
<template slot-scope="scope">
<span>{{ scope.row.modifiedTime || '--' }}</span>
</template>
</el-table-column>
<el-table-column label="操作" width="200" align="center" fixed="right">
<template slot-scope="scope">
<div v-if="scope.row.commissionFlag == 2">
......@@ -552,7 +563,6 @@
handleRemove(){},
beforeRemove(){},
handleSelectionChange(val){
console.log(val)
this.selectList = val
},
......@@ -622,8 +632,9 @@
reader.readAsDataURL(file);
},
uploadTemp(){
// let url = "https://file.yunqueyi.com/trade/store/goods_import_template.xlsx"
const url = 'https://file.yunqueyi.com/trade/store/20210129/goods_import_template.xlsx';
// let url = "https://file.yunqueyi.com/trade/store/goods_import_template.xlsx 'https://file.yunqueyi.com/trade/store/20210129/goods_import_template.xlsx'"
const url = 'https://files.yunqueyi.com/template/goods_import_template_1.xlsx';
window.location.href = url
},
getLever(id=0){
......@@ -821,7 +832,6 @@
},
exportOpt() {
const { goodsIdList, goodsType, goodsName, storeId, saleType } = this.searchForm;
getGoodsExportUrl({ goodsIdList, goodsType, goodsName, storeId, saleType }).then(res => {
if (res.code != '000000') {
this.$message({ message: res.message, type: 'error' });
......
......@@ -89,19 +89,6 @@ const rules = {
{ required: true, message: "请输入条形码", trigger: "submit" },
{ validator: checkBarcode, trigger: "submit" }
],
goodsName: [
{ required: true, message: "请输入商品名称", trigger: "submit" },
{ validator: checkProjectStr, trigger: "submit" }
],
goodsHeaderImages: [
{ required: true, message: "请上传商品头图", trigger: "blur" }
],
goodsType:[
{ required: true, message: "请选择商品类型", trigger: "change" }
],
hcd:[
{ required: true, message: "请选择是否支持退货退款", trigger: "change" }
],
optPrice: [
{ required: true, message: "请输入价格", trigger: "blur" },
],
......@@ -126,8 +113,22 @@ const rules = {
// ],
}
const rules3 = {
goodsName: [
{ required: true, message: "请输入商品名称", trigger: "submit" },
{ validator: checkProjectStr, trigger: "submit" },
],
goodsDescription: [
{ required: true, message: "请输入商品介绍", trigger: "submit" },
],
goodsHeaderImages: [
{ required: true, message: "请上传商品头图", trigger: "blur" },
],
goodsType: [{ required: true, message: "请选择商品类型", trigger: "change" }],
};
export const originRules1 = rules1;
export const originRules2 = rules2;
export const originRules3 = rules3;
export const originRules = rules;
Markdown 格式
0% or
您添加了 0 到此讨论。请谨慎行事。
先完成此消息的编辑!
想要评论请 注册