edit.php 44 KB

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