<template>
	<div class="my-container">
		<transition-group name="fade" style="position: relative;width: 100%;display: flex;">
			<div class="bill-left" v-show="isShow==='home'" key="item">
				<div class="bill-tab">
					<div class="bill-title">导航</div>
					<side-tree :propConfig="treeConfig" @onChange="onChangeTree" ref="sideTree" />
				</div>
			</div>
			<div class="bill-main" v-show="isShow==='home'" key="item2">
				<module-view :propConfig="config" ref="moduleView" @pagination="getDataList" @search="getDataList"
					@resert="onRefresh" @clickHandle="clickHandle" @detail="getDetail" @onRefresh="onRefresh" />
			</div>
			<!-- 新增/编辑 -->
			<div class="detil" v-show="isShow==='add'" key="item3">
				<by-tool :propConfig="toolConfig" @clickHandle="insideTools" ref="byTool" />
				<div class="box-shadow">
					<by-form :propConfig="formConfig" ref="form">
						<template v-slot:description>
							<el-input type="textarea" :rows="5" placeholder="请输入内容" v-model="textarea">
							</el-input>
						</template>
						<template v-slot:tags>
							<el-tag style="margin-right: 16px;" :disable-transitions="true" v-for="(item,index) of tagsData"
								:key="index" closable @close="handleClose2(index)">
								{{item}}
							</el-tag>
							<by-input class="input-new-tag" ref="tagsValue" style="width: 150px;"></by-input>
							<el-button class="button-new-tag" @click="getTagsValue">添加</el-button>
						</template>
						<template v-slot:status>
							<el-radio v-model="status" :label="0">启用</el-radio>
							<el-radio v-model="status" :label="1">备用</el-radio>
							<el-radio v-model="status" :label="2">禁用</el-radio>
						</template>
						<template v-slot:ismakeup>
							<el-radio v-model="ismakeup" :label="0">是</el-radio>
							<el-radio v-model="ismakeup" :label="1">否</el-radio>
							<el-button v-show="ismakeup===0" @click="openMakeup">选择商品</el-button>
						</template>
						<template v-slot:makeupTable>
							<div v-if="ismakeup===0">
								<by-table :propConfig="makeupTable" ref="makeupTable"></by-table>
							</div>
						</template>
						<template v-slot:issued>
							<el-radio v-model="issued" :label="0">是</el-radio>
							<el-radio v-model="issued" :label="1">否</el-radio>
						</template>
						<template v-slot:materialSpec>
							<el-radio v-model="materialSpec" :label="0" @input="changeSingle">单规格</el-radio>
							<el-radio v-model="materialSpec" :label="1" @input="changeSingle">多规格</el-radio>
						</template>
						<template v-slot:attributeName>
							<div v-if="isSingle" key="item4">
								<by-table :propConfig="singleTable" @onChangeRow="getInputValue" ref="singeTable">
									<template v-slot:stock="{row}">
										<vxe-input v-if="!isEdit" v-model="row.stock" size="mini" type="integer"></vxe-input>
										<span v-else>{{ row.stock }}</span>
									</template>
								</by-table>
							</div>
							<div v-if="!isSingle" key="item5">
								<el-select :value="selectValue" clearable placeholder="请选择" style="width: 19.5%;"
									@input="getSelectValue">
									<el-option v-for="item in selectList" :key="item.value" :label="item.name" :value="item.id">
									</el-option>
								</el-select>
								<div class="by-tab" key="item6">
									<div v-for="(item,index) of attributeList" :key="index">
										<div class="tab-title">{{item.title}} <i class="el-icon-circle-close"
												@click="closeGroup(index)"></i>
										</div>
										<el-tag class="item-tab" :disable-transitions="true" :key="i" v-for="(tag,i) of item.list" closable
											@close="handleClose(tag,index)">
											{{tag}}
										</el-tag>
										<by-input class="input-new-tag" :ref="'getValue_'+index"></by-input>
										<el-button class="button-new-tag" @click="showInput(index)">添加</el-button>
									</div>

									<div style="margin: 20px 0;" v-if="!isAdd" key="item7">
										<div class="el-button mr15 el-button--primary el-button--small" @click="isAdd=true">添加新规格</div>
									</div>
									<div style="display: flex;margin: 20px 0;" v-else key='item8'>
										<div class="flex-item">
											<label>规格：</label>
											<div class="el-input el-input--small" style="width: 250px;">
												<input type="text" v-model="norms" placeholder="请输入规格" class="el-input__inner">
											</div>
										</div>
										<div class="flex-item">
											<label>规格值：</label>
											<div class="el-input el-input--small" style="width: 250px;">
												<input type="text" v-model="normsValue" placeholder="请输入规格值" class="el-input__inner">
											</div>
										</div>
										<div @click="doComfirm" class="el-button el-button--primary el-button--small">确定</div>
										<div @click="isAdd=false" class="el-button el-button--danger el-button--small">取消</div>
									</div>
									<div>
										<by-table :propConfig="tableConfig" @onChangeRow="getInputValue" ref="table">
											<template v-slot:stock="{row}">
												<vxe-input v-if="!isEdit" v-model="row.stock" size="mini" type="integer"></vxe-input>
												<span v-else>{{ row.stock }}</span>
											</template>
										</by-table>
									</div>
								</div>
							</div>
						</template>
					</by-form>
				</div>
			</div>
		</transition-group>
		<!-- 选择物料 -->
		<productModal ref="product" :mulit="true" @confirm="confirmProduct" />
		<!-- <productDialog ref="product" :mulit="true" @confirm="confirmProduct" /> -->
	</div>
