setting.php 26 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-rich-text');
  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 class="form_box">
  8. <template>
  9. <el-card>
  10. <el-form :model="ruleForm" size="small" ref="ruleForm" label-width="150px">
  11. <el-tabs v-model="activeName" type="card">
  12. <el-tab-pane label="基本设置" name="basic">
  13. <?php ComponentHelper::loadComponentView('basic', __DIR__ . '/'); ?>
  14. </el-tab-pane>
  15. <el-tab-pane label="奖金池设置" name="bonus_pool">
  16. <?php ComponentHelper::loadComponentView('bonus_pool', __DIR__ . '/'); ?>
  17. </el-tab-pane>
  18. <!-- <el-tab-pane label="消息设置" name="message">
  19. <?php //ComponentHelper::loadComponentView('message', __DIR__ . '/');
  20. ?>
  21. </el-tab-pane> -->
  22. <el-tab-pane label="文本设置" name="customize_text">
  23. <?php ComponentHelper::loadComponentView('customize_text', __DIR__ . '/'); ?>
  24. </el-tab-pane>
  25. <el-tab-pane label="短信配置" name="sms">
  26. <?= ComponentHelper::loadComponentView('sms', __DIR__) ?>
  27. </el-tab-pane>
  28. </el-tabs>
  29. <el-button :loading="btnLoading" class="button-item" type="primary" style="margin-top: 24px;" @click="store('ruleForm')" size="small">保存
  30. </el-button>
  31. </el-form>
  32. </el-card>
  33. </template>
  34. </div>
  35. <!-- 这个是复制用的容器,已隐藏 -->
  36. <textarea id="inputs" style="opacity: 0;width: 0;height: 0;">复制内容</textarea>
  37. </el-card>
  38. </div>
  39. <script>
  40. const app = new Vue({
  41. el: '#app',
  42. data() {
  43. return {
  44. activeName: 'basic',
  45. // activeName: 'customize_text',
  46. loading: false,
  47. btnLoading: false,
  48. dialogTableVisible: false,
  49. list: [],
  50. pagination: null, //分页数据
  51. selectItem: {}, //被选中的券
  52. confirmItem: {}, //确认选择该券
  53. page: 1,
  54. mall_sms: 'aliyun',
  55. smsDialogShow: false,
  56. smsCurrentKey: 'lucky_success',
  57. rules: {
  58. },
  59. ruleForm: {
  60. // 基础设置
  61. basic: {
  62. default_level_attend_times: 0, // 默认会员参团次数
  63. ping_tuan_limit: 0, // 参团限制开关
  64. ping_tuan_limit_win: 0,
  65. ping_tuan_limit_lose: 0,
  66. ping_tuan_limit_win_radio: 1,
  67. is_show_lunbo: 0, // 是否显示文字播报
  68. equal_deep: 0, // 平级层级
  69. equal_calculate_basis: 1, // 平级奖计算依据
  70. equal_calculate_type: 1, // 平级奖结算方式
  71. invited_award_type: 'score', // 推荐参团奖励-奖励类型
  72. invited_award_mode: 0, // 推荐参团奖励-奖励方式
  73. direct_award: 0, // 直推奖励
  74. indirect_award: 0, // 间推奖励
  75. desc: '', // 参团规则
  76. is_auto_pintuan: 1, // 参团规则
  77. },
  78. bonus_pool: {
  79. // 奖金池设置
  80. is_enable: 0, // 奖金池开关
  81. curr_pool_money: 0, // 当前奖金池金额
  82. everyday_out_rate: 0, // 每日奖金池拿出比例
  83. settle_type: 2, // 结算周期
  84. every_day_bingo_prize: 1, // 奖金池奖励阶梯--拼中奖励方式
  85. every_day_bingo_nums: 0, // 每日拼中奖励--拼中次数
  86. every_day_bingo_limit_prize: 0, // 每日拼中奖励--拼中奖励
  87. win_basic_setting: [{
  88. times: 0, // 拼中次数
  89. money: 0, // 奖励金额
  90. }], // 累计拼中奖励--阶梯设置
  91. is_virtual_bonus_pool: 0, // 是否开启虚拟奖金池
  92. virtual_money: 0, // 虚拟金额
  93. virtual_pepole: 0, // 虚拟人数
  94. },
  95. sms: {
  96. lucky_success: {
  97. title: '拼团成功通知',
  98. type: 'lucky_success',
  99. tips: '',
  100. data: {
  101. template_id: '',
  102. content: '恭喜您,您参与的幸运拼团活动,现已拼团成功,请立即前往购买!',
  103. },
  104. },
  105. lucky_fail: {
  106. title: '拼团失败通知',
  107. type: 'lucky_fail',
  108. tips: '',
  109. data: {
  110. template_id: '',
  111. content: '很遗憾,您参与的幸运拼团活动,最终拼团失败,可前往参与其他拼团。',
  112. },
  113. },
  114. 'mall_sms': 'aliyun',
  115. },
  116. },
  117. events: [
  118. {
  119. title: '拼团成功通知',
  120. type: 'lucky_success',
  121. tips: ''
  122. },
  123. {
  124. title: '拼团失败通知',
  125. type: 'lucky_fail',
  126. tips: ''
  127. },
  128. ],
  129. isCanRequest: true,
  130. // customize_text 设置
  131. customize_text_list: [{
  132. original_text: '幸运拼团',
  133. new_text: '幸运拼团',
  134. field_name: 'group_buy_text'
  135. },
  136. {
  137. original_text: '立即拼团',
  138. new_text: '立即拼团',
  139. field_name: 'join_at_once_text'
  140. },
  141. {
  142. original_text: '拼团',
  143. new_text: '拼团',
  144. field_name: 'join_team_text'
  145. },
  146. {
  147. original_text: '拼到',
  148. new_text: '拼到',
  149. field_name: 'snagging_text'
  150. },
  151. {
  152. original_text: '拼中',
  153. new_text: '拼中',
  154. field_name: 'join_success_text'
  155. },
  156. // {original_text: '拼', new_text: '拼', field_name: 'join_in_text'},
  157. {
  158. original_text: '开团',
  159. new_text: '开团',
  160. field_name: 'activity_start_text'
  161. },
  162. {
  163. original_text: '幸运拼团订单',
  164. new_text: '幸运拼团订单',
  165. field_name: 'group_buy_order_text'
  166. },
  167. {
  168. original_text: '拼团奖金池',
  169. new_text: '拼团奖金池',
  170. field_name: 'group_buy_bonus_pool_text'
  171. },
  172. {
  173. original_text: '奖金池明细',
  174. new_text: '奖金池明细',
  175. field_name: 'bonus_pool_detail_text'
  176. },
  177. {
  178. original_text: '奖金总额',
  179. new_text: '奖金总额',
  180. field_name: 'bonus_pool_total_amount_text'
  181. },
  182. {
  183. original_text: '分红池排行榜',
  184. new_text: '分红池排行榜',
  185. field_name: 'bonus_pool_ranking_list_text'
  186. },
  187. {
  188. original_text: '参团金额',
  189. new_text: '参团金额',
  190. field_name: 'join_in_amount_text'
  191. },
  192. {
  193. original_text: '参团',
  194. new_text: '参团',
  195. field_name: 'join_into_team_text'
  196. },
  197. {
  198. original_text: '智能连拼',
  199. new_text: '智能连拼',
  200. field_name: 'smart_continuity_text'
  201. },
  202. {
  203. original_text: '成团',
  204. new_text: '成团',
  205. field_name: 'join_finish_text'
  206. },
  207. {
  208. original_text: '未拼中',
  209. new_text: '未拼中',
  210. field_name: 'join_fail_text'
  211. },
  212. {
  213. original_text: '成功',
  214. new_text: '成功',
  215. field_name: 'success_text'
  216. },
  217. {
  218. original_text: '失败',
  219. new_text: '失败',
  220. field_name: 'fail_text'
  221. },
  222. {
  223. original_text: '手动拼团',
  224. new_text: '手动拼团',
  225. field_name: 'manual_join_text'
  226. },
  227. ],
  228. customize_reward_name_list: [{
  229. original_text: '参团奖励',
  230. new_text: '参团奖励',
  231. field_name: 'attend_reward_text'
  232. },
  233. {
  234. original_text: '拼中奖励',
  235. new_text: '拼中奖励',
  236. field_name: 'win_reward_text'
  237. },
  238. {
  239. original_text: '奖金池奖励',
  240. new_text: '奖金池奖励',
  241. field_name: 'pool_reward_text'
  242. },
  243. {
  244. original_text: '渠道佣金',
  245. new_text: '渠道佣金',
  246. field_name: 'agent_reward_text'
  247. },
  248. {
  249. original_text: '平级奖励',
  250. new_text: '平级奖励',
  251. field_name: 'equal_reward_text'
  252. },
  253. {
  254. original_text: '越级奖励',
  255. new_text: '越级奖励',
  256. field_name: 'over_reward_text'
  257. },
  258. {
  259. original_text: '推荐奖励',
  260. new_text: '推荐奖励',
  261. field_name: 'invite_reward_text'
  262. },
  263. {
  264. original_text: '每日拼中奖励',
  265. new_text: '每日拼中奖励',
  266. field_name: 'every_day_bingo_prize_text'
  267. },
  268. {
  269. original_text: '奖金池推荐奖',
  270. new_text: '奖金池推荐奖',
  271. field_name: 'every_day_bingo_prize_s_text'
  272. },
  273. ],
  274. }
  275. },
  276. mounted: function() {
  277. this.loadData();
  278. },
  279. methods: {
  280. loadData() {
  281. if (this.loading === true) return;
  282. this.loading = true;
  283. request({
  284. params: {
  285. r: 'lucky-group/setting/storage',
  286. },
  287. method: 'get'
  288. }).then(e => {
  289. this.loading = false;
  290. if (e.data.code == 0) {
  291. if (e.data.data.basic) {
  292. this.ruleForm.basic = e.data.data.basic;
  293. }
  294. if (e.data.data.bonus_pool) {
  295. this.ruleForm.bonus_pool = e.data.data.bonus_pool;
  296. }
  297. // 文本设置
  298. if (e.data.data.customize_text.length) {
  299. this.customize_text_list = e.data.data.customize_text;
  300. }
  301. // 奖励名称设置
  302. if (e.data.data.customize_reward_name.length) {
  303. this.customize_reward_name_list = e.data.data.customize_reward_name;
  304. }
  305. //短信设置
  306. if (e.data.data.sms) {
  307. this.ruleForm.sms = e.data.data.sms;
  308. }
  309. if (e.data.data.mall_sms) {
  310. this.mall_sms = e.data.data.mall_sms;
  311. }
  312. this.mallSmsClick();
  313. }
  314. }).catch(e => {
  315. this.loading = false;
  316. })
  317. },
  318. store(formName) {
  319. this.isCanRequest = true;
  320. if (this.ruleForm.basic.ping_tuan_limit == 1 && !this.ruleForm.basic.ping_tuan_limit_win_radio) {
  321. this.$message.error('清选择拼团限制的方式');
  322. return false;
  323. }
  324. if (this.ruleForm.bonus_pool.everyday_out_rate > 100 || this.ruleForm.bonus_pool.everyday_out_rate < 0) {
  325. this.$message.error('每日奖金池拿出比例在 0 到 100 之间');
  326. return false;
  327. }
  328. if (this.ruleForm.basic.invited_award_mode == 1) {
  329. if (this.ruleForm.basic.direct_award > 100 || this.ruleForm.basic.direct_award < 0) {
  330. this.$message.error('直推奖励比例在 0 到 100 之间');
  331. return false;
  332. }
  333. if (this.ruleForm.basic.indirect_award > 100 || this.ruleForm.basic.indirect_award < 0) {
  334. this.$message.error('间推奖励比例在 0 到 100 之间');
  335. return false;
  336. }
  337. }
  338. if (this.ruleForm.bonus_pool.every_day_bingo_tj_prize) {
  339. var v1 = parseFloat(this.ruleForm.bonus_pool.everyday_out_rate)
  340. var v2 = parseFloat(this.ruleForm.bonus_pool.every_day_bingo_tj_rate)
  341. if ((v1 + v2) > 100) {
  342. this.$message.error('每日奖金池拿出比例+每日拿奖金池分给上级推荐人比例不能大于100%');
  343. return false;
  344. }
  345. }
  346. if (this.ruleForm.bonus_pool.every_day_bingo_limit_prize > 99999999) {
  347. this.$message.error('每日拼中奖励的上限不能大于99999999');
  348. return false;
  349. }
  350. // 奖金池奖励阶梯验证
  351. if (this.ruleForm.bonus_pool.every_day_bingo_prize == 2 && this.ruleForm.bonus_pool.win_basic_setting.length) {
  352. let forNumber = this.ruleForm.bonus_pool.win_basic_setting.length;
  353. if (forNumber > 100) {
  354. this.$message.error('奖励阶级不能超过 100 层');
  355. return false;
  356. }
  357. for (let i = 0; i < forNumber; i++) {
  358. let val = this.ruleForm.bonus_pool.win_basic_setting[i];
  359. if (val.times <= 0 || !val.times) {
  360. this.$message.error('奖励阶梯中的拼中次数必须大于 0 ');
  361. return false;
  362. }
  363. if (i > 0) {
  364. if (parseInt(val.times) <= parseInt(this.ruleForm.bonus_pool.win_basic_setting[i - 1].times)) {
  365. this.$message.error('奖励阶梯中的拼中次数必须大于前一个阶梯');
  366. return false;
  367. }
  368. }
  369. }
  370. }
  371. // 文本设置验证
  372. var for_len_text = this.customize_text_list.length;
  373. var for_len_reward_name = this.customize_reward_name_list.length;
  374. var name_text_len_map = {
  375. group_buy_text: 4,
  376. join_at_once_text: 5,
  377. join_team_text: 2,
  378. snagging_text: 2,
  379. join_success_text: 2,
  380. join_in_text: 1,
  381. activity_start_text: 2,
  382. group_buy_order_text: 6,
  383. group_buy_bonus_pool_text: 5,
  384. bonus_pool_detail_text: 5,
  385. bonus_pool_total_amount_text: 5,
  386. bonus_pool_ranking_list_text: 6,
  387. join_in_amount_text: 4,
  388. join_into_team_text: 2,
  389. smart_continuity_text: 4,
  390. join_finish_text: 2,
  391. join_fail_text: 3,
  392. success_text: 2,
  393. fail_text: 2,
  394. attend_reward_text: 6,
  395. win_reward_text: 6,
  396. pool_reward_text: 7,
  397. agent_reward_text: 6,
  398. equal_reward_text: 6,
  399. over_reward_text: 6,
  400. invite_reward_text: 6,
  401. every_day_bingo_prize_text: 8,
  402. every_day_bingo_prize_s_text: 8,
  403. };
  404. if (this.customize_text_list.length) {
  405. for (let i = 0; i < for_len_text; i++) {
  406. if (this.customize_text_list[i].new_text.length > name_text_len_map[this.customize_text_list[i].field_name]) {
  407. this.$message.error('文本 “' + this.customize_text_list[i].original_text + '” 的替换文本的长度最多是 ' + name_text_len_map[this.customize_text_list[i].field_name] + ' 个字符');
  408. return false;
  409. }
  410. }
  411. this.ruleForm.customize_text = this.customize_text_list;
  412. }
  413. if (this.customize_reward_name_list.length) {
  414. for (let i = 0; i < for_len_reward_name; i++) {
  415. if (this.customize_reward_name_list[i].new_text.length > name_text_len_map[this.customize_reward_name_list[i].field_name]) {
  416. this.$message.error('奖励名称 “' + this.customize_reward_name_list[i].original_text + '” 的替换名称的长度最多是 ' + name_text_len_map[this.customize_reward_name_list[i].field_name] + ' 个字符');
  417. return false;
  418. }
  419. }
  420. this.ruleForm.customize_reward_name = this.customize_reward_name_list;
  421. }
  422. // console.log(this.ruleForm);return null;
  423. this.$refs[formName].validate((valid) => {
  424. if (valid) {
  425. if (!this.isCanRequest && this.btnLoading) return
  426. this.btnLoading = true;
  427. request({
  428. params: {
  429. r: 'lucky-group/setting/storage',
  430. },
  431. method: 'post',
  432. data: this.ruleForm
  433. }).then(e => {
  434. this.btnLoading = false;
  435. if (e.data.code == 0) {
  436. this.$message.success(e.data.msg);
  437. } else {
  438. this.$message.error(e.data.msg);
  439. }
  440. }).catch(e => {
  441. this.$message.error(e);
  442. this.btnLoading = false;
  443. })
  444. } else {
  445. this.btnLoading = false;
  446. console.log('error submit!!');
  447. return false;
  448. }
  449. });
  450. },
  451. // 添加奖金池阶梯
  452. addRewardItem() {
  453. // console.log(this.ruleForm.bonus_pool.every_day_bingo_prize);
  454. // console.log(this.ruleForm.bonus_pool.win_basic_setting);return null;
  455. let obj = {};
  456. obj.times = 0;
  457. obj.money = 0;
  458. this.ruleForm.bonus_pool.win_basic_setting.push(obj);
  459. },
  460. // 删除奖金池阶梯
  461. deleteRewardItem(index) {
  462. if (this.ruleForm.bonus_pool.win_basic_setting.length > 0) {
  463. this.ruleForm.bonus_pool.win_basic_setting.splice(index, 1);
  464. }
  465. },
  466. onSetSmsConfig(item) {
  467. this.smsCurrentKey = item.type
  468. this.smsDialogShow = true
  469. console.log('smsCurrentKey', this.smsCurrentKey);
  470. console.log('smsCurrentKey', this.ruleForm.sms);
  471. },
  472. onSmsDialogHide() {
  473. this.smsDialogShow = false
  474. },
  475. handleClose(tag, type) {
  476. let itag = type.toLowerCase()
  477. let index = `${itag}_tags`
  478. this.ruleForm.basic[index].splice(this.ruleForm.basic[index].indexOf(tag), 1);
  479. },
  480. showInput(type) {
  481. this[`input${type}Visible`] = true
  482. this.$nextTick(_ => {
  483. this.$refs[`tag${type}`].$refs.input.focus();
  484. });
  485. },
  486. onInputContent(val) {
  487. let p = '';
  488. switch (this.ruleForm.sms.mall_sms) {
  489. case 'aliyun':
  490. p = /(\$\{[0-9A-Za-z_]+\})/g
  491. break;
  492. case 'qcloud':
  493. p = /(\{[0-9]+\})/g
  494. break;
  495. case 'submail':
  496. p = /(\@var\([0-9A-Za-z_]+\))/g
  497. break;
  498. }
  499. let ms = val.match(p)
  500. console.log('onInputContent', ms, this.smsCurrentKey)
  501. if (ms && ms.length > 0) {
  502. let vars = []
  503. for (let msKey in ms) {
  504. vars.push({
  505. name: ms[msKey],
  506. key: ''
  507. })
  508. }
  509. this.$set(this.ruleForm.sms[this.smsCurrentKey].data, 'vars', vars)
  510. }
  511. },
  512. handleInputConfirm(type) {
  513. let inputValue = this[`input${type}Value`];
  514. if (inputValue) {
  515. let tag = type.toLowerCase()
  516. let index = `${tag}_tags`
  517. this.ruleForm.basic[index].push(inputValue);
  518. }
  519. this[`input${type}Visible`] = false;
  520. this[`input${type}Value`] = '';
  521. },
  522. mallSmsClick() {
  523. switch (this.ruleForm.sms.mall_sms) {
  524. case 'aliyun':
  525. this.events = [
  526. {
  527. title: '拼团成功通知',
  528. type: 'lucky_success',
  529. tips: ''
  530. },
  531. {
  532. title: '拼团失败通知',
  533. type: 'lucky_fail',
  534. tips: ''
  535. },
  536. ];
  537. break;
  538. case 'qcloud':
  539. this.events = [
  540. {
  541. title: '拼团成功通知',
  542. type: 'lucky_success_qcloud',
  543. tips: ''
  544. },
  545. {
  546. title: '拼团失败通知',
  547. type: 'lucky_fail_qcloud',
  548. tips: ''
  549. },
  550. ]
  551. break;
  552. case 'submail':
  553. this.events = [
  554. {
  555. title: '拼团成功通知',
  556. type: 'lucky_success_submail',
  557. tips: ''
  558. },
  559. {
  560. title: '拼团失败通知',
  561. type: 'lucky_fail_submail',
  562. tips: ''
  563. },
  564. ]
  565. break;
  566. }
  567. console.log(this.events);
  568. }
  569. },
  570. });
  571. </script>
  572. <style>
  573. </style>