Jelajahi Sumber

Merge branch 'pengyouhao_dev'

pengyh 1 tahun lalu
induk
melakukan
031d320be9

+ 64 - 0
src/api/activityOrder.js

@@ -0,0 +1,64 @@
+import request, { postBlob, getBlob, handleImport } from '@/utils/request'
+
+// 获取列表
+export function listPageV2(data) {
+  return request({
+    url: `/promotion/activity/list?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+//导出
+export function pageExport(params) {
+  return request({
+    url: '/promotion/activity/export',
+	method: 'get',
+    params
+  })
+}
+
+// 新增
+export function add(data) {
+  return request({
+    url: `/promotion/activity/add`,
+    method: 'post',
+    data
+  })
+}
+
+// 详情
+export function getDetail(params) {
+  return request({
+    url: `/promotion/activity/detail`,
+    method: 'post',
+    params
+  })
+}
+
+// 跟进
+export function follow(data) {
+  return request({
+    url: `/promotion/activity/batch/follow`,
+    method: 'post',
+    data
+  })
+}
+
+// 获取活动
+export function getActiveList(data) {
+  return request({
+    url: `/promotion/questionnaire/list`,
+    method: 'post',
+    data
+  })
+}
+
+//获取活动详情
+export function getActiveDetail(params) {
+  return request({
+    url: `/promotion/questionnaire/detail`,
+    method: 'post',
+    params
+  })
+}

+ 64 - 0
src/api/goodsWarehouse.js

@@ -0,0 +1,64 @@
+import request, { postBlob, getBlob, handleImport } from '@/utils/request'
+
+// 获取列表
+export function listPageV2(data) {
+  return request({
+    url: `/goods/library/list?moduleId=${data.moduleId}`,
+    method: 'post',
+    data
+  })
+}
+
+//导出
+export function pageExport(data, name) {
+  return postBlob({
+    url: '/goods/library/list/export',
+    data,
+    name
+  })
+}
+
+// 新增编辑
+export function save(data) {
+  return request({
+    url: `/goods/library/save`,
+    method: 'post',
+    data
+  })
+}
+
+// 删除
+export function del(params) {
+  return request({
+    url: `/goods/library/del`,
+    method: 'post',
+    params
+  })
+}
+
+// 详情
+export function getDetail(params) {
+  return request({
+    url: `/goods/library/detail`,
+    method: 'post',
+    params
+  })
+}
+
+// 批量改状态
+export function batch(params) {
+  return request({
+    url: `/goods/library/status/batch`,
+    method: 'post',
+    params
+  })
+}
+
+// 同步商品
+export function sync(params) {
+  return request({
+    url: `/goods/library/sync`,
+    method: 'post',
+    params
+  })
+}

+ 12 - 5
src/components/file-upload/index.vue

@@ -3,12 +3,12 @@
     <el-upload name="file" :class="['uploader', uid_]" :action="baseURL + 'common/upload'" :multiple="false"
       :accept="accept" :show-file-list="false" :on-success="uploadSuccess" :before-upload="beforeUpload"
       :headers="myHeaders" />
-    <div class="images" v-if="modType === 'view'">
+    <div class="images" v-if="modType === 'view' || modType === 'text'">
       <div v-for="(item, index) in files" :key="index" class="item">
         <div v-if="item.url" class="img">
           <el-image v-if="checkFileType(item.url) == 'image'" ref="img" :src="item.url" :preview-src-list="previewImages"
-            style="width: 120px; height: 120px" fit="cover" />
-          <el-image v-else ref="img" :src="item.url" style="width: 120px; height: 120px" fit="cover">
+            style="width: 120px;height: 120px" fit="cover" />
+          <el-image v-else ref="img" :src="item.url" style="width: 120px;height: 120px" fit="cover">
             <div slot="error" class="image-slot">
               <img v-if="checkFileType(item.url) == 'word'" class="file" src="@/assets/common/word.png" />
               <img v-if="checkFileType(item.url) == 'excel'" class="file" src="@/assets/common/excel.png" />
@@ -34,7 +34,10 @@
       <template v-if="isEdit">
         <div v-if="limit">
           <div v-if="limit !== files.length" class="add" @click="uploadImage()">
-            <i class="el-icon-plus" />
+			<div v-if="modType === 'text'">
+			  <div class="upload_text">上传</div>
+			</div>
+            <i v-else class="el-icon-plus" />
           </div>
         </div>
         <div v-else>
@@ -113,7 +116,7 @@ export default {
     showName: {
       type: Boolean,
       default: false
-    },
+    }
   },
   data() {
     return {
@@ -395,4 +398,8 @@ export default {
 .uploader {
   height: 0;
 }
+.upload_text{
+	color: #409eff;
+	cursor: pointer;
+}
 </style>

+ 502 - 0
src/views/mallManagement/activityOrder/detail.vue

@@ -0,0 +1,502 @@
+<template>
+	<div class="s-page">
+		<el-page-header @back="goBack" :content="title"></el-page-header>
+		<el-divider></el-divider>
+		<el-card class="box-card">
+			<div slot="header" class="clearfix">
+				<span>基本信息</span>
+			</div>
+			<div class="mymain-container">
+				<el-form ref="formData" :rules="rules" :model="formData" label-width="110px" size="small" label-position="left">
+					<el-row :gutter="20" justify="start">
+						<el-col :span="6">
+							<el-form-item label="所属商户" :required="true" >
+								<el-input type="text" :value="companyName" disabled></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6" style="height: 51px;">
+							<el-form-item label="活动名称" prop="promotionActivityId">
+								<el-select v-model="formData.active" :disabled="formType!=0" value-key="id" @change="(e)=>{
+									formData.promotionActivityId = e.id
+									formData.activeDate = [e.startTime,e.endTime]
+									this.getActiveDetail(e.id)
+								}" placeholder="请选择" style="width: 100%;">
+								    <el-option
+								      v-for="item in activeList"
+								      :key="item.id"
+								      :label="item.name"
+								      :value="item">
+								    </el-option>
+								  </el-select>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12" style="margin-bottom: 1px;">
+							<el-form-item label="活动时间" prop="" class="is-required">
+								<el-date-picker
+								      v-model="formData.activeDate"
+									  disabled
+								      type="daterange"
+								      range-separator="至"
+								      start-placeholder="开始日期"
+								      end-placeholder="结束日期">
+								</el-date-picker>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6">
+							<el-form-item label="客户名称" prop="userName">
+								<el-input type="text" :disabled="formType!=0" v-model="formData.userName" placeholder="请输入"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6">
+							<el-form-item label="联系人" prop="linkName">
+								<el-input type="text" :disabled="formType!=0" v-model="formData.linkName" placeholder="请输入"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6">
+							<el-form-item label="客户电话" prop="userMobile">
+								<el-input type="number" :disabled="formType!=0" v-model="formData.userMobile" placeholder="请输入"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="6">
+							<el-form-item label="客户电话2" prop="userMobile2">
+								<el-input type="text" :disabled="formType!=0" v-model="formData.userMobile2" placeholder="请输入电话 (固话加区号)"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="24">
+							<el-form-item label="客户地址" prop="userAddress">
+								<el-input type="text" v-model="formData.userAddress" :disabled="formType!=0" placeholder="详细地址"></el-input>
+							</el-form-item>
+						</el-col>
+						<template v-if="formType!=0">
+							<el-col :span="6">
+								<el-form-item label="提交人" prop="createBy">
+									<el-input type="text" v-model="formData.createBy" :disabled="true" placeholder="提交人"></el-input>
+								</el-form-item>
+							</el-col>
+							<el-col :span="6">
+								<el-form-item label="提交时间" prop="createTime">
+									<el-input type="text" v-model="formData.createTime" :disabled="true" placeholder="提交时间"></el-input>
+								</el-form-item>
+							</el-col>
+						</template>
+						
+					</el-row>
+				</el-form>
+			</div>
+		</el-card>
+		<el-card class="box-card" v-if="activeItems.length > 0">
+			<div slot="header" class="clearfix">
+				<span>报名信息</span>
+			</div>
+			<div v-for="(item, index) in activeItems" :key="index">
+			  <div class="picker-container" v-if="item.type == 1 || item.type == 2">
+			    <div class="label"><span v-if="item.isRequire">*</span>{{item.question}}({{{1: '单选', 2: '多选'}[item.type]}})</div>
+			    <div class="img-list" v-if="item.answer && item.answer.length > 0 && item.answer[0].option_files && item.answer[0].option_files.length > 0 && item.answer[0].option_files[0].url">
+			      <div
+			        class="item1"
+			        :class="it.active ? 'active' : ''"
+			        v-for="(it, idx) in item.answer"
+			        :key="idx"
+			        @click="clickOption(index, idx)">
+			        <el-image class="image" :src="returnUrl(it)" mode="aspectFill"></el-image>
+			        <div class="text">{{it.option_value}}</div>
+			      </div>
+			    </div>
+			    <div class="text-list" v-else>
+			      <div
+			        class="item"
+			        :class="it.active ? 'active' : ''"
+			        v-for="(it, idx) in item.answer"
+			        :key="idx"
+			        @click="clickOption(index, idx)">
+			        {{it.option_value}}
+			      </div>
+			    </div>
+			  </div>
+			  <div class="input-container" v-else-if="item.type == 3">
+			    <div class="label"><span v-if="item.isRequire">*</span>{{item.question}}</div>
+				<el-input type="text" v-model="item.inputValue" show-word-limit :maxlength="item.answer[0].option_limit" :disabled="formType!=0" :placeholder="`请输入${item.question}`"></el-input>
+			  </div>
+			  <div class="input-container" v-else>
+			    <div class="label"><span v-if="item.isRequire">*</span>{{item.question}}</div><br/>
+				<ImageUpload :fileList="item.inputValue" :limit="1" :isEdit="formType==0" :fileType="['image','video']"/>
+			  </div>
+			</div>
+		</el-card>
+		<el-card class="box-card" v-if="formType != 0">
+			<div slot="header" class="clearfix">
+				<span>跟进记录</span>
+			</div>
+			<div class="mymain-container">
+				<el-form ref="formData" :model="formData" label-width="110px" size="small" label-position="left">
+					<el-row :gutter="20" justify="start">
+						<el-col :span="24">
+							<el-form-item label="最新跟进结果" prop="status" class="is-required">
+								<el-radio-group v-model="formData.status">
+								    <el-radio :disabled="status == 'END'" label="ING">继续跟进</el-radio>
+								    <el-radio :disabled="status == 'END'" label="END">无需跟进</el-radio>
+								</el-radio-group>
+							</el-form-item>
+						</el-col>
+						<el-col :span="24">
+							<el-form-item label="备注" prop="remark" :rules="[{ required: true, message: `请输入备注内容`, trigger: 'blur' }]">
+								<el-input type="textarea" :rows="3" :disabled="status == 'END'" v-model="formData.remark" placeholder="请输入"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</el-form>
+			</div>
+			<div class="table">
+				<div>跟进记录</div><br/>
+				<el-table :data="formData.records" element-loading-text="Loading" border fit highlight-current-row stripe>
+					<el-table-column prop="status" label="跟进结果" align="center">
+						<template slot-scope="scope">
+							{{scope.row.status == 'ING'?'继续跟进':scope.row.status == 'END'?'无需跟进':''}}
+						</template>
+					</el-table-column>
+					<el-table-column prop="remark" label="备注" align="center"></el-table-column>
+					<el-table-column prop="createBy" align="center" label="跟进人" ></el-table-column>
+					<el-table-column prop="createTime" align="center" label="跟进时间" ></el-table-column>
+				</el-table>
+			</div>
+		</el-card>
+		<div class="page-footer">
+			<div class="footer">
+				<el-button size="small" type="info" @click="goBack">返回</el-button>
+				<el-button v-if="formType == 0 || status == 'ING'" size="small" type="primary" @click="submit()">提交</el-button>
+			</div>
+		</div>
+	</div>
+</template>
+
+<script>
+	import ImageUpload from '@/components/file-upload'
+	import { getDetail, add, follow, getActiveList, getActiveDetail } from "@/api/activityOrder";
+	export default {
+		components: {ImageUpload},
+		props: ['id','title','formType','activeId'],
+		data() {
+			return {
+				dataList: [],
+				activeList: [],
+				activeItems: [],
+				formData: {
+					active: {},
+					activeDate: [],
+					promotionActivityId: '',
+					userName: '',
+					linkName: '',
+					userMobile: '',
+					userMobile2: '',
+					userAddress: '',
+					status: '',
+					remark: ''
+				},
+				status: '',
+				companyName: JSON.parse(localStorage.getItem('greemall_user')).companyName,
+				rules: {
+					userMobile: [
+						{ required: true, message: `请输入客户电话`, trigger: 'blur' },
+						{ required: true, message: `请输入客户电话`, trigger: 'change' },
+						{ pattern:/^((0\d{2,3}-\d{7,8})|(1[3456789]\d{9}))$/, message: '电话号码格式不正确', trigger: 'blur' }
+					],
+					userMobile2: [
+						{ required: true, message: '请输入客户电话或座机', trigger: 'blur' }
+					],
+					userName: [
+						{ required: true, message: '请输入客户名称', trigger: 'blur' }
+					],
+					linkName: [
+						{ required: true, message: '请输入联系人', trigger: 'blur' }
+					],
+					userAddress: [
+						{ required: true, message: '请输入客户地址', trigger: 'blur' }
+					],
+					promotionActivityId: [
+						{ required: true, message: '请选择活动名称', trigger: 'change' }
+					]
+				}
+			};
+		},
+		computed: {
+			returnUrl(){
+				return function(it){
+					return it.option_files.length > 0?it.option_files[0].url:''
+				}
+			}
+		},
+		created() {
+			if(this.id){
+				this.getDetail()
+			}
+			if(this.activeId){
+				this.formData.active = {id: this.activeId}
+				this.getActiveDetail(this.activeId)
+			}
+			this.getActiveList()
+		},
+		methods: {
+			// 返回
+			goBack() {
+				this.$emit('back');
+			},
+			async getDetail(){
+				const that = this
+				getDetail({promotionActivityId: this.id}).then( async res => {
+					Object.assign(this.formData, res.data, {
+						active: {id: res.data.promotionQuestionnaireId}
+					})
+					this.status = res.data.status
+					this.getActiveDetail(res.data.promotionQuestionnaireId,res.data.items)
+				})
+			},
+			getActiveList(){
+				getActiveList({pageNum: 1,pageSize: -1,status: 1}).then(res => {
+					this.activeList = res.data.records
+				})
+			},
+			getActiveDetail(id,items){
+				getActiveDetail({id}).then(res => {
+					this.formData.activeDate = [res.data.startTime,res.data.endTime]
+					res.data.promotionQuestionnaireItems.forEach((item,index)=>{
+						item.answer = JSON.parse(item.answer)
+						if(items){
+							item.answer.forEach((it,ind) => {
+								let data = JSON.parse(items[index].answer)
+								if(data[ind]?.active){
+									it.active = true;
+								}else{
+									it.active = false;
+								}
+								if(items[index].type == 3){
+									item.inputValue = data[ind]?.option_value
+								}else if(item.type == 4 || item.type == 5){
+									item.inputValue = [{url: data[ind]?.option_value}]
+								}
+							})
+						}else{
+							if(item.type == 4 || item.type == 5){
+								item.inputValue = []
+							}else{
+								item.inputValue = '';
+							}
+							item.answer.forEach(it => {
+							  it.active = false;
+							})
+						}
+					})
+					this.activeItems = res.data.promotionQuestionnaireItems
+				})
+			},
+			clickOption(index, idx) {
+				if(this.id){return false}
+			  // 单选题
+			  if(this.activeItems[index].type == 1) {
+			    this.activeItems[index].answer.forEach((item, ind_) => {
+			      this.activeItems[index].answer.splice(ind_, 1, {...item, active: ind_ == idx ? (this.activeItems[index].isRequire ? true : !item.active) : false})
+			    })
+			  }
+			  // 多选题
+			  else {
+			    this.activeItems[index].answer.splice(idx, 1, {...this.activeItems[index].answer[idx], active: !this.activeItems[index].answer[idx].active})
+			  }
+			},
+			submit(){
+				this.$refs.formData.validate((valid, invalidFields, errLabels) => {
+					if (valid) {
+						if(this.formType == 0){
+							for(let i = 0; i < this.activeItems.length; i++) {
+							  if(this.activeItems[i].isRequire) {
+							    // 单选题多选题
+							    if((this.activeItems[i].type == 1 || this.activeItems[i].type == 2) && this.activeItems[i].answer.every(o => !o.active)) {
+							      return this.$message.warning(`请选择${this.activeItems[i].question}`)
+							    }
+							    // 填写题
+							    if(this.activeItems[i].type == 3 && !this.activeItems[i].inputValue) {
+									return this.$message.warning(`请输入${this.activeItems[i].question}`)
+							    }
+								// 图片视频
+								if((this.activeItems[i].type == 4 || this.activeItems[i].type == 5) && this.activeItems[i].inputValue.length==0) {
+									return this.$message.warning(`请上传${this.activeItems[i].question}`)
+								}
+							  }
+							}
+							// 生成题目提交信息
+							let items = [];
+							let activeItems = JSON.parse(JSON.stringify(this.activeItems));
+							for(let index = 0; index < activeItems.length; index++) {
+							  // 单选题多选题
+							  if ((activeItems[index].type == 1 || activeItems[index].type == 2)) {
+							    activeItems[index].answer = activeItems[index].answer.filter(o => o.active);
+							    activeItems[index].answer = JSON.stringify(activeItems[index].answer);
+							    items.push(activeItems[index]);
+							  }
+							  // 填写题
+							  if (activeItems[index].type == 3) {
+							    activeItems[index].answer[0].option_value = activeItems[index].inputValue;
+							    activeItems[index].answer = JSON.stringify(activeItems[index].answer);
+							    items.push(activeItems[index]);
+							  }
+							  // 图片视频
+							  if (activeItems[index].type == 4 || activeItems[index].type == 5) {
+							    activeItems[index].answer[0].option_value = activeItems[index].inputValue.length>0?activeItems[index].inputValue[0].url:'';
+							    activeItems[index].answer = JSON.stringify(activeItems[index].answer);
+							    items.push(activeItems[index]);
+							  }
+							}
+							add({
+								promotionQuestionnaireId: this.formData.promotionActivityId,
+								userName: this.formData.userName,
+								linkName: this.formData.linkName,
+								userMobile: this.formData.userMobile,
+								userMobile2: this.formData.userMobile2,
+								userAddress: this.formData.userAddress,
+								items
+							}).then(res => {
+								if(res.code == 200){
+									this.$message.success('提交成功!')
+									this.goBack()
+								}
+							})
+						}else{
+							follow({
+								ids: [this.id],
+								status: this.formData.status,
+								remark: this.formData.remark,
+							}).then(res => {
+								if(res.code == 200){
+									this.dataList = []
+									this.$message.success('提交成功!')
+									this.goBack()
+								}
+							})
+						}
+					}
+				})
+			}
+		}
+	};
+</script>
+
+<style scoped="scoped" lang="scss">
+	.s-page {
+		padding: 20px;
+		background-color: #ffffff;
+	}
+	.page-footer {
+		height: 70px;
+	}
+	.input-container {
+	  margin-top: 20px;
+	  .label {
+	    font-size: 14px;
+	    font-weight: bold;
+	    span {
+	      color: red;
+	    }
+	  }
+	}
+	.picker-container {
+	  margin-top: 20px;
+	  .label {
+	    font-size: 14px;
+	    font-weight: bold;
+	    span {
+	      color: red;
+	    }
+	  }
+	  .text-list {
+	    display: flex;
+	    flex-wrap: wrap;
+	    .item {
+	      margin-top: 20px;
+	      margin-right: 20px;
+	      height: 40px;
+	      border-radius: 30px;
+	      background: #f5f5f5;
+	      font-size: 14px;
+	      display: flex;
+	      align-items: center;
+	      justify-content: center;
+	      box-sizing: border-box;
+		  cursor: pointer;
+		  padding: 0 40px;
+	      &.active {
+	        border: 1px solid #f6390d;
+	        color: #f6390d;
+	        background: #ffffff;
+	      }
+	    }
+	  }
+	  .img-list {
+	    display: flex;
+	    flex-wrap: wrap;
+	    .item,.item1 {
+	      margin-top: 10px;
+	      margin-right: 10px;
+	      border-radius: 20px;
+		  height: 40px;
+	      display: flex;
+	      flex-direction: column;
+	      align-items: center;
+	      justify-content: center;
+	      box-sizing: border-box;
+	      padding: 0 40px;
+		  background-color: #f3f3f3;
+		  cursor: pointer;
+	      .image {
+	        width: 100%;
+	        height: 60px;
+	      }
+	      .text {
+	        font-size: 14px;
+	      }
+	      &.active {
+	        border: 1px solid #f6390d;
+			background-color: #ffffff;
+	        .text {
+	          color: #f6390d;
+	        }
+	      }
+	    }
+		.item1{
+			height: 130px;
+			border-radius: 6px;
+			padding: 6px;
+			.image {
+			  width: 120px;
+			  height: 100px;
+			}
+		}
+	  }
+	}
+	.footer {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		z-index: 1;
+		width: 100%;
+		background: #fff;
+		padding: 15px 40px;
+		box-sizing: border-box;
+		transition: all 0.28s;
+		text-align: right;
+		box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%), 0 2px 5px 0 rgb(0 0 0 / 10%);
+	
+		&.hideSidebar {
+			margin-left: 54px;
+			width: calc(100vw - 54px);
+		}
+	
+		&.openSidebar {
+			margin-left: 210px;
+			width: calc(100vw - 210px);
+		}
+	
+		.tips {
+			font-size: 12px;
+			color: red;
+			margin-top: 10px;
+		}
+	}
+</style>

+ 303 - 0
src/views/mallManagement/activityOrder/index.vue

@@ -0,0 +1,303 @@
+<template>
+	<div class="page">
+		<template-page v-if="!formDialog" ref="pageRef" :get-list="getList" :table-attributes="tableAttributes"
+			:table-events="tableEvents" :operationColumnWidth="80" :options-evens-group="optionsEvensGroup"
+			:moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation()">
+			<div slot="moreSearch">
+				<el-radio-group v-model="status" size="mini" @change="changeType">
+					<el-radio-button label="ING">继续跟进</el-radio-button>
+					<el-radio-button label="END">无需跟进</el-radio-button>
+					<el-radio-button label="">全部</el-radio-button>
+				</el-radio-group>
+				<br><br>
+			</div>
+		</template-page>
+		<div class="detail" v-if="formDialog">
+			<detail :id="id" :activeId="activeId" @back="backList" :formType="formDialogType" :title="'活动单' + formDialogTitles[formDialogType]"></detail>
+		</div>
+		<!-- 批量跟进 -->
+		<el-dialog title="批量跟进" :visible.sync="isShow" width="50%" :close-on-click-modal="false" :modal-append-to-body="false" @close="formData = {status: 'END',remark: ''}">
+			<el-form ref="formData" :model="formData" label-width="110px" size="small" label-position="left">
+				<el-row :gutter="20" justify="start">
+					<el-col :span="24">
+						<el-form-item label="最新跟进结果" prop="status" :required="true">
+							<el-radio-group v-model="formData.status">
+							    <el-radio label="ING">继续跟进</el-radio>
+							    <el-radio label="END">无需跟进</el-radio>
+							</el-radio-group>
+						</el-form-item>
+					</el-col>
+					<el-col :span="24">
+						<el-form-item label="备注" prop="remark" :rules="[{ required: true, message: `请输入备注内容`, trigger: 'blur' }]">
+							<el-input type="textarea" :rows="3" v-model="formData.remark" placeholder="请输入"></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<div class="footer">
+				<el-button size="mini" @click="isShow = false">取消</el-button>
+				<el-button size="mini" @click="formConfirm()" type="primary">确定</el-button>
+			</div>
+		</el-dialog>
+		<!-- 导出 -->
+		<el-dialog title="选择导出日期" :visible.sync="isShowDate" width="50%" :close-on-click-modal="false" :modal-append-to-body="false" @close="formData1.date = []">
+			<el-form ref="formData1" :model="formData1" label-width="110px" size="small" label-position="left">
+				<el-row :gutter="20" justify="start">
+					<el-col :span="24">
+						<el-form-item label="提交日期范围" prop="date" :rules="[{ required: true, message: `请选择日期`, trigger: 'change' }]">
+							<el-date-picker
+							      v-model="formData1.date"
+							      type="daterange"
+								  value-format="yyyy-MM-dd"
+							      range-separator="至"
+							      start-placeholder="开始日期"
+							      end-placeholder="结束日期">
+							</el-date-picker>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<div class="footer">
+				<el-button size="mini" @click="isShowDate = false">取消</el-button>
+				<el-button size="mini" @click="formConfirm1()" type="primary">确定</el-button>
+			</div>
+		</el-dialog>
+	</div>
+</template>
+
+<script>
+import TemplatePage from '@/components/template/template-page-1.vue'
+import detail from './detail.vue'
+import import_mixin from '@/components/template/import_mixin.js'
+import ImageUpload from '@/components/file-upload'
+import { downloadFiles } from '@/utils/util'
+import { required, mobileRequired, mobile, httpUrl, email } from '@/components/template/rules_verify.js'
+import { listPageV2, pageExport, getDetail, add, follow } from "@/api/activityOrder";
+import operation_mixin from '@/components/template/operation_mixin.js'
+export default {
+	components: { TemplatePage, ImageUpload, detail },
+	mixins: [import_mixin, operation_mixin],
+	data() {
+		return {
+			// 表格属性
+			tableAttributes: {
+				// 启用勾选列
+				selectColumn: true,
+				selectable: this.selectable
+			},
+			// 表格事件
+			tableEvents: {
+				'selection-change': this.selectionChange
+			},
+			// 勾选选中行
+			recordSelected: [],
+			/** 表单变量 */
+			formDialogType: 0,
+			formDialogTitles: ["新增", "跟进", "详情"],
+			formDialog: false,
+			status: 'ING',
+			id: '',
+			activeId: '',
+			promotion_questionnaire_id: '',
+			isShow: false,
+			isShowDate: false,
+			formData: {
+				status: 'END',
+				remark: ''
+			},
+			formData1: {
+				date: []
+			}
+		}
+	},
+	computed: {
+		// 事件组合
+		optionsEvensGroup() {
+			return [
+				[
+					[
+						this.optionsEvensAuth("add", {
+							click: this.addData
+						}),
+					]
+				],
+				[
+					[
+						this.optionsEvensAuth("followUpMore", {
+							click: this.followMore
+						}),
+					]
+				],
+				[
+					[
+						this.optionsEvensAuth("exp", {
+							click: this.openDate
+						}),
+					]
+				],
+			]
+		},
+		// 更多参数
+		moreParameters() {
+			return []
+		},
+		formItems() { },
+	},
+	created(){
+		if(this.pageType == 'detail'){
+			this.activeId = this.pageCode
+			this.formDialog = true
+		}
+	},
+	methods: {
+		// 切换状态
+		changeType(val) {
+			this.$refs.pageRef.refreshList()
+		},
+		backList() {
+			this.id = ''
+			this.formDialog = false;
+			this.$refs?.pageRef?.refreshList()
+		},
+		// 列表请求函数
+		getList(p, cb) {
+			try {
+				var pam = JSON.parse(JSON.stringify(p))
+				pam.params.push({ "param": "a.status", "compare": "=", "value": this.status },{ "param": "a.promotion_questionnaire_id", "compare": "=", "value": this.pageCode?this.pageCode:'' })
+				cb && cb(pam)
+				return listPageV2(pam)
+			} catch (error) {
+				console.log(error)
+			}
+		},
+		// 列表导出函数
+		// exportList: pageExport,
+		// 表格列解析渲染数据更改
+		columnParsing(item, defaultData) {
+			if (item.jname === 'startTime') {
+				defaultData.render = (h, { row, index, column }) => {
+					return (
+						<div style="padding:0 6px;cursor: pointer;">
+							{row.startTime.substring(0,10)}
+						</div>
+					)
+				}
+			}
+			if (item.jname === 'endTime') {
+				defaultData.render = (h, { row, index, column }) => {
+					return (
+						<div style="padding:0 6px;cursor: pointer;">
+							{row.endTime.substring(0,10)}
+						</div>
+					)
+				}
+			}
+			return defaultData
+		},
+		selectable(row, index) {
+			return ["ING"].includes(Object.entries(row.selectMapData.status).find(([key, val]) => val == row.status)?.[0])
+		},
+		// 监听勾选变化
+		selectionChange(data) {
+			this.recordSelected = data
+		},
+		openDate(){
+			this.isShowDate = true
+		},
+		operation() {
+			return this.operationBtn({
+				followUp: {
+					conditions: ({ row, index, column }) => {
+						return row.status == 'ING'
+					},
+					click: ({ row, index, column }) => {
+						this.id = row.promotionActivityId
+						this.formDialogType = 1
+						this.openForm()
+					}
+				},
+				detail: {
+					click: ({ row, index, column }) => {
+						this.id = row.promotionActivityId
+						this.formDialogType = 2
+						this.openForm()
+					}
+				}
+			})
+		},
+
+		addData() {
+			this.formDialogType = 0
+			this.openForm()
+		},
+		openForm() {
+			this.formDialog = true;
+		},
+		followMore() {
+			if (this.recordSelected.length == 0) {
+				return this.$message.warning('请至少勾选一条数据!');
+			}
+			this.isShow = true
+		},
+		formConfirm() {
+			let ids = this.recordSelected.map(item => { return item.promotionActivityId })
+			this.$refs.formData.validate((valid, invalidFields, errLabels) => {
+				if (valid) {
+					this.$confirm('请确认是否批量跟进选中的数据, 是否继续?', '提示', {
+						confirmButtonText: '确定',
+						cancelButtonText: '取消',
+						type: 'warning'
+					}).then(() => {
+						follow({
+							ids,
+							status: this.formData.status,
+							remark: this.formData.remark
+						}).then(res => {
+							this.isShow = false
+							this.$refs?.formData?.resetFields()
+							this.$message({ type: 'success', message: '批量跟进成功!' })
+							this.$refs.pageRef.refreshList()
+						})
+					});
+				}
+			})	
+		},
+		//确认导出
+		formConfirm1() {
+			this.$refs.formData1.validate((valid, invalidFields, errLabels) => {
+				if (valid) {
+					pageExport({
+						statDate: this.formData1.date[0] + ' 00:00:00',
+						endDate: this.formData1.date[1] + ' 23:59:59'
+					}).then(res => {
+						this.isShowDate = false
+						this.$refs?.formData1?.resetFields()
+						this.$message({ type: 'success', message: '导出成功!' })
+					})
+				}
+			})	
+		},
+	}
+}
+</script>
+
+<style lang="scss" scoped>
+.page {
+	height: 100%;
+}
+
+.tab {
+	padding: 20px 20px 0 20px;
+}
+
+.importResultList {
+	.item {
+		font-size: 16px;
+		margin-bottom: 10px;
+	}
+}
+.footer{
+	display: flex;
+	justify-content: flex-end;
+}
+</style>

+ 407 - 0
src/views/mallManagement/goods/goodsWarehouse/detail.vue

@@ -0,0 +1,407 @@
+<template>
+	<template-page v-if="isShowTab" ref="pageRef" :get-list="getList"
+		:table-attributes="tableAttributes" :table-events="tableEvents" :options-evens-group="optionsEvensGroup"
+		:moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation":operationColumnWidth="80" :fieldBeansHook="fieldBeansHook">
+		<div class="footer">
+			<el-button size="mini" @click="cancel()">取消</el-button>
+			<el-button size="mini" @click="formConfirm()" type="primary">确定</el-button>
+		</div>
+		<!-- 选择商品 -->
+		<el-dialog title="商品详情" :visible.sync="isShowDetail" width="100%" style="height: 100vh;" :close-on-click-modal="false" :modal-append-to-body="false" :append-to-body="true">
+			<div style="max-height: 82vh;overflow-y: auto;">
+				<el-form ref="formRef" :rules="rules" :model="formData" label-width="110px" size="small" label-position="left">
+					<el-card class="box-card" id="box">
+						<div slot="header" class="clearfix">
+							<span>基础信息</span>
+						</div>
+						<div class="mymain-container">
+							<el-row :gutter="20" justify="start">
+								<!-- <el-col :span="24">
+									<el-form-item label="商品可选状态" prop="status" :required="true">
+										<div class="flex_ac">
+											<el-radio-group v-model="formData.status">
+											    <el-radio disabled :label="true">开启</el-radio>
+											    <el-radio disabled :label="false">关闭</el-radio>
+											</el-radio-group>
+											<div class="hui" style="margin-left: 80px;">开启状态,商户可选择本商品;关闭则不允许商户选择;</div>
+										</div>
+									</el-form-item>
+								</el-col> -->
+								<el-col :span="6">
+									<el-form-item label="品牌" prop="brandName" :rules="[{ required: true, message: `请输入品牌`, trigger: 'blur' }]">
+										<el-input type="text" v-model="formData.brandName" disabled placeholder="请输入"></el-input>
+									</el-form-item>
+								</el-col>
+								<el-col :span="6">
+									<el-form-item label="是否虚拟商品" prop="isVr" :required="true">
+										<el-radio-group v-model="formData.isVr">
+										    <el-radio disabled :label="true">是</el-radio>
+										    <el-radio disabled :label="false">否</el-radio>
+										</el-radio-group>
+									</el-form-item>
+								</el-col>
+								<el-col :span="6">
+									<el-form-item label="商品大类" prop="category1" :rules="[{ required: true, message: `请输入商品大类`, trigger: 'blur' }]">
+										<el-input type="text" v-model="formData.category1" disabled placeholder="请输入"></el-input>
+									</el-form-item>
+								</el-col>
+								<el-col :span="6">
+									<el-form-item label="商品小类" prop="category2" :rules="[{ required: true, message: `请输入商品小类`, trigger: 'blur' }]">
+										<el-input type="text" v-model="formData.category2" disabled placeholder="请输入"></el-input>
+									</el-form-item>
+								</el-col>
+								<el-col :span="24">
+									<el-form-item label="商品名称" prop="goodsName" :rules="[{ required: true, message: `请输入商品名称`, trigger: 'blur' }]">
+										<el-input type="textarea" :rows="3" v-model="formData.goodsName" disabled placeholder="请输入"></el-input>
+										<div class="hui">商品名称将显示在商品详情,让用户更直接了解商品内涵</div>
+									</el-form-item>
+								</el-col>
+								<el-col :span="24">
+									<el-form-item label="商品描述" prop="describeText">
+										<el-input type="textarea" :rows="3" v-model="formData.describeText" disabled placeholder="请输入"></el-input>
+										<div class="hui">商品描述将显示在商品详情,让用户更了解商品细节</div>
+									</el-form-item>
+								</el-col>
+								<el-col :span="12">
+									<el-form-item label="商品主图" prop="imgUrl" :rules="[{ required: true, message: `请上传商品主图`, trigger: 'change' }]">
+										<ImageUpload :fileList="formData.imgUrl" :limit="1" :isEdit="false" :fileType="['image']"/>
+										<div class="suggest">建议尺寸800*800</div>
+									</el-form-item>
+								</el-col>
+								<el-col :span="12">
+									<el-form-item label="商品视频" prop="vedio">
+										<ImageUpload :fileList="formData.vedio" :limit="1" :isEdit="false" :fileType="['video']"/>
+										<div class="suggest">建议视频宽高比16:9,建议时长9-30秒</div>
+									</el-form-item>
+								</el-col>
+								<el-col :span="24">
+									<el-form-item label="轮播图" prop="imgs" :rules="[{ required: true, message: `请上传轮播图`, trigger: 'change' }]">
+										<ImageUpload :fileList="formData.imgs" :limit="6" :isEdit="false" :fileType="['image']"/>
+										<div class="suggest">建议尺寸800*800,最多上传6张</div>
+									</el-form-item>
+								</el-col>
+							</el-row>
+						</div>
+					</el-card>
+					<el-card class="box-card">
+						<div slot="header" class="clearfix">
+							<span>价格库存</span>
+						</div>
+						<div class="mymain-container">
+							<el-row :gutter="20" justify="start">
+								<el-col :span="24">
+									<el-form-item label="规格类型" prop="goodsLibrarySpecList" class="is-required">
+									</el-form-item>
+								</el-col>
+								<el-table :data="formData.goodsLibrarySpecList" element-loading-text="Loading" border fit highlight-current-row stripe>
+									<el-table-column prop="" align="center" label="*大类">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.mainName'" :rules="[{ required: true, message: `请输入大类`, trigger: 'blur' }]" label-width="0">
+												<el-input type="text" v-model="scope.row.mainName" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*小类">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.smallName'" :rules="[{ required: true, message: `请输入小类`, trigger: 'blur' }]" label-width="0">
+												<el-input type="text" v-model="scope.row.smallName" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*规格型号">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.specValue'" :rules="[{ required: true, message: `请输入规格型号`, trigger: 'blur' }]" label-width="0">
+												<el-input type="text" v-model="scope.row.specValue" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*参考销售价格">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.price'" :rules="[{ required: true, message: `请输入参考销售价格`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+												<el-input type="number" v-model="scope.row.price" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*参考划线价格">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.orgPrice'" :rules="[{ required: true, message: `请输入参考划线价格`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+												<el-input type="number" v-model="scope.row.orgPrice" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*参考成本价">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.costPrice'" :rules="[{ required: true, message: `请输入参考成本价`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+												<el-input type="number" v-model="scope.row.costPrice" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*参考佣金">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.shareAmount'" :rules="[{ required: true, message: `请输入参考佣金`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+												<el-input type="number" v-model="scope.row.shareAmount" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*参考内部佣金">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.innerShareAmount'" :rules="[{ required: true, message: `请输入参考内部佣金`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+												<el-input type="number" v-model="scope.row.innerShareAmount" disabled placeholder="请输入"></el-input>
+											</el-form-item>
+										</template>
+									</el-table-column>
+									<el-table-column prop="" align="center" label="*参考规格图片">
+										<template slot-scope="scope">
+											<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.imgUrl'" :rules="[{ required: true, message: `请上传参考规格图片`, trigger: 'change' }]" label-width="0">
+												<div class="flex_ac">
+													<ImageUpload :fileList="scope.row.imgUrl" :limit="1" :download="false" :viewOnline="false" :isEdit="false" modType="text" :fileType="['image']"/>
+												</div>
+											</el-form-item>
+										</template>
+									</el-table-column>
+								</el-table>
+							</el-row>
+						</div>
+					</el-card>
+					<el-card class="box-card">
+						<div slot="header" class="clearfix">
+							<span>详情内容</span>
+						</div>
+						<div class="mymain-container">
+							<el-row :gutter="20" justify="start">
+								<el-form-item label="详情内容" prop="content" :rules="[{ required: true, message: `请输入详情内容`, trigger: 'change' }]">
+									<quillEditor v-model="formData.content"></quillEditor>
+									<input type="hidden" v-model="formData.content">
+								</el-form-item>
+							</el-row>
+						</div>
+					</el-card>
+				</el-form>
+			</div>
+			<div class="footer">
+				<el-button size="mini" @click="isShowDetail = false">返回</el-button>
+			</div>
+		</el-dialog>
+	</template-page>
+</template>
+
+<script>
+	import TemplatePage from '@/components/template/template-page-1.vue'
+	import { required, mobileRequired, mobile } from '@/components/template/rules_verify.js'
+	import { listPageV2, pageExport, save, del, getDetail, batch, sync } from "@/api/goodsWarehouse";
+	import operation_mixin from '@/components/template/operation_mixin.js'
+	import ImageUpload from '@/components/file-upload'
+	import quillEditor from '@/components/v-quill-editor'
+	export default {
+		components: {
+			TemplatePage,ImageUpload,quillEditor
+		},
+		mixins: [operation_mixin],
+		props: ['isSelectShop'],
+		data() {
+			return {
+				// 表格属性
+				tableAttributes: {
+					// 启用勾选列
+					selectColumn: true,
+					selectable: this.selectable
+				},
+				// 表格事件
+				tableEvents: {
+					'selection-change': this.selectionChange
+				},
+				// 勾选选中行
+				recordSelected: [],
+				/** 表单变量 */
+				formDialogType: 0,
+				formDialogTitles: ["新增", "编辑"],
+				formDialog: false,
+				formData: {
+					status: true,
+					brandName: '',
+					category1: '',
+					category2: '',
+					isVr: true,
+					goodsName: '',
+					describeText: '',
+					imgUrl: [],
+					vedio: [],
+					imgs: [],
+					content: '',
+					goodsLibrarySpecList: []
+				},
+				rules: {},
+				status: '',
+				formType: 'add',
+				formVisible: false,
+				stepIndex: 0,
+				isEdit: 0,
+				editSpecImageIdx: 0,
+				isShowTab: true,
+				isShowDetail: false
+			}
+		},
+		watch: {
+			isSelectShop(){
+				this.isShowTab = false
+				this.recordSelected = []
+				this.$nextTick(()=>{
+					this.isShowTab = true
+				})
+			}
+		},
+		computed: {
+			// 事件组合
+			optionsEvensGroup() {
+				return [
+					
+				]
+			},
+			// 更多参数
+			moreParameters() {
+				return []
+			},
+			formItems() {
+				return []
+			}
+		},
+		methods: {
+			// 列表请求函数
+			getList(p, cb) {
+				try {
+					var pam = JSON.parse(JSON.stringify(p))
+					pam.params.push({ 'param': 'a.status', "compare": "=", "value": true })
+					cb && cb(pam)
+					return listPageV2(pam)
+				} catch (error) {
+					console.log(error)
+				}
+			},
+			// 列表导出函数
+			exportList: pageExport,
+			changeType(){
+				this.$refs.pageRef.refreshList()
+			},
+			selectable(row){
+				return this.recordSelected.length ? !!this.recordSelected.find(item=>item.goodsLibraryId==row.goodsLibraryId) : true
+			},
+			fieldBeansHook(row){
+				row.forEach(item=>{
+					if(item.jname == 'status'){
+						item.isQuery = false
+					}
+				})
+				console.log(row,111)
+			},
+			// 表格列解析渲染数据更改
+			columnParsing(item, defaultData) {
+				if (item.jname === 'imgUrl') {
+					defaultData.render = (h, { row, index, column }) => {
+						return (
+							<div style="padding:6px;cursor: pointer;">
+							  {row.imgUrl ? row.imgUrl.split(",").map(url => <el-image src={url} preview-src-list={[url]} fit="fit" style="width:60px;height:60px;" />) : null}
+							</div>
+						)
+					}
+				}
+				return defaultData
+			},
+			// 监听勾选变化
+			selectionChange(data) {
+				this.recordSelected = data
+			},
+			// 表格操作列
+			operation(h, { row, index, column }) {
+			  return (
+			    <div class='operation-btns'>
+			      <el-button type="text" onClick={() => {
+			        this.isShowDetail = true
+					getDetail({
+						goodsLibraryId: row.goodsLibraryId
+					}).then(res => {
+						let imgs = []
+						let goodsLibrarySpecList = []
+						res.data.imgs.split(",").forEach(item=>{
+							imgs.push({
+								url: item
+							})
+						})
+						res.data.goodsLibrarySpecList.forEach(item=>{
+							goodsLibrarySpecList.push({
+								...item,
+								imgUrl: item.imgUrl?[{url: item.imgUrl}]:[]
+							})
+						})
+						Object.assign(this.formData, res.data,{
+							imgUrl: res.data.imgUrl?[{url: res.data.imgUrl}]:[],
+							imgs: res.data.imgs?imgs:[],
+							vedio: res.data.vedio?[{url: res.data.vedio}]:[],
+							goodsLibrarySpecList
+						})
+						this.$nextTick(()=>{
+							document.querySelector('#box').scrollIntoView({
+								behavior: "smooth"
+							});
+						})
+					})
+			      }}>查看详情</el-button>
+			    </div>
+			  )
+			},
+			formCancel() {
+				this.formVisible = false
+				this.$refs?.formRef?.resetFields()
+				this.$data.formData = this.$options.data().formData
+			},
+			formConfirm() {
+				if (this.recordSelected.length == 0) {
+					return this.$message.warning('请至少勾选一条数据!');
+				}
+				this.$emit('selectShop',this.recordSelected[0].goodsLibraryId)
+			},
+			cancel(){
+				this.$emit('selectShop')
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.page{
+		padding: 20px;
+		padding-bottom: 60px;
+		box-sizing: border-box;
+	}
+	.flex_ac{
+		display: flex;
+		align-items: center;
+	}
+	.box-card{
+		margin-top: 30px;
+	}
+	.hui{
+		color: #888888;
+	}
+	.suggest{
+		display: inline-block;
+		padding: 0 10px;
+		margin-top: 10px;
+		background-color: #ffdee5;
+		color: #cd1e46;
+	}
+	.footer {
+		padding: 15px 40px;
+		box-sizing: border-box;
+		text-align: right;
+	}
+	::v-deep .zj-page-fill{
+		max-height: 360px !important;
+		overflow-y: auto;
+	}
+	::v-deep .el-dialog{
+		margin-top: 0 !important;
+	}
+	::v-deep .el-dialog__wrapper{
+		overflow: hidden !important;
+	}
+</style>

+ 624 - 0
src/views/mallManagement/goods/goodsWarehouse/index.vue

@@ -0,0 +1,624 @@
+<template>
+	<div>
+		<zj-tab-page ref="tabPage" :defaultActives="[{ key: 'list', label: $route.meta.title+'-列表', essential: true }]">
+			<template slot-scope="{activeKey, data}">
+				<template-page v-if="activeKey == 'list'" ref="pageRef" :get-list="getList"
+					:table-attributes="tableAttributes" :table-events="tableEvents" :options-evens-group="optionsEvensGroup"
+					:moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation()"
+					:exportList="exportList" :operationColumnWidth="80">
+					<div slot="moreSearch">
+						<el-radio-group v-model="status" size="mini" @change="changeType">
+							<el-radio-button label="">全部</el-radio-button>
+							<el-radio-button :label="false">已关闭</el-radio-button>
+							<el-radio-button :label="true">已开启</el-radio-button>
+						</el-radio-group>
+						<br><br>
+					</div>
+				</template-page>
+				<div v-if="~['add', 'edit', 'detail'].indexOf(activeKey)">
+					<div class="page">
+						<el-steps :active="stepIndex" align-center>
+							<el-step title="编辑基础信息" description=""></el-step>
+							<el-step title="编辑价格库存" description=""></el-step>
+							<el-step title="编辑商品详情" description=""></el-step>
+						</el-steps>
+						<el-card class="box-card">
+							<div slot="header" class="clearfix">
+								<span>{{stepIndex == 0?'基础信息':stepIndex == 1?'价格库存':stepIndex == 2?'详情内容':''}}</span>
+							</div>
+							<div class="mymain-container">
+								<el-form ref="formRef" :rules="rules" :model="formData" label-width="110px" size="small"
+									label-position="left">
+									<el-row :gutter="20" justify="start">
+										<div v-show="stepIndex == 0">
+											<el-col :span="24">
+												<el-form-item label="商品可选状态" prop="status" :required="true">
+													<div class="flex_ac">
+														<el-radio-group v-model="formData.status">
+														    <el-radio :label="true">开启</el-radio>
+														    <el-radio :label="false">关闭</el-radio>
+														</el-radio-group>
+														<div class="hui" style="margin-left: 80px;">开启状态,商户可选择本商品;关闭则不允许商户选择;</div>
+													</div>
+												</el-form-item>
+											</el-col>
+											<el-col :span="6">
+												<el-form-item label="品牌" prop="brandName" :rules="[{ required: true, message: `请输入品牌`, trigger: 'blur' }]">
+													<el-input type="text" v-model="formData.brandName" placeholder="请输入"></el-input>
+												</el-form-item>
+											</el-col>
+											<el-col :span="6">
+												<el-form-item label="是否虚拟商品" prop="isVr" :required="true">
+													<el-radio-group v-model="formData.isVr">
+													    <el-radio :label="true">是</el-radio>
+													    <el-radio :label="false">否</el-radio>
+													</el-radio-group>
+												</el-form-item>
+											</el-col>
+											<el-col :span="6">
+												<el-form-item label="商品大类" prop="category1" :rules="[{ required: true, message: `请输入商品大类`, trigger: 'blur' }]">
+													<el-input type="text" v-model="formData.category1" placeholder="请输入"></el-input>
+												</el-form-item>
+											</el-col>
+											<el-col :span="6">
+												<el-form-item label="商品小类" prop="category2" :rules="[{ required: true, message: `请输入商品小类`, trigger: 'blur' }]">
+													<el-input type="text" v-model="formData.category2" placeholder="请输入"></el-input>
+												</el-form-item>
+											</el-col>
+											<el-col :span="24">
+												<el-form-item label="商品名称" prop="goodsName" :rules="[{ required: true, message: `请输入商品名称`, trigger: 'blur' }]">
+													<el-input type="textarea" :rows="3" v-model="formData.goodsName" placeholder="请输入"></el-input>
+													<div class="hui">商品名称将显示在商品详情,让用户更直接了解商品内涵</div>
+												</el-form-item>
+											</el-col>
+											<el-col :span="24">
+												<el-form-item label="商品描述" prop="describeText">
+													<el-input type="textarea" :rows="3" v-model="formData.describeText" placeholder="请输入"></el-input>
+													<div class="hui">商品描述将显示在商品详情,让用户更了解商品细节</div>
+												</el-form-item>
+											</el-col>
+											<el-col :span="12">
+												<el-form-item label="商品主图" prop="imgUrl" :rules="[{ required: true, message: `请上传商品主图`, trigger: 'change' }]">
+													<ImageUpload :fileList="formData.imgUrl" :limit="1" :isEdit="true" :fileType="['image']"/>
+													<div class="suggest">建议尺寸800*800</div>
+												</el-form-item>
+											</el-col>
+											<el-col :span="12">
+												<el-form-item label="商品视频" prop="vedio">
+													<ImageUpload :fileList="formData.vedio" :limit="1" :isEdit="true" :fileType="['video']"/>
+													<div class="suggest">建议视频宽高比16:9,建议时长9-30秒</div>
+												</el-form-item>
+											</el-col>
+											<el-col :span="24">
+												<el-form-item label="轮播图" prop="imgs" :rules="[{ required: true, message: `请上传轮播图`, trigger: 'change' }]">
+													<ImageUpload :fileList="formData.imgs" :limit="6" :isEdit="true" :fileType="['image']"/>
+													<div class="suggest">建议尺寸800*800,最多上传6张</div>
+												</el-form-item>
+											</el-col>
+										</div>
+										<div v-show="stepIndex == 1">
+											<el-col :span="24">
+												<el-form-item label="规格类型" prop="goodsLibrarySpecList" class="is-required">
+													<el-button size="mini" @click="add()" type="primary">添加规格</el-button>
+												</el-form-item>
+											</el-col>
+											<el-form ref="formData" :model="formData" label-width="110px" size="small">
+												<el-table :data="formData.goodsLibrarySpecList" element-loading-text="Loading" border fit highlight-current-row stripe>
+													<el-table-column prop="" align="center" label="*大类">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.mainName'" :rules="[{ required: true, message: `请输入大类`, trigger: 'blur' }]" label-width="0">
+																<el-input type="text" v-model="scope.row.mainName" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*小类">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.smallName'" :rules="[{ required: true, message: `请输入小类`, trigger: 'blur' }]" label-width="0">
+																<el-input type="text" v-model="scope.row.smallName" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*规格型号">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.specValue'" :rules="[{ required: true, message: `请输入规格型号`, trigger: 'blur' }]" label-width="0">
+																<el-input type="text" v-model="scope.row.specValue" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*参考销售价格">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.price'" :rules="[{ required: true, message: `请输入参考销售价格`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+																<el-input type="number" v-model="scope.row.price" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*参考划线价格">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.orgPrice'" :rules="[{ required: true, message: `请输入参考划线价格`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+																<el-input type="number" v-model="scope.row.orgPrice" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*参考成本价">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.costPrice'" :rules="[{ required: true, message: `请输入参考成本价`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+																<el-input type="number" v-model="scope.row.costPrice" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*参考佣金">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.shareAmount'" :rules="[{ required: true, message: `请输入参考佣金`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+																<el-input type="number" v-model="scope.row.shareAmount" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*参考内部佣金">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.innerShareAmount'" :rules="[{ required: true, message: `请输入参考内部佣金`, trigger: 'blur' },{ pattern:/^(([0-9]\d*)|([0][.]{1}[0-9]{0,2}[1-9]+)|([1-9]\d*[.]{1}[0-9]+))$/g, message: '请输入大于等于0的数', trigger: 'blur' }]" label-width="0">
+																<el-input type="number" v-model="scope.row.innerShareAmount" :disabled="isEdit != scope.$index" placeholder="请输入"></el-input>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column prop="" align="center" label="*参考规格图片">
+														<template slot-scope="scope">
+															<el-form-item :prop="'goodsLibrarySpecList.' + scope.$index + '.imgUrl'" :rules="[{ required: true, message: `请上传参考规格图片`, trigger: 'change' }]" label-width="0">
+																<div class="flex_ac">
+																	<ImageUpload :fileList="scope.row.imgUrl" :limit="1" :download="false" :viewOnline="false" :isEdit="true" modType="text" :fileType="['image']"/>
+																</div>
+															</el-form-item>
+														</template>
+													</el-table-column>
+													<el-table-column label="操作" align="center" width="160">
+														<template slot-scope="scope">
+															<el-button size="mini" type="primary" v-if="scope.$index != isEdit" @click="edit(scope.$index)">编辑</el-button>
+															<el-button size="mini" type="danger" @click="del(scope.$index)">删除</el-button>
+														</template>
+													</el-table-column>
+												</el-table>
+											</el-form>
+										</div>
+										<div v-show="stepIndex == 2">
+											<el-form-item label="详情内容" prop="content" :rules="[{ required: true, message: `请输入详情内容`, trigger: 'change' }]">
+												<quillEditor v-model="formData.content"></quillEditor>
+												<input type="hidden" v-model="formData.content">
+											</el-form-item>
+										</div>
+									</el-row>
+								</el-form>
+							</div>
+						</el-card>
+					</div>
+					<div class="footer">
+						<el-button v-if="stepIndex > 0" size="mini" @click="up()">上一步</el-button>
+						<el-button v-if="stepIndex < 2" size="mini" @click="next()">下一步</el-button>
+						<el-button size="mini" @click="formConfirm(data.removeTab)" type="primary">提交</el-button>
+						<el-button size="mini" @click="data.removeTab()">关闭</el-button>
+					</div>
+				</div>
+			</template>
+		</zj-tab-page>
+	</div>
+</template>
+
+<script>
+	import TemplatePage from '@/components/template/template-page-1.vue'
+	import import_mixin from '@/components/template/import_mixin.js'
+	import ImageUpload from '@/components/file-upload'
+	import { required, mobileRequired, mobile } from '@/components/template/rules_verify.js'
+	import { listPageV2, pageExport, save, del, getDetail, batch, sync } from "@/api/goodsWarehouse";
+	import operation_mixin from '@/components/template/operation_mixin.js'
+	import quillEditor from '@/components/v-quill-editor'
+	export default {
+		components: {
+			TemplatePage,ImageUpload,quillEditor
+		},
+		mixins: [import_mixin, operation_mixin],
+		data() {
+			return {
+				// 表格属性
+				tableAttributes: {
+					// 启用勾选列
+					selectColumn: true
+				},
+				// 表格事件
+				tableEvents: {
+					'selection-change': this.selectionChange
+				},
+				// 勾选选中行
+				recordSelected: [],
+				/** 表单变量 */
+				formDialogType: 0,
+				formDialogTitles: ["新增", "编辑"],
+				formDialog: false,
+				formData: {
+					status: true,
+					brandName: '',
+					category1: '',
+					category2: '',
+					isVr: true,
+					goodsName: '',
+					describeText: '',
+					imgUrl: [],
+					vedio: [],
+					imgs: [],
+					content: '',
+					goodsLibrarySpecList: []
+				},
+				rules: {},
+				status: '',
+				formType: 'add',
+				formVisible: false,
+				stepIndex: 0,
+				isEdit: 0
+			}
+		},
+		computed: {
+			// 事件组合
+			optionsEvensGroup() {
+				return [
+					[
+						[
+							this.optionsEvensAuth("add", {
+								click: () => {
+									this.openForm('add')
+								}
+							})
+						]
+					],
+					[
+						[
+							this.optionsEvensAuth("openMore", {
+								click: () => {
+									this.openMore()
+								}
+							})
+						]
+					],
+					[
+						[
+							this.optionsEvensAuth("closeMore", {
+								click: () => {
+									this.closeMore()
+								}
+							})
+						]
+					],
+					[
+						[
+							this.optionsEvensAuth("synchronization", {
+								click: () => {
+									this.sync()
+								}
+							})
+						]
+					]
+				]
+			},
+			// 更多参数
+			moreParameters() {
+				return []
+			},
+			formItems() {
+				return []
+			}
+		},
+		methods: {
+			// 列表请求函数
+			getList(p, cb) {
+				try {
+					var pam = JSON.parse(JSON.stringify(p))
+					pam.params.push({ 'param': 'a.status', "compare": "=", "value": this.status })
+					cb && cb(pam)
+					return listPageV2(pam)
+				} catch (error) {
+					console.log(error)
+				}
+			},
+			// 列表导出函数
+			exportList: pageExport,
+			changeType(){
+				this.$refs.pageRef.refreshList()
+			},
+			// 表格列解析渲染数据更改
+			columnParsing(item, defaultData) {
+				if (item.jname === 'imgUrl') {
+					defaultData.render = (h, { row, index, column }) => {
+						return (
+							<div style="padding:6px;cursor: pointer;">
+							  {row.imgUrl ? row.imgUrl.split(",").map(url => <el-image src={url} preview-src-list={[url]} fit="fit" style="width:60px;height:60px;" />) : null}
+							</div>
+						)
+					}
+				}
+				if (item.jname === 'goodsName') {
+					defaultData.render = (h, { row, index, column }) => {
+						return (
+							<div style="padding:6px;">
+								{row.goodsName}
+							</div>
+						)
+					}
+					defaultData.columnAttributes.width = 300
+					console.log(defaultData,11)
+				}
+				return defaultData
+			},
+			up(){
+				this.stepIndex -= 1
+			},
+			next(){
+				this.stepIndex += 1
+			},
+			add(){
+				this.$refs.formData.validate((valid) => {
+					if (valid) {
+						this.isEdit = 0
+						this.formData.goodsLibrarySpecList.unshift({
+							mainName: '',
+							smallName: '',
+							specValue: '',
+							price: '',
+							orgPrice: '',
+							shareAmount: '',
+							innerShareAmount: '',
+							costPrice: '',
+							imgUrl: []
+						})
+					}
+				});
+			},
+			edit(index){
+				this.$refs.formData.validate((valid) => {
+					if (valid) {
+						this.isEdit = index
+					}
+				});
+			},
+			del(index){
+				this.formData.goodsLibrarySpecList.splice(index,1)
+			},
+			// 监听勾选变化
+			selectionChange(data) {
+				this.recordSelected = data
+			},
+			openMore() {
+				if (this.recordSelected.length == 0) {
+					return this.$message.warning('请至少勾选一条数据!');
+				}
+				this.batch(this.recordSelected.map(item => { return item.goodsLibraryId }),true)
+			},
+			closeMore() {
+				if (this.recordSelected.length == 0) {
+					return this.$message.warning('请至少勾选一条数据!');
+				}
+				this.batch(this.recordSelected.map(item => { return item.goodsLibraryId }),false)
+			},
+			batch(goodsLibraryIds,statusEnum) {
+				console.log(goodsLibraryIds)
+				this.$confirm('请确认是否批量操作选中的数据, 是否继续?', '提示', {
+					confirmButtonText: '确定',
+					cancelButtonText: '取消',
+					type: 'warning'
+				}).then(() => {
+					batch({
+						goodsLibraryIds: goodsLibraryIds.join(','),
+						statusEnum
+					}).then(res => {
+						this.$message({ type: 'success', message: statusEnum?'批量开启成功!':'批量关闭成功!' })
+						this.$refs.pageRef.refreshList()
+					})
+				});
+			},
+			sync(){
+				const loading = this.$loading({
+				  lock: true,
+				  text: 'Loading',
+				  spinner: 'el-icon-loading',
+				  background: 'rgba(0, 0, 0, 0.7)'
+				});
+				sync().then(res => {
+					if(res.code == 200){
+						this.$message({ type: 'success', message: `同步成功!` })
+						this.$refs.pageRef.refreshList()
+					}else{
+						this.$message({ type: 'error', message: res.message })
+					}
+					loading.close();
+				})
+				
+			},
+			// 表格操作列
+			operation() {
+				return this.operationBtn({
+					edit: {
+						btnType: 'text',
+						click: ({ row, index, column }) => {
+							this.openForm('edit', row.goodsLibraryId)
+						}
+					},
+					del: {
+						btnType: 'text',
+						prompt: '确定删除吗?',
+						click: ({ row, index, column }) => {
+							del({
+								goodsLibraryId: row.goodsLibraryId
+							}).then(() => {
+								this.$message({
+									type: 'success',
+									message: '删除成功!'
+								})
+								this.$refs.pageRef.refreshList()
+							})
+						}
+					}
+				})
+			},
+			// 打开 新增编辑 网点表单
+			openForm(type, goodsLibraryId) {
+				this.$refs.tabPage.addTab({
+					// 对应显示的模块
+					activeKey: type,
+					// 唯一标识
+					key: type,
+					// 页签名称
+					label: ({
+						edit: "编辑",
+						add: "新增"
+					})[type],
+					// 打开时事件
+					triggerEvent: () => {
+						this.formCancel()
+						this.$nextTick(() => {
+							this.formType = type
+							this.formVisible = true
+							if (type == 'add') {
+								this.formDialogType = 0
+							} else if (type == 'edit') {
+								this.formDialogType = 1
+								getDetail({
+									goodsLibraryId
+								}).then(res => {
+									let imgs = []
+									let goodsLibrarySpecList = []
+									res.data.imgs.split(",").forEach(item=>{
+										imgs.push({
+											url: item
+										})
+									})
+									res.data.goodsLibrarySpecList.forEach(item=>{
+										goodsLibrarySpecList.push({
+											...item,
+											imgUrl: item.imgUrl?[{url: item.imgUrl}]:[]
+										})
+									})
+									Object.assign(this.formData, res.data,{
+										imgUrl: res.data.imgUrl?[{url: res.data.imgUrl}]:[],
+										imgs: res.data.imgs?imgs:[],
+										vedio: res.data.vedio?[{url: res.data.vedio}]:[],
+										goodsLibrarySpecList
+									})
+									console.log(this.formData,imgs)
+								})
+							}
+						})
+					},
+					// 关闭时事件
+					closeEvent: () => {
+
+					}
+				})
+			},
+			formCancel() {
+				this.formVisible = false
+				this.$refs?.formRef?.resetFields()
+				this.$data.formData = this.$options.data().formData
+			},
+			formConfirm(cancel) {
+				let imgs = this.formData.imgs.map(item => { return item.url })
+				let goodsLibrarySpecList = []
+				this.formData.goodsLibrarySpecList.forEach(item=>{
+					goodsLibrarySpecList.push({
+						...item,
+						imgUrl: item.imgUrl.length>0?item.imgUrl[0].url:''
+					})
+				})
+				this.$refs.formRef.validate((valid, invalidFields, errLabels) => {
+					if (valid) {
+						this.$refs.formData.validate((valid, invalidFields, errLabels) => {
+							if (valid) {
+								save({
+									...this.formData,
+									imgUrl: this.formData.imgUrl.length>0?this.formData.imgUrl[0].url:'',
+									imgs: this.formData.imgs.length>0?imgs.join(','):'',
+									vedio: this.formData.vedio.length>0?this.formData.vedio[0].url:'',
+									goodsLibrarySpecList
+								}).then(res => {
+									this.stepIndex = 0
+									this.$message({
+										type: 'success',
+										message: `${this.formDialogTitles[this.formDialogType]}成功!`
+									})
+									cancel('list')
+									this.$refs.pageRef.refreshList()
+								})
+							}else{
+								this.stepIndex = 1
+							}
+						})
+					}else{
+						if(this.formData.goodsLibrarySpecList.length == 0){
+							this.stepIndex = 1
+							this.$message({
+								type: 'warning',
+								message: '请添加规格类型!'
+							})
+						}else if(!this.formData.content){
+							this.stepIndex = 2
+							this.$message({
+								type: 'warning',
+								message: '请输入商品内容详情!'
+							})
+						}else{
+							this.stepIndex = 0
+						}
+					}
+				})
+			}
+		}
+	}
+</script>
+
+<style lang="scss" scoped>
+	.page{
+		padding: 20px;
+		padding-bottom: 60px;
+		box-sizing: border-box;
+	}
+	.flex_ac{
+		display: flex;
+		align-items: center;
+	}
+	.box-card{
+		margin-top: 30px;
+	}
+	.hui{
+		color: #888888;
+	}
+	.suggest{
+		display: inline-block;
+		padding: 0 10px;
+		margin-top: 10px;
+		background-color: #ffdee5;
+		color: #cd1e46;
+	}
+	.footer {
+		position: fixed;
+		bottom: 0;
+		left: 0;
+		z-index: 1;
+		width: 100%;
+		background: #fff;
+		padding: 15px 40px;
+		box-sizing: border-box;
+		transition: all 0.28s;
+		text-align: right;
+		box-shadow: 0 2px 5px 0 rgb(0 0 0 / 50%), 0 2px 5px 0 rgb(0 0 0 / 10%);
+	
+		&.hideSidebar {
+			margin-left: 54px;
+			width: calc(100vw - 54px);
+		}
+	
+		&.openSidebar {
+			margin-left: 210px;
+			width: calc(100vw - 210px);
+		}
+	
+		.tips {
+			font-size: 12px;
+			color: red;
+			margin-top: 10px;
+		}
+	}
+</style>

+ 67 - 7
src/views/mallManagement/goods/goods_add/index.vue

@@ -78,7 +78,10 @@
           </el-col>
           <el-col :span="24">
             <el-form-item label="商品名称:" prop="goodsName">
-              <el-input v-model="step1Form.goodsName" placeholder="请输入商品名称" maxlength="200" show-word-limit></el-input>
+              <div style="display: flex">
+				  <el-input v-model="step1Form.goodsName" placeholder="请输入商品名称" maxlength="200" show-word-limit></el-input>
+				  <el-button v-if="type == 'add'" size="mini" @click="isSelectShop = true" type="primary">从商品库选择</el-button>
+			  </div>
             </el-form-item>
           </el-col>
           <el-col :span="24">
@@ -391,7 +394,10 @@
         </el-popconfirm>
       </div>
     </div>
-
+	<!-- 选择商品 -->
+	<el-dialog title="选择商品" :visible.sync="isSelectShop" width="90%" style="max-height: 95vh;overflow-y: auto;" :close-on-click-modal="false" :modal-append-to-body="false">
+	  <selectShopDetail @selectShop="selectShop" :isSelectShop="isSelectShop"></selectShopDetail>
+	</el-dialog>
   </div>
 </template>
 
@@ -404,6 +410,8 @@ import 'quill/dist/quill.core.css'
 import 'quill/dist/quill.snow.css'
 import 'quill/dist/quill.bubble.css'
 import { EventBus } from '@/utils/eventBus'
+import selectShopDetail from '../goodsWarehouse/detail'
+import { getDetail } from "@/api/goodsWarehouse";
 // 工具栏配置
 const toolbarOptions = [
   ['bold', 'italic', 'underline', 'strike'],
@@ -424,7 +432,7 @@ const toolbarOptions = [
 
 export default {
   components: {
-    quillEditor
+    quillEditor,selectShopDetail
   },
   filters: {
     unitFilter(val) {
@@ -472,7 +480,8 @@ export default {
           { required: true, message: '请选择商品分类', trigger: 'change' }
         ],
         goodsName: [
-          { required: true, message: '请填写商品名称', trigger: 'blur' }
+          { required: true, message: '请填写商品名称', trigger: 'blur' },
+		  { required: true, message: '请填写商品名称', trigger: 'change' }
         ],
         imgUrl: [
           { required: true, message: '请上传商品主图', trigger: 'change' }
@@ -548,7 +557,8 @@ export default {
       tagList: [], // 标签列表
 
       showImageListUpload2: false,
-
+	  type: 'add',
+	  isSelectShop: false //选择商品库
     }
   },
 
@@ -561,7 +571,8 @@ export default {
   },
 
   async created() {
-    const { id } = this.$route.query;
+    const { id,type } = this.$route.query;
+	this.type = type
     this.isEdit = id ? true : false;
     this.editId = id;
 
@@ -580,7 +591,56 @@ export default {
 
   },
   methods: {
-
+	//选择商品库商品
+	selectShop(goodsLibraryId){
+		this.isSelectShop = false
+		if(goodsLibraryId){
+			getDetail({
+				goodsLibraryId
+			}).then(res => {
+				let imgs = []
+				let goodsLibrarySpecList = []
+				res.data.imgs.split(",").forEach(item=>{
+					imgs.push({
+						url: item
+					})
+				})
+				res.data.goodsLibrarySpecList.forEach(item=>{
+					goodsLibrarySpecList.push({
+						goodsCode: '', // 物料编号
+						mainId: '', // 大类id
+						mainName: '', // 大类名称
+						smallId: '', // 小类id
+						smallName: '', // 小类名称
+						specValue: item.specValue, // 商品名称
+						specsName: '', // 规格名称
+						unit: '', // 单位
+						price: item.price, // 销售价格
+						orgPrice: item.orgPrice, // 划线价格
+						costAmount: item.costPrice, // 成本价格
+						shareAmount: item.shareAmount, // 分销金额
+						innerShareAmount: item.innerShareAmount, // 内部分销金额
+						stockNum: '', // 上架库存
+						stockQty: '', // 当前库存
+						imgUrl: item.imgUrl, // 图片
+					})
+				})
+				this.step1Form = {
+					...this.step1Form,
+				  goodsName: res.data.goodsName, // 商品名称
+				  goodsDes: res.data.describeText, // 商品描述
+				  imgUrl: res.data.imgUrl, // 商品主图
+				  videoUrl: res.data.vedio, // 商品视频
+				  images: res.data.imgs?imgs:[], // 轮播图
+				}
+				this.specList = [...this.specList,...goodsLibrarySpecList]
+				this.step3Form.detailContent = res.data.content
+				this.$refs.step1Form.validateField('goodsName')
+			})
+			
+		}
+	},
+	
     // 获取商品分类列表
     async getClassifyList() {
       return new Promise((resolve, reject) => {

+ 2 - 2
src/views/mallManagement/goods/goods_index/index.vue

@@ -480,13 +480,13 @@ export default {
       if(type == 'add') {
         this.$router.push({
           name: 'goods_add',
-          query: {}
+          query: {type}
         })
       }else {
         this.$router.push({
           name: 'goods_add',
           query: {
-            id
+            id,type
           }
         })
       }

+ 24 - 4
src/views/mallManagement/tenancyManagement/tenancyOrder/detail.vue

@@ -335,7 +335,11 @@
 								</el-form-item>
 							</template>
 						</el-table-column>
-						<el-table-column prop="realEndDate" align="center" label="实际到期日期"></el-table-column>
+						<el-table-column prop="realEndDate" align="center" label="实际到期日期">
+							<template slot-scope="scope">
+								{{scope.row.realEndDate?scope.row.realEndDate.substring(0,10):''}}
+							</template>
+						</el-table-column>
 						<el-table-column prop="depositAmount" align="center" label="*押金">
 							<template slot-scope="scope">
 								<el-form-item :prop="'dataList.' + scope.$index + '.depositAmount'"
@@ -377,12 +381,12 @@
 					<el-table-column prop="payValue" label="订金" align="center"></el-table-column>
 					<el-table-column prop="" align="center" label="租赁开始时间">
 						<template slot-scope="scope">
-							{{scope.row.startDate.substring(0,10)}}
+							{{scope.row.startDate?scope.row.startDate.substring(0,10):''}}
 						</template>
 					</el-table-column>
 					<el-table-column prop="" align="center" label="租赁结束时间">
 						<template slot-scope="scope">
-							{{scope.row.endDate.substring(0,10)}}
+							{{scope.row.endDate?scope.row.endDate.substring(0,10):''}}
 						</template>
 					</el-table-column>
 					<el-table-column prop="createBy" align="center" label="操作人"></el-table-column>
@@ -390,6 +394,22 @@
 				</el-table>
 			</div>
 		</el-card>
+		<el-card class="box-card" v-if="formType != 0">
+			<div slot="header" class="clearfix">
+				<span>报修记录</span>
+			</div>
+			<div class="table">
+				<el-table :data="formData.orderBases" element-loading-text="Loading" border fit highlight-current-row
+					stripe>
+					<el-table-column prop="id" label="报修单号" align="center"></el-table-column>
+					<el-table-column prop="createDate" label="提交时间" align="center"></el-table-column>
+					<el-table-column prop="appointmentTime" label="上门时间" align="center"></el-table-column>
+					<el-table-column prop="overDate" label="完工时间" align="center"></el-table-column>
+					<el-table-column prop="updateBy" align="center" label="操作人"></el-table-column>
+					<el-table-column prop="updateTime" align="center" label="操作时间"></el-table-column>
+				</el-table>
+			</div>
+		</el-card>
 		<div class="page-footer">
 			<div class="footer">
 				<el-button v-if="formType == 0" size="small" type="primary" @click="submit()">提交</el-button>
@@ -607,7 +627,7 @@
 						cityObj: {id: res.data.cityId},
 						areaObj: {id: res.data.areaId},
 						streetObj: {id: res.data.streetId},
-						userInfo: res.data.userId?{userId: res.data.userId,userMobile: res.data.userMobile,userName: res.data.userName}:res.data.userMobile
+						userInfo: (res.data.userId && res.data.payType=="LINE")?{userId: res.data.userId,userMobile: res.data.userMobile,userName: res.data.userName}:res.data.userMobile
 					}
 					this.formData3.dataList = res.data.items
 					this.getinitlbslist()

+ 1 - 1
src/views/mallManagement/tenancyManagement/tenancyOrder/index.vue

@@ -59,7 +59,7 @@
 					<el-tab-pane label="全部" name="ALL"></el-tab-pane>
 					<el-tab-pane label="待确认" name="WAIT"></el-tab-pane>
 					<el-tab-pane label="待开始" name="WAIT_START"></el-tab-pane>
-					<el-tab-pane label="租中" name="LEASE"></el-tab-pane>
+					<el-tab-pane label="租中" name="LEASE"></el-tab-pane>
 					<el-tab-pane label="已到期-待回收" name="OVER"></el-tab-pane>
 					<el-tab-pane label="已到期-已回收" name="RECOVER"></el-tab-pane>
 					<el-tab-pane label="已取消" name="CANCEL"></el-tab-pane>

+ 1 - 1
src/views/mallManagement/tenancyManagement/tenancyProduct/detail.vue

@@ -54,7 +54,7 @@
 							</el-form-item>
 						</el-col>
 						<el-col :span="8">
-							<el-form-item label="金价格" prop="depositPrice">
+							<el-form-item label="金价格" prop="depositPrice">
 								<div class="flex">
 									<el-input type="number" style="flex: 1" v-model="formData.depositPrice" oninput="if(value<0) value=0" :disabled="formType==2" placeholder="请输入"></el-input>
 									<span>元</span>