</template>
<script lang="ts">
	import { Component, Prop, Vue, Watch } from "vue-property-decorator";
	import api from '@/api/currency'
	import other from '@/api/other'
	import ForTab from "@/components/ForTab/index.vue";
	import productModal from "../orderTask/components/productModal.vue";
	import brandType from "./components/brandType.vue";
	@Component({ components: { ForTab, productModal, brandType } })
	export default class productManagement extends Vue {
		tagsData : any = [] // 标签值
		isShow = 'home'
		isEdit = true
		editInfo : any = ''
		isSingle : any = true
		timeNum = 0;
		timer : any = null
		materialSpec : any = 0
		status : any = 0
		ismakeup : any = 1
		issued : any = 0
		textarea : any = ''
		categoryIds : any = ''
		selectList = []
		selectValue = ''
		// tab
		singeTable : any = ''
		setTableConfig : any = ''
		towTable : any = ''
		attributeList : any = [] // 物料属性规格
		inputValue : any = ''
		norms : any = ''
		normsValue : any = ''
		isAdd : any = false
		skuRuleList : any = ''
		tableList : any = ''
		attributeId : any = ''
		intercept : any = ''
		makeupList : any = [] // 组合商品列表
		// tab
		toolConfig = {
			tools: {
				return: true,
				save: true,
			}
		}
		treeConfig = {
			attr: {
				retConfig: {
					id: 'id',
				},
				defaultExpandAll: true,
				label: 'name',
				resType: 'data'
			},
			request: {
				url: '/maindata/maindataMaterialCategory/treeUseList',
				method: 'GET'
			}
		}
		singleTable : any = {
			attr: {
				size: 'mini',
				align: 'center',
			},
			columns: [
				{
					width: '150px',
					title: '标题',
					field: 'skuTitle',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '120px',
					title: '副标题',
					field: 'skuSubtitle',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '140px',
					title: '物料编码',
					field: 'skuCode',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '140px',
					title: '财务编号',
					field: 'accountingCode',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '90px',
					title: '价格',
					field: 'price',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
							defaultValue: 0
						},
					}
				},
				{
					width: '90px',
					title: '单位',
					field: 'unit',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
						},
					}
				},
				{
					width: '90px',
					title: '单位编码',
					field: 'unitCode',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
						},
					}
				},
				{
					width: '90px',
					title: '库存',
					field: 'stock',
					slot: true,
				},
				{
					width: '110px',
					title: '保质期（天）',
					field: 'shelfLife',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "integer",
						},
					}
				},
				{
					width: '90px',
					title: '重量/g',
					field: 'weight',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '90px',
					title: '长/cm',
					field: 'length',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '90px',
					title: '宽/cm',
					field: 'width',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '90px',
					title: '高/cm',
					field: 'height',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '90px',
					title: '体积/cm³',
					field: 'volume',
				},
			]
		}
		tableConfig : any = {
			attr: {
				size: 'mini',
				align: 'left',
			},
			columns: [
				{
					width: '160px',
					title: '标题',
					field: 'skuTitle',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '120px',
					title: '副标题',
					field: 'skuSubtitle',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '140px',
					title: '物料编码',
					field: 'skuCode',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '140px',
					title: '财务编号',
					field: 'accountingCode',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' '
						},
					}
				},
				{
					width: '80px',
					title: '价格',
					field: 'price',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '80px',
					title: '单位',
					field: 'unit',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
						},
					}
				},
				{
					width: '80px',
					title: '单位编码',
					field: 'unitCode',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
						},
					}
				},
				{
					width: '80px',
					title: '库存',
					field: 'stock',
					slot: true,
				},
				{
					width: '100px',
					title: '保质期（天）',
					field: 'shelfLife',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '80px',
					title: '重量/g',
					field: 'weight',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '80px',
					title: '长/cm',
					field: 'length',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '80px',
					title: '宽/cm',
					field: 'width',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '80px',
					title: '高/cm',
					field: 'height',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							placeholder: ' ',
							type: "number",
						},
					}
				},
				{
					width: '80px',
					title: '体积/cm³',
					field: 'volume',
				},
				{
					width: '80px',
					title: '操作',
					action: true,
					plugins: [{
						icon: 'el-icon-delete',
						name: '删除',
						audit: '',
						event: {
							click: (item : any) => {
								(this as any).doDeleteTable(item)
							}
						}
					}]
				}
			]
		}
		makeupTable : any = {
			attr: {
				size: 'mini',
				align: 'center',
			},
			columns: [
				{
					width: '170px',
					title: '标题',
					field: 'title',
				},
				{
					width: '170px',
					title: '副标题',
					field: 'subtitle',
				},
				{
					width: '170px',
					title: '数量',
					field: 'number',
					component: 'by-input',
					compConfig: {
						attr: {
							size: 'mini',
							defaultValue: '1',
							type: 'number'
						},
					}
				},
				{
					width: 120,
					title: '操作',
					action: true,
					plugins: [{
						name: '删除',
						event: {
							click: (item : any) => (this as any).deleteMakeup(item)
						}
					}]
				}
			]
		}
		formConfig = {
			attr: {
				size: 'medium',
				rules: {
					name: [{
						required: true, message: '请输入名称', trigger: 'blur'
					}],
					basePrice: [{
						required: true, message: '请输入基本售价', trigger: 'blur'
					}],
					categoryName: [{
						required: true, message: '请选择物料分类', trigger: 'change'
					}],
					brandId: [{
						required: true, message: '请选择物料品牌', trigger: 'change'
					}],
				}
			},
			columns: [
				[
					{
						span: 6,
						label: '名称',
						prop: 'name',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入名称',
								clearable: true
							}
						}
					},
					{
						span: 6,
						label: '简称',
						prop: 'shortName',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入简称',
								clearable: true
							}
						}
					},
					{
						span: 6,
						label: '物料编码',
						prop: 'materialCode',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入物料编码',
							}
						}
					},
					{
						span: 6,
						label: '货号',
						prop: 'itemNumber',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入货号',
								clearable: true
							}
						}
					},
				],
				[
					{
						span: 6,
						label: '基本售价',
						prop: 'basePrice',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入基本售价',
								type: 'number'
							}
						}
					},
					{
						span: 6,
						label: '市场价格',
						prop: 'markPrice',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入市场价格',
								type: 'number'
							}
						}
					},
					{
						span: 6,
						label: '国际码',
						prop: 'nsCode',
						component: 'by-input',
						compConfig: {
							attr: {
								placeholder: '请输入国际码',
								clearable: true
							}
						}
					},
				],
				[
					{
						span: 6,
						label: '物料分类',
						prop: 'categoryName',
						component: 'select-tree',
						compConfig: {
							attr: {
								label: 'name',
								clearable: true,
								retConfig: {
									categoryName: 'name',
									categoryId: 'id'
								},
								defaultExpandAll: true
							},
							request: {
								url: '/maindata/maindataMaterialCategory/treeUseList'
							}
						}
					},
					{
						span: 6,
						label: '物料品牌',
						prop: 'brandId',
						component: brandType,
					},
					{
						span: 6,
						label: '虚拟分类',
						prop: 'vmCategoryName',
						component: 'select-tree',
						compConfig: {
							attr: {
								label: 'name',
								clearable: true,
								retConfig: {
									vmCategoryName: 'name',
									vmCategoryId: 'id'
								},
								defaultExpandAll: true
							},
							request: {
								url: '/maindata/maindataMaterialVmcategory/treeUseList'
							}
						}
					},
					{
						labelWidth: '116px',
						span: 6,
						label: '机构商品分类',
						prop: 'organizationCategoryName',
						component: 'select-tree',
						compConfig: {
							attr: {
								label: 'name',
								clearable: true,
								retConfig: {
									organizationCategoryName: 'name',
									organizationCategoryId: 'id'
								},
								defaultExpandAll: true
							},
							request: {
								url: '/maindata/maindataMaterialOrganizationCategory/treeUseList'
							}
						}
					},
				],
				[
					{
						span: 30,
						label: '描述',
						slot: true,
						prop: 'description',
					}
				],
				[
					{
						span: 20,
						label: '标签',
						slot: true,
						prop: 'tags',
					}
				],
				[
					{
						span: 20,
						label: '物料状态',
						slot: true,
						prop: 'status',
					}
				],
				[
					{
						span: 20,
						label: '组合商品',
						slot: true,
						prop: 'ismakeup',
					}
				],
				[
					{
						span: 30,
						label: '',
						slot: true,
						prop: 'makeupTable',
					}
				],
				[
					{
						span: 20,
						label: '是否公布',
						slot: true,
						prop: 'issued',
					}
				],
				[
					{
						span: 20,
						label: '商品规格',
						slot: true,
						prop: 'materialSpec',
					}
				],
				[
					{
						span: 30,
						label: '物料属性',
						slot: true,
						prop: 'attributeName',
					}
				],
			],

		}
		config : any = {
			attr: {
				calculateH: true
			},
			search: {
				attr: {
					size: 'mini'
				},
				columns: [
					[
						{
							span: 6,
							label: '名称',
							prop: 'name',
							component: 'by-input',
							labelWidth: '70px',
							compConfig: {
								attr: {
									placeholder: '请输入名称',
									clearable: true
								}
							},
						}, {
							span: 6,
							label: '简称',
							prop: 'shortName',
							component: 'by-input',
							labelWidth: '70px',
							compConfig: {
								attr: {
									placeholder: '请输入简称',
									clearable: true
								}
							}
						},
						{
							span: 6,
							label: '货号',
							prop: 'itemNumber',
							component: 'by-input',
							labelWidth: '70px',
							compConfig: {
								attr: {
									placeholder: '请输入货号',
									clearable: true
								}
							}
						},
					],
				]
			},
			tool: {
				tools: {
					add: true,
					delete: true,
					search: true,
					refresh: true,
				},
				// customTools: [
				// 	{
				// 		name: '同步到财务系统', icon: 'el-icon-top', audit: [''], event: {
				// 			click: () => {
				// 				(this as any).syncSystem()
				// 			}
				// 		}
				// 	},
				// ]
			},
			table: {
				attr: {
					size: 'mini',
					align: 'left',
					checkbox: true,
				},
				columns: [{
					width: 250,
					title: '名称',
					field: 'name',
					isDetail: true,
				}, {
					width: 200,
					title: '简称',
					field: 'shortName'
				}, {
					width: 200,
					title: '货号',
					field: 'itemNumber'
				}, {
					width: 200,
					title: '国际码',
					field: 'nsCode'
				}, {
					width: 90,
					title: '基本售价',
					field: 'basePrice'
				}, {
					width: 90,
					title: '市场价格', // （市场价格统一售价）
					field: 'markPrice'
				},
				{
					width: 120,
					title: '操作',
					action: true,
					plugins: [{
						icon: 'el-icon-edit',
						name: '编辑',
						audit: '',
						event: {
							click: (item : any) => {
								(this as any).getDetail(item)
							}
						}
					}, {
						name: '删除',
						event: {
							click: (item : any) => (this as any).doDelete2(item)
						}
					}]
				}]
			},
		}
		mounted() {
			this.getAttribute()
			this.timer = setInterval(() => {
				this.getDataList()
			}, 500)
		}
		// 确定商品新增
		confirmProduct(e : any) {
			console.log(e);
			this.$nextTick(() => {
				let nowData = (this.$refs.makeupTable as any).getValue();
				let names = '';
				if (e.length > 0) {
					for (const item of e) {
						let t = true;
						for (const t_item of nowData) {
							if (item.id == t_item.materialSkuId) {
								if (!names) {
									names = item.skuTitle
								} else {
									names = names + ',' + item.skuTitle
								}
								t = false;
								break;
							}
						}
						if (t) {
							let obj : any = {};
							obj.title = item.skuTitle
							obj.subtitle = item.skuSubtitle
							obj.materialSkuId = item.id
							obj.isDeleted = 0
							this.makeupList.push(obj);
							nowData.push(obj);
						}
					};
					(this as any).$refs.makeupTable.setValue(nowData) // 设置表格数据
					if (names) {
						this.$alert('商品 “' + names + '”已存在！', '提示', {
							confirmButtonText: '确定',
						});
					}
				}
			})
		}
		//点击树获取数据
		onChangeTree(e : any) {
			this.categoryIds = e.id;
			let loading = this.$loading({ target: '.main-container' });
			api.byCategoryPage({ categoryId: e.id }, 'maindataMaterialCategory').then((res : any) => {
				loading.close();
				if (res.code === 200) {
					(this.$refs.moduleView as any).setTableValue(res.data.records);
					let page = {
						pageNo: res.data.current, //当前页
						pageSize: res.data.size, //每页条数
						total: res.data.total //总条数
					};
					(this.$refs.moduleView as any).setPage(page);
				}
			}).catch(() => loading.close());
		}
		// 保存编辑/新增
		doFormData() {
			(this as any).$refs.form.validate().then(() => {
				let query = (this as any).$refs.form.getValue();
				console.log('物料信息 ==> ', query);
				query.materialSpec = this.materialSpec; // 商品规格
				query.attributeList = JSON.stringify(this.attributeList) // 物料属性
				query.attributeId = this.attributeId // 物料属性ID
				query.status = this.status; // 物料状态
				query.tags = this.tagsData.join(","); // 标签
				query.ismakeup = this.ismakeup; // 商品组合
				query.issued = this.issued; // 是否公布
				query.description = this.textarea; // 备注
				let data : any = {}
				// 多规格
				if (query.materialSpec === 1) {
					if (this.tableList.length <= 0 || this.attributeList.length <= 0) return (this as any).$message.warning('多规格商品，物料属性不能为空！');

					console.log('多规格表格数据 ==> ', this.tableList);
					for (let v of this.tableList) {
						if (!v.price) return this.$message.warning('物料价格必填');
						if (parseInt(v.price) <= 0) return this.$message.warning('物料价格不能小于1');
						if (!v.unit) return this.$message.warning('物料单位必填');
						if (!v.stock) return this.$message.warning('物料库存必填');
						if (parseInt(v.stock) <= 0) return this.$message.warning('物料库存必须为自然数');
						if (!v.shelfLife) return this.$message.warning('物料保质期必填');
						if (parseInt(v.shelfLife) <= 0) return this.$message.warning('物料保质期必须为自然数');
						if (!v.weight) return this.$message.warning('物料重量必填');
						if (parseInt(v.weight) <= 0) return this.$message.warning('物料重量不能小于1');
						if (!v.length) return this.$message.warning('物料长必填');
						if (parseInt(v.length) <= 0) return this.$message.warning('物料长不能小于1');
						if (!v.width) return this.$message.warning('物料宽必填');
						if (parseInt(v.width) <= 0) return this.$message.warning('物料宽不能小于1');
						if (!v.height) return this.$message.warning('物料高必填');
						if (parseInt(v.height) <= 0) return this.$message.warning('物料高不能小于1');
					};
					data = { maindataMaterialReceiveParam: query, maindataMaterialSkus: this.tableList }
					let newArray : any = []
					let materialSpecData : any = []
					let attributeLength = this.attributeList.length
					this.tableList.map((v : any) => {
						for (let kyes in v) {
							if (kyes.indexOf('_field_name') != -1) {
								let key = kyes.split('_field_name')[0]
								newArray.push({ [key]: v[kyes] })
							}
						}
					})
					// console.log('newArray ==> ',newArray);
					for (var i = 0; i < newArray.length; i += attributeLength) {
						materialSpecData.push(newArray.slice(i, i + attributeLength));
					}
					// console.log('materialSpecData ==> ', materialSpecData);
					data.maindataMaterialSkus.map((v : any, i : any) => {
						if (materialSpecData[i]) v.materialSpec = JSON.stringify(materialSpecData[i])
					})
				} else { // 单规格
					data = { maindataMaterialReceiveParam: query, maindataMaterialSkus: (this.$refs.singeTable as any).getValue() }
					// console.log('单规格表格数据 ==> ', data.maindataMaterialSkus);
					for (let v of data.maindataMaterialSkus) {
						if (!v.price) return this.$message.warning('物料价格必填');
						if (parseInt(v.price) <= 0) return this.$message.warning('物料价格不能小于1');
						if (!v.unit) return this.$message.warning('物料单位必填');
						if (!v.stock) return this.$message.warning('物料库存必填');
						if (parseInt(v.stock) <= 0) return this.$message.warning('物料库存必须为自然数');
						if (!v.shelfLife) return this.$message.warning('物料保质期必填');
						if (parseInt(v.shelfLife) <= 0) return this.$message.warning('物料保质期必须为自然数');
						if (!v.weight) return this.$message.warning('物料重量必填');
						if (parseInt(v.weight) <= 0) return this.$message.warning('物料重量不能小于1');
						if (!v.length) return this.$message.warning('物料长必填');
						if (parseInt(v.length) <= 0) return this.$message.warning('物料长不能小于1');
						if (!v.width) return this.$message.warning('物料宽必填');
						if (parseInt(v.width) <= 0) return this.$message.warning('物料宽不能小于1');
						if (!v.height) return this.$message.warning('物料高必填');
						if (parseInt(v.height) <= 0) return this.$message.warning('物料高不能小于1');
					};
					data.maindataMaterialSkus[0].isDeleted = 0;
					data.maindataMaterialReceiveParam.attributeList = ""
				}
				if (this.ismakeup === 0) {
					console.log('this.makeupList ==> ', this.makeupList);
					if (this.makeupList.length <= 0) return this.$message.warning('请选择组合商品');
					data.maindataMaterialLinks = this.makeupList;
					// 表格删除
					data.maindataMaterialLinks.map((v : any, i : any) => {
						if (v.isDeleted === 1 && !v.id) {
							data.maindataMaterialLinks.splice(i, 1)
						}
					});
				}
				console.log('data ==> ', data);
				let loading = this.$loading({ target: '.main-container' });
				if (this.isEdit) { // 编辑
					api.updateList(data, 'maindataMaterial').then((res : any) => {
						loading.close()
						if (res.code === 200) {
							this.isShow = 'home';
							(this as any).$refs.sideTree.request();
							this.getDataList();
							this.$message.success('保存成功');
						}
					}).catch(() => loading.close());
				} else {// 新增
					api.saveList(data, 'maindataMaterial').then((res : any) => {
						loading.close()
						if (res.code === 200) {
							this.isShow = 'home';
							(this as any).$refs.sideTree.request();
							this.getDataList();
							this.$message.success('保存成功');
						}
					}).catch(() => loading.close());
				}

			});
		}
		// 打开新增
		onAdd() {
			this.isShow = 'add'; // 展示类型
			this.selectValue = '' // 物料属性名称
			this.towTable = '' // 表格数据
			this.textarea = '' // 描述
			this.tagsData = [] // 标签
			this.attributeList = [] // 属性规格
			this.tableList = [] // 表格数据
			this.materialSpec = 0; // 单规格
			this.status = 0; // 物料状态
			this.ismakeup = 1; // 商品组合
			this.makeupList = [] // 组合商品列表
			this.issued = 0; // 是否公布
			this.isSingle = true; // 显示单表格
			this.isEdit = false; // 是否编辑
			(this as any).$refs.byTool.setTool({ return: true, save: true });
			this.$nextTick(() => {
				(this as any).$refs.form.setValue(); // 设置表单数据
				(this as any).$refs.singeTable.setValue([{}]) // 设置单表格数据
			});
		}
		// 打开编辑
		getDetail(e : any) {
			console.log('编辑 ==> ', e);
			(this as any).$refs.byTool.setTool({ return: true, save: true, delete: true });
			let loading = this.$loading({ target: '.my-container' });
			api.single({ id: e.id }, 'maindataMaterial').then((v : any) => {
				let data = v.data;
				if (data.vmCategoryId) {
					api.single({ id: data.vmCategoryId }, 'maindataMaterialVmcategory').then((res : any) => {
						if (res.code === 200) {
							if (res.data) data.vmCategoryName = res.data.name;
						}
					}).catch(() => loading.close());
				}
				if (data.organizationCategoryId) {
					api.single({ id: data.organizationCategoryId }, 'maindataMaterialOrganizationCategory').then((res : any) => {
						if (res.code === 200) {
							if (res.data) data.organizationCategoryName = res.data.name;
						}
					}).catch(() => loading.close());
				}
				if (data.categoryId) {
					api.single({ id: data.categoryId }, 'maindataMaterialCategory').then((res : any) => {
						if (res.code === 200) data.categoryName = res.data.name;
						if (data.attributeId) {
							api.single({ id: data.attributeId }, 'maindataMaterialAttribute').then((p : any) => {
								if (p.code === 200) {
									if (p.data) this.selectValue = p.data.name
								}
							}).catch(() => loading.close());
						}
						this.intercept = data.attributeId // 拦截物料属性判断
						this.isEdit = true;
						this.editInfo = data;
						this.isShow = 'add';
						// 标签
						if (data.tags) {
							this.tagsData = data.tags.split(",")
						} else this.tagsData = [];
						this.materialSpec = data.materialSpec
						this.isSingle = data.materialSpec === 0 ? true : false;
						if (data.attributeList) this.attributeList = JSON.parse(data.attributeList);
						other.selectByMaterialId({ id: data.id }, 'maindataMaterialSku').then((info : any) => {
							if (info.code === 200) {
								this.status = data.status
								console.log(data.ismakeup);
								this.ismakeup = data.ismakeup
								if (data.ismakeup === 0 && data.maindataMaterialLinks.length > 0) {
									(this as any).makeupList = data.maindataMaterialLinks;
									setTimeout(() => {
										(this as any).$refs.makeupTable.setValue(data.maindataMaterialLinks) // 设置组合表格数据
									})
								}
								this.issued = data.issued
								if (this.isSingle) {
									this.selectValue = '' // 物料属性名称
									this.towTable = '' // 表格数据
									this.attributeList = []; // 属性规格
									this.$nextTick(() => {
										(this as any).$refs.singeTable.setValue(info.data);
									});
								} else {
									this.forFun(this.attributeList[0], 0) // 生成sku
									let tableConfig = (this as any).$lodash.cloneDeep(this.tableConfig);
									let skuRuleList = (this as any).$lodash.cloneDeep(this.skuRuleList);
									let newColumns = (this as any).$lodash.cloneDeep(this.attributeList).reverse();
									info.data.map((v : any, i : any) => {
										v = Object.assign(v, skuRuleList[i])
										v.dataIndex = i
									});
									newColumns.map((v : any) => {
										tableConfig.columns.unshift({
											width: '80px',
											title: v.title,
											field: v.field,
										})
									});
									this.tableList = (this as any).$lodash.cloneDeep(info.data);
									// console.log('表格配置 ==> ', tableConfig);
									console.log('skuRuleList ==> ', skuRuleList);
									console.log('表格数据 ==> ', this.tableList);
									this.setTableConfig = tableConfig;
									this.$nextTick(() => {
										(this as any).$refs.table.setConfig(tableConfig); // 设置表格配置
										(this as any).$refs.table.setValue(this.tableList) // 设置表格数据
									});
								}
							}
							(this as any).$refs.form.setValue(data)
							loading.close()
						}).catch(() => loading.close());
					}).catch(() => loading.close());
				}

			}).catch(() => loading.close());
		}
		// 同步到财务系统
		syncSystem() {

		}
		// 立即生成
		generateNow() {
			this.forFun(this.attributeList[0], 0) // 生成sku
			let newArray : any = []
			let materialSpecData : any = []
			let attributeLength = this.attributeList.length
			let tableConfig = (this as any).$lodash.cloneDeep(this.tableConfig);
			let skuRuleList = (this as any).$lodash.cloneDeep(this.skuRuleList);
			let newColumns = (this as any).$lodash.cloneDeep(this.attributeList).reverse();
			let tableList = (this as any).$refs.table.getValue();
			tableList.map((v : any) => {
				for (let key in v) {
					if (key.indexOf('_field_name') != -1) {
						delete v[key]
					}
				}
			})
			skuRuleList.map((v : any) => {
				for (let kyes in v) {
					if (kyes.indexOf('_field_name') != -1) {
						let key = kyes.split('_field_name')[0]
						newArray.push({ [key]: v[kyes] })
					}
				}
			})
			// console.log('skuRuleList ==> ', skuRuleList);
			for (var i = 0; i < newArray.length; i += attributeLength) {
				materialSpecData.push(newArray.slice(i, i + attributeLength));
			}
			// console.log('materialSpecData ==> ', materialSpecData);
			skuRuleList.map((v : any, i : any) => {
				v.materialSpec = JSON.stringify(materialSpecData[i]);
				v.dataIndex = i;
				v.isDeleted = 0;
				if (tableList[i] && v.materialSpec.indexOf(tableList[i].materialSpec != -1)) {
					v = Object.assign(v, tableList[i])
				};
			})
			newColumns.map((v : any) => {
				tableConfig.columns.unshift({
					width: '80px',
					title: v.title,
					field: v.field,
				})
			});
			console.log('旧表格数据 ==> ', tableList);
			console.log('新表格数据 ==> ', skuRuleList);
			this.tableList = skuRuleList;
			this.setTableConfig = tableConfig;
			this.$nextTick(() => {
				(this as any).$refs.table.setConfig(tableConfig); // 设置表格配置
				(this as any).$refs.table.setValue(this.tableList); // 设置表格数据
			});
		}
		// 更换物料属性数据
		getSelectValue(e : any) {
			if (this.intercept === e) return console.log('拦截!');
			this.$confirm('确定更换物料属性吗？确定之后原表格数据会被清除', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				api.single({ id: e }, 'maindataMaterialAttribute').then((res : any) => {
					if (res.code === 200) {
						this.selectList.map((v : any) => {
							if (v.id === e) {
								v.id = e
								this.selectValue = v.name
							}
						});
						this.intercept = e
						this.attributeList = JSON.parse(res.data.attributeValue);
						this.attributeId = e
						this.forFun(this.attributeList[0], 0) // 生成sku
						let tableConfig = (this as any).$lodash.cloneDeep(this.tableConfig);
						let skuRuleList = (this as any).$lodash.cloneDeep(this.skuRuleList);
						let newColumns = (this as any).$lodash.cloneDeep(this.attributeList).reverse();
						let giveInfo = (this as any).$refs.form.getValue();
						skuRuleList.map((v : any, i : any) => {
							v.dataIndex = i;
							v.isDeleted = 0;
							v.skuTitle = giveInfo.name;
							v.skuSubtitle = giveInfo.shortName;
							v.price = giveInfo.basePrice
						})
						newColumns.map((v : any) => {
							tableConfig.columns.unshift({
								width: '80px',
								title: v.title,
								field: v.field,
							})
						});
						console.log('表格配置 ==> ', tableConfig);
						console.log('表格数据 ==> ', skuRuleList);
						this.setTableConfig = tableConfig;
						this.tableList = skuRuleList;
						this.$nextTick(() => {
							(this as any).$refs.table.setConfig(tableConfig); // 设置表格配置
							(this as any).$refs.table.setValue(skuRuleList); // 设置表格数据
						});
					}
				})
			}).catch(() => { });
		}
		// 切换组合商品
		openMakeup() {
			(this.$refs.product as any).setShow(true); // 打开sku弹窗
		}
		// 切换商品规格
		changeSingle() {
			if (this.isSingle) {
				if ((this as any).$refs.singeTable) this.singeTable = (this as any).$refs.singeTable.getValue()
				this.isSingle = false;
				this.$nextTick(() => {
					// 设置表格数据
					if (this.towTable) {
						if ((this as any).$refs.table) {
							this.tableList = this.towTable;
							(this as any).$refs.table.setConfig(this.setTableConfig); // 设置表格配置
							(this as any).$refs.table.setValue(this.towTable); // 设置表格数据
						}
					}
				});
			} else {
				if ((this as any).$refs.table) this.towTable = (this as any).$refs.table.getValue()
				this.isSingle = true;
				this.$nextTick(() => {
					// 设置单表格数据
					if (this.singeTable) {
						console.log('单表格数据 ==> ', this.singeTable);
						(this as any).$refs.singeTable.setValue(this.singeTable);
					} else (this as any).$refs.singeTable.setValue([{}]);
				});
			}
		}
		// 添加规格
		showInput(index : any) {
			this.$confirm('确定添加吗！确定后将可能影响原表格数据', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				let inputValue = (this as any).$refs['getValue_' + index][0].getValue();
				if (!inputValue) return (this as any).$message.warning('请输入内容');
				if (!/^\S*$/.test(inputValue)) return (this as any).$message.warning('输入内容不能有空格');
				if (this.attributeList[index].list.indexOf(inputValue) !== -1) return (this as any).$refs['getValue_' + index][0].clearValue();
				if (inputValue) {
					this.attributeList[index].list.push(inputValue);
				}
				(this as any).$refs['getValue_' + index][0].clearValue();
				this.generateNow();
				this.$message.success('添加成功');
			}).catch(() => this.$message.info('已取消添加'));
		}
		// 添加sku规格
		doComfirm() {
			if (!this.normsValue || !this.norms) return (this as any).$message.warning('请添加完整的规格');
			if (!/^\S*$/.test(this.normsValue) || !/^\S*$/.test(this.norms)) return this.$message.warning('输入内容不能有空格');
			this.$confirm('确定添加吗！确定后将可能影响原表格数据', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				let obj : any = {
					title: this.norms,
					field: this.norms + '_field_name',
					list: [this.normsValue]
				};
				this.attributeList.push(obj);
				this.norms = '';
				this.normsValue = '';
				this.isAdd = false;
				this.generateNow();
				this.$message.success('添加成功');
			}).catch(() => this.$message.info('已取消添加'));
		}
		// 监听表格数据
		getInputValue(e : any) {
			// console.log('监听表格 ==> ', e);
			if (e.length && e.width && e.height) {
				e.volume = (e.length * e.width * e.height).toFixed(2);
			}
		}
		// 排序生成
		forFun(data : any, i : number, v ?: any) {
			if (data.list) {
				let d : Array<any> = [];
				data.list.forEach((item : any) => {
					if (i == 0) { // 第一次循环
						let obj : any = {}
						obj[data.field] = item
						d.push(obj);
					} else {
						v.forEach((ele : any) => {
							let obj : any = {};
							obj = (this as any).$lodash.clone(ele);
							obj[data.field] = item
							d.push(obj);
						});
					}
				});
				i++
				if (this.attributeList[i]) {
					this.forFun(this.attributeList[i], i, d);
				}
				else {
					this.skuRuleList = d;
				}
			}
		}
		// 添加标签
		getTagsValue() {
			let value = (this as any).$refs.tagsValue.getValue().trim();
			if (!value) return this.$message.warning('请输入标签值');
			this.tagsData.push(value);
			(this as any).$refs.tagsValue.clearValue();
		}
		// 删除标签
		handleClose2(index : any) {
			this.$confirm('确定删除吗！', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				this.tagsData.splice(index, 1)
				this.$message.success('删除成功');
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 删除标签
		handleClose(tag : any, index : any) {
			this.$confirm('确定删除吗！确定后将可能影响原表格数据', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				this.attributeList[index].list.splice(this.attributeList[index].list.indexOf(tag), 1);
				this.generateNow();
				this.$message.success('删除成功');
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 删除数组
		closeGroup(index : any) {
			this.$confirm('确定删除吗！确定后将可能影响原表格数据', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				this.attributeList.splice(index, 1);
				this.generateNow();
				this.$message.success('删除成功');
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 删除表格数据
		doDeleteTable(item : any) {
			this.$confirm('确定删除吗！', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				console.log(this.tableList);
				(this as any).tableList.map((v : any) => {
					if (v.dataIndex === item.dataIndex) v.isDeleted = 1;
				})
				let filterList = this.tableList.filter((v : any) => v.isDeleted !== 1);
				(this as any).$refs.table.setValue(filterList); // 设置表格数据
				this.$message.success('删除成功');
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 获取物料属性
		getAttribute() {
			api.pageList({}, 'maindataMaterialAttribute').then((res : any) => {
				if (res.code === 200) {
					this.selectList = res.data.records
				} else this.$message.error(res.msg);
			})
		}
		// 获取列表数据
		getDataList() {
			if (!this.$refs.moduleView) {
				if (this.timeNum > 5) {
					clearInterval(this.timer)
				}
				this.timeNum++;
				return
			}
			clearInterval(this.timer)
			let query = (this.$refs.moduleView as any).getQuery();
			if (this.categoryIds) query.categoryIds = this.categoryIds;
			console.log('表单字段 ==> ', query);
			this.getPageList(query)
		}
		getPageList(query : any) {
			let loading = this.$loading({ target: '.main-container' });
			api.pageList(query, 'maindataMaterial').then((res : any) => {
				if (res.code === 200) {
					(this.$refs.moduleView as any).setTableValue(res.data.records);
					let page = {
						pageNo: res.data.current, //当前页
						pageSize: res.data.size, //每页条数
						total: res.data.total //总条数
					};
					(this.$refs.moduleView as any).setPage(page);
					loading.close();
				} else this.$message.error(res.msg);
			})
		}
		// 工具栏方法
		clickHandle(e : any) {
			if (e === 'onAdd') this.onAdd();
			if (e === 'onDelete') this.doDelete();
		}
		// 内页工具栏方法
		insideTools(e : any) {
			console.log(e);
			if (e === 'onReturn') this.isShow = 'home';
			if (e === 'onSave') this.doFormData();
			if (e === 'onDelete') this.pageDelete(this.editInfo);
		}
		// 组合商品删除
		deleteMakeup(item : any) {
			this.$confirm('确定删除吗', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				let data = (this.$refs.makeupTable as any).getValue();// 获取表格数据
				let i = -1;
				let j = -1;
				for (const v of data) {
					i++;
					if (v.id == item.id) {
						break
					}
				};
				for (const v of this.makeupList) {
					j++;
					if (v.id == item.id && item.isDeleted === 0) {
						break
					}
				};
				this.makeupList[j].isDeleted = 1;
				data.splice(i, 1);
				(this.$refs.makeupTable as any).setValue(data);// 设置表格数据
				this.$message.success('删除成功');
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 内页删除
		pageDelete(item : any) {
			this.$confirm('确定删除吗,此操作不能撤销！', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				other.deleteSpuAndSku({ ids: item.id }, 'maindataMaterial').then((res : any) => {
					if (res.code === 200) {
						this.$message.success('删除成功');
						this.isShow = 'home';
						(this as any).$refs.sideTree.request();
						this.getDataList();
					} else this.$message.error(res.msg);
				})
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 工具栏删除
		doDelete() {
			let selectData = (this.$refs.moduleView as any).getSelectData()
			let ids = '';
			if (selectData.length > 0) {
				selectData.map((v : any) => {
					ids += v.id + ','
				})
			} else return this.$message({ type: 'warning', message: '请选择删除数据' })
			ids = ids.slice(0, ids.length - 1);
			this.$confirm('确定删除吗,此操作不能撤销！', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				other.deleteSpuAndSku({ ids: ids }, 'maindataMaterial').then((res : any) => {
					if (res.code === 200) {
						(this as any).$refs.sideTree.request();
						this.getDataList();
						this.$message.success('删除成功');
					} else this.$message.error(res.msg);
				})
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 操作删除
		doDelete2(item : any) {
			this.$confirm('确定删除吗,此操作不能撤销！', '注意', {
				confirmButtonText: '确定',
				cancelButtonText: '取消',
				type: 'warning',
				center: true
			}).then(() => {
				other.deleteSpuAndSku({ ids: item.id }, 'maindataMaterial').then((res : any) => {
					if (res.code === 200) {
						(this as any).$refs.sideTree.request();
						this.getDataList();
						this.$message.success('删除成功');
					} else this.$message.error(res.msg);
				})
			}).catch(() => this.$message.info('已取消删除'));
		}
		// 刷新
		onRefresh() {
			(this as any).$refs.moduleView.clearSearch();
			(this as any).$refs.sideTree.request();
			this.categoryIds = '';
			this.getDataList();
		}
	}
</script>
<style lang="scss" scoped>
	.my-container {
		width: 100%;
		box-sizing: border-box;
		display: flex;
		padding: 16px;

		.bill-left {
			position: relative;
			border-right: solid #EEE 1px;
			padding-right: 16px;
			flex-shrink: 0;
			height: 740px;

			.bill-tab {
				width: 150px;
				height: 100%;
				transition: all .5s;
				overflow: hidden;
			}

			.tab-title {
				font-size: 16px;
				padding-bottom: 16px;
				width: 200px;
			}
		}

		.bill-main {
			width: calc(100% - 16px);
			box-sizing: border-box;
			margin-left: 16px;
			position: relative;
			height: 100%;
			overflow-y: hidden;
		}

		.detil {
			width: 100%;

			.box-shadow {
				box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
				padding: 20px;
				border-radius: 4px;
				border: 1px solid #e6ebf5;
				background-color: #fff;
				overflow: hidden;
				color: #303133;
				-webkit-transition: .3s;
				transition: .3s;
				margin-top: 20px;
			}
		}

		@media screen and (min-width: 1700px) {
			.bill-main {
				min-width: 1450px;
			}
		}
	}
</style>