index.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-rich-text');
  4. ?>
  5. <style>
  6. @media screen and (min-width:1370px){
  7. .form-body {
  8. padding: 20px 0;
  9. padding-right: 50%;
  10. min-width: 1400px;
  11. }
  12. }
  13. @media screen and (max-width:1369px){
  14. .form-body {
  15. padding: 20px 0;
  16. padding-right: 20%;
  17. }
  18. }
  19. .form-body {
  20. background-color: #fff;
  21. margin-bottom: 20px;
  22. }
  23. .form-button {
  24. margin: 0!important;
  25. }
  26. .form-button .el-form-item__content {
  27. margin-left: 0!important;
  28. }
  29. .button-item {
  30. padding: 9px 25px;
  31. }
  32. .agent-item-input{
  33. display: flex;
  34. align-items: center;
  35. margin-top: 16px;
  36. }
  37. .agent-item-input .item-lab-title{
  38. width: 80px;
  39. margin-right: 20px;
  40. }
  41. .tips-title{
  42. font-size: 12px;
  43. color: #999999;
  44. }
  45. .el-tabs__header{
  46. background-color: #fff;
  47. }
  48. .el-tabs__item{
  49. width: 100px;
  50. text-align: center;
  51. }
  52. .el-table th>.cell{
  53. color: #333;
  54. font-weight: bold;
  55. font-size: 14px;
  56. }
  57. .el-table__footer-wrapper, .el-table__header-wrapper{
  58. border-bottom: 1.4px solid #D6D6D6;
  59. }
  60. .add-image-btn {
  61. width: 100px;
  62. height: 100px;
  63. color: #419EFB;
  64. border: 1px solid #e2e2e2;
  65. cursor: pointer;
  66. }
  67. .pic-url-remark{
  68. font-size: 12px;
  69. color: #999999;
  70. }
  71. .el-image {
  72. position: relative;
  73. display: inline-block;
  74. overflow: hidden;
  75. }
  76. .el-button.is-circle {
  77. border-radius: 50%;
  78. padding: 12px;
  79. }
  80. .el-button--mini.is-circle {
  81. padding: 7px;
  82. }
  83. .del-btn {
  84. position: absolute;
  85. right: 0px;
  86. top: 0px;
  87. padding: 4px 4px;
  88. }
  89. </style>
  90. <div id="app" v-cloak>
  91. <el-card style="border:0;min-width: 1000px;" shadow="never" body-style="background-color: #f3f3f3;padding: 10px 0 0;" v-loading="loading">
  92. <el-tabs v-model="activeName" @tab-click="handleClick">
  93. <!-- <el-tab-pane label="基础设置" name="basic"></el-tab-pane> -->
  94. <div class="form-body" style="width:100%; padding-right:10%; padding-left:20px;">
  95. <div style="display: flex;align-items: center;padding-bottom: 10px;border-bottom: 1px solid #E4E7ED;margin:10px 0 20px 15px;">
  96. <div style="width: 5px;height: 20px;background-color: #409eff;margin-right: 5px;"></div>
  97. <div>基础设置</div>
  98. </div>
  99. <el-form ref="form" :model="form" :rules="rules" label-width="180px" size="small">
  100. <el-form-item label="启用积分分红" style="margin-bottom: 0">
  101. <div>
  102. <el-switch v-model="form.is_enable" :active-value="1" :inactive-value="0">
  103. </el-switch>
  104. </div>
  105. <div class="tips-text" style="line-height: 24px;">
  106. 需开启后才能使用“积分分红”插件的所有功能
  107. </div>
  108. </el-form-item>
  109. <div v-show="form.is_enable == 1">
  110. <div style="display: flex;align-items: center;padding-bottom: 10px;border-bottom: 1px solid #E4E7ED;margin:10px 0 20px 15px;">
  111. <div style="width: 5px;height: 20px;background-color: #409eff;margin-right: 5px;"></div>
  112. <div>分红设置</div>
  113. </div>
  114. <el-form-item label-width="180px" prop='bonus_pre'>
  115. <label slot="label">投放比例
  116. <el-tooltip class="item" effect="dark"
  117. content="平台营业额投放比例"
  118. placement="top">
  119. <i class="el-icon-info"></i>
  120. </el-tooltip>
  121. </label>
  122. <span style="color: #333;">
  123. 平台营业额
  124. <el-input v-model.number="form.bonus_pre" size="small" style="width:150px; margin-left:5px; margin-right:5px;" @input="handlePreInput">
  125. <template slot="append">%</template>
  126. </el-input>
  127. 投放到分红
  128. </span>
  129. <br/>
  130. <div class="tips-text" style="line-height: 24px;">
  131. 分红池金额:营业额*N%=分红池金额
  132. </div>
  133. </el-form-item>
  134. <el-form-item label-width="180px">
  135. <label slot="label">投放节点
  136. <el-tooltip class="item" effect="dark"
  137. content="每天取订单支付后/订单完成后的数值"
  138. placement="top">
  139. <i class="el-icon-info"></i>
  140. </el-tooltip>
  141. </label>
  142. <el-radio v-model="form.settle_type" :label="1" border>支付完成</el-radio>
  143. <el-radio v-model="form.settle_type" :label="2" border>订单完成</el-radio>
  144. <br/>
  145. <!-- <div class="tips-text" style="line-height: 24px;">
  146. 积分分红结算方式,是门店订单支付后还是必须订单完成后才能结算
  147. </div> -->
  148. </el-form-item>
  149. <div style="display: flex;align-items: center;padding-bottom: 10px;border-bottom: 1px solid #E4E7ED;margin:10px 0 20px 15px;">
  150. <div style="width: 5px;height: 20px;background-color: #409eff;margin-right: 5px;"></div>
  151. <div>结算设置</div>
  152. </div>
  153. <el-form-item label-width="180px">
  154. <label slot="label">结算周期
  155. <el-tooltip class="item" effect="dark"
  156. content="分红的结算周期"
  157. placement="top">
  158. <i class="el-icon-info"></i>
  159. </el-tooltip>
  160. </label>
  161. <el-select v-model="form.settle_circle" placeholder="请选择周期">
  162. <el-option v-for="(item, index) in settle_circle_opiton" :label="item.name" :value="item.index" :key="index"></el-option>
  163. </el-select>
  164. <br/>
  165. <!-- <div class="tips-text" style="line-height: 24px;">
  166. 结算周期
  167. </div> -->
  168. </el-form-item>
  169. <el-form-item label="选择结算方式:" prop="equal_type">
  170. <el-radio-group v-model="form.settle_method">
  171. <el-radio :label="0">积分占比分配</el-radio>
  172. <el-radio :label="1">权重占比分配</el-radio>
  173. </el-radio-group>
  174. </el-form-item>
  175. <el-form-item label-width="180px" prop="user_score" v-if="form.settle_method == 0">
  176. <label slot="label">结算条件
  177. <el-tooltip class="item" effect="dark"
  178. content="满足该条件即可进行分红"
  179. placement="top">
  180. <i class="el-icon-info"></i>
  181. </el-tooltip>
  182. </label>
  183. <span style="color: #333;">
  184. 用户积分达到
  185. <el-input v-model="form.user_score" size="small" style="width:150px;margin-left:5px; margin-right:5px;" @input="handleInput">
  186. </el-input>
  187. 积分,即可参与分红结算
  188. </span>
  189. <br/>
  190. <div class="tips-text" style="line-height: 24px;">
  191. 个人持有积分数量/平台会员总积分数量*分红池金额=该周期所得分红金额
  192. </div>
  193. </el-form-item>
  194. <el-form-item label-width="180px" prop="user_score" v-if="form.settle_method == 1">
  195. <label slot="label">结算条件
  196. <el-tooltip class="item" effect="dark"
  197. content="满足该条件即可进行分红"
  198. placement="top">
  199. <i class="el-icon-info"></i>
  200. </el-tooltip>
  201. </label>
  202. <span style="color: #333;">
  203. 每直推
  204. <el-input-number
  205. v-model="form.recommend_user_num"
  206. :min="1"
  207. :step="1"
  208. :precision="0"
  209. ></el-input-number>
  210. 个大于或等于
  211. <el-select v-model="form.recommend_user_level" placeholder="请选择会员等级">
  212. <el-option v-for="(item, index) in user_level_list" :label="item.name" :value="item.id" :key="id"></el-option>
  213. </el-select>
  214. 会员等级,获得
  215. <el-input-number
  216. v-model="form.recommend_user_weight"
  217. :min="0"
  218. :step="1"
  219. :precision="0"
  220. ></el-input-number>
  221. 权重
  222. </span>
  223. <br/>
  224. <div class="tips-text" style="line-height: 24px;">
  225. 分红池金额÷总权重数量*个人持有权重数量=该周期所得分红。会员持有积分并有权重数量才计入权重计算。
  226. </div>
  227. </el-form-item>
  228. <el-form-item label-width="180px" label="所得分红">
  229. <el-radio v-model="form.is_all_reward" :label="1" border>全部分红</el-radio>
  230. <el-radio v-model="form.is_all_reward" :label="2" border>等额积分</el-radio>
  231. <br/>
  232. <div class="tips-text" style="line-height: 24px;">
  233. <span v-if="form.is_all_reward == 1">结算时计算所得的分红金额,比如:个人积分:100个,但是计算可得分红为:150元,则所得分红为:150元</span>
  234. <span v-if="form.is_all_reward == 2">结算时计算所得的分红金额,比如:个人积分:100个,但是计算可得分红为:150元,则所得分红为:100元</span>
  235. </div>
  236. </el-form-item>
  237. <el-form-item label="推广中心显示" style="margin-bottom: 0">
  238. <div>
  239. <el-switch v-model="form.is_show_at_center" :active-value="1" :inactive-value="0">
  240. </el-switch>
  241. </div>
  242. </el-form-item>
  243. </el-form>
  244. </div>
  245. </div>
  246. <el-button class="button-item" :loading="btnLoading" type="primary" size="small" @click="store('form')">保存</el-button>
  247. </el-card>
  248. </div>
  249. <script>
  250. const app = new Vue({
  251. el: '#app',
  252. data() {
  253. var validatePass = (rule, value, callback) => {
  254. if (Number.isInteger(Number(value)) && Number(value) > 0) {
  255. callback();
  256. } else {
  257. callback(new Error('请输入大于0的整数'));
  258. }
  259. };
  260. return {
  261. // 0.1 设置页数据
  262. activeName: 'first',
  263. loading: false,
  264. load: false,
  265. btnLoading: false,
  266. form: {
  267. // 基础设置
  268. is_enable : 1, //是否开启
  269. // 结算设置
  270. bonus_pre: 0, //营业额投入资金池的比例
  271. settle_type: 1, // 结算方式
  272. settle_circle: 3, // 分红周期
  273. user_score: 0,
  274. is_show_at_center: 1,
  275. is_all_reward: 1,
  276. settle_method: 0, //0积分占比 1权重占比
  277. recommend_user_num: null, //推荐直属下级个数
  278. recommend_user_weight: null, //推荐直属下级权重
  279. recommend_user_level: null,
  280. },
  281. user_level_list:[],
  282. settle_circle_opiton: [
  283. {index: 3, name: '按天'},
  284. {index: 1, name: '按周'},
  285. {index: 2, name: '按月'},
  286. ],
  287. rules: {
  288. bonus_pre: [
  289. {required: true, message: '请填写投放比例', trigger: 'change'},
  290. ],
  291. user_score: [
  292. {required: true, message: '请填写结算条件', trigger: 'change'},
  293. ],
  294. },
  295. };
  296. },
  297. created() {
  298. this.getDetail();
  299. },
  300. methods: {
  301. // 0.1.1 获取设置详情
  302. getDetail(){
  303. let that = this;
  304. this.loading = true;
  305. request({
  306. params: {
  307. r: 'score-bonus/setting/detail',
  308. },
  309. method: 'post'
  310. }).then(e => {
  311. this.loading = false;
  312. if (e.data.code == 0) {
  313. if(e.data.data.is_null == 0){
  314. that.form = e.data.data.config
  315. }
  316. that.user_level_list = e.data.data.user_level_list
  317. console.log('user_level_list', that.user_level_list)
  318. } else {
  319. this.$message.error(e.data.msg);
  320. }
  321. }).catch(e => {
  322. this.btnLoading = false;
  323. });
  324. },
  325. handleInput() {
  326. // if (this.form.refund_price === '') {
  327. // this.form.refund_price = 0;
  328. // }
  329. this.limitInput(this.form.user_score, 'user_score');
  330. },
  331. limitInput(value, name) {
  332. this.form[name] = ('' + value)
  333. .replace(/[^\d^\.]+/g, '')
  334. .replace(/^0+(\d)/, '$1')
  335. .replace(/^\./, '0.')
  336. .match(/^\d*(\.?\d{0,2})/g)[0] || ''
  337. },
  338. handlePreInput() {
  339. this.limitInput(this.form.bonus_pre, 'bonus_pre');
  340. },
  341. // 2.0 提交表单-编辑基础设置
  342. store(formName) {
  343. this.$refs[formName].validate((valid) => {
  344. if (valid) {
  345. this.btnLoading = true;
  346. let postForm = JSON.parse(JSON.stringify(this.form));
  347. request({
  348. params: {
  349. r: 'score-bonus/setting/index',
  350. },
  351. method: 'post',
  352. data: postForm,
  353. }).then(e => {
  354. this.btnLoading = false;
  355. if (e.data.code == 0) {
  356. this.$message.success(e.data.msg);
  357. } else {
  358. this.$message.error(e.data.msg)
  359. }
  360. }).catch(e => {
  361. this.btnLoading = false;
  362. });
  363. } else {
  364. this.btnLoading = false;
  365. return false;
  366. }
  367. })
  368. },
  369. handleClick(tab, event) {
  370. this.activeName = tab.name;
  371. },
  372. },
  373. filters: {
  374. },
  375. });
  376. </script>