com-goods-distribution.php 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552
  1. <?php
  2. /**
  3. * @link:http://www.goodmall.com/
  4. * @copyright: Copyright (c) 2020
  5. * Created by PhpStorm
  6. * Author: ganxiaohao
  7. * Date: 2020-05-19
  8. * Time: 14:19
  9. */
  10. ?>
  11. <template id="com-goods-distribution" v-cloak>
  12. <el-card shadow="never" class="mt-24">
  13. <div v-loading="loading" class="com-goods-distribution" v-if="goods_id!=0">
  14. <el-form-item label="是否开启分销" prop="is_alone">
  15. <el-switch :active-value="1" :inactive-value="0" v-model="form.is_alone">
  16. </el-switch>
  17. </el-form-item>
  18. <template v-if="form.is_alone==1">
  19. <el-form-item label="分销佣金设置" v-if="use_attr == 1">
  20. <el-radio v-model="form.attr_setting_type" :label="0">按商品设置</el-radio>
  21. <el-radio v-model="form.attr_setting_type" :label="1">按规格设置</el-radio>
  22. </el-form-item>
  23. <el-form-item label="分销佣金类型" prop="share_type">
  24. <el-radio v-model="form.share_type" :label="0">固定金额</el-radio>
  25. <el-radio v-model="form.share_type" :label="1">百分比</el-radio>
  26. </el-form-item>
  27. <el-form-item label="分销佣金">
  28. <template v-if="distributionLevel.length == 0">
  29. <el-button type="danger" @click="$navigate({r: 'plugin/distribution/mall/setting/index'})">
  30. 请先在分销应用的中开启功能
  31. </el-button>
  32. </template>
  33. <template v-else>
  34. <div class="box">
  35. <label style="margin-bottom:0;padding:18px 10px;">批量设置</label>
  36. <el-select v-model="selectLevel" slot="prepend" placeholder="请选择等级"
  37. v-if="form.attr_setting_type == 1">
  38. <el-option v-for="(item, index) in form.distribution_level_list"
  39. :value="index"
  40. :key="item.id"
  41. :label="item.name">{{item.name}}
  42. </el-option>
  43. </el-select>
  44. <el-select v-model="selectData" slot="prepend" placeholder="请选择层级">
  45. <el-option v-for="(item, index) in distributionLevel" :value="item.value"
  46. :key="item.id"
  47. :label="item.label">{{item.label}}
  48. </el-option>
  49. </el-select>
  50. <el-input @keyup.enter.native="enter" type="number" style="width: 150px;"
  51. v-model="batchShareLevel">
  52. <span slot="append">{{form.share_type == 1 ? '%' : '元'}}</span>
  53. </el-input>
  54. <el-button type="primary" size="small" @click="batchAttr">设置</el-button>
  55. </div>
  56. <!--普通分销佣金设置 -->
  57. <template v-if="form.attr_setting_type == 0 || use_attr == 0">
  58. <el-table ref="normal" :data="form.distribution_level_list" border stripe style="width: 100%;"
  59. @selection-change="handleSelectionChange">
  60. <el-table-column type="selection" width="55"></el-table-column>
  61. <el-table-column width="100" label="等级名称" prop="name"></el-table-column>
  62. <el-table-column :label="item.label" :prop="item.value" :property="item.value"
  63. v-for="(item, index) in distributionLevel" :key="index" width="300">
  64. <template slot-scope="scope">
  65. <el-input type="number" v-model="scope.row[scope.column.property]">
  66. <span slot="append">{{form.share_type == 1 ? '%' : '元'}}</span>
  67. </el-input>
  68. </template>
  69. </el-table-column>
  70. </el-table>
  71. </template>
  72. <template v-else>
  73. <!-- 详细分销佣金设置 -->
  74. <template v-if="form.attr.length > 0">
  75. <el-table ref="detail" :data="form.attr" border class="detail"
  76. @selection-change="handleSelectionChange">
  77. <el-table-column type="selection" width="55"></el-table-column>
  78. <el-table-column width="100" v-for="(item, index) in attrGroups" :key="item.id"
  79. :label="item.attr_group_name"
  80. :prop="'attr_list['+index+'].attr_name'">
  81. </el-table-column>
  82. <el-table-column v-for="(item, index) in form.distribution_level_list" :key="item.id"
  83. :label="item.name">
  84. <el-table-column :label="value.label" type="index" :index="index"
  85. :prop="value.value"
  86. v-for="(value, key) in distributionLevel" :key="key" width="150">
  87. <template slot-scope="scope">
  88. <el-input type="number"
  89. v-model="scope.row.distribution_level_list[scope.column.index][scope.column.property]" @input="onInput()">
  90. <span slot="append">{{form.share_type == 1 ? '%' : '元'}}</span>
  91. </el-input>
  92. </template>
  93. </el-table-column>
  94. </el-table-column>
  95. </el-table>
  96. </template>
  97. <!-- 默认规格 分销佣金-->
  98. <template v-else>
  99. <el-tag style="margin-top: 10px;" type="danger">如需设置多规格分销价, 请先添加商品规格</el-tag>
  100. </template>
  101. </template>
  102. </template>
  103. </el-form-item>
  104. <!-- <el-form-item label="分销积分类型" prop="score_type">
  105. <el-radio v-model="form.score_type" :label="0">固定金额</el-radio>
  106. <el-radio v-model="form.score_type" :label="1">百分比</el-radio>
  107. </el-form-item>
  108. <el-form-item label="分销积分">
  109. <template v-if="distributionLevel.length == 0">
  110. <el-button type="danger" @click="$navigate({r: 'plugin/distribution/mall/setting/index'})">
  111. 请先在分销应用的中开启功能
  112. </el-button>
  113. </template>
  114. <template v-else>
  115. <div class="box">
  116. <label style="margin-bottom:0;padding:18px 10px;">批量设置</label>
  117. <el-select v-model="selectLevel2" slot="prepend" placeholder="请选择等级"
  118. v-if="form.attr_setting_type == 1">
  119. <el-option v-for="(item, index) in form.distribution_level_list_score"
  120. :value="index"
  121. :key="item.id"
  122. :label="item.name">{{item.name}}
  123. </el-option>
  124. </el-select>
  125. <el-select v-model="selectData2" slot="prepend" placeholder="请选择层级">
  126. <el-option v-for="(item, index) in distributionLevel" :value="item.value"
  127. :key="item.id"
  128. :label="item.label">{{item.label}}
  129. </el-option>
  130. </el-select>
  131. <el-input @keyup.enter.native="enter" type="number" style="width: 150px;"
  132. v-model="batchShareLevel2">
  133. <span slot="append">{{form.score_type == 1 ? '%' : '个'}}</span>
  134. </el-input>
  135. <el-button type="primary" size="small" @click="batchAttr2">设置</el-button>
  136. </div>
  137. <template v-if="form.attr_setting_type == 0 || use_attr == 0">
  138. <el-table ref="normal" :data="form.distribution_level_list_score" border stripe style="width: 100%;"
  139. @selection-change="handleSelectionChange2">
  140. <el-table-column type="selection" width="55"></el-table-column>
  141. <el-table-column width="100" label="等级名称" prop="name"></el-table-column>
  142. <el-table-column :label="item.label" :prop="item.value" :property="item.value"
  143. v-for="(item, index) in distributionLevel" :key="index" width="300">
  144. <template slot-scope="scope">
  145. <el-input type="number" v-model="scope.row[scope.column.property]">
  146. <span slot="append">{{form.score_type == 1 ? '%' : '个'}}</span>
  147. </el-input>
  148. </template>
  149. </el-table-column>
  150. </el-table>
  151. </template>
  152. <template v-else>
  153. <template v-if="form.attr.length > 0">
  154. <el-table ref="detail" :data="form.attr" border class="detail"
  155. @selection-change="handleSelectionChange2">
  156. <el-table-column type="selection" width="55"></el-table-column>
  157. <el-table-column width="100" v-for="(item, index) in attrGroups" :key="item.id"
  158. :label="item.attr_group_name"
  159. :prop="'attr_list['+index+'].attr_name'">
  160. </el-table-column>
  161. <el-table-column v-for="(item, index) in form.distribution_level_list_score" :key="item.id"
  162. :label="item.name">
  163. <el-table-column :label="value.label" type="index" :index="index"
  164. :prop="value.value"
  165. v-for="(value, key) in distributionLevel" :key="key" width="150">
  166. <template slot-scope="scope">
  167. <el-input type="number"
  168. v-model="scope.row.distribution_level_list_score[scope.column.index][scope.column.property]" @input="onInput()">
  169. <span slot="append">{{form.share_type == 1 ? '%' : '元'}}</span>
  170. </el-input>
  171. </template>
  172. </el-table-column>
  173. </el-table-column>
  174. </el-table>
  175. </template>
  176. <template v-else>
  177. <el-tag style="margin-top: 10px;" type="danger">如需设置多规格分销价, 请先添加商品规格</el-tag>
  178. </template>
  179. </template>
  180. </template>
  181. </el-form-item> -->
  182. </template>
  183. <el-form-item>
  184. <el-button type="primary" style="margin-top: 10px" size="small" @click="saveGoodsDistribution">保存分销设置
  185. </el-button>
  186. </el-form-item>
  187. </div>
  188. </el-card>
  189. <!-- <el-tabs v-model="activeName" @tab-click="handleClick" style="margin-left: 20px;">
  190. <el-tab-pane label="佣金" name="zero">
  191. </el-tab-pane>
  192. </el-tabs> -->
  193. </template>
  194. <script>
  195. Vue.component('com-goods-distribution', {
  196. template: '#com-goods-distribution',
  197. props: {
  198. goods: Number,
  199. goods_id: String,
  200. goods_type: String,
  201. },
  202. data() {
  203. return {
  204. form: {
  205. goods_id: 0,
  206. attr_setting_type: 0,
  207. share_type: 0,
  208. score_type: 0,
  209. distribution_level_list: [],
  210. distribution_level_list_score: [],
  211. attr: [],
  212. is_alone: 0,
  213. goods_type: 'MALL_GOODS'
  214. },
  215. attrGroups: [],
  216. distributionLevel: [], //分销层级
  217. loading: false, //默认不在请求中
  218. selectList: [],
  219. batchShareLevel: 0,
  220. selectData: '',
  221. selectLevel: '',
  222. selectList2: [],
  223. batchShareLevel2: 0,
  224. selectData2: '',
  225. selectLevel2: '',
  226. use_attr: 0,
  227. // 这里是二级tab数据
  228. // currencyList : [], //对应的可用货币列表
  229. // activeName: 'zero',
  230. }
  231. },
  232. mounted() {
  233. if (this.goods_id == 0) {
  234. this.$alert('请先保存商品后重试!', '分销设置提示', {
  235. confirmButtonText: '确定',
  236. });
  237. return;
  238. }
  239. this.form.goods_id = this.goods_id;
  240. this.form.goods_type = this.goods_type;
  241. this.loadData();
  242. },
  243. methods: {
  244. // 标签页
  245. handleClick(tab, event) {
  246. this.$emit('change-tabs', tab.name);
  247. console.log(tab.name,'tab.nametab.nametab.name')
  248. if (tab.name == "third") {
  249. this.getMembers();
  250. }
  251. if(tab.name == "seventh"){
  252. // 请求短视频设置
  253. this.videoLoadData();
  254. }
  255. if(tab.name == "eighth"){
  256. // 请求短视频设置
  257. // this.videoLoadData();
  258. }
  259. if(tab.name == "second"){
  260. // 请求会员价设置
  261. this.getMembers();
  262. }
  263. if(tab.name == "tenth"){
  264. // 电子券设置
  265. }
  266. },
  267. onInput(){
  268. this.$forceUpdate();
  269. },
  270. saveGoodsDistribution() {
  271. let self = this;
  272. if(self.loading){ //请求没有完成,不能重复请求
  273. return
  274. }
  275. self.loading = true; //请求中
  276. // console.log(self.form);
  277. // return
  278. request({
  279. params: {
  280. r: 'distribution/distribution/goods-distribution-setting',
  281. },
  282. method: 'post',
  283. data: {
  284. form: this.form
  285. }
  286. }).then(e => {
  287. self.loading = false;
  288. if (e.data.code == 0) {
  289. self.$message.success(e.data.msg);
  290. } else {
  291. self.$message.error(e.data.msg);
  292. }
  293. }).catch(e => {
  294. console.log(e);
  295. });
  296. },
  297. // 获取分销设置
  298. loadData() {
  299. let self = this;
  300. self.loading = true;
  301. request({
  302. params: {
  303. r: 'distribution/distribution/distribution-config',
  304. goods_id: self.goods_id,
  305. goods_type: self.goods_type
  306. },
  307. method: 'get',
  308. data: {}
  309. }).then(e => {
  310. self.loading = false;
  311. if (e.data.code == 0) {
  312. let detail = e.data.data.detail;
  313. if (detail.distribution_goods) {
  314. self.form.share_type = detail.distribution_goods.share_type;
  315. self.form.score_type = detail.distribution_goods.score_type;
  316. self.form.attr_setting_type = detail.distribution_goods.attr_setting_type;
  317. self.form.is_alone = detail.distribution_goods.is_alone;
  318. }
  319. if (detail.goods) {
  320. self.use_attr = detail.goods.use_attr;
  321. self.attrGroups = detail.goods.attr_groups;
  322. }
  323. self.distributionLevel = e.data.data.distributionLevelArray; //分销层级
  324. self.form.distribution_level_list = e.data.data.distributionLevelList; //分销商等级
  325. //-------
  326. self.form.distribution_level_list_score = e.data.data.distributionLevelList; //分销商等级
  327. // 分销层级&会员等级发送给兄弟组件
  328. let publicLeverData = {
  329. distributionLevel : e.data.data.distributionLevelArray,
  330. distribution_level_list : e.data.data.distributionLevelList,
  331. //-------
  332. distribution_level_list_score : e.data.data.distributionLevelList,
  333. }
  334. this.$emit("public-lever-data", publicLeverData);
  335. if (e.data.data.detail) {
  336. let attr_level_setting_list = e.data.data.detail.attr_distribution_level_setting_list;
  337. self.form.attr = e.data.data.detail.attr;
  338. if (self.use_attr == 1) { // 使用规格的情况
  339. self.form.attr.forEach((attr, index) => {
  340. let item_distribution_level_list = this.setDistriburtionLevel(self.form.distribution_level_list, attr_level_setting_list[index].distribution_level_list);
  341. self.$set(self.form.attr[index], 'distribution_level_list', item_distribution_level_list)
  342. //--------
  343. let item_distribution_level_list_score = this.setDistriburtionLevel(self.form.distribution_level_list_score, attr_level_setting_list[index].distribution_level_list_score);
  344. self.$set(self.form.attr[index], 'distribution_level_list_score', item_distribution_level_list_score)
  345. });
  346. }
  347. let distribution_level_setting_list = e.data.data.detail.distribution_level_setting_list;
  348. let form_distribution_level_list = this.setDistriburtionLevel(self.form.distribution_level_list, distribution_level_setting_list);
  349. self.$set(self.form, 'distribution_level_list', form_distribution_level_list)
  350. //-----------
  351. let distribution_level_setting_list_score = e.data.data.detail.distribution_level_setting_list_score;
  352. let form_distribution_level_list_score = this.setDistriburtionLevel(self.form.distribution_level_list_score, distribution_level_setting_list_score);
  353. self.$set(self.form, 'distribution_level_list_score', form_distribution_level_list_score)
  354. }
  355. } else {
  356. self.$message.error(e.data.msg);
  357. }
  358. }).catch(e => {
  359. console.log(e);
  360. });
  361. },
  362. setDistriburtionLevel(distributionLevelList, list) {
  363. let newDistributionLevelList = [];
  364. distributionLevelList.forEach((item) => {
  365. let newItem = {
  366. level: item.level,
  367. name: item.name,
  368. commission_first: 0,
  369. commission_second: 0,
  370. commission_third: 0,
  371. score_first: 0,
  372. score_second: 0,
  373. score_third: 0,
  374. };
  375. for (let i in list) {
  376. if (list[i].level == item.level) {
  377. newItem = Object.assign(newItem, list[i]);
  378. }
  379. }
  380. newDistributionLevelList.push(newItem);
  381. });
  382. return JSON.parse(JSON.stringify(newDistributionLevelList));
  383. },
  384. handleSelectionChange(data) {
  385. this.selectList = data;
  386. },
  387. handleSelectionChange2(data) {
  388. this.selectList2 = data;
  389. },
  390. batchAttr() {
  391. let form = JSON.parse(JSON.stringify(this.form));
  392. if (form.attr_setting_type == 0) {
  393. if (!this.selectList || this.selectList.length === 0) {
  394. this.$message.warning('请勾选分销商等级');
  395. return;
  396. }
  397. if (this.selectData === '') {
  398. this.$message.warning('请选择分销层级');
  399. return;
  400. }
  401. form.distribution_level_list.forEach((item, index) => {
  402. let flag = false;
  403. this.selectList.map((item1) => {
  404. if (JSON.stringify(item1) === JSON.stringify(item)) {
  405. flag = true;
  406. }
  407. });
  408. if (flag) {
  409. item[this.selectData] = this.batchShareLevel
  410. }
  411. })
  412. } else {
  413. if (!this.selectList || this.selectList.length === 0) {
  414. this.$message.warning('请勾选商品规格');
  415. return;
  416. }
  417. if (this.selectLevel === '') {
  418. this.$message.warning('请选择分销商等级');
  419. return;
  420. }
  421. if (this.selectData === '') {
  422. this.$message.warning('请选择分销层级');
  423. return;
  424. }
  425. form.attr.forEach((item, index) => {
  426. let flag = false;
  427. this.selectList.map((item1) => {
  428. if (JSON.stringify(item1.attr_list) === JSON.stringify(item.attr_list)) {
  429. flag = true;
  430. }
  431. });
  432. if (flag) {
  433. item.distribution_level_list[this.selectLevel][this.selectData] = this.batchShareLevel
  434. }
  435. })
  436. }
  437. this.$set(this, 'form', form);
  438. },
  439. batchAttr2() {
  440. let form = JSON.parse(JSON.stringify(this.form));
  441. if (form.attr_setting_type == 0) {
  442. if (!this.selectList2 || this.selectList2.length === 0) {
  443. this.$message.warning('请勾选分销商等级');
  444. return;
  445. }
  446. if (this.selectData2 === '') {
  447. this.$message.warning('请选择分销层级');
  448. return;
  449. }
  450. form.distribution_level_list_score.forEach((item, index) => {
  451. let flag = false;
  452. this.selectList2.map((item1) => {
  453. if (JSON.stringify(item1) === JSON.stringify(item)) {
  454. flag = true;
  455. }
  456. });
  457. if (flag) {
  458. item[this.selectData2] = this.batchShareLevel2
  459. }
  460. })
  461. } else {
  462. if (!this.selectList2 || this.selectList2.length === 0) {
  463. this.$message.warning('请勾选商品规格');
  464. return;
  465. }
  466. if (this.selectLevel2 === '') {
  467. this.$message.warning('请选择分销商等级');
  468. return;
  469. }
  470. if (this.selectData2 === '') {
  471. this.$message.warning('请选择分销层级');
  472. return;
  473. }
  474. form.attr.forEach((item, index) => {
  475. let flag = false;
  476. this.selectList2.map((item1) => {
  477. if (JSON.stringify(item1.attr_list) === JSON.stringify(item.attr_list)) {
  478. flag = true;
  479. }
  480. });
  481. if (flag) {
  482. item.distribution_level_list_score[this.selectLevel2][this.selectData2] = this.batchShareLevel2
  483. }
  484. })
  485. }
  486. this.$set(this, 'form', form);
  487. }
  488. }
  489. });
  490. </script>
  491. <style>
  492. .com-goods-distribution .box {
  493. border-top: 1px solid #E8EAEE;
  494. border-left: 1px solid #E8EAEE;
  495. border-right: 1px solid #E8EAEE;
  496. padding: 16px;
  497. }
  498. .com-goods-distribution .box .batch {
  499. margin-left: -10px;
  500. margin-right: 20px;
  501. }
  502. .com-goods-distribution .el-select .el-input {
  503. width: 130px;
  504. }
  505. .com-goods-distribution .detail {
  506. width: 100%;
  507. }
  508. .com-goods-distribution .detail .el-input-group__append {
  509. padding: 0 10px;
  510. }
  511. .com-goods-distribution input::-webkit-outer-spin-button,
  512. .com-goods-distribution input::-webkit-inner-spin-button {
  513. -webkit-appearance: none;
  514. }
  515. .com-goods-distribution input[type="number"] {
  516. -moz-appearance: textfield;
  517. }
  518. .com-goods-distribution .el-table .cell {
  519. text-align: center;
  520. }
  521. .com-goods-distribution .el-table thead.is-group th {
  522. background: #ffffff;
  523. }
  524. </style>