| 1 |
- {"remainingRequest":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js??vue-loader-options!C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\product\\productAdd\\index.vue?vue&type=style&index=0&id=4f4fb64e&lang=scss&scoped=true","dependencies":[{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\src\\pages\\product\\productAdd\\index.vue","mtime":1761186792563},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\css-loader\\index.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\loaders\\stylePostLoader.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\postcss-loader\\src\\index.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\sass-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\cache-loader\\dist\\cjs.js","mtime":499162500000},{"path":"C:\\Users\\Administrator\\Desktop\\crmeb5.0\\template\\admin\\node_modules\\vue-loader\\lib\\index.js","mtime":499162500000}],"contextDependencies":[],"result":[{"type":"Buffer","data":"base64:DQpAdXNlICcuL3Byb2R1Y3RBZGQuc2NzcycgYXMgKjsNCg=="},{"version":3,"sources":["index.vue"],"names":[],"mappings":";AA4lEA","file":"index.vue","sourceRoot":"src/pages/product/productAdd","sourcesContent":["<template>\r\n <div class=\"\" id=\"shopp-manager\" v-loading=\"spinShow\">\r\n <pages-header\r\n ref=\"pageHeader\"\r\n :title=\"$route.params.id ? '编辑商品' : '添加商品'\"\r\n :backUrl=\"$routeProStr + '/product/product_list'\"\r\n ></pages-header>\r\n <el-card :bordered=\"false\" shadow=\"never\" class=\"mt16\" :body-style=\"{ padding: '0px 20px' }\">\r\n <el-tabs v-model=\"currentTab\">\r\n <el-tab-pane v-for=\"(item, index) in headTab\" :key=\"index\" :label=\"item.tit\" :name=\"item.name\"></el-tab-pane>\r\n </el-tabs>\r\n <el-form\r\n class=\"formValidate mt20\"\r\n ref=\"formValidate\"\r\n :rules=\"ruleValidate\"\r\n :model=\"formValidate\"\r\n :label-width=\"labelWidth\"\r\n :label-position=\"labelPosition\"\r\n @submit.native.prevent\r\n >\r\n <!-- 基础信息-->\r\n <basic-info\r\n v-show=\"currentTab === '1'\"\r\n :isCai=\"type\"\r\n :formValidate=\"formValidate\"\r\n :goodsType=\"goodsType\"\r\n :treeSelect=\"treeSelect\"\r\n :tileLabelList=\"tileLabelList\"\r\n :progress=\"progress\"\r\n :upload=\"upload\"\r\n :videoIng=\"videoIng\"\r\n @virtualbtn=\"virtualbtn\"\r\n @handleDragStart=\"handleDragStart\"\r\n @handleDragOver=\"handleDragOver\"\r\n @handleDragEnter=\"handleDragEnter\"\r\n @handleDragEnd=\"handleDragEnd\"\r\n @handleRemove=\"handleRemove\"\r\n @modalPicTap=\"modalPicTap\"\r\n @addVideo=\"addVideo\"\r\n @delVideo=\"delVideo\"\r\n @addCate=\"addCate\"\r\n @addGoodsTag=\"addGoodsTag\"\r\n ></basic-info>\r\n\r\n <!-- 规格库存-->\r\n <spec-stock\r\n ref=\"specStock\"\r\n v-show=\"currentTab === '2'\"\r\n :formValidate=\"formValidate\"\r\n :ruleList=\"ruleList\"\r\n :attrs=\"attrs\"\r\n :manyFormValidate=\"manyFormValidate\"\r\n :oneFormValidate=\"oneFormValidate\"\r\n :tableKey=\"tableKey\"\r\n :oneFormBatch=\"oneFormBatch\"\r\n :formDynamic=\"formDynamic\"\r\n :canSel=\"canSel\"\r\n @changeSpec=\"changeSpec\"\r\n @confirm=\"confirm\"\r\n @onMoveSpec=\"onMoveSpec\"\r\n @changeCurrentIndex=\"changeCurrentIndex\"\r\n @handleRemoveRole=\"handleRemoveRole\"\r\n @attrChangeValue=\"attrChangeValue\"\r\n @handleFocus=\"handleFocus\"\r\n @addPic=\"addPic\"\r\n @handleRemove2=\"handleRemove2\"\r\n @attrDetailChangeValue=\"attrDetailChangeValue\"\r\n @handleBlur=\"handleBlur\"\r\n @handleSelImg=\"handleSelImg\"\r\n @handleRemoveImg=\"handleRemoveImg\"\r\n @handleShowPop=\"handleShowPop\"\r\n @createAttr=\"createAttr\"\r\n @handleAddRole=\"handleAddRole\"\r\n @handleSaveAsTemplate=\"handleSaveAsTemplate\"\r\n @batchAdd=\"batchAdd\"\r\n @batchDel=\"batchDel\"\r\n @modalPicTap=\"modalPicTap\"\r\n @changeDefaultSelect=\"changeDefaultSelect\"\r\n @changeDefaultShow=\"changeDefaultShow\"\r\n @addGoodsCoupon=\"addGoodsCoupon\"\r\n @see=\"see\"\r\n @addVirtual=\"addVirtual\"\r\n ></spec-stock>\r\n\r\n <!-- 商品详情-->\r\n <product-detail\r\n v-show=\"currentTab === '3'\"\r\n :contents=\"contents\"\r\n :content=\"content\"\r\n @getEditorContent=\"getEditorContent\"\r\n ></product-detail>\r\n\r\n <!-- 物流设置-->\r\n <logistics-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '4' : false\"\r\n :formValidate=\"formValidate\"\r\n :templateList=\"templateList\"\r\n @logisticsBtn=\"logisticsBtn\"\r\n @addTemp=\"addTemp\"\r\n ></logistics-setting>\r\n\r\n <!-- 会员价/佣金 -->\r\n <price-commission\r\n v-show=\"headTab.length === 7 ? currentTab === '5' : currentTab === '4'\"\r\n :formValidate=\"formValidate\"\r\n :oneFormValidate=\"oneFormValidate\"\r\n :manyFormValidate=\"manyFormValidate\"\r\n :columnsInstall=\"columnsInstall\"\r\n :columnsInstal2=\"columnsInstal2\"\r\n :manyBrokerage.sync=\"manyBrokerage\"\r\n :manyBrokerageTwo.sync=\"manyBrokerageTwo\"\r\n :manyVipPrice.sync=\"manyVipPrice\"\r\n :manyVipDiscount.sync=\"manyVipDiscount\"\r\n @checkAllGroupChange=\"checkAllGroupChange\"\r\n @changeVipPrice=\"changeVipPrice\"\r\n @changeDiscount=\"changeDiscount\"\r\n @brokerageSetUp=\"brokerageSetUp\"\r\n ></price-commission>\r\n\r\n <!-- 营销设置-->\r\n <marketing-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '6' : currentTab === '5'\"\r\n :formValidate=\"formValidate\"\r\n :couponName=\"couponName\"\r\n :dataLabel=\"dataLabel\"\r\n :activity=\"activity\"\r\n @handleClose=\"handleClose\"\r\n @addCoupon=\"addCoupon\"\r\n @openLabel=\"openLabel\"\r\n @closeLabel=\"closeLabel\"\r\n @addLabel=\"addLabel\"\r\n @onchangeTime=\"onchangeTime\"\r\n @handleRemoveRecommend=\"handleRemoveRecommend\"\r\n @changeGoods=\"changeGoods\"\r\n ></marketing-setting>\r\n\r\n <!-- 其他设置-->\r\n <other-setting\r\n v-show=\"headTab.length === 7 ? currentTab === '7' : currentTab === '6'\"\r\n :formValidate=\"formValidate\"\r\n :customBtn.sync=\"customBtn\"\r\n :paramsType=\"paramsType\"\r\n :paramsTypeList=\"paramsTypeList\"\r\n :protectionList=\"protectionList\"\r\n :CustomList=\"CustomList\"\r\n @modalPicTap=\"modalPicTap\"\r\n @changeParamsType=\"changeParamsType\"\r\n @deleteRow=\"deleteRow\"\r\n @handleAddParams=\"handleAddParams\"\r\n @addProtection=\"addProtection\"\r\n @customMessBtn=\"customMessBtn\"\r\n @delcustom=\"delcustom\"\r\n @addcustom=\"addcustom\"\r\n ></other-setting>\r\n\r\n <el-form-item>\r\n <el-button v-if=\"currentTab !== '1'\" v-db-click @click=\"upTab\">上一步</el-button>\r\n <el-button\r\n class=\"submission\"\r\n v-if=\"currentTab !== '7' && formValidate.virtual_type == 0\"\r\n v-db-click\r\n @click=\"downTab\"\r\n >下一步</el-button\r\n >\r\n <el-button\r\n class=\"submission\"\r\n v-if=\"currentTab !== '6' && formValidate.virtual_type != 0\"\r\n v-db-click\r\n @click=\"downTab\"\r\n >下一步</el-button\r\n >\r\n <el-button\r\n type=\"primary\"\r\n class=\"submission\"\r\n v-db-click\r\n @click=\"handleSubmit('formValidate')\"\r\n v-if=\"$route.params.id || currentTab !== '1'\"\r\n >保存</el-button\r\n >\r\n </el-form-item>\r\n </el-form>\r\n <el-dialog :visible.sync=\"modalPic\" width=\"950px\" scrollable title=\"上传商品图\" :close-on-click-modal=\"false\">\r\n <uploadPictures\r\n :isChoice=\"isChoice\"\r\n @getPic=\"getPic\"\r\n @getPicD=\"getPicD\"\r\n :gridBtn=\"gridBtn\"\r\n :gridPic=\"gridPic\"\r\n v-if=\"modalPic\"\r\n ></uploadPictures>\r\n </el-dialog>\r\n <el-dialog\r\n :visible.sync=\"addVirtualModel\"\r\n width=\"720px\"\r\n title=\"添加卡密\"\r\n :show-close=\"true\"\r\n :close-on-click-modal=\"false\"\r\n @closed=\"initVirtualData\"\r\n >\r\n <div class=\"trip\"></div>\r\n <div class=\"type-radio\">\r\n <el-form label-width=\"85px\">\r\n <el-form-item label=\"卡密类型:\">\r\n <el-radio-group v-model=\"disk_type\" size=\"large\">\r\n <el-radio :label=\"1\">固定卡密</el-radio>\r\n <el-radio :label=\"2\">一次性卡密</el-radio>\r\n </el-radio-group>\r\n <div v-if=\"disk_type == 1\">\r\n <div class=\"stock-disk\">\r\n <el-input v-model=\"disk_info\" size=\"large\" type=\"textarea\" :rows=\"4\" placeholder=\"填写卡密信息\" />\r\n </div>\r\n <div class=\"stock-input\">\r\n <!-- <el-input type=\"number\" v-model=\"stock\" size=\"large\" :min='0' placeholder=\"填写库存数量\">\r\n <span slot=\"append\">件</span>\r\n </el-input> -->\r\n <el-input-number :controls=\"false\" :max=\"100000\" :min=\"1\" :step=\"1\" :precision=\"0\" v-model=\"stock\" />\r\n <span class=\"pl10\">件</span>\r\n </div>\r\n </div>\r\n <div class=\"scroll-virtual\" v-if=\"disk_type == 2\">\r\n <div class=\"virtual-data mb10\" v-for=\"(item, index) in virtualList\" :key=\"index\">\r\n <span class=\"mr10 virtual-title\">卡号{{ index + 1 }}:</span>\r\n <el-input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.key\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡号(非必填)\"\r\n ></el-input>\r\n <span class=\"mr10 virtual-title\">卡密{{ index + 1 }}:</span>\r\n <el-input\r\n class=\"mr10\"\r\n type=\"text\"\r\n v-model.trim=\"item.value\"\r\n style=\"width: 150px\"\r\n placeholder=\"请输入卡密\"\r\n ></el-input>\r\n <span class=\"deteal-btn\" v-db-click @click=\"removeVirtual(index)\">删除</span>\r\n </div>\r\n </div>\r\n <div class=\"add-more\" v-if=\"disk_type == 2\">\r\n <el-button class=\"h-33\" type=\"primary\" v-db-click @click=\"handleAdd\">新增</el-button>\r\n <el-upload\r\n class=\"ml10\"\r\n :action=\"cardUrl\"\r\n :data=\"uploadData\"\r\n :headers=\"header\"\r\n :on-success=\"upFile\"\r\n :before-upload=\"beforeUpload\"\r\n >\r\n <el-button>导入卡密</el-button>\r\n </el-upload>\r\n </div>\r\n </el-form-item>\r\n </el-form>\r\n </div>\r\n <span slot=\"footer\" class=\"dialog-footer\">\r\n <el-button v-db-click @click=\"closeVirtual\">取 消</el-button>\r\n <el-button type=\"primary\" v-db-click @click=\"upVirtual\">确 定</el-button>\r\n </span>\r\n </el-dialog>\r\n </el-card>\r\n <freightTemplate\r\n :template=\"template\"\r\n v-on:changeTemplate=\"changeTemplate\"\r\n @addSuccess=\"productGetTemplate\"\r\n ref=\"templates\"\r\n ></freightTemplate>\r\n <add-attr ref=\"addattr\" @getList=\"userSearchs\"></add-attr>\r\n <coupon-list\r\n ref=\"couponTemplates\"\r\n @nameId=\"nameId\"\r\n :couponids=\"formValidate.coupon_ids\"\r\n :updateIds=\"updateIds\"\r\n :updateName=\"updateName\"\r\n ></coupon-list>\r\n <coupon-list ref=\"goodsCoupon\" many=\"one\" :luckDraw=\"true\" @getCouponId=\"goodsCouponId\"></coupon-list>\r\n <!-- 生成淘宝京东表单-->\r\n <el-dialog\r\n :visible.sync=\"modals\"\r\n @closed=\"cancel\"\r\n class=\"Box\"\r\n title=\"复制淘宝、天猫、京东、苏宁、1688\"\r\n :close-on-click-modal=\"false\"\r\n width=\"720px\"\r\n >\r\n <tao-bao ref=\"taobaos\" v-if=\"modals\" @on-close=\"onClose\"></tao-bao>\r\n </el-dialog>\r\n <el-dialog :visible.sync=\"goods_modals\" title=\"商品列表\" footerHide class=\"paymentFooter\" scrollable width=\"1000px\">\r\n <goods-list v-if=\"goods_modals\" ref=\"goodslist\" :ischeckbox=\"true\" @getProductId=\"getProductId\"></goods-list>\r\n </el-dialog>\r\n <!-- 用户标签 -->\r\n <el-dialog\r\n :visible.sync=\"labelShow\"\r\n title=\"请选择用户标签\"\r\n :show-close=\"true\"\r\n width=\"540px\"\r\n :close-on-click-modal=\"false\"\r\n >\r\n <userLabel ref=\"userLabel\" @activeData=\"activeData\" @close=\"labelClose\"></userLabel>\r\n </el-dialog>\r\n <!-- 商品标签 -->\r\n <el-dialog\r\n :visible.sync=\"tagShow\"\r\n title=\"请选择商品标签\"\r\n :show-close=\"true\"\r\n width=\"540px\"\r\n :close-on-click-modal=\"false\"\r\n >\r\n <goodsLabel\r\n ref=\"goodsLabel\"\r\n :defaultLabelList=\"labelList\"\r\n @activeLabel=\"activeLabel\"\r\n @close=\"labelClose\"\r\n ></goodsLabel>\r\n </el-dialog>\r\n </div>\r\n</template>\r\n\r\n<script>\r\nimport userLabel from '@/components/labelList';\r\nimport useLabel from '@/components/goodsLabel/useLabel';\r\nimport goodsLabel from '@/components/goodsLabel';\r\nimport { mapState } from 'vuex';\r\nimport uploadPictures from '@/components/uploadPictures';\r\nimport freightTemplate from '@/components/freightTemplate';\r\nimport couponList from '@/components/couponList';\r\nimport addAttr from '../productAttr/addAttr';\r\nimport goodsList from '@/components/goodsList/index';\r\nimport taoBao from './taoBao';\r\nimport { userLabelAddApi } from '@/api/user';\r\nimport {\r\n productInfoApi,\r\n cascaderListApi,\r\n productAddApi,\r\n generateAttrApi,\r\n productGetRuleApi,\r\n productGetTemplateApi,\r\n productGetTempKeysApi,\r\n checkActivityApi,\r\n productCache,\r\n cacheDelete,\r\n uploadType,\r\n importCard,\r\n productCreateApi,\r\n getProductTypeConfig,\r\n ruleAddApi,\r\n paramListApi,\r\n paramInfoApi,\r\n productProtectionListApi,\r\n productLabelUseListApi,\r\n} from '@/api/product';\r\nimport Setting from '@/setting';\r\nimport { getCookies } from '@/libs/util';\r\nimport { uploadByPieces } from '@/utils/upload'; //引入uploadByPieces方法\r\nimport { isFileUpload, isVideoUpload, arraysEqual } from '@/utils';\r\nimport checkArray from '@/libs/permission';\r\nimport {\r\n GoodsTableHead,\r\n VirtualTableHead,\r\n VirtualTableHead2,\r\n columns2,\r\n columns3,\r\n CustomList,\r\n RuleValidate,\r\n} from './defaultData.js';\r\nimport BasicInfo from './components/BasicInfo.vue';\r\nimport SpecStock from './components/SpecStock.vue';\r\nimport ProductDetail from './components/ProductDetail.vue';\r\nimport LogisticsSetting from './components/LogisticsSetting.vue';\r\nimport PriceCommission from './components/PriceCommission.vue';\r\nimport MarketingSetting from './components/MarketingSetting.vue';\r\nimport OtherSetting from './components/OtherSetting.vue';\r\nimport { formatRichText } from '@/utils/editorImg';\r\n\r\nexport default {\r\n name: 'ProductAdd',\r\n components: {\r\n uploadPictures,\r\n freightTemplate,\r\n addAttr,\r\n couponList,\r\n taoBao,\r\n goodsList,\r\n userLabel,\r\n goodsLabel,\r\n useLabel,\r\n BasicInfo,\r\n SpecStock,\r\n ProductDetail,\r\n LogisticsSetting,\r\n PriceCommission,\r\n MarketingSetting,\r\n OtherSetting,\r\n },\r\n data() {\r\n return {\r\n labelShow: false,\r\n tagShow: false,\r\n dataLabel: [],\r\n headTab: [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '会员价/佣金', name: '5' },\r\n { tit: '营销设置', name: '6' },\r\n { tit: '其他设置', name: '7' },\r\n ],\r\n virtual: [\r\n { tit: '普通商品', id: 0, tit2: '物流发货' },\r\n { tit: '卡密/网盘', id: 1, tit2: '自动发货' },\r\n { tit: '优惠券', id: 2, tit2: '自动发货' },\r\n { tit: '虚拟商品', id: 3, tit2: '虚拟发货' },\r\n ],\r\n seletVideo: 0, //选择视频类型\r\n customBtn: 0, //自定义留言开关\r\n content: '',\r\n contents: '',\r\n fileUrl: Setting.apiBaseURL + '/file/upload',\r\n fileUrl2: Setting.apiBaseURL + '/file/video_upload',\r\n cardUrl: Setting.apiBaseURL + '/file/upload/1',\r\n upload_type: '', //视频上传类型 1 本地上传 2 3 4 OSS上传\r\n uploadData: {}, // 上传参数\r\n header: {},\r\n type: 0,\r\n modals: false,\r\n goods_modals: false,\r\n spinShow: false,\r\n openSubimit: false,\r\n virtualList: [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ],\r\n // 批量设置表格data\r\n oneFormBatch: [\r\n {\r\n pic: '',\r\n price: void 0,\r\n cost: void 0,\r\n ot_price: void 0,\r\n stock: void 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: void 0,\r\n volume: void 0,\r\n virtual_list: [],\r\n },\r\n ],\r\n\r\n // 规格数据\r\n formDynamic: {\r\n attrsName: '',\r\n attrsVal: '',\r\n },\r\n disk_type: 1, //卡密类型\r\n tabIndex: 0,\r\n tabName: '',\r\n formDynamicNameData: [],\r\n isBtn: false,\r\n columns2: columns2,\r\n columns3: columns3,\r\n columns: [],\r\n columnsInstall: [],\r\n columnsInstal2: [],\r\n gridPic: {\r\n xl: 6,\r\n lg: 8,\r\n md: 12,\r\n sm: 12,\r\n xs: 12,\r\n },\r\n gridBtn: {\r\n xl: 4,\r\n lg: 8,\r\n md: 8,\r\n sm: 8,\r\n xs: 8,\r\n },\r\n //自定义留言下拉选择\r\n CustomList: CustomList,\r\n //自定义留言内容\r\n currentIndex: 0,\r\n\r\n formValidate: {\r\n is_pack: 0,//是否报单\r\n disk_info: '', //卡密类型\r\n logistics: ['1'], //选择物流方式\r\n freight: 2, //运费设置\r\n postage: 0, //设置运费金额\r\n recommend: [], //商品推荐\r\n presale_day: 1, //预售发货时间-结束\r\n presale: false, //预售商品开关\r\n is_limit: false,\r\n limit_type: 0,\r\n limit_num: 0,\r\n vip_product: false, //付费会员专属开关\r\n custom_form: [], //自定义留言\r\n store_name: '',\r\n cate_id: [],\r\n label_id: [],\r\n keyword: '',\r\n unit_name: '',\r\n store_info: '',\r\n image: '',\r\n recommend_image: '',\r\n slider_image: [],\r\n description: '',\r\n ficti: 0,\r\n give_integral: 0,\r\n sort: 0,\r\n is_show: 1,\r\n is_gift: 0, // 开启送礼品\r\n gift_price: 0,\r\n is_hot: 0,\r\n is_benefit: 0,\r\n is_best: 0,\r\n is_new: 0,\r\n is_good: 0,\r\n is_postage: 0,\r\n is_sub: [],\r\n recommend_list: [],\r\n params_list: [], //商品参数\r\n virtual_type: 0,\r\n // is_sub: 0,\r\n id: 0,\r\n spec_type: 0,\r\n is_virtual: 0,\r\n video_link: '',\r\n // postage: 0,\r\n temp_id: '',\r\n attrs: [],\r\n items: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n },\r\n ],\r\n activity: ['默认', '秒杀', '砍价', '拼团'],\r\n couponName: [],\r\n header: [],\r\n selectRule: '',\r\n coupon_ids: [],\r\n command_word: '',\r\n min_qty: 1,\r\n label_list: [],\r\n protection_list: [],\r\n },\r\n ruleList: [],\r\n templateList: [],\r\n createBnt: true,\r\n showIput: false,\r\n manyFormValidate: [],\r\n // 单规格表格data\r\n oneFormValidate: [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ],\r\n images: [],\r\n imagesTable: '',\r\n currentTab: '1',\r\n isChoice: '',\r\n loading: false,\r\n modalPic: false,\r\n addVirtualModel: false,\r\n template: false,\r\n uploadList: [],\r\n treeSelect: [],\r\n picTit: '',\r\n tableIndex: 0,\r\n ruleValidate: RuleValidate,\r\n manyBrokerage: undefined,\r\n manyBrokerageTwo: undefined,\r\n manyVipPrice: undefined,\r\n manyVipDiscount: undefined,\r\n upload: {\r\n videoIng: false, // 是否显示进度条;\r\n },\r\n videoIng: false, // 是否显示进度条;\r\n progress: 0, // 进度条默认0\r\n stock: 0,\r\n disk_info: '',\r\n videoLink: '',\r\n attrs: [],\r\n activity: { 默认: 'red', 秒杀: 'blue', 砍价: 'green', 拼团: 'yellow' },\r\n couponName: [],\r\n updateIds: [],\r\n updateName: [],\r\n couponIds: '',\r\n couponNames: [],\r\n rakeBack: [\r\n {\r\n title: '一级返佣(元)',\r\n slot: 'brokerage',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '二级返佣(元)',\r\n slot: 'brokerage_two',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n member: [\r\n {\r\n title: '会员价',\r\n slot: 'vip_price',\r\n align: 'center',\r\n width: 95,\r\n },\r\n {\r\n title: '会员折扣',\r\n slot: 'vip_proportion',\r\n align: 'center',\r\n width: 95,\r\n },\r\n ],\r\n columnsInstalM: [],\r\n moveIndex: '',\r\n addValue: '',\r\n visible: false,\r\n typeConfig: [],\r\n goodsType: [],\r\n paramsTypeList: [],\r\n paramsType: null,\r\n canSel: true, // 规格图片添加判断\r\n changeAttrValue: '', //修改的规格值\r\n tableKey: 0,\r\n protectionList: [], // 服务保障\r\n labelList: [],\r\n tileLabelList: [],\r\n };\r\n },\r\n computed: {\r\n ...mapState('media', ['isMobile']),\r\n labelWidth() {\r\n return this.isMobile ? undefined : '120px';\r\n },\r\n labelPosition() {\r\n return this.isMobile ? 'top' : 'right';\r\n },\r\n labelBottom() {\r\n return this.isMobile ? undefined : '15px';\r\n },\r\n },\r\n watch: {\r\n typeConfig(val) {\r\n if (val.length) {\r\n // 对virtual中的id等于val中的id的\r\n this.goodsType = this.virtual.filter((item) => {\r\n return val.includes(item.id + '');\r\n });\r\n } else {\r\n this.goodsType = this.virtual;\r\n }\r\n },\r\n },\r\n beforeRouteUpdate(to, from, next) {\r\n this.bus.$emit('onTagsViewRefreshRouterView', this.$route.path);\r\n next();\r\n },\r\n created() {\r\n this.columns = this.columns2.slice(0, 8);\r\n this.getToken();\r\n },\r\n async mounted() {\r\n if (this.$route.params.id !== '0' && this.$route.params.id) {\r\n await this.getInfo();\r\n } else if (this.$route.params.id === '0') {\r\n this.getProductCache();\r\n } else {\r\n this.getproductLabelUseListApi();\r\n }\r\n if (this.$route.query.type) {\r\n this.modals = true;\r\n this.type = this.$route.query.type;\r\n } else {\r\n this.type = 0;\r\n }\r\n this.goodsCategory();\r\n this.productGetRule();\r\n this.productGetTemplate();\r\n this.paramsGetTemplate();\r\n this.uploadType();\r\n this.productConfig();\r\n this.watchActivity();\r\n this.getProtectionList();\r\n },\r\n methods: {\r\n getProductCache() {\r\n productCache()\r\n .then((res) => {\r\n let data = res.data.info;\r\n this.getproductLabelUseListApi();\r\n\r\n if (!Array.isArray(data)) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n if (data.coupons) {\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.couponName = data.coupons;\r\n }\r\n\r\n this.formValidate = data;\r\n this.dataLabel = data.label_id;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.updateName = data.coupons;\r\n this.formValidate.cate_id = cate_id;\r\n this.oneFormValidate = data.attrs;\r\n this.generateHeader(this.attrs);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.header = [];\r\n this.manyFormValidate = data.attrs;\r\n this.spec_type = data.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = 1;\r\n }\r\n this.attrs.map((item) => {\r\n if (item.add_pic) this.canSel = false;\r\n });\r\n this.virtualbtn(data.virtual_type, 1);\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: data.image,\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n }\r\n this.watchActivity();\r\n this.spinShow = false;\r\n }\r\n })\r\n .catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n },\r\n getProtectionList() {\r\n productProtectionListApi({ page: 0, limit: 0, status: 1 }).then((res) => {\r\n this.protectionList = res.data.list;\r\n });\r\n },\r\n getproductLabelUseListApi() {\r\n productLabelUseListApi().then((res) => {\r\n // 合并数组中所有的list\r\n this.tileLabelList = res.data.flatMap((item) => item.list);\r\n let labelList = res.data;\r\n if (this.formValidate.label_list.length) {\r\n this.formValidate.label_list.map((el) => {\r\n labelList.map((re) => {\r\n re.list.map((label) => {\r\n if (label.id === el) {\r\n label.active = true;\r\n } else {\r\n label.active = false;\r\n }\r\n });\r\n });\r\n });\r\n } else {\r\n labelList.map((el) => {\r\n el.list.map((label) => {\r\n label.active = false;\r\n });\r\n });\r\n }\r\n this.labelList = labelList;\r\n });\r\n },\r\n addProtection() {\r\n this.$router.push({ path: this.$routeProStr + '/product/protection/list' });\r\n },\r\n productConfig() {\r\n getProductTypeConfig().then((res) => {\r\n this.typeConfig = res.data;\r\n });\r\n },\r\n beforeUpload(file) {\r\n return isFileUpload(file);\r\n },\r\n // 分片上传\r\n videoSaveToUrl(file) {\r\n if (isVideoUpload(file)) {\r\n uploadByPieces({\r\n file: file, // 视频实体\r\n pieceSize: 3, // 分片大小\r\n success: (data) => {\r\n this.formValidate.video_link = data.file_path;\r\n this.progress = 100;\r\n },\r\n error: (e) => {\r\n this.$message.error(e.msg);\r\n },\r\n uploading: (chunk, allChunk) => {\r\n this.videoIng = true;\r\n let st = Math.floor((chunk / allChunk) * 100);\r\n this.progress = st;\r\n },\r\n });\r\n }\r\n return false;\r\n },\r\n // 类型选择/填入内容判断\r\n virtualbtn(index, type) {\r\n if (type != 1) {\r\n if (this.$route.params.id) return this.$message.error('编辑商品不支持切换商品类型');\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$message.error(res.msg);\r\n });\r\n } else {\r\n if (this.formValidate.spec_type == 1) {\r\n this.generate(1);\r\n }\r\n }\r\n }\r\n // 定义基础商品和虚拟商品的标签页配置\r\n const baseHeadTabs = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '物流设置', name: '4' },\r\n { tit: '会员价/佣金', name: '5' },\r\n { tit: '营销设置', name: '6' },\r\n { tit: '其他设置', name: '7' },\r\n ];\r\n const virtualHeadTabs = [\r\n { tit: '基础信息', name: '1' },\r\n { tit: '规格库存', name: '2' },\r\n { tit: '商品详情', name: '3' },\r\n { tit: '会员价/佣金', name: '4' },\r\n { tit: '营销设置', name: '5' },\r\n { tit: '其他设置', name: '6' },\r\n ];\r\n\r\n switch (index) {\r\n case 0: // 普通商品\r\n this.formValidate.virtual_type = 0;\r\n this.formValidate.is_virtual = 0;\r\n this.headTab = baseHeadTabs;\r\n break;\r\n\r\n case 1: // 卡密/网盘商品\r\n this.formValidate.virtual_type = 1;\r\n this.formValidate.postage = 0;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n\r\n case 2: // 优惠券商品\r\n this.formValidate.virtual_type = 2;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n\r\n case 3: // 虚拟商品\r\n this.formValidate.virtual_type = 3;\r\n this.formValidate.is_virtual = 1;\r\n this.headTab = virtualHeadTabs;\r\n break;\r\n }\r\n },\r\n // 新增分类\r\n addCate() {\r\n this.$modalForm(productCreateApi()).then(() => this.goodsCategory());\r\n },\r\n // 物流方式选择\r\n logisticsBtn(e) {\r\n this.formValidate.logistics = e;\r\n },\r\n // 新增标签\r\n addLabel() {\r\n this.$modalForm(userLabelAddApi(0)).then(() => this.userLabel());\r\n },\r\n // 选择标签\r\n addGoodsTag() {\r\n this.tagShow = true;\r\n },\r\n // 自定义留言 开启关闭\r\n customMessBtn(e) {\r\n if (!e) {\r\n this.formValidate.custom_form = [];\r\n }\r\n this.customBtn = e;\r\n },\r\n // 自定义留言 新增表单\r\n addcustom() {\r\n if (this.formValidate.custom_form.length > 9) {\r\n this.$message.warning('最多添加10条');\r\n } else {\r\n this.formValidate.custom_form.push({\r\n title: '',\r\n label: 'text',\r\n value: '',\r\n status: false,\r\n });\r\n }\r\n },\r\n // 删除\r\n delcustom(index) {\r\n this.formValidate.custom_form.splice(index, 1);\r\n },\r\n // 预售具体日期\r\n onchangeTime(e) {\r\n this.formValidate.presale_time = e;\r\n },\r\n // 商品详情\r\n getEditorContent(data) {\r\n this.content = data;\r\n },\r\n cancel() {\r\n this.modals = false;\r\n },\r\n // 上传头部token\r\n getToken() {\r\n this.header['Authori-zation'] = 'Bearer ' + getCookies('token');\r\n },\r\n // 导入卡密\r\n upFile(res) {\r\n importCard({ file: res.data.src }).then((res) => {\r\n this.virtualList = this.virtualList.concat(res.data);\r\n });\r\n },\r\n //获取视频上传类型\r\n uploadType() {\r\n uploadType().then((res) => {\r\n this.upload_type = res.data.upload_type;\r\n });\r\n },\r\n // 初始化数据展示\r\n infoData(data, isCopy) {\r\n let cate_id = data.cate_id.map(Number);\r\n let label_id = data.label_id.map(Number);\r\n this.attrs = data.items || [];\r\n let ids = [];\r\n data.coupons.map((item) => {\r\n ids.push(item.id);\r\n });\r\n this.formValidate = data;\r\n this.seletVideo = data.seletVideo;\r\n this.contents = data.description;\r\n this.couponName = data.coupons;\r\n this.formValidate.coupon_ids = ids;\r\n this.updateIds = ids;\r\n this.dataLabel = data.label_id;\r\n this.updateName = data.coupons;\r\n this.virtualbtn(data.virtual_type, 1);\r\n this.formValidate.logistics = data.logistics || ['1'];\r\n this.formValidate.custom_form = data.custom_form || [];\r\n if (this.formValidate.custom_form.length != 0) {\r\n this.customBtn = 1;\r\n }\r\n this.formValidate.cate_id = cate_id;\r\n if (data.attr) {\r\n this.oneFormValidate = [data.attr];\r\n this.oneFormValidate[0].vip_proportion = (\r\n (this.oneFormValidate[0].vip_price / this.oneFormValidate[0].price) *\r\n 100\r\n ).toFixed(2);\r\n }\r\n this.getproductLabelUseListApi();\r\n\r\n this.formValidate.header = [];\r\n this.spec_type = data.spec_type;\r\n this.formValidate.spec_type = this.spec_type;\r\n this.formValidate.is_virtual = data.is_virtual;\r\n this.attrs.map((item) => {\r\n if (item.add_pic) this.canSel = false;\r\n });\r\n if (data.spec_type === 0) {\r\n this.manyFormValidate = [];\r\n } else {\r\n this.createBnt = true;\r\n this.oneFormValidate = [\r\n {\r\n pic: '',\r\n price: 0,\r\n cost: 0,\r\n ot_price: 0,\r\n stock: 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: 0,\r\n volume: 0,\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n virtual_list: [],\r\n coupon_id: 0,\r\n },\r\n ];\r\n\r\n this.generateHeader(this.attrs);\r\n this.manyFormValidate = [...this.oneFormBatch, ...data.attrs];\r\n }\r\n\r\n setTimeout((e) => {\r\n this.checkAllGroup(data.is_sub);\r\n }, 1000);\r\n this.watchActivity();\r\n },\r\n //关闭淘宝弹窗并生成数据;\r\n onClose(data) {\r\n this.modals = false;\r\n this.infoData(data, 1);\r\n },\r\n\r\n checkMove(evt) {\r\n this.moveIndex = evt.draggedContext.index;\r\n },\r\n end() {\r\n this.moveIndex = '';\r\n this.generate(1);\r\n },\r\n // 单独设置会员设置\r\n checkAllGroupChange(data) {\r\n this.checkAllGroup(data);\r\n },\r\n checkAllGroup(data) {\r\n let endLength = this.attrs.length + 3;\r\n if (this.formValidate.spec_type === 0) {\r\n if (data.length === 2) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.rakeBack).concat(this.member);\r\n } else if (data.indexOf(0) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstall = this.columns2.slice(0, endLength).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstall = this.columns2.slice(0, endLength);\r\n }\r\n } else {\r\n if (data.length === 2) {\r\n this.columnsInstal2 = this.columnsInstalM\r\n .slice(0, endLength + 1)\r\n .concat(this.rakeBack)\r\n .concat(this.member);\r\n } else if (data.indexOf(0) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength).concat(this.member);\r\n } else if (data.indexOf(1) > -1) {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength).concat(this.rakeBack);\r\n } else {\r\n this.columnsInstal2 = this.columnsInstalM.slice(0, endLength);\r\n }\r\n }\r\n },\r\n // 添加优惠券\r\n addCoupon() {\r\n this.$refs.couponTemplates.isTemplate = true;\r\n this.$refs.couponTemplates.tableList();\r\n },\r\n // 规格中优惠券查看\r\n see(data, name, index) {\r\n this.tabName = name;\r\n this.tabIndex = index;\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n if (data.disk_info != '') {\r\n this.disk_type = 1;\r\n this.disk_info = data.disk_info;\r\n this.stock = data.stock;\r\n } else if (data.virtual_list.length) {\r\n this.disk_type = 2;\r\n this.virtualList = data.virtual_list;\r\n }\r\n this.addVirtualModel = true;\r\n } else {\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n }\r\n },\r\n // 修改分佣比例\r\n changeDiscount(index, type = 'manyFormValidate') {\r\n // 根据分佣比例 vip_proportion 修改会员价 保留2位小数\r\n this[type][index].vip_price = (this[type][index].price * (this[type][index].vip_proportion / 100)).toFixed(2);\r\n },\r\n // 修改会员价\r\n changeVipPrice(index, type = 'manyFormValidate') {\r\n // 根据会员价计算出分佣比例\r\n this[type][index].vip_proportion = ((this[type][index].vip_price / this[type][index].price) * 100).toFixed(2);\r\n },\r\n // 添加优惠券\r\n addGoodsCoupon(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.$refs.goodsCoupon.isTemplate = true;\r\n this.$refs.goodsCoupon.tableList(3);\r\n },\r\n addVirtual(index, name) {\r\n this.tabIndex = index;\r\n this.tabName = name;\r\n this.addVirtualModel = true;\r\n },\r\n // 提交卡密信息\r\n upVirtual() {\r\n if (this.disk_type == 2) {\r\n for (let i = 0; i < this.virtualList.length; i++) {\r\n const element = this.virtualList[i];\r\n if (!element.value) {\r\n this.$message.error('请输入所有卡密');\r\n return;\r\n }\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', this.virtualList);\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', this.virtualList.length);\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', '');\r\n } else {\r\n if (!this.disk_info.length) {\r\n return this.$message.error('请填写卡密信息');\r\n }\r\n if (!this.stock) {\r\n return this.$message.error('请填写库存数量');\r\n }\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'stock', Number(this.stock));\r\n this.$set(this[this.tabName][this.tabIndex], 'disk_info', this.disk_info);\r\n this.$set(this[this.tabName][this.tabIndex], 'virtual_list', []);\r\n }\r\n this.addVirtualModel = false;\r\n this.closeVirtual();\r\n },\r\n // 初始化卡密数据信息\r\n closeVirtual() {\r\n this.addVirtualModel = false;\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n this.disk_info = '';\r\n this.stock = 0;\r\n },\r\n //对象数组去重;\r\n uniqueArray(arr) {\r\n const seen = {};\r\n return arr.filter((item) => {\r\n const key = JSON.stringify(item); // 使用 JSON.stringify 生成唯一键\r\n if (seen[key]) {\r\n return false;\r\n } else {\r\n seen[key] = true;\r\n return true;\r\n }\r\n });\r\n },\r\n // 获取优惠券id数据\r\n nameId(id, names) {\r\n this.formValidate.coupon_ids = id;\r\n this.couponName = this.uniqueArray(names);\r\n },\r\n // 获取优惠券信息\r\n goodsCouponId(data) {\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_id', data.id);\r\n this.$set(this[this.tabName][this.tabIndex], 'coupon_name', data.title);\r\n this.$refs.goodsCoupon.isTemplate = false;\r\n },\r\n handleClose(name) {\r\n let index = this.couponName.indexOf(name);\r\n this.couponName.splice(index, 1);\r\n let couponIds = this.formValidate.coupon_ids;\r\n couponIds.splice(index, 1);\r\n this.updateIds = couponIds;\r\n this.updateName = this.couponName;\r\n },\r\n // 添加运费模板\r\n addTemp() {\r\n this.$refs.templates.isTemplate = true;\r\n },\r\n addVideo() {\r\n this.$videoModal((e) => {\r\n this.formValidate.video_link = e;\r\n });\r\n },\r\n // 删除视频;\r\n delVideo() {\r\n this.$set(this.formValidate, 'video_link', '');\r\n this.$set(this, 'progress', 0);\r\n this.videoIng = false;\r\n this.upload.videoIng = false;\r\n },\r\n zh_uploadFile() {\r\n if (this.seletVideo == 1) {\r\n this.formValidate.video_link = this.videoLink;\r\n } else {\r\n this.$refs.refid.click();\r\n }\r\n },\r\n // 上传视频\r\n zh_uploadFile_change(evfile) {\r\n let suffix = evfile.target.files[0].name.substr(evfile.target.files[0].name.indexOf('.'));\r\n if (suffix.indexOf('.mp4') === -1) {\r\n return this.$message.error('只能上传MP4文件');\r\n }\r\n let types = {\r\n key: evfile.target.files[0].name,\r\n contentType: evfile.target.files[0].type,\r\n };\r\n productGetTempKeysApi(types)\r\n .then((res) => {\r\n this.$videoCloud\r\n .videoUpload({\r\n type: res.data.type,\r\n evfile: evfile,\r\n res: res,\r\n uploading(status, progress) {\r\n this.upload.videoIng = status;\r\n if (res.status == 200) {\r\n this.progress = 100;\r\n }\r\n },\r\n })\r\n .then((res) => {\r\n this.formValidate.video_link = res.url;\r\n this.$message.success('视频上传成功');\r\n this.upload.videoIng = false;\r\n })\r\n .catch((res) => {\r\n this.$message.error(res);\r\n });\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 上一页;\r\n upTab() {\r\n this.currentTab = (Number(this.currentTab) - 1).toString();\r\n },\r\n // 下一页;\r\n downTab() {\r\n this.currentTab = (Number(this.currentTab) + 1).toString();\r\n },\r\n // 属性弹窗回调函数;\r\n userSearchs() {\r\n this.productGetRule();\r\n },\r\n // 添加规则;\r\n addRule() {\r\n this.$refs.addattr.modal = true;\r\n },\r\n // 批量设置分佣;\r\n brokerageSetUp() {\r\n if (this.formValidate.is_sub.indexOf(1) > -1) {\r\n if (this.manyBrokerage <= 0 || this.manyBrokerageTwo <= 0) {\r\n return this.$message.error('请填写返佣金额后进行批量添加');\r\n }\r\n } else if (this.formValidate.is_sub.indexOf(0) > -1) {\r\n if (this.manyVipPrice <= 0) {\r\n return this.$message.error('请填写会员价后进行批量添加');\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n if (this.manyBrokerage <= 0 || this.manyBrokerageTwo <= 0) {\r\n return this.$message.error('请填写完金额后进行批量添加');\r\n }\r\n if (this.manyVipPrice > 0 && this.manyVipDiscount > 0) {\r\n return this.$message.error('会员价和会员折扣只能二选一添加');\r\n }\r\n }\r\n for (let val of this.manyFormValidate) {\r\n this.manyBrokerage != undefined && this.$set(val, 'brokerage', this.manyBrokerage);\r\n this.manyBrokerageTwo != undefined && this.$set(val, 'brokerage_two', this.manyBrokerageTwo);\r\n if (this.manyVipPrice != undefined) {\r\n this.$set(val, 'vip_price', this.manyVipPrice);\r\n this.$set(val, 'vip_proportion', ((val.vip_price / val.price) * 100).toFixed(2));\r\n } else {\r\n this.$set(val, 'vip_proportion', this.manyVipDiscount);\r\n this.$set(val, 'vip_price', (val.price * (this.manyVipDiscount / 100)).toFixed(2));\r\n }\r\n }\r\n },\r\n // 批量设置会员价\r\n vipPriceSetUp() {\r\n if (this.manyVipPrice <= 0) {\r\n return this.$message.error('请填写会员价在进行批量添加');\r\n } else {\r\n for (let val of this.manyFormValidate) {\r\n this.$set(val, 'vip_price', this.manyVipPrice);\r\n }\r\n }\r\n },\r\n // 新增卡密\r\n handleAdd() {\r\n this.virtualList.push({\r\n key: '',\r\n value: '',\r\n });\r\n },\r\n // 初始化卡密信息\r\n initVirtualData(status) {\r\n this.virtualList = [\r\n {\r\n key: '',\r\n value: '',\r\n },\r\n ];\r\n },\r\n removeVirtual(index) {\r\n this.virtualList.splice(index, 1);\r\n },\r\n // 清空批量规格信息\r\n batchDel() {\r\n this.oneFormBatch = [\r\n {\r\n pic: '',\r\n price: void 0,\r\n cost: void 0,\r\n ot_price: void 0,\r\n stock: void 0,\r\n bar_code: '',\r\n bar_code_number: '',\r\n weight: void 0,\r\n volume: void 0,\r\n virtual_list: [],\r\n },\r\n ];\r\n },\r\n confirm(name) {\r\n this.createBnt = true;\r\n this.formValidate.selectRule = name;\r\n this.attrs = [];\r\n if (this.formValidate.selectRule.trim().length <= 0) {\r\n return this.$message.error('请选择属性');\r\n }\r\n this.ruleList.forEach((item, index) => {\r\n if (item.rule_name === this.formValidate.selectRule) {\r\n this.attrs = [...item.rule_value];\r\n }\r\n });\r\n this.canSel = true;\r\n this.generateAttr(this.attrs);\r\n },\r\n // 选择规格模板\r\n handleCommand(e) {},\r\n // 获取商品属性模板;\r\n productGetRule() {\r\n productGetRuleApi().then((res) => {\r\n this.ruleList = res.data;\r\n });\r\n },\r\n // 获取运费模板;\r\n productGetTemplate() {\r\n productGetTemplateApi().then((res) => {\r\n this.templateList = res.data;\r\n });\r\n },\r\n paramsGetTemplate() {\r\n paramListApi().then((res) => {\r\n this.paramsTypeList = res.data.list;\r\n });\r\n },\r\n changeParamsType(e) {\r\n e ? this.getParams(e) : (this.formValidate.params_list = []);\r\n },\r\n getParams(id) {\r\n paramInfoApi(id).then((res) => {\r\n this.formValidate.params_list = res.data.value;\r\n });\r\n },\r\n isSubset(arr1, arr2) {\r\n // 将数组转换为 Set,以便进行高效的包含检查\r\n const set1 = new Set(arr1);\r\n const set2 = new Set(arr2);\r\n\r\n // 检查 set2 中的每个元素是否都在 set1 中\r\n for (let elem of set2) {\r\n if (!set1.has(elem)) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n },\r\n // 批量添加\r\n batchAdd() {\r\n let arr = [];\r\n for (let val of this.attrs) {\r\n if (this.oneFormBatch[0][val.value]) {\r\n arr.push(this.oneFormBatch[0][val.value]);\r\n }\r\n }\r\n\r\n // 批量设置商品规格属性\r\n const batchFields = [\r\n 'pic',\r\n 'price',\r\n 'cost',\r\n 'ot_price',\r\n 'stock',\r\n 'weight',\r\n 'volume',\r\n 'bar_code',\r\n 'bar_code_number',\r\n ];\r\n // const defaultFields = ['bar_code', 'bar_code_number'];\r\n\r\n for (let val of this.manyFormValidate) {\r\n const batch = this.oneFormBatch[0];\r\n // 如果存在筛选条件且满足条件,或无筛选条件时\r\n if (!arr.length || this.isSubset(val.attr_arr, arr)) {\r\n // 设置有值的批量字段\r\n batchFields.forEach((field) => {\r\n if (batch[field] && batch[field] !== undefined) {\r\n if (field === 'pic' && batch[field]) {\r\n this.$set(val, field, batch[field]);\r\n } else if (field != 'pic') {\r\n this.$set(val, field, batch[field]);\r\n }\r\n }\r\n });\r\n\r\n // 设置默认字段\r\n // defaultFields.forEach((field) => {\r\n // this.$set(val, field, batch[field]);\r\n // });\r\n }\r\n }\r\n },\r\n changeSpecImg(arr, img) {\r\n // 判断是否存在规格图\r\n let isHas = false;\r\n for (let i = 1; i < this.manyFormValidate.length; i++) {\r\n let item = this.manyFormValidate[i];\r\n if (item.pic && this.isSubset(item.attr_arr, arr)) {\r\n isHas = true;\r\n break;\r\n }\r\n }\r\n if (isHas) {\r\n this.$confirm('可以同步修改下方该规格图片,确定要替换吗?', '提示', {\r\n confirmButtonText: '替换',\r\n cancelButtonText: '暂不',\r\n type: 'warning',\r\n })\r\n .then(() => {\r\n for (let val of this.manyFormValidate) {\r\n if (this.isSubset(val.attr_arr, arr)) {\r\n this.$set(val, 'pic', img);\r\n }\r\n }\r\n })\r\n .catch(() => {});\r\n } else {\r\n for (let val of this.manyFormValidate) {\r\n if (this.isSubset(val.attr_arr, arr)) {\r\n this.$set(val, 'pic', img);\r\n }\r\n }\r\n }\r\n },\r\n // 立即生成\r\n generate(type, isCopy, arr) {\r\n this.manyFormValidate = [];\r\n this.formValidate.header = [];\r\n },\r\n clearAttr() {\r\n this.formDynamic.attrsName = '';\r\n this.formDynamic.attrsVal = '';\r\n },\r\n\r\n // 删除规格\r\n handleRemoveRole(index) {\r\n this.attrs.splice(index, 1);\r\n this.manyFormValidate.splice(index, 1);\r\n if (!this.attrs.length) {\r\n this.formValidate.header = [];\r\n this.manyFormValidate = [];\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n },\r\n // 删除表格中 对应属性\r\n delAttrTable(val) {\r\n for (let i = 0; i < this.manyFormValidate.length; i++) {\r\n let item = this.manyFormValidate[i];\r\n if (item.attr_arr && item.attr_arr.includes(val)) {\r\n this.manyFormValidate.splice(i, 1);\r\n i--;\r\n }\r\n }\r\n },\r\n // 删除属性\r\n handleRemove2(item, index, val) {\r\n // 删除 manyFormValidate中 title = item.value 的属性值\r\n item.splice(index, 1);\r\n // this.generateAttr(this.attrs);\r\n this.delAttrTable(val);\r\n },\r\n // 新增规格\r\n handleAddRole() {\r\n let data = {\r\n value: this.formDynamic.attrsName,\r\n add_pic: 0,\r\n detail: [],\r\n };\r\n this.attrs.push(data);\r\n },\r\n handleAddParams() {\r\n let data = {\r\n name: '',\r\n value: '',\r\n };\r\n this.formValidate.params_list.push(data);\r\n },\r\n handleSaveAsTemplate() {\r\n this.$prompt('', '请输入模板名称', {\r\n confirmButtonText: '确定',\r\n cancelButtonText: '取消',\r\n })\r\n .then(({ value }) => {\r\n let spec = this.attrs.map((item) => {\r\n return {\r\n value: item.value,\r\n detail: item.detail.map((e) => e.value),\r\n };\r\n });\r\n let formDynamic = {\r\n rule_name: value,\r\n spec: spec,\r\n };\r\n ruleAddApi(formDynamic, 0)\r\n .then((res) => {\r\n this.$message.success(res.msg);\r\n this.productGetRule();\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n })\r\n .catch(() => {});\r\n },\r\n // 新增一条属性\r\n addOneAttr(val, val2) {\r\n this.generateAttr(this.attrs, val2);\r\n },\r\n handleFocus(val) {\r\n this.changeAttrValue = val;\r\n },\r\n handleBlur() {\r\n this.changeAttrValue = '';\r\n },\r\n handleSelImg(item) {\r\n this.$imgModal((e) => {\r\n item.pic = e.att_dir;\r\n this.changeSpecImg([item.value], e.att_dir);\r\n });\r\n },\r\n handleRemoveImg(item) {\r\n item.pic = '';\r\n },\r\n // 规格名称改变\r\n attrChangeValue(i, val) {\r\n if (val.trim().length && this.attrs[i].detail.length) {\r\n this.generateHeader(this.attrs);\r\n if (this.manyFormValidate.length) {\r\n this.manyFormValidate.map((item, i) => {\r\n if (i > 0) {\r\n if (Object.keys(item.detail).includes(this.changeAttrValue)) {\r\n item.detail[val] = item.detail[this.changeAttrValue];\r\n item[val] = item[this.changeAttrValue];\r\n delete item.detail[this.changeAttrValue];\r\n delete item[this.changeAttrValue];\r\n }\r\n }\r\n });\r\n this.changeAttrValue = val;\r\n }\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n },\r\n // 规格值改变\r\n attrDetailChangeValue(val, i) {\r\n if (this.manyFormValidate.length) {\r\n let key = this.attrs[i].value;\r\n this.manyFormValidate.map((item, i) => {\r\n if (i > 0) {\r\n if (Object.keys(item.detail).includes(key) && item.detail[key] === this.changeAttrValue) {\r\n item.detail[key] = val;\r\n let index = item.attr_arr.findIndex((item) => item === this.changeAttrValue);\r\n item.attr_arr[index] = val;\r\n }\r\n }\r\n });\r\n this.changeAttrValue = val;\r\n } else {\r\n this.generateAttr(this.attrs, 1);\r\n }\r\n },\r\n // 规格图片添加开关\r\n addPic(e, i) {\r\n if (e) {\r\n this.attrs.map((item, ii) => {\r\n if (ii !== i) {\r\n this.$set(item, 'add_pic', 0);\r\n }\r\n });\r\n this.canSel = false;\r\n } else {\r\n this.canSel = true;\r\n }\r\n },\r\n // 规格拖拽排序后\r\n onMoveSpec() {\r\n this.generateAttr(this.attrs);\r\n },\r\n changeCurrentIndex(i) {\r\n this.currentIndex = i;\r\n },\r\n // 生成商品规格表头\r\n generateHeader(data) {\r\n let specificationsColumns = data.map((item) => ({\r\n title: item.value,\r\n key: item.value,\r\n minWidth: 140,\r\n fixed: 'left',\r\n }));\r\n let arr;\r\n if ([1, 2].includes(Number(this.formValidate.virtual_type))) {\r\n arr = [...specificationsColumns, ...VirtualTableHead];\r\n // 找到slot 等于 fictitious 将title改为规格名称\r\n this.formValidate.header.map((item) => {\r\n if (item.slot === 'fictitious') {\r\n item.title = this.formValidate.virtual_type == 1 ? '添加卡密/网盘' : '选择优惠券';\r\n }\r\n });\r\n } else if (this.formValidate.virtual_type == 3) {\r\n arr = [...specificationsColumns, ...VirtualTableHead2];\r\n } else {\r\n arr = [...specificationsColumns, ...GoodsTableHead];\r\n }\r\n this.$set(this.formValidate, 'header', arr);\r\n this.tableKey += 1;\r\n this.columnsInstalM = arr;\r\n },\r\n /*\r\n * 生成属性\r\n * @param {Array} data 规格数据\r\n * */\r\n generateAttr(data, val) {\r\n this.generateHeader(data);\r\n const combinations = this.generateCombinations(data);\r\n console.log('规格组合总数:' + combinations.length);\r\n const virtualType = this.formValidate.virtual_type;\r\n // 如果combinations数量超过 500,则分批次生成属性\r\n let rows = [];\r\n if (combinations.length > 500) {\r\n const batchSize = Math.ceil(combinations.length / 500);\r\n for (let i = 0; i < combinations.length; i += batchSize) {\r\n setTimeout((e) => {\r\n let d = this.generateAttrBatch(data, combinations.slice(i, i + batchSize), val);\r\n rows = [...rows, ...d];\r\n this.manyFormValidate = [...this.oneFormBatch, ...rows];\r\n }, 0);\r\n }\r\n } else {\r\n rows = this.generateAttrBatch(data, combinations, val);\r\n this.manyFormValidate = [...this.oneFormBatch, ...rows];\r\n }\r\n },\r\n // 生成属性批次\r\n generateAttrBatch(data, combinations, val) {\r\n const existingItems = this.manyFormValidate.slice(1); // 排除第一项默认数据\r\n\r\n const rows = combinations.map((combination) => {\r\n const row = {\r\n attr_arr: combination,\r\n detail: {},\r\n title: '',\r\n key: '',\r\n price: 0,\r\n pic: '',\r\n ot_price: 0,\r\n cost: 0,\r\n stock: 0,\r\n is_show: 1,\r\n is_default_select: 0,\r\n unique: '',\r\n weight: '',\r\n volume: '',\r\n brokerage: 0,\r\n brokerage_two: 0,\r\n vip_price: 0,\r\n vip_proportion: 0,\r\n };\r\n\r\n // 设置虚拟类型相关属性\r\n if (this.formValidate.virtual_type === 1) {\r\n row.virtual_list = [];\r\n row.disk_info = '';\r\n } else if (this.formValidate.virtual_type === 2) {\r\n row.coupon_id = 0;\r\n row.coupon_name = '';\r\n }\r\n\r\n // 处理规格属性\r\n data.forEach((item, i) => {\r\n const value = combination[i];\r\n row[item.value] = value;\r\n row.title = item.value;\r\n row.key = item.value;\r\n row.detail[item.value] = value;\r\n\r\n // 查找匹配的现有规格项\r\n const matchedItem = existingItems.find((item) => item.attr_arr && arraysEqual(item.attr_arr, combination));\r\n\r\n if (matchedItem) {\r\n Object.assign(row, {\r\n price: matchedItem.price,\r\n cost: matchedItem.cost,\r\n ot_price: matchedItem.ot_price,\r\n stock: matchedItem.stock,\r\n pic: matchedItem.pic,\r\n unique: matchedItem.unique || '',\r\n weight: matchedItem.weight || '',\r\n volume: matchedItem.volume || '',\r\n is_show: matchedItem.is_show || 1,\r\n is_default_select: matchedItem.is_default_select || 0,\r\n volume: matchedItem.volume || 0,\r\n bar_code_number: matchedItem.bar_code_number || 0,\r\n is_virtual: matchedItem.is_virtual,\r\n brokerage: matchedItem.brokerage,\r\n brokerage_two: matchedItem.brokerage_two,\r\n vip_price: matchedItem.vip_price,\r\n vip_proportion: matchedItem.vip_proportion,\r\n });\r\n\r\n if (this.formValidate.virtual_type === 1) {\r\n row.virtual_list = matchedItem.virtual_list;\r\n row.disk_info = matchedItem.disk_info;\r\n } else if (this.formValidate.virtual_type === 2 && matchedItem.coupon_id) {\r\n row.coupon_id = matchedItem.coupon_id;\r\n row.coupon_name = matchedItem.coupon_name;\r\n }\r\n } else if (item.add_pic && combination.includes(val)) {\r\n const picItem = item.detail.find((e) => combination.includes(e.value));\r\n if (picItem) row.pic = picItem.pic;\r\n }\r\n });\r\n return row;\r\n });\r\n return rows;\r\n },\r\n // 切换默认选中规格\r\n changeDefaultSelect(e, index) {\r\n // 一个开启 其他关闭\r\n this.manyFormValidate.map((item, i) => {\r\n if (i !== index) {\r\n item.is_default_select = 0;\r\n }\r\n });\r\n if (e) this.manyFormValidate[index].is_show = 1;\r\n },\r\n // 改变是否显示\r\n changeDefaultShow(index) {\r\n // 如果默认选中开启 则不可隐藏\r\n if (this.manyFormValidate[index].is_default_select === 1) {\r\n this.manyFormValidate[index].is_show = 1;\r\n this.$message.error('默认规格不可隐藏');\r\n }\r\n },\r\n // 生成规格组合\r\n generateCombinations(arr, prefix = []) {\r\n if (arr.length === 0) {\r\n return [prefix];\r\n }\r\n const [first, ...rest] = arr;\r\n return first.detail.flatMap((detail) => this.generateCombinations(rest, [...prefix, detail.value]));\r\n },\r\n // 添加属性\r\n createAttr(num, idx) {\r\n if (num) {\r\n // 判断是否存在同样熟悉\r\n var isExist = this.attrs[idx].detail.some((item) => item.value === num);\r\n if (isExist) {\r\n this.$message.error('规格值已存在');\r\n return;\r\n }\r\n this.attrs[idx].detail.push({ value: num, pic: '' });\r\n if (this.manyFormValidate.length) {\r\n this.addOneAttr(this.attrs[idx].value, num);\r\n } else {\r\n this.generateAttr(this.attrs);\r\n }\r\n\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doClose(); //关闭的\r\n this.clearAttr();\r\n setTimeout(() => {\r\n if (this.$refs.specStock.$refs['popoverRef_' + idx]) {\r\n //重点是以下两句\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doShow(); //打开的\r\n //重点是以上两句\r\n }\r\n }, 20);\r\n } else {\r\n this.$refs.specStock.$refs['popoverRef_' + idx][0].doClose(); //关闭的\r\n }\r\n },\r\n handleShowPop(index) {\r\n this.$refs.specStock.$refs['inputRef_' + index][0].focus();\r\n },\r\n // 商品分类;\r\n goodsCategory() {\r\n cascaderListApi(1)\r\n .then((res) => {\r\n this.treeSelect = res.data;\r\n })\r\n .catch((res) => {\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n // 改变规格\r\n changeSpec() {\r\n this.formValidate.is_sub = [];\r\n let id = this.$route.params.id;\r\n if (id) {\r\n checkActivityApi(id)\r\n .then((res) => {})\r\n .catch((res) => {\r\n this.formValidate.spec_type = this.spec_type;\r\n this.$message.error(res.msg);\r\n });\r\n }\r\n },\r\n // 详情\r\n getInfo() {\r\n this.spinShow = true;\r\n productInfoApi(this.$route.params.id)\r\n .then(async (res) => {\r\n let data = res.data.productInfo;\r\n this.infoData(data);\r\n this.spinShow = false;\r\n })\r\n .catch((res) => {\r\n this.spinShow = false;\r\n this.$message.error(res.msg);\r\n });\r\n },\r\n handleRemove(i) {\r\n this.images.splice(i, 1);\r\n this.formValidate.slider_image.splice(i, 1);\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n },\r\n // 关闭图片上传模态框\r\n changeCancel(msg) {\r\n this.modalPic = false;\r\n },\r\n // 点击商品图\r\n modalPicTap(tit, picTit = '', index = 0) {\r\n this.modalPic = true;\r\n this.isChoice = tit === 'dan' ? '单选' : '多选';\r\n this.picTit = picTit;\r\n this.tableIndex = index;\r\n },\r\n // 获取单张图片信息\r\n getPic(pc) {\r\n switch (this.picTit) {\r\n case 'danFrom':\r\n this.formValidate.image = pc.att_dir;\r\n if (!this.$route.params.id) {\r\n if (this.formValidate.spec_type === 0) {\r\n this.oneFormValidate[0].pic = pc.att_dir;\r\n } else {\r\n this.manyFormValidate.map((item) => {\r\n item.pic = pc.att_dir;\r\n });\r\n this.oneFormBatch[0].pic = pc.att_dir;\r\n }\r\n }\r\n break;\r\n case 'danTable':\r\n this.oneFormValidate[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'duopi':\r\n this.oneFormBatch[this.tableIndex].pic = pc.att_dir;\r\n break;\r\n case 'recommend_image':\r\n this.formValidate.recommend_image = pc.att_dir;\r\n break;\r\n default:\r\n if (this.manyFormValidate.length) this.manyFormValidate[this.tableIndex].pic = pc.att_dir;\r\n }\r\n this.modalPic = false;\r\n },\r\n deleteRow(index) {\r\n this.formValidate.params_list.splice(index, 1);\r\n },\r\n // 获取多张图信息\r\n getPicD(pc) {\r\n this.images = pc;\r\n this.images.map((item) => {\r\n this.formValidate.slider_image.push(item.att_dir);\r\n this.formValidate.slider_image = this.formValidate.slider_image.splice(0, 10);\r\n });\r\n this.oneFormValidate[0].pic = this.formValidate.slider_image[0];\r\n this.modalPic = false;\r\n },\r\n // 提交\r\n handleSubmit(name) {\r\n this.$refs[name].validate((valid) => {\r\n if (valid) {\r\n this.formValidate.type = this.type;\r\n let arr = this.formValidate.spec_type === 0 ? this.oneFormValidate : this.manyFormValidate;\r\n let item = JSON.parse(JSON.stringify(arr));\r\n if (this.formValidate.spec_type === 1) {\r\n if (item.length < 2) return this.$message.warning('商品规格-规格数量最少1个');\r\n // 删除第一项\r\n item.shift();\r\n }\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].stock > 1000000) {\r\n return this.$message.error('规格库存-库存超出系统范围(1000000)');\r\n }\r\n }\r\n if (this.formValidate.is_sub[0] === 1) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null) {\r\n return this.$message.error('营销设置- 一二级返佣不能为空');\r\n }\r\n }\r\n } else {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].vip_price === null) {\r\n return this.$message.error('营销设置-会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.is_sub.length === 2) {\r\n for (let i = 0; i < item.length; i++) {\r\n if (item[i].brokerage === null || item[i].brokerage_two === null || item[i].vip_price === null) {\r\n return this.$message.error('营销设置- 一二级返佣和会员价不能为空');\r\n }\r\n }\r\n }\r\n if (this.formValidate.freight == 3 && !this.formValidate.temp_id) {\r\n return this.$message.warning('商品信息-运费模板不能为空');\r\n }\r\n let activeIds = [];\r\n this.dataLabel.forEach((item) => {\r\n activeIds.push(item.id);\r\n });\r\n this.formValidate.label_id = activeIds;\r\n if (this.openSubimit) return;\r\n this.openSubimit = true;\r\n this.formValidate.description = formatRichText(this.content);\r\n if (this.formValidate.spec_type === 0) {\r\n this.formValidate.attrs = item;\r\n this.formValidate.header = [];\r\n this.formValidate.items = [];\r\n this.formValidate.is_copy = 0;\r\n } else {\r\n this.formValidate.items = this.attrs;\r\n this.formValidate.attrs = item;\r\n this.formValidate.is_copy = 1;\r\n }\r\n productAddApi(this.formValidate)\r\n .then(async (res) => {\r\n this.openSubimit = false;\r\n this.$message.success(res.msg);\r\n if (this.$route.params.id === '0') {\r\n cacheDelete().catch((err) => {\r\n this.$message.error(err.msg);\r\n });\r\n }\r\n setTimeout(() => {\r\n this.openSubimit = false;\r\n this.$router.push({ path: this.$routeProStr + '/product/product_list' });\r\n }, 500);\r\n })\r\n .catch((res) => {\r\n setTimeout((e) => {\r\n this.openSubimit = false;\r\n }, 1000);\r\n this.$message.error(res.msg);\r\n });\r\n } else {\r\n if (!this.formValidate.store_name) {\r\n return this.$message.warning('商品信息-商品名称不能为空');\r\n } else if (!this.formValidate.cate_id.length) {\r\n return this.$message.warning('商品信息-商品分类不能为空');\r\n } else if (!this.formValidate.unit_name) {\r\n return this.$message.warning('商品信息-商品单位不能为空');\r\n } else if (!this.formValidate.slider_image.length) {\r\n return this.$message.warning('商品信息-商品轮播图不能为空');\r\n } else if (!this.formValidate.logistics.length && !this.formValidate.virtual_type) {\r\n return this.$message.warning('物流设置-至少选择一种物流方式');\r\n } else if (!this.formValidate.temp_id && this.formValidate.freight == 3) {\r\n return this.$message.warning('商品信息-运费模板不能为空');\r\n }\r\n }\r\n });\r\n },\r\n changeTemplate(msg) {\r\n this.template = msg;\r\n },\r\n // 表单验证\r\n validate(prop, status, error) {\r\n if (status === false) {\r\n this.$message.warning(error);\r\n }\r\n },\r\n // 移动\r\n handleDragStart(e, item) {\r\n this.dragging = item;\r\n },\r\n handleDragEnd(e, item) {\r\n this.dragging = null;\r\n },\r\n handleDragOver(e) {\r\n e.dataTransfer.dropEffect = 'move';\r\n },\r\n handleDragEnter(e, item) {\r\n e.dataTransfer.effectAllowed = 'move';\r\n if (item === this.dragging) {\r\n return;\r\n }\r\n const newItems = [...this.formValidate.slider_image];\r\n const src = newItems.indexOf(this.dragging);\r\n const dst = newItems.indexOf(item);\r\n newItems.splice(dst, 0, ...newItems.splice(src, 1));\r\n this.formValidate.slider_image = newItems;\r\n },\r\n //对象数组去重;\r\n unique(arr) {\r\n const res = new Map();\r\n return arr.filter((arr) => !res.has(arr.product_id) && res.set(arr.product_id, 1));\r\n },\r\n // 商品id\r\n getProductId(data) {\r\n this.goods_modals = false;\r\n this.formValidate.recommend_list = this.unique(this.formValidate.recommend_list.concat(data));\r\n },\r\n // 选择推荐商品\r\n changeGoods() {\r\n this.goods_modals = true;\r\n this.$refs.goodslist.getList();\r\n this.$refs.goodslist.goodsCategory();\r\n },\r\n // 选择用户标签\r\n activeData(dataLabel) {\r\n this.labelShow = false;\r\n this.dataLabel = dataLabel;\r\n },\r\n // 选择商品标签\r\n activeLabel(data) {\r\n this.tagShow = false;\r\n this.formValidate.label_list = Array.from(new Set(data));\r\n },\r\n // 标签弹窗关闭\r\n labelClose() {\r\n this.labelShow = false;\r\n this.tagShow = false;\r\n },\r\n // 删除用户标签\r\n closeLabel(label) {\r\n let index = this.dataLabel.indexOf(this.dataLabel.filter((d) => d.id == label.id)[0]);\r\n this.dataLabel.splice(index, 1);\r\n },\r\n // 打开选择用户标签\r\n openLabel(row) {\r\n this.labelShow = true;\r\n },\r\n handleRemoveRecommend(i) {\r\n this.formValidate.recommend_list.splice(i, 1);\r\n },\r\n // 打开的营销活动标签\r\n watchActivity() {\r\n let marketing = [];\r\n // 使用对象映射优化权限判断逻辑\r\n const permissionMap = {\r\n 默认: true,\r\n 秒杀: 'seckill',\r\n 砍价: 'bargain',\r\n 拼团: 'combination',\r\n };\r\n this.formValidate.activity.forEach((el) => {\r\n if (permissionMap[el] === true || (permissionMap[el] && checkArray(permissionMap[el]))) {\r\n marketing.push(el);\r\n }\r\n });\r\n this.formValidate.activity = marketing;\r\n },\r\n },\r\n};\r\n</script>\r\n<style lang=\"scss\" scoped>\r\n@use './productAdd.scss' as *;\r\n</style>\r\n"]}]}
|