index.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-dialog-select');
  4. ?>
  5. <div id="app" v-cloak>
  6. <el-card class="box-card" v-loading="loading" shadow="never" style="border:0;min-width: 1200px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  7. <div slot="header">
  8. <div>
  9. <span>基础设置</span>
  10. </div>
  11. </div>
  12. <div class="form_box">
  13. <el-form :model="ruleForm" :rules="rules" size="small" ref="ruleForm" label-width="150px">
  14. <el-card shadow="never">
  15. <div slot="header">
  16. <div>
  17. <span>分销循环设置</span>
  18. </div>
  19. </div>
  20. <div>
  21. <el-row>
  22. <el-col :span="16">
  23. <el-form-item label="启用分销循环">
  24. <div>
  25. <el-switch v-model="ruleForm.is_enable" :active-value="1" :inactive-value="0">
  26. </el-switch>
  27. </div>
  28. <div class="tips-text" style="line-height: 24px;">
  29. 开启分销循环才会按以下设置进行分红
  30. </div>
  31. </el-form-item>
  32. <el-form-item prop="is_apply" label="成为分销商的条件">
  33. <el-col :span="8" style="width: 100%">
  34. <el-radio-group v-model="ruleForm.is_apply" size="small">
  35. <el-radio :label="0" border>无条件</el-radio>
  36. <el-radio :label="1" border>申请</el-radio>
  37. <el-radio :label="2" border>购买商品</el-radio>
  38. </el-radio-group>
  39. </el-col>
  40. <div class="tips-text" style="line-height: 24px;">
  41. 成为分销商的条件,可申请可无条件(即所有人去推荐都有以下分红)
  42. </div>
  43. </el-form-item>
  44. <el-form-item prop="become_goods_ids">
  45. <template v-if="ruleForm.is_apply == 2">
  46. <el-form-item prop="become_goods_way">
  47. <el-radio-group v-model="ruleForm.become_goods_way" size="small">
  48. <el-radio :label="0">任意商品</el-radio>
  49. <el-radio :label="1">指定商品</el-radio>
  50. </el-radio-group>
  51. </el-form-item>
  52. <el-form-item prop="become_order_status">
  53. <el-radio-group v-model="ruleForm.become_order_status" size="small">
  54. <el-radio :label="0">订单完成</el-radio>
  55. <el-radio :label="1">订单支付</el-radio>
  56. </el-radio-group>
  57. </el-form-item>
  58. <template v-if="ruleForm.become_goods_way == 1">
  59. <div style="display:flex;justify-content:space-between;padding-bottom:10px;">
  60. <span style="color: #ff4544;">最多可添加100个商品</span>
  61. <span>
  62. <com-dialog-select :multiple="true" @selected="becomeGoodsSelect" title="商品选择">
  63. <el-button type="primary" size="mini">选择商品</el-button>
  64. </com-dialog-select>
  65. </span>
  66. </div>
  67. <div style="max-height: 300px;overflow-y: auto">
  68. <el-table :data="ruleForm.become_goods_list" :show-header="false" border>
  69. <el-table-column label="">
  70. <template slot-scope="scope">
  71. <div flex>
  72. <div style="padding-right: 10px;flex-grow: 0">
  73. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  74. </div>
  75. <div style="flex-grow: 1;">
  76. <com-ellipsis :line="2">{{scope.row.name}}
  77. </com-ellipsis>
  78. </div>
  79. <div style="flex-grow: 0;">
  80. <el-button @click="deleteBecomeGoods(scope.$index)" type="text" circle size="mini">
  81. <el-tooltip class="item" effect="dark" content="删除" placement="top">
  82. <img src="resources/img/mall/del.png" alt="">
  83. </el-tooltip>
  84. </el-button>
  85. </div>
  86. </div>
  87. </template>
  88. </el-table-column>
  89. </el-table>
  90. </div>
  91. </template>
  92. </template>
  93. </el-form-item>
  94. <el-form-item label="推广中心显示">
  95. <div>
  96. <el-switch v-model="ruleForm.is_show_at_center" :active-value="1" :inactive-value="0">
  97. </el-switch>
  98. </div>
  99. <div class="tips-text" style="line-height: 24px;">
  100. 推广中心是否显示分销循环分红
  101. </div>
  102. </el-form-item>
  103. <el-form-item prop="is_check" label="是否需要审核">
  104. <el-col :span="8" style="width: 100%">
  105. <el-radio-group v-model="ruleForm.is_check" size="small">
  106. <el-radio :label="0" border>不需要</el-radio>
  107. <el-radio :label="1" border>需要</el-radio>
  108. </el-radio-group>
  109. </el-col>
  110. <div class="tips-text" style="line-height: 24px;">
  111. 申请为分销上是否需要审核
  112. </div>
  113. </el-form-item>
  114. <el-form-item label="申请协议" prop="protocol" v-if="ruleForm.is_apply==1">
  115. <el-input type="textarea" :rows="4" placeholder="申请协议" v-model="ruleForm.protocol">
  116. </el-input>
  117. </el-form-item>
  118. <el-form-item label="分销层级" prop="level" required>
  119. <el-radio-group v-model="ruleForm.level">
  120. <el-radio :label="1" is_checked="is_check">一级分销</el-radio>
  121. </el-radio-group>
  122. </el-form-item>
  123. <el-form-item prop="compute_type" label="结算方式">
  124. <el-col :span="19" style="width: 100%">
  125. <el-radio-group v-model="ruleForm.compute_type" size="small">
  126. <el-radio :label="0" border>订单完成后</el-radio>
  127. <el-radio :label="1" border>订单支付后</el-radio>
  128. </el-radio-group>
  129. </el-col>
  130. <div class="tips-text" style="line-height: 24px;">
  131. 循环分红佣金结算方式,结算后才能提现,如选择支付后则会员支付后其上级佣金马上结算,进行提现
  132. </div>
  133. </el-form-item>
  134. <el-form-item prop="computing_method" label="计算方式">
  135. <el-col :span="19" style="width: 100%">
  136. <el-radio-group v-model="ruleForm.computing_method" size="small">
  137. <el-radio :label="0" border>实际支付金额</el-radio>
  138. <el-radio :label="1" border>商品售价</el-radio>
  139. <el-radio :label="2" border>商品利润</el-radio>
  140. </el-radio-group>
  141. </el-col>
  142. <div class="tips-text" style="line-height: 24px;">
  143. 如分销循环佣金选的是按百分比来算,则按这里的计算基数计算佣金
  144. </div>
  145. </el-form-item>
  146. <el-form-item label="循环复购">
  147. <div>
  148. <el-switch v-model="ruleForm.is_circle_repurchase" :active-value="1" :inactive-value="0">
  149. </el-switch>
  150. </div>
  151. <div class="tips-text" style="line-height: 24px;">
  152. 开启以后每循环奖励一次后需要进行复购才结算奖励
  153. </div>
  154. </el-form-item>
  155. <el-form-item label="指定商品" v-if="ruleForm.is_circle_repurchase > 0">
  156. <el-col :span="2">
  157. <com-dialog-select :multiple="true" @selected="goodsSelect" title="指定商品" style="float: right; margin-top: 10px;"><el-button type="primary" plain size="mini">添加商品</el-button></com-dialog-select>
  158. </el-col>
  159. <el-col :span="22">
  160. <div class="goods_box" v-for="(item,key) in ruleForm.thaw_goods_list">
  161. <div>
  162. <com-image mode="aspectFill" :src="item.cover_pic"></com-image>
  163. </div>
  164. <div class="goods_desc">
  165. <span class="ellipsis">{{ item.name }}</span>
  166. <span style="display: flex;justify-content: space-between;">
  167. <span>¥{{ item.price }}</span>
  168. <span><el-button type="text" style="padding: 0;" @click="deleteGoods(key)">删除</el-button></span>
  169. </span>
  170. </div>
  171. </div>
  172. </el-col>
  173. </el-form-item>
  174. <el-form-item prop="compute_type" label="复购结算方式" v-if="ruleForm.is_circle_repurchase > 0">
  175. <el-col :span="19" style="width: 100%">
  176. <el-radio-group v-model="ruleForm.repurchase_compute_type" size="small">
  177. <el-radio :label="0" border>订单完成后</el-radio>
  178. <el-radio :label="1" border>订单支付后</el-radio>
  179. </el-radio-group>
  180. </el-col>
  181. <div class="tips-text" style="line-height: 24px;">
  182. 复购后待结算佣金何时结算
  183. </div>
  184. </el-form-item>
  185. </el-col>
  186. </el-row>
  187. </div>
  188. </el-card>
  189. <el-card style="margin-top: 10px" shadow="never">
  190. <div slot="header">
  191. <div>佣金设置
  192. <el-tooltip class="item" effect="dark" content="需要打开分销循环开关,才能设置对应的分销佣金" placement="top">
  193. <i class="el-icon-info"></i>
  194. </el-tooltip>
  195. </div>
  196. </div>
  197. <el-col :span="14">
  198. <el-form-item label="分销佣金类型" prop="price_type">
  199. <el-radio-group v-model="ruleForm.commission.is_percent">
  200. <el-radio :label="0">百分比</el-radio>
  201. <el-radio :label="1">固定金额</el-radio>
  202. </el-radio-group>
  203. <div class="tips-text" style="line-height: 24px;">
  204. 佣金设置:<br />
  205. A推荐下级下单<br />
  206. 直推下级的第一个订单,A拿10%<br />
  207. 直推下级的第二个订单,A拿20%<br />
  208. 直推下级的第三个订单,A拿30%<br />
  209. 直推下级的第四个订单,A拿10%<br />
  210. 直推下级的第五个订单,A拿20%<br />
  211. 直推下级的第六个订单,A拿30%<br />
  212. 以此类推
  213. </div>
  214. </el-form-item>
  215. <el-form-item v-for="(item,index) in ruleForm.commission.list" :key='index' v-if="ruleForm.commission.list.length > 0" label='佣金阶梯' prop="first_score">
  216. <el-input type="number" :min="0" v-model="item.value" style="width: 360px;margin-right: 20px;">
  217. <template slot="prepend">直推第{{ index+1 }}人/直推第n+{{ index+1 }}人</template>
  218. <template slot="append" v-if="ruleForm.commission.is_percent == 0">%</template>
  219. <template slot="append" v-if="ruleForm.commission.is_percent == 1">元</template>
  220. </el-input>
  221. <el-button v-if="ruleForm.commission.list && ruleForm.commission.list.length>1" size="mini" type="danger" icon="el-icon-close" circle @click="delItem(index)" style="margin-left:10px"></el-button>
  222. </el-form-item>
  223. <el-button type="primary" @click="dirctAddSet" size="small" style="margin-bottom: 10px;marginLeft:60px">+添加佣金阶梯</el-button>
  224. </el-col>
  225. <el-col :span="14">
  226. <el-form-item label="分销积分奖励" prop="score_type">
  227. <el-radio-group v-model="ruleForm.score.is_percent">
  228. <el-radio :label="0">百分比</el-radio>
  229. <el-radio :label="1">固定</el-radio>
  230. </el-radio-group>
  231. </el-form-item>
  232. <el-form-item v-for="(item,index) in ruleForm.score.list" :key='index' v-if="ruleForm.score.list.length > 0" label='积分阶梯' prop="first_score">
  233. <el-input type="number" :min="0" v-model="item.value" style="width: 360px;margin-right: 20px;">
  234. <template slot="prepend">直推第{{ index+1 }}人/直推第n+{{ index+1 }}人</template>
  235. <template slot="append" v-if="ruleForm.score.is_percent == 0">%</template>
  236. <template slot="append" v-if="ruleForm.score.is_percent == 1">积分</template>
  237. </el-input>
  238. <el-button v-if="ruleForm.score.list && ruleForm.score.list.length>1" size="mini" type="danger" icon="el-icon-close" circle @click="delScoreItem(index)" style="margin-left:10px"></el-button>
  239. </el-form-item>
  240. <el-button type="primary" @click="scoreAddSet" size="small" style="margin-bottom: 10px;marginLeft:60px">+添加积分阶梯</el-button>
  241. </el-col>
  242. </el-card>
  243. </el-form>
  244. <el-button :loading="btnLoading" class="button-item" type="primary" style="margin-top: 24px;" @click="store('ruleForm')" size="small">保存
  245. </el-button>
  246. </div>
  247. </el-card>
  248. </div>
  249. <script>
  250. const app = new Vue({
  251. el: '#app',
  252. data() {
  253. return {
  254. loading: false,
  255. btnLoading: false,
  256. cat_show: false,
  257. show_share_level: false,
  258. ruleForm: {
  259. level: 0,
  260. is_apply: 0,
  261. is_show_at_center: 1,
  262. is_check: 0,
  263. is_self_buy: 0,
  264. diect: [],
  265. commission: {
  266. is_percent: 0,
  267. list: []
  268. },
  269. score: {
  270. is_percent: 0,
  271. list: []
  272. },
  273. is_show_share_level: 0,
  274. rebuy_price_date: 1,
  275. is_rebuy: 0,
  276. is_team: 0,
  277. subsidy_price_date: 1,
  278. is_subsidy: 0,
  279. computing_method: 0,
  280. compute_type: 0,
  281. protocol: '',
  282. is_circle_repurchase: 0,
  283. thaw_goods_ids: [],
  284. thaw_goods_list: [],
  285. repurchase_compute_type: 0,
  286. become_goods_list: [],
  287. become_goods_ids: [],
  288. become_goods_way: 0,
  289. become_order_status: 1,
  290. },
  291. rules: {
  292. level: [{
  293. message: '请选择分销层级',
  294. trigger: 'blur',
  295. required: true
  296. }],
  297. is_self_buy: [{
  298. message: '请选择分销内购',
  299. trigger: 'blur',
  300. required: true
  301. }],
  302. }
  303. }
  304. },
  305. mounted: function() {
  306. this.loadData();
  307. },
  308. methods: {
  309. loadData() {
  310. this.loading = true;
  311. request({
  312. params: {
  313. r: 'circle-distribution/setting/index',
  314. },
  315. method: 'get'
  316. }).then(e => {
  317. console.log('e:', e);
  318. this.loading = false;
  319. if (e.data.code == 0) {
  320. Object.assign(this.ruleForm, e.data.data);
  321. this.ruleForm.commission = e.data.data.commission;
  322. this.ruleForm.score = e.data.data.score;
  323. }
  324. }).catch(e => {
  325. this.loading = false;
  326. this.$message.error(e);
  327. })
  328. },
  329. store(formName) {
  330. if (this.ruleForm.rebuy_price_date > 28) {
  331. this.$message.error('为防止部分月份低于28天,请填写28日及之前');
  332. return;
  333. }
  334. let title_obj = {};
  335. this.$nextTick(() => {
  336. let elFormItemLabelDom = document.getElementsByClassName("el-form-item__label");
  337. for (let i = 0; i < elFormItemLabelDom.length; i++) {
  338. let labKey = elFormItemLabelDom[i].getAttribute("for");
  339. let labVal = elFormItemLabelDom[i].innerText;
  340. title_obj[labKey] = labVal;
  341. }
  342. })
  343. this.$refs[formName].validate((valid) => {
  344. if (valid) {
  345. this.btnLoading = true;
  346. request({
  347. params: {
  348. r: 'circle-distribution/setting/index',
  349. },
  350. method: 'post',
  351. data: {
  352. basic: this.ruleForm,
  353. // title: title_obj,
  354. }
  355. }).then(e => {
  356. this.btnLoading = false;
  357. if (e.data.code == 0) {
  358. this.$message.success(e.data.msg);
  359. } else {
  360. this.$message.error(e.data.msg);
  361. }
  362. }).catch(e => {
  363. this.$message.error(e);
  364. this.btnLoading = false;
  365. })
  366. } else {
  367. this.btnLoading = false;
  368. console.log('error submit!!');
  369. return false;
  370. }
  371. });
  372. },
  373. dirctAddSet() {
  374. let item = {
  375. value: 0
  376. }
  377. this.ruleForm.commission.list.push(item)
  378. },
  379. scoreAddSet() {
  380. let item_tmp = {
  381. value: 0
  382. }
  383. this.ruleForm.score.list.push(item_tmp)
  384. },
  385. delItem(index) {
  386. console.log('删除哪一个', index, this.ruleForm.commission.list)
  387. let commission_list = this.ruleForm.commission.list;
  388. commission_list.splice(index, 1);
  389. this.ruleForm.commission.list = commission_list;
  390. },
  391. delScoreItem(index) {
  392. let score_list = this.ruleForm.score.list;
  393. score_list.splice(index, 1);
  394. this.ruleForm.score.list = score_list;
  395. },
  396. //选择商品
  397. goodsSelect(param) {
  398. for (let j in param) {
  399. let item = param[j];
  400. if (this.ruleForm.thaw_goods_ids.length >= 20) {
  401. this.$message.error('指定商品不能大于20个');
  402. return;
  403. }
  404. let flag = true;
  405. for (let i in this.ruleForm.thaw_goods_ids) {
  406. if (this.ruleForm.thaw_goods_ids[i] == param[j].id) {
  407. flag = false;
  408. break;
  409. }
  410. }
  411. if (flag) {
  412. this.ruleForm.thaw_goods_ids.push(param[j].id);
  413. this.ruleForm.thaw_goods_list.push({
  414. id: param[j].id,
  415. name: param[j].goods_name,
  416. price: param[j].price,
  417. cover_pic: param[j].cover_pic,
  418. });
  419. }
  420. }
  421. },
  422. //删除商品
  423. deleteGoods(index) {
  424. this.$confirm('点击确定将删除该商品, 是否继续?', '警告', {
  425. type: 'warning'
  426. }).then(() => {
  427. this.ruleForm.thaw_goods_list.splice(index, 1);
  428. this.ruleForm.thaw_goods_ids.splice(index, 1);
  429. })
  430. },
  431. becomeGoodsSelect(param) {
  432. for (let j in param) {
  433. let item = param[j];
  434. if (this.ruleForm.become_goods_ids.length >= 100) {
  435. this.$message.error('指定商品不能大于100个');
  436. return;
  437. }
  438. let flag = true;
  439. for (let i in this.ruleForm.become_goods_ids) {
  440. if (this.ruleForm.become_goods_ids[i] == item.id) {
  441. flag = false;
  442. break;
  443. }
  444. }
  445. if (flag) {
  446. if (this.ruleForm.become_goods_ids.indexOf(item.id) == -1) {
  447. this.ruleForm.become_goods_ids.push(item.id);
  448. }
  449. this.ruleForm.become_goods_list.push({
  450. id: item.id,
  451. name: item.goods_name,
  452. cover_pic: item.cover_pic,
  453. });
  454. }
  455. }
  456. },
  457. deleteBecomeGoods(index) {
  458. this.ruleForm.become_goods_list.splice(index, 1);
  459. this.ruleForm.become_goods_ids.splice(index, 1);
  460. }
  461. }
  462. });
  463. </script>
  464. <style>
  465. .form_box {
  466. background-color: #f3f3f3;
  467. padding: 0 0 20px;
  468. }
  469. .button-item {
  470. margin-top: 12px;
  471. padding: 9px 25px;
  472. }
  473. .el-input-group__append {
  474. background-color: #fff;
  475. color: #353535;
  476. }
  477. .goods_desc {
  478. line-height: 22px;
  479. width: 70%;
  480. margin-left: 10px;
  481. }
  482. .goods_desc span {
  483. display: inline-block;
  484. }
  485. .goods_box {
  486. width: 19%;
  487. border: 1px solid #EBEEF5;
  488. border-radius: 10px;
  489. padding: 10px;
  490. display: flex;
  491. margin: 10px 0px 10px 15px;
  492. float: left;
  493. }
  494. .ellipsis {
  495. width: 100%;
  496. text-overflow: ellipsis;
  497. overflow: hidden;
  498. white-space: nowrap;
  499. }
  500. </style>