edit.php 35 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('component/com-add-cat', __DIR__);
  4. ComponentHelper::loadComponentView('component/com-attr-group', __DIR__);
  5. ComponentHelper::loadComponentView('component/com-attr', __DIR__);
  6. ComponentHelper::loadComponentView('com-rich-text');
  7. ComponentHelper::loadComponentView('com-district');
  8. ComponentHelper::loadComponentView('com-coupon', Yii::$app->basePath . '/../addons/Coupon/backend/views/goods');
  9. ComponentHelper::loadComponentView('component/com-attachment', dirname(__DIR__));
  10. ComponentHelper::loadComponentView('component/com-attachment-edit', dirname(__DIR__));
  11. ComponentHelper::loadComponentView('component/com-upload', dirname(__DIR__));
  12. if (!empty($components)) {
  13. foreach ($components as $addons => $component) {
  14. ComponentHelper::loadComponentView($component['component'], $component['path']);
  15. }
  16. $components = \yii\helpers\Json::encode($components);
  17. }
  18. ?>
  19. <script src="/resources/js/Sortable.min.js"></script>
  20. <script src="/resources/unpkg/vuedraggable@2.18.1/dist/vuedraggable.umd.min.js"></script>
  21. <style>
  22. <?= ComponentHelper::loadComponentView('edit', __DIR__ . '/css', [], true, 'css'); ?>
  23. </style>
  24. <div id="app" v-cloak>
  25. <el-card shadow="never" style="border:0" class="box-card" body-style="background-color: #f3f3f3;padding: 20px 0 0;" class="box-card" v-loading="cardLoading">
  26. <div slot="header">
  27. <div flex="cross:center box:first">
  28. <div><span @click="$navigate({r:'mch/client/goods/index'})" class="text">商品列表</span>/添加商品</div>
  29. </div>
  30. </div>
  31. <div class="goods-box">
  32. <el-form :model="ruleForm" :rules="rules" ref="ruleForm" size="mini" label-width="150px" class="demo-ruleForm">
  33. <!-- tab切换 -->
  34. <div class="tabs-box">
  35. <div class="tabs-list" flex="cross:center">
  36. <span v-for="(item, index) in tabs" :key="index" class="tabs-item" :class="item.value == activeName ? 'tabActive' : ''" @click="toggle(item, index, 'tabs')">{{item.name}}</span>
  37. </div>
  38. </div>
  39. <!-- 基础设置 -->
  40. <div v-show="activeName == 'basic'">
  41. <?= ComponentHelper::loadComponentView('goods-basic', __DIR__) ?>
  42. </div>
  43. <!-- 营销配置 -->
  44. <div v-show="activeName == 'marketing'">
  45. <?= ComponentHelper::loadComponentView('goods-marketing', __DIR__) ?>
  46. </div>
  47. <!-- 会员权益 -->
  48. <div v-show="activeName == 'member_benefits'">
  49. <?= ComponentHelper::loadComponentView('goods-member', __DIR__) ?>
  50. </div>
  51. </el-form>
  52. </div>
  53. </el-card>
  54. <div class="bottom-btns" flex="main:center cross:center">
  55. <el-button size="mini" type="primary" @click="submit()" :loading="btnLoading">保存</el-button>
  56. </div>
  57. </div>
  58. <script>
  59. const app = new Vue({
  60. el: '#app',
  61. data() {
  62. return {
  63. tabs: [{
  64. name: '基础设置',
  65. value: 'basic'
  66. },
  67. {
  68. name: '营销配置',
  69. value: 'marketing'
  70. },
  71. {
  72. name: '会员权益',
  73. value: 'member_benefits'
  74. }
  75. ],
  76. activeName: 'basic',
  77. typeArr: [],
  78. goods_type: 'physical',
  79. is_base_show: false,
  80. is_mch: false,
  81. is_default_services: 1,
  82. typeIndex: 0,
  83. btnLoading: false,
  84. cardLoading: false,
  85. cats: [],
  86. freight_id: 0,
  87. goodsId: null,
  88. // freight: {
  89. // dialog: false,
  90. // list: [],
  91. // checked: {},
  92. // loading: false
  93. // },
  94. attrGroups: [], //规格组
  95. attrGroupName: '',
  96. attrName: [],
  97. // 批量设置
  98. batch: {},
  99. label_list: [], // 商品标签列表
  100. service_list: [], // 商品服务列表
  101. freight_rules: [ // 运费模板
  102. // {
  103. // id: '1',
  104. // name: '全国包邮'
  105. // },
  106. // {
  107. // id: '2',
  108. // name: '北京包邮'
  109. // }
  110. ],
  111. is_show_freight: false,
  112. defaultMemberPrice: [],
  113. member_level_list: [
  114. // {level: 1, name: '普通会员', value: {"sign_id_2:4":40, "sign_id_3:4": 41, "sign_id_2:5": 41, "sign_id_3:5": 41}},
  115. // {level: 2, name: '等级2', value: {"sign_id_2:4":30, "sign_id_3:4": 31, "sign_id_2:5": 32, "sign_id_3:5": 33}},
  116. // {level: 3, name: '等级3', value: {"sign_id_2:4":20, "sign_id_3:4": 21, "sign_id_2:5": 22, "sign_id_3:5": 23}},
  117. // {level: 4, name: '等级4', value: {"sign_id_2:6":10, "sign_id_3:4": 11, "sign_id_2:5": 12, "sign_id_3:5": 13}}
  118. ],
  119. dialogVisible: false, // 配送范围弹出框
  120. earaRule: [],
  121. multiple_selection: [], //优惠券
  122. is_show_counpon: 0, //优惠券是否展示
  123. show_addons: <?= $components ?? '{}'; ?>, //插件营销是否展示
  124. the_addons_name: 'Mch',
  125. marketing_score_calculation_list: [ // 积分营销赠送计算方式选项
  126. {
  127. value: 0,
  128. label: '订单实付金额'
  129. },
  130. {
  131. value: 1,
  132. label: '商品利润'
  133. },
  134. {
  135. value: 2,
  136. label: '商品售价'
  137. }
  138. ],
  139. ruleForm: {
  140. /*********************************** 基础设置 ****************************************/
  141. goods_type: 1,
  142. goods_name: '',
  143. subtitle: '',
  144. cover_pic: '',
  145. bannar_pic: [],
  146. video_url: '',
  147. cats: [],
  148. mchCats: [], //多商户系统分类
  149. services: [],
  150. freight: null,
  151. labels: '', // 商品标签
  152. is_attr: 0, // 是否有规格
  153. attr: [],
  154. price: 0,
  155. original_price: 0,
  156. cost_price: 0,
  157. stock: '',
  158. unit: '', // 单位
  159. stock_warning: 0, // 库存预警 - 自定义字段,后面改
  160. goods_weight: 0, // 商品重量 - 自定义字段,后面改
  161. goods_no: '', // 商品货号
  162. is_show_stock: 1, // 是否显示库存 - 自定义字段,后面改
  163. is_show_sales: 1, // 是否显示销量 - 自定义字段,后面改
  164. virtual_sales: 0,
  165. coupon_is_enable: 0, //优惠卷的开关
  166. // logistics_way: [{
  167. // name: '快递发货',
  168. // checked: true
  169. // }], // 快递发货 - 自定义字段,后面改
  170. freight_type: [1], //物流方式 1快递物流
  171. freight_rules_type: 1, // 运费规则类型 1运费模板 2统一运费
  172. freight_id: '', // 运费模板ID
  173. shipping_fee: 0, //统一运费
  174. free_shipping_num: 0, //满N件包邮
  175. free_shipping_money: 0, //满N元包邮
  176. is_cross_border: 0, // 是否跨境商品 - 自定义字段,后面改
  177. is_id_card: 0, // 是否身份证上传 - 自定义字段,后面改
  178. is_on_sale: 1, // 是否上架
  179. extra: {
  180. full_reduce_price_limit: 0, // 单品满额减免价格阈值
  181. full_reduce_money: 0, // 单品满额减免金额
  182. score_give_setting: {
  183. code: 'score',
  184. name: '积分',
  185. enable_give_score: 0, //是否开启赠送积分
  186. give_num: 0, // 货币赠送
  187. give_type: 1, // 货币赠送 1.固定值 2售价百分比
  188. settlement: 0, // 结算方式 1.支付完成 0订单完成
  189. enable_limit_level: 0,
  190. limit_level: [],
  191. calculation_value: 0, // 赠送计算方式
  192. score_giving_goods_type: [], //商品类型
  193. score_giving_calculation: 0, //计算方式
  194. },
  195. is_member_price: 0,
  196. member_price_setting: {},
  197. member_buy_limit_setting: {
  198. member_level: [],
  199. every_num: 0,
  200. every_day_num: 0,
  201. every_week_num: 0,
  202. every_month_num: 0,
  203. nums: 0,
  204. total_num: 0,
  205. },
  206. currency_deduct_setting: [], // 货币这块有bug,暂时不需要展示,所以不需要提交数据
  207. },
  208. coupon_selection: [],
  209. goods_setting: {
  210. /*********************************** 会员权益 **********************************************/
  211. member_setting: { // 会员权益模块提交的格式
  212. member_price_setting: '',
  213. member_price: {},
  214. member_buy_limit_setting: {
  215. member_level: [],
  216. every_num: 0,
  217. every_day_num: 0,
  218. every_week_num: 0,
  219. every_month_num: 0,
  220. nums: 0,
  221. total_num: 0,
  222. }
  223. },
  224. /*********************************** 营销设置 **********************************************/
  225. marketing_setting: { // 营销配置模块提交的格式
  226. full_reduce_price_limit: 0, // 单品满额减免价格阈值
  227. full_reduce_money: 0, // 单品满额减免金额
  228. score_give_setting: {
  229. code: 'score',
  230. name: '积分',
  231. give_num: 0, // 货币赠送
  232. give_type: 1, // 货币赠送 1.固定值 2售价百分比
  233. },
  234. score_deduct_setting: {
  235. code: 'score',
  236. name: '积分',
  237. deduct_num: 0, // 货币抵扣
  238. deduct_type: 1, // 1.单件抵扣 2.多件累计抵扣
  239. },
  240. currency_deduct_setting: [], // 货币这块有bug,暂时不需要展示,所以不需要提交数据
  241. }
  242. },
  243. /******************************* 配送范围 ************************************/
  244. is_area_limit: 0,
  245. // area_limit: [{ list: [] }]
  246. area_limit: [],
  247. addons: {},
  248. mch_id: 0,
  249. },
  250. rules: {
  251. cats: [{
  252. required: true,
  253. type: 'array',
  254. validator: (rule, value, callback) => {
  255. if (this.ruleForm.cats instanceof Array && this.ruleForm.cats.length > 0) {
  256. callback();
  257. }
  258. callback('请选择分类');
  259. }
  260. }],
  261. mchCats: [{
  262. required: true,
  263. type: 'array',
  264. validator: (rule, value, callback) => {
  265. if (this.ruleForm.mchCats instanceof Array && this.ruleForm.mchCats.length > 0) {
  266. callback();
  267. }
  268. callback('请选择系统分类');
  269. }
  270. }],
  271. goods_name: [{
  272. required: true,
  273. message: '请输入商品名称',
  274. trigger: 'blur'
  275. }],
  276. cover_pic: [{
  277. required: true,
  278. message: '请添加图片',
  279. trigger: 'change'
  280. }],
  281. price: [{
  282. required: true,
  283. message: '请输入价格',
  284. trigger: 'blur'
  285. }],
  286. extra: {
  287. full_reduce_price_limit: [{
  288. validator: (rule, value, callback) => {
  289. if (value > 1000000) {
  290. callback('不能大于1000000');
  291. }
  292. callback();
  293. }
  294. }],
  295. full_reduce_money: [{
  296. validator: (rule, value, callback) => {
  297. if (value > 1000000) {
  298. callback('不能大于1000000');
  299. }
  300. callback();
  301. }
  302. }]
  303. },
  304. stock: [{
  305. required: true,
  306. message: '请输入商品库存',
  307. trigger: 'blur'
  308. }],
  309. // area_limit: [{
  310. // required: true,
  311. // type: 'array',
  312. // validator: (rule, value, callback) => {
  313. // if (value instanceof Array && value[0]['list'].length === 0) {
  314. // callback('允许购买区域不能为空');
  315. // }
  316. // callback();
  317. // }
  318. // }],
  319. },
  320. revealArea: [],
  321. };
  322. },
  323. created() {
  324. this.goodsId = getQuery('id');
  325. },
  326. mounted: function() {
  327. this.getGoodsDetail();
  328. },
  329. watch: {
  330. 'ruleForm.detail'(newVal, oldVal) {
  331. this.cForm.detail = newVal
  332. },
  333. },
  334. computed: {
  335. cForm() {
  336. let form = {};
  337. let ruleForm = JSON.parse(JSON.stringify(this.ruleForm));
  338. if (this.form) {
  339. form = Object.assign(ruleForm, JSON.parse(JSON.stringify(this.form)));
  340. } else {
  341. form = ruleForm;
  342. }
  343. if (getQuery('id')) {
  344. form.id = getQuery('id')
  345. }
  346. return form;
  347. },
  348. cRule() {
  349. return this.rule ? Object.assign({}, this.rules, this.rule) : this.rules;
  350. },
  351. },
  352. methods: {
  353. changeFreightType() {
  354. this.is_show_freight = inArray(1, this.ruleForm.freight_type);
  355. },
  356. getGoodsDetail() {
  357. let self = this;
  358. self.cardLoading = true;
  359. request({
  360. params: {
  361. r: 'mch/client/goods/edit',
  362. id: getQuery('id')
  363. },
  364. method: 'get',
  365. }).then(e => {
  366. self.cardLoading = false;
  367. if (e.data.code == 0) {
  368. if (!isEmpty(e.data.data.detail)) {
  369. self.attrGroups = e.data.data.detail.attr_groups;
  370. self.ruleForm = Object.assign(self.ruleForm, e.data.data.detail);
  371. console.info(self.ruleForm);
  372. self.selectCat(e.data.data.detail.cats)
  373. self.cats = e.data.data.detail.cats;
  374. for (let key in e.data.data.detail.freight_type) {
  375. if (e.data.data.detail.freight_type[key] == 1) {
  376. this.is_show_freight = true;
  377. break;
  378. }
  379. }
  380. if (self.ruleForm.area_limit) {
  381. self.deduplicationArea();
  382. }
  383. }
  384. self.label_list = e.data.data.labels;
  385. self.service_list = e.data.data.services;
  386. self.member_level_list = e.data.data.levels;
  387. // 以下数据用于默认规格情况下的 会员价设置
  388. if (!e.data.data.detail.is_attr && e.data.data.detail.is_attr != 0) {
  389. self.member_level_list.forEach((item, index) => {
  390. let obj = {};
  391. obj['id'] = index;
  392. obj['name'] = item.name;
  393. obj['level'] = 'level' + parseInt(item.level);
  394. var key = item.level + '';
  395. self.$set(this.ruleForm.extra.member_price_setting, key, 0);
  396. });
  397. }
  398. // 以下数据用于默认规格情况下的 会员价设置
  399. var memberSetting = e.data.data.detail.extra;
  400. self.member_level_list.forEach(function(item, index) {
  401. let obj = {};
  402. let key = 'level' + parseInt(item.level);
  403. obj['id'] = index;
  404. obj['name'] = item.name;
  405. obj['level'] = key;
  406. if (memberSetting && memberSetting.member_price_setting && memberSetting.member_price_setting[key]) {
  407. self.member_level_list[index]['value'] = memberSetting.member_price_setting[key]; // 赋值到会员列表数据中
  408. } else {
  409. self.member_level_list[index]['value'] = {};
  410. }
  411. self.defaultMemberPrice.push(obj);
  412. });
  413. self.typeArr = e.data.data.goods_type;
  414. self.freight_rules = e.data.data.freight_rules;
  415. // 默认运费模板
  416. if (self.ruleForm.freight_rules_type == 1 && isEmpty(self.ruleForm.freight_id) && self.freight_rules.length > 0) {
  417. self.ruleForm.freight_id = self.freight_rules[0].id;
  418. }
  419. } else {
  420. self.$message.error(e.data.msg);
  421. }
  422. }).catch(e => {
  423. console.log(e);
  424. });
  425. },
  426. /* 配送范围start */
  427. openDistrict() {
  428. this.dialogVisible = true;
  429. this.earaRule = this.ruleForm.area_limit;
  430. },
  431. selectDistrict(e) {
  432. let list = [];
  433. for (let i in e) {
  434. let obj = {
  435. id: e[i].id,
  436. name: e[i].name
  437. };
  438. list.push(obj);
  439. }
  440. this.earaRule = list;
  441. },
  442. districtConfirm() {
  443. this.ruleForm.area_limit = JSON.parse(JSON.stringify(this.earaRule));
  444. this.deduplicationArea();
  445. this.dialogVisible = false;
  446. // this.$refs['ruleForm'].validate((valid) => {
  447. // return false;
  448. // })
  449. },
  450. deduplicationArea() {
  451. let that = this;
  452. let reg = /市$|特别行政区$/;
  453. let filt = [...new Set(this.ruleForm.area_limit.filter(v => reg.test(v.name)).map(v => v.name))];
  454. this.ruleForm.area_limit.forEach(v => {
  455. let length = that.revealArea.filter(f => f.name == v.name).length;
  456. if (filt.findIndex(f => f == v.name) != -1 && length > 0) {
  457. return;
  458. }
  459. that.revealArea.push(v);
  460. })
  461. },
  462. space() { // 删除地区
  463. this.ruleForm.area_limit = [];
  464. },
  465. /* 配送范围end */
  466. showMore(type) { // 展开更多
  467. switch (type) {
  468. case 'base':
  469. this.is_base_show = !this.is_base_show
  470. }
  471. },
  472. toggle(it, i, type) { // tab切换
  473. switch (type) {
  474. case 'tabs':
  475. this.activeName = it.value
  476. break;
  477. case 'select':
  478. if (this.ruleForm.id > 0) return;
  479. this.ruleForm.goods_type = it.type
  480. break;
  481. default:
  482. break;
  483. }
  484. },
  485. coverPic(e) { // 选择图片
  486. this.ruleForm.cover_pic = e[0].url
  487. },
  488. bannerPic(e) { // 选择轮播图
  489. if (e.length) {
  490. e.forEach((item, index) => {
  491. if (this.ruleForm.bannar_pic.length >= 9) return;
  492. this.ruleForm.bannar_pic.push({
  493. id: item.id,
  494. pic_url: item.url
  495. });
  496. })
  497. }
  498. },
  499. delPic(type, index) { // 删除图片
  500. switch (type) {
  501. case 'cover_pic':
  502. this.ruleForm.cover_pic = ''
  503. break;
  504. case 'bannar_pic':
  505. this.ruleForm.bannar_pic.splice(index, 1)
  506. break;
  507. default:
  508. break;
  509. }
  510. },
  511. // 商品视频
  512. videoUrl(e) {
  513. if (e.length) {
  514. this.ruleForm.video_url = e[0].url;
  515. }
  516. },
  517. /*---商品分类----*/
  518. selectCat(cats) {
  519. this.cats = cats;
  520. let arr = [];
  521. cats.map(v => {
  522. arr.push(v.id);
  523. })
  524. this.ruleForm.cats = arr;
  525. this.$refs.ruleForm.validateField('cats');
  526. },
  527. selectMchCat(cats) {
  528. this.mchCats = cats;
  529. let arr = [];
  530. cats.map(v => {
  531. arr.push(v.id);
  532. })
  533. this.ruleForm.mchCats = arr;
  534. this.$refs.ruleForm.validateField('mchCats');
  535. },
  536. /*---商品分类end----*/
  537. /*----规格start----*/
  538. // 规格组合
  539. makeAttrGroup(e) {
  540. let self = this;
  541. let array = [];
  542. self.attrGroups.forEach(function(attrGroupItem, attrGroupIndex) {
  543. attrGroupItem.attr_list.forEach(function(attrListItem, attrListIndex) {
  544. let object = {
  545. attr_group_id: attrGroupItem.attr_group_id,
  546. attr_group_name: attrGroupItem.attr_group_name,
  547. attr_id: attrListItem.attr_id,
  548. attr_name: attrListItem.attr_name,
  549. };
  550. if (!array[attrGroupIndex]) {
  551. array[attrGroupIndex] = [];
  552. }
  553. array[attrGroupIndex].push(object)
  554. });
  555. });
  556. // 2.属性排列组合
  557. const res = array.reduce((osResult, options) => {
  558. return options.reduce((oResult, option) => {
  559. if (!osResult.length) {
  560. return oResult.concat(option)
  561. } else {
  562. return oResult.concat(osResult.map(o => [].concat(o, option)))
  563. }
  564. }, [])
  565. }, []);
  566. // 3.组合结果赋值
  567. for (let i in res) {
  568. const options = Array.isArray(res[i]) ? res[i] : [res[i]];
  569. const row = {
  570. attr_list: options,
  571. stock: typeof(self.ruleForm.attr[i]) == 'undefined' ? 0 : self.ruleForm.attr[i].stock,
  572. price: typeof(self.ruleForm.attr[i]) == 'undefined' ? 0 : self.ruleForm.attr[i].price,
  573. original_price: typeof(self.ruleForm.attr[i]) == 'undefined' ? 0 : self.ruleForm.attr[i].original_price,
  574. cost_price: typeof(self.ruleForm.attr[i]) == 'undefined' ? 0 : self.ruleForm.attr[i].cost_price,
  575. goods_no: typeof(self.ruleForm.attr[i]) == 'undefined' ? '' : self.ruleForm.attr[i].goods_no,
  576. weight: typeof(self.ruleForm.attr[i]) == 'undefined' ? 0 : self.ruleForm.attr[i].weight,
  577. pic_url: typeof(self.ruleForm.attr[i]) == 'undefined' ? '' : self.ruleForm.attr[i].pic_url,
  578. distributionLevelList: [],
  579. levelPrice: typeof(self.ruleForm.attr[i]) == 'undefined' ? {} : self.ruleForm.attr[i].levelPrice,
  580. sign_id: typeof(self.ruleForm.attr[i]) == 'undefined' ? '' : self.ruleForm.attr[i].sign_id,
  581. };
  582. let arr = [];
  583. row.attr_list.forEach(val => {
  584. arr.push(val.attr_id);
  585. })
  586. // console.info(arr.join(":"),"::::");
  587. row.sign_id = arr.join(":");
  588. // 动态绑定多规格会员价
  589. let obj = {};
  590. self.member_level_list.forEach(function(item, index) {
  591. let key = 'level' + item.level;
  592. obj[key] = 0;
  593. });
  594. row['member_price'] = obj;
  595. // 3-1.已设置数据的优先使用原数据
  596. if (self.ruleForm.attr.length) {
  597. for (let j in self.ruleForm.attr) {
  598. const oldOptions = [];
  599. for (let k in self.ruleForm.attr[j].attr_list) {
  600. oldOptions.push(self.ruleForm.attr[j].attr_list[k].attr_name)
  601. }
  602. const newOptions = [];
  603. for (let k in options) {
  604. newOptions.push(options[k].attr_name)
  605. }
  606. if (oldOptions.toString() === newOptions.toString()) {
  607. row['price'] = self.ruleForm.attr[j].price;
  608. row['stock'] = self.ruleForm.attr[j].stock;
  609. row['goods_no'] = self.ruleForm.attr[j].goods_no;
  610. row['weight'] = self.ruleForm.attr[j].weight;
  611. row['pic_url'] = self.ruleForm.attr[j].pic_url;
  612. break
  613. }
  614. }
  615. }
  616. res[i] = row;
  617. }
  618. self.ruleForm.attr = res;
  619. console.log(self.ruleForm.attr, '-------------------------------attr');
  620. },
  621. // 批量设置
  622. batchAttr(key) {
  623. let self = this;
  624. if (self.batch[key] && self.batch[key] >= 0 || key === 'goods_no') {
  625. self.ruleForm.attr.forEach(function(item, index) {
  626. // 批量设置会员价
  627. // 判断字符串是否出现过,并返回位置
  628. if (key.indexOf('level') !== -1) {
  629. item['member_price'][key] = self.batch[key];
  630. } else {
  631. item[key] = self.batch[key];
  632. }
  633. });
  634. }
  635. },
  636. destroyCat(value) {
  637. this.cats = this.cats.filter(function(item) {
  638. return value.id !== item.id
  639. });
  640. this.ruleForm.cats = this.cats.map(function(item) {
  641. return item.id;
  642. })
  643. },
  644. /*----规格end----*/
  645. submit() {
  646. this.$refs['ruleForm'].validate((valid) => {
  647. if (valid) {
  648. let self = this;
  649. if (Number(self.ruleForm.extra.member_buy_limit_setting.every_num) > 0 && Number(self.ruleForm.extra.member_buy_limit_setting.every_num) < Number(self.ruleForm.extra.member_buy_limit_setting.nums)) {
  650. this.$message.error('每次限购数量不能小于起购数量');
  651. return
  652. }
  653. if (Number(self.ruleForm.extra.member_buy_limit_setting.every_day_num) > 0 && Number(self.ruleForm.extra.member_buy_limit_setting.every_day_num) < Number(self.ruleForm.extra.member_buy_limit_setting.nums)) {
  654. this.$message.error('每天限购数量不能小于起购数量');
  655. return
  656. }
  657. if (self.ruleForm.is_attr == 1) {
  658. if (this.attrGroups.length == 0) {
  659. this.$message.error('请完善规格组');
  660. return
  661. }
  662. self.ruleForm.extra.member_price_setting = this.getMemberPrice(this.ruleForm.attr);
  663. }
  664. //把纯数字转字符
  665. this.ruleForm.goods_name = this.ruleForm.goods_name + '';
  666. this.ruleForm.subtitle = this.ruleForm.subtitle + '';
  667. self.btnLoading = true;
  668. params = Object.assign(self.ruleForm, this.cForm);
  669. request({
  670. params: {
  671. r: 'mch/client/goods/edit'
  672. },
  673. method: 'post',
  674. data: {
  675. form: JSON.stringify(params),
  676. }
  677. }).then(e => {
  678. self.btnLoading = false;
  679. if (e.data.code == 0) {
  680. self.$message.success(e.data.msg);
  681. this.$navigate({
  682. r: 'mch/client/goods/index'
  683. })
  684. } else {
  685. self.$message.error(e.data.msg);
  686. }
  687. }).catch(e => {
  688. self.$message.error(e.data.msg);
  689. self.btnLoading = false;
  690. });
  691. }
  692. });
  693. },
  694. //添加优惠券
  695. add_coupon(e) {
  696. this.ruleForm.coupon_selection = e;
  697. },
  698. //跳转新增优惠券界面
  699. // handle_coupon() {
  700. // this.$navigate({
  701. // r: 'coupon/default/edit'
  702. // })
  703. // },
  704. checkoutChange(it) {
  705. console.log(it)
  706. },
  707. getFreight() { // 获取运费规则选项
  708. let self = this;
  709. request({
  710. params: {
  711. r: 'mall/postage-rules/all-list'
  712. },
  713. method: 'get',
  714. data: {}
  715. }).then(e => {
  716. if (e.data.code == 0) {
  717. self.freight.list = e.data.data.list;
  718. // 添加商品时使用默认运费
  719. self.freight.list.unshift({
  720. id: 0,
  721. name: '默认运费',
  722. status: 1
  723. })
  724. console.log(self.freight.list)
  725. } else {
  726. self.$message.error(e.data.msg);
  727. }
  728. }).catch(e => {
  729. console.log(e);
  730. });
  731. },
  732. freightChange(e) {
  733. console.log(e)
  734. },
  735. // 获取规格会员价
  736. getMemberPrice(attr) {
  737. let that = this;
  738. let member_price_setting = {};
  739. let levels = objectKeys(attr[0].member_price_setting);
  740. levels.forEach(level => {
  741. that.$set(member_price_setting, level, {});
  742. });
  743. attr.forEach((v) => {
  744. let sign_id = v.sign_id;
  745. for (const key in v.member_price_setting) {
  746. member_price_setting[key][sign_id] = v.member_price_setting[key];
  747. }
  748. })
  749. member_price_setting = member_price_setting;
  750. return member_price_setting;
  751. },
  752. addons_data_change(e) {
  753. Object.assign(this.ruleForm.addons, e);
  754. console.log(this.ruleForm.addons, '=======addons====');
  755. // this.ruleForm.addons.coupon_selection = e;
  756. },
  757. }
  758. });
  759. </script>