瀏覽代碼

商品库

pengyh 1 年之前
父節點
當前提交
c5f8b93a05

+ 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>

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

@@ -0,0 +1,169 @@
+<template>
+	<template-page ref="pageRef" :get-list="getList"
+		:table-attributes="tableAttributes" :table-events="tableEvents" :options-evens-group="optionsEvensGroup"
+		:moreParameters="moreParameters" :column-parsing="columnParsing" :operation="operation()":operationColumnWidth="80">
+		<div class="footer">
+			<el-button size="mini" @click="close()">取消</el-button>
+			<el-button size="mini" @click="formConfirm()" type="primary">确定</el-button>
+		</div>
+	</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'
+	export default {
+		components: {
+			TemplatePage
+		},
+		mixins: [operation_mixin],
+		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: 1,
+				isEdit: 0,
+				editSpecImageIdx: 0
+			}
+		},
+		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": this.status })
+					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
+			},
+			// 表格列解析渲染数据更改
+			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() {
+				return this.operationBtn({
+					viewDetail: {
+						btnType: 'text',
+						click: ({ row, index, column }) => {
+							
+						}
+					},
+				})
+			},
+			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])
+			}
+		}
+	}
+</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;
+	}
+</style>

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

@@ -0,0 +1,623 @@
+<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>
+						<el-button size="mini" @click="isShow = true">选择商品</el-button>
+					</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 == 1?'基础信息':stepIndex == 2?'价格库存':stepIndex == 3?'详情内容':''}}</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 == 1">
+											<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" :rules="[{ required: true, message: `请输入商品描述`, trigger: 'blur' }]">
+													<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 == 2">
+											<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 == 3">
+											<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 > 1" size="mini" @click="up()">上一步</el-button>
+						<el-button v-if="stepIndex < 3" 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>
+		<!-- 批量设置模块 -->
+		<el-dialog title="选择商品" :visible.sync="isShow" width="80%" style="" :close-on-click-modal="false" :modal-append-to-body="false">
+		  <detail @selectShop="selectShop"></detail>
+		</el-dialog>
+	</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 detail from './detail'
+	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,detail
+		},
+		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: 1,
+				isEdit: 0,
+				editSpecImageIdx: 0,
+				isShow: false
+			}
+		},
+		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()
+			},
+			selectShop(data){
+				this.isShow = false
+				console.log(data)
+			},
+			// 编辑规格图 - 点击图片
+			editSpecImage(index) {
+			  this.editSpecImageIdx = index;
+			  document.querySelector('.editSpecimage-uploader input').click();
+			},
+			// 表格列解析渲染数据更改
+			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
+			},
+			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(){
+				sync().then(res => {
+					if(res.code == 200){
+						this.$message({ type: 'success', message: `同步成功!` })
+						this.$refs.pageRef.refreshList()
+					}else{
+						this.$message({ type: 'error', message: res.message })
+					}
+				})
+				
+			},
+			// 表格操作列
+			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 = 1
+									this.$message({
+										type: 'success',
+										message: `${this.formDialogTitles[this.formDialogType]}成功!`
+									})
+									cancel('list')
+									this.$refs.pageRef.refreshList()
+								})
+							}else{
+								this.stepIndex = 2
+							}
+						})
+					}else{
+						if(this.formData.goodsLibrarySpecList.length == 0){
+							this.stepIndex = 2
+							this.$message({
+								type: 'warning',
+								message: '请添加规格类型!'
+							})
+						}else if(!this.formData.content){
+							this.stepIndex = 3
+							this.$message({
+								type: 'warning',
+								message: '请输入商品内容详情!'
+							})
+						}else{
+							this.stepIndex = 1
+						}
+					}
+				})
+			}
+		}
+	}
+</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>