edit.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-select-cat');
  4. ComponentHelper::loadComponentView('com-dialog-select');
  5. ComponentHelper::loadComponentView('com-rich-text');
  6. ?>
  7. <script src="/resources/js/Sortable.min.js"></script>
  8. <script src="/resources/unpkg/vuedraggable@2.18.1/dist/vuedraggable.umd.min.js"></script>
  9. <div id="app" v-cloak>
  10. <el-card class="box-card" shadow="never" style="border:0;min-width: 1200px;"
  11. body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  12. <div slot="header">
  13. <el-breadcrumb separator="/">
  14. <el-breadcrumb-item>
  15. <span style="color: #409EFF;cursor: pointer"
  16. @click="$navigate({r:'electron-coupon/default/index'})">
  17. 招商员
  18. </span>
  19. </el-breadcrumb-item>
  20. <el-breadcrumb-item>{{titleName}}</el-breadcrumb-item>
  21. </el-breadcrumb>
  22. </div>
  23. <div class="form-body" v-loading="loading">
  24. <el-form :model="submitData" :rules="rules" ref="ruleForm" size="small" label-width="150px" style="margin-left: 20px;">
  25. <el-form-item label="招商员" style="margin-bottom: 20px" prop="name" label-width="100px">
  26. <div class="user-add" v-show="submitData.id == 0">
  27. <el-tooltip effect="dark" content="添加用户" placement="top">
  28. <el-button @click="showUserDialog('user')"
  29. icon="el-icon-plus"></el-button>
  30. </el-tooltip>
  31. </div>
  32. <div v-show="submitData.user_id" class="user-info">
  33. <img :src="submitData.avatar_url ? submitData.avatar_url : '/resources/img/common/default-avatar.png'" />
  34. <p>会员ID:&nbsp;&nbsp;&nbsp;&nbsp;{{submitData.user_id}}</p>
  35. <p>会员昵称:{{submitData.nickname}}</p>
  36. <p>手机号码:{{submitData.mobile}}</p>
  37. </div>
  38. </el-form-item>
  39. <el-form-item label="等级" style="margin-bottom: 20px" required label-width="100px">
  40. <el-select v-model="submitData.business_bonus_level" placeholder="请选择等级" :disabled="submitData.id == 0 ? true : false">
  41. <el-option v-for="(item, index) in level_list" :label="item.level_name" :value="item.level" :key="index"></el-option>
  42. </el-select>
  43. </el-form-item>
  44. <el-form-item label="分红比例" style="margin-bottom: 20px" required label-width="100px">
  45. {{bonus_rate}}
  46. <div class="remark">用户成为招商员之后,新推广的门店、商户才享受分红</div>
  47. </el-form-item>
  48. <el-form-item label="状态" style="margin-bottom: 20px" required label-width="100px">
  49. <el-switch
  50. v-model="submitData.status"
  51. :active-value="1"
  52. :inactive-value="0"
  53. active-text="开放"
  54. inactive-text="禁用"
  55. >
  56. </el-switch>
  57. <div class="remark">禁用后不再给予分红</div>
  58. </el-form-item>
  59. </div>
  60. <el-dialog @open="getUser" title="选择用户" :visible.sync="userDialog.visible" :close-on-click-modal="false">
  61. <el-form size="small" :inline="true" @submit.native.prevent>
  62. <el-form-item>
  63. <div class="input-item">
  64. <el-input @keyup.enter.native="search" size="small" v-model="keyword_name" autocomplete="off" placeholder="昵称" style="width: 30%"></el-input>
  65. <el-input @keyup.enter.native="search" size="small" v-model="keyword_id" autocomplete="off" placeholder="ID" style="width: 16%"></el-input>
  66. <el-input @keyup.enter.native="search" size="small" v-model="keyword_mobile" autocomplete="off" placeholder="手机号" style="width: 30%"></el-input>
  67. <el-button size="small" :loading=foundLoading @click="getUser">查找用户</el-button>
  68. </el-input>
  69. </div>
  70. </el-form-item>
  71. </el-form>
  72. <el-table :data="userDialog.list" v-loading="userDialog.loading" @selection-change="userSelectionChange">
  73. <el-table-column label="选择" type="selection"></el-table-column>
  74. <el-table-column label="ID" prop="id" width="100px"></el-table-column>
  75. <el-table-column label="头像" width="100px" prop="avatar_url">
  76. <template slot-scope="scope">
  77. <com-image mode="aspectFill" width='50px' height='50px' :src="scope.row.avatar_url ? scope.row.avatar_url:'/resources/img/common/default-avatar.png'"></com-image>
  78. </template>
  79. </el-table-column>
  80. <el-table-column label="名称" prop="nickname"></el-table-column>
  81. </el-table>
  82. <div style="text-align: center; margin-top: 15px;">
  83. <el-pagination
  84. v-if="userDialog.pagination"
  85. style="display: inline-block"
  86. background
  87. @current-change="userDialogPageChange"
  88. layout="prev, pager, next"
  89. :page-size.sync="userDialog.pagination.pageSize"
  90. :total="Number(userDialog.pagination.totalCount)">
  91. </el-pagination>
  92. </div>
  93. <div slot="footer">
  94. <el-button @click="userDialog.visible = false">取 消</el-button>
  95. <el-button type="primary" @click="addUser">确 定</el-button>
  96. </div>
  97. </el-dialog>
  98. <el-button class="button-item" :loading="btnLoading" type="primary" @click="saveFun"
  99. size="small">保存
  100. </el-button>
  101. </el-card>
  102. </div>
  103. <script>
  104. const app = new Vue({
  105. el: '#app',
  106. data() {
  107. return {
  108. diy_img_prefix: '<?= Yii::getAlias('@attachurl') ?>',
  109. titleName:"添加招商员",
  110. loading:false,
  111. foundLoading:false,
  112. keyword_name: '',
  113. keyword_id: '',
  114. keyword_mobile: '',
  115. level_list: [],
  116. userDialog: {
  117. visible: false,
  118. page: 1,
  119. loading: null,
  120. pagination: null,
  121. list: [],
  122. index: 'user',
  123. selectedList: null,
  124. max: 20,
  125. },
  126. submitData:{
  127. id: 0,
  128. user_id: '',
  129. nickname: '',
  130. mobile: '',
  131. avatar_url: '',
  132. status: 1,
  133. business_bonus_level: 0, // 别改动初始值
  134. created_at: 0,
  135. updated_at: 0,
  136. bonus_rate: 0
  137. },
  138. rules: {
  139. business_bonus_level: [
  140. { required: true, message: '请选择招商员等级', trigger: 'blur' }
  141. ],
  142. },
  143. btnLoading:false,
  144. };
  145. },
  146. mounted() {
  147. this.submitData.updated_at = Date.parse(new Date()) / 1000; // 新建数据的更新时间
  148. if (getQuery('id')) {
  149. this.titleName="编辑招商员";
  150. this.loadData(getQuery('id'));
  151. } else {
  152. this.submitData.created_at = Date.parse(new Date()) / 1000; // 新建数据的创建时间
  153. }
  154. this.getBonusLevel(getQuery('id'));
  155. },
  156. watch:{
  157. },
  158. computed:
  159. {
  160. bonus_rate() {
  161. let rate = 0;
  162. let that = this;
  163. this.level_list.map(function (item) {
  164. if (item.level == that.submitData.business_bonus_level) {
  165. rate = item.bonus_rate;
  166. }
  167. });
  168. this.submitData.bonus_rate = rate;
  169. return rate ? rate + '%' : '';
  170. }
  171. },
  172. methods: {
  173. getUser() {
  174. let self = this;
  175. self.userDialog.loading = true;
  176. request({
  177. params: {
  178. r: 'business-bonus/default/search-user',
  179. page: self.userDialog.page,
  180. keyword_name: this.keyword_name,
  181. keyword_id: this.keyword_id,
  182. keyword_mobile: this.keyword_mobile,
  183. type:this.userDialog.index,
  184. },
  185. method: 'get',
  186. }).then(e => {
  187. self.userDialog.loading = false;
  188. self.userDialog.list = e.data.data.list;
  189. self.userDialog.pagination = e.data.data.pagination;
  190. }).catch(e => {
  191. console.log(e);
  192. });
  193. },
  194. addUser()
  195. {
  196. if (this.userDialog.selectedList && this.userDialog.selectedList.length > 1) {
  197. this.$message.error('只能选择一个用户!');
  198. return false;
  199. }
  200. this.submitData.nickname = this.userDialog.selectedList[0].nickname;
  201. this.submitData.user_id = this.userDialog.selectedList[0].id;
  202. this.submitData.mobile = this.userDialog.selectedList[0].mobile;
  203. this.submitData.avatar_url = this.userDialog.selectedList[0].avatar_url;
  204. this.userDialog.visible = false;
  205. },
  206. userSelectionChange(e) {
  207. if (e.length > 1) {
  208. this.$message.error('只能选择一个用户!');
  209. }
  210. this.userDialog.selectedList = e;
  211. },
  212. userDialogPageChange(page) {
  213. this.userDialog.page = page;
  214. this.getUser();
  215. },
  216. showUserDialog(index) {
  217. this.userDialog.visible = true;
  218. this.userDialog.index = index;
  219. },
  220. saveFun(){
  221. this.$refs['ruleForm'].validate((valid) => {
  222. if (valid) {
  223. if (!this.submitData.user_id) {
  224. this.$message.error('请选择一个用户作为招商员!');
  225. return false;
  226. }
  227. let data =JSON.parse(JSON.stringify(this.submitData));
  228. this.btnLoading = true;
  229. let url = 'business-bonus/default/edit';
  230. request({
  231. params: {
  232. r:url,
  233. },
  234. method: 'post',
  235. data: data
  236. }).then(e => {
  237. this.btnLoading = false;
  238. if (e.data.code == 0) {
  239. this.$message.success(e.data.msg);
  240. setTimeout(function () {
  241. navigateTo({
  242. r: 'business-bonus/default/index',
  243. });
  244. }, 1500);
  245. } else {
  246. this.$message.error(e.data.msg);
  247. }
  248. }).catch(e => {
  249. this.$message.error(e);
  250. this.btnLoading = false;
  251. })
  252. } else {
  253. this.$message.error('请填写必要的参数!');
  254. return false;
  255. }
  256. });
  257. },
  258. picUrl(e) {
  259. if (e.length) {
  260. this.submitData.pic = e[0].url;
  261. }
  262. },
  263. delPic(index) {
  264. /* this.pic_url.splice(index, 1) */
  265. this.submitData.pic = '';
  266. },
  267. receiveDatetimeChange(){
  268. if(this.receive_datetime){
  269. this.submitData.receive_begin_time = Date.parse(new Date(this.receive_datetime[0]).toString())/1000;
  270. this.submitData.receive_end_time = Date.parse(new Date(this.receive_datetime[1]).toString())/1000;
  271. }
  272. },
  273. useDatetimeChange() {
  274. if(this.use_datetime){
  275. this.submitData.use_begin_time = Date.parse(new Date(this.use_datetime[0]).toString())/1000;
  276. this.submitData.use_end_time = Date.parse(new Date(this.use_datetime[1]).toString())/1000;
  277. }
  278. },
  279. addPrize(){
  280. this.submitData.prize.push(JSON.parse(JSON.stringify(this.prizeObj)));
  281. },
  282. delPrize(index){
  283. this.submitData.prize.splice(index,1)
  284. },
  285. formatTime(timeStamp) {
  286. var date = new Date();
  287. date.setTime(timeStamp * 1000);
  288. var y = date.getFullYear();
  289. var m = date.getMonth() + 1;
  290. m = m < 10 ? ('0' + m) : m;
  291. var d = date.getDate();
  292. d = d < 10 ? ('0' + d) : d;
  293. var h = date.getHours();
  294. h = h < 10 ? ('0' + h) : h;
  295. var minute = date.getMinutes();
  296. var second = date.getSeconds();
  297. minute = minute < 10 ? ('0' + minute) : minute;
  298. second = second < 10 ? ('0' + second) : second;
  299. return y + '-' + m + '-' + d + ' ' + h + ':' + minute + ':' + second;
  300. },
  301. loadData(id){
  302. this.loading = true;
  303. request({
  304. params: {
  305. r:'business-bonus/default/info',
  306. inc_id: id
  307. },
  308. method: 'get',
  309. }).then(e => {
  310. this.loading = false;
  311. if (e.data.code == 0) {
  312. if (e.data.data.is_null == 0) {
  313. this.submitData = e.data.data.info;
  314. }
  315. } else {
  316. this.$message.error(e.data.msg);
  317. }
  318. }).catch(e => {
  319. this.loading = false;
  320. });
  321. },
  322. getBonusLevel(id) {
  323. request({
  324. params: {
  325. r:'business-bonus/default/business-bonus-level',
  326. },
  327. method: 'post',
  328. }).then(e => {
  329. if (e.data.code == 0) {
  330. this.level_list = e.data.data.level_list;
  331. if (id <= 0) {
  332. this.submitData.business_bonus_level = 1; // 初始化,触发计算属性
  333. }
  334. } else {
  335. this.$message.error(e.data.msg);
  336. }
  337. }).catch(e => {
  338. });
  339. }
  340. }
  341. });
  342. </script>
  343. <style>
  344. .form-body {
  345. padding: 20px;
  346. background-color: #fff;
  347. margin-bottom: 20px;
  348. padding-right: 20%;
  349. min-width: 900px;
  350. }
  351. .form-body .el-form-item {
  352. padding-right: 25%;
  353. min-width: 850px;
  354. }
  355. .form-button {
  356. margin: 0;
  357. }
  358. .form-button .el-form-item__content {
  359. margin-left: 0 !important;
  360. }
  361. .button-item {
  362. padding: 9px 25px;
  363. }
  364. .check-group {
  365. font-size: 14px !important;
  366. }
  367. .check-group .el-col {
  368. display: flex;
  369. }
  370. .check-group .el-input {
  371. margin: 0 5px;
  372. }
  373. .check-group .el-col .el-checkbox {
  374. display: flex;
  375. align-items: center;
  376. }
  377. .check-group .el-col .el-input {
  378. width: 100px;
  379. }
  380. .check-group .el-col .el-input .el-input__inner {
  381. height: 30px;
  382. width: 100px;
  383. }
  384. .el-checkbox-group .el-col {
  385. margin-bottom: 10px;
  386. }
  387. .add-image-btn {
  388. width: 100px;
  389. height: 100px;
  390. color: #419EFB;
  391. border: 1px solid #e2e2e2;
  392. cursor: pointer;
  393. }
  394. .remark {
  395. color: #cccccc;
  396. }
  397. .user-info img {
  398. width: 60px;
  399. border-radius: 50%;
  400. margin-top: 10px;
  401. }
  402. </style>