index.php 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445
  1. <?php defined('YII_ENV') or exit('Access Denied'); ?>
  2. <style>
  3. .form-body {
  4. background-color: #fff;
  5. padding: 20px 50% 20px 20px;
  6. min-width: 1000px;
  7. }
  8. .button-item {
  9. margin-top: 12px;
  10. padding: 9px 25px;
  11. }
  12. .user-list {
  13. flex-wrap: wrap;
  14. margin-top: 10px;
  15. /* cursor: move; */
  16. }
  17. .user-item,
  18. .user-add {
  19. width: 50px;
  20. height: 50px;
  21. position: relative;
  22. border: 1px solid #e2e2e2;
  23. margin-right: 15px;
  24. margin-bottom: 15px;
  25. }
  26. .user-add .el-button {
  27. width: 100%;
  28. height: 100%;
  29. border: none;
  30. border-radius: 0;
  31. padding: 0;
  32. }
  33. .user-delete {
  34. position: absolute;
  35. left: calc(100% - 13px);
  36. top: -13px;
  37. width: 25px;
  38. height: 25px;
  39. line-height: 25px;
  40. padding: 0 0;
  41. visibility: hidden;
  42. z-index: 1;
  43. }
  44. .user-delete .el-icon-close {
  45. position: absolute;
  46. top: 6px;
  47. left: 6px;
  48. }
  49. .user-item:hover .user-delete {
  50. visibility: visible;
  51. }
  52. .user-pic {
  53. background-size: cover;
  54. background-position: center;
  55. width: 100%;
  56. height: 100%;
  57. background-color: #f6f6f6;
  58. background-repeat: no-repeat;
  59. }
  60. </style>
  61. <section id="app" v-cloak>
  62. <el-card class="box-card" style="border:0" shadow="never" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  63. <div slot="header" class="clearfix">
  64. <span></span>
  65. <el-breadcrumb separator="/">
  66. <el-breadcrumb-item><span style="color: #409EFF;cursor: pointer"
  67. @click="$navigate({r:'mall/coupon/index'})">优惠券管理</span></el-breadcrumb-item>
  68. <el-breadcrumb-item>优惠券发放</el-breadcrumb-item>
  69. </el-breadcrumb>
  70. </div>
  71. <div class="form-body">
  72. <el-form :model="form" @submit.native.prevent v-loading="loading" label-width="20rem" ref="form">
  73. <el-form-item label="优惠券名称" prop="name">
  74. <div>{{form.name}}</div>
  75. </el-form-item>
  76. <el-form-item label="最低消费金额(元)" prop="min_price">
  77. <div>{{form.min_price}}</div>
  78. </el-form-item>
  79. <el-form-item label="优惠金额(元)" prop="sub_price">
  80. <div>{{form.sub_price}}</div>
  81. </el-form-item>
  82. <el-form-item label="剩余数量" prop="total_count">
  83. <div v-if="form.total_count == -1">无限制</div>
  84. <div v-else>{{form.total_count}}</div>
  85. </el-form-item>
  86. <el-form-item label="优惠券有效期" prop="expire_type">
  87. <div v-if="form.expire_type == '2'"><span style="color: #FF4544">{{form.begin_at|dateTimeFormat('Y-m-d H:i:s')}}</span>至<span style="color: #FF4544">{{form.end_at|dateTimeFormat('Y-m-d H:i:s')}}</span></div>
  88. <div v-if="form.expire_type == '1'">领取后{{form.expire_day}}天过期</div>
  89. </el-form-item>
  90. <!--<el-form-item label="发送小程序模板消息" prop="is_send">
  91. <el-switch
  92. style="margin-left: 20px;"
  93. v-model="form.is_send"
  94. active-value="1"
  95. inactive-value="0">
  96. </el-switch>
  97. </el-form-item> -->
  98. <el-form-item label="发送数量" prop="coupon_num">
  99. <el-input size="small" type="number" v-model="form.coupon_num" style="width:50%" autocomplete="off"></el-input>
  100. </el-form-item>
  101. <el-form-item label="发送全部" prop="all_send">
  102. <el-switch v-model="all_send" :active-value="1" :inactive-value="2"></el-switch>
  103. </el-form-item>
  104. <el-form-item label-width="180px" label="发放对象" v-if="all_send==2">
  105. <el-col :span="14" v-if="userList">
  106. <div class="user-list" flex="cross:center wrap:wrap">
  107. <div class="user-item" v-for="(user,userIndex) in ruleForm.user.user_list.value">
  108. <el-tooltip effect="dark" content="移除商品" placement="top">
  109. <el-button @click="deleteUser(userIndex, 'user')" circle
  110. class="user-delete" type="danger"
  111. icon="el-icon-close"></el-button>
  112. </el-tooltip>
  113. <div class="user-pic" :style="'background-image:url('+user.avatar_url+')'"></div>
  114. <template slot-scope="scope">
  115. <div mode="aspectFill" width='50px' height='50px' prop="id"></div>
  116. </template>
  117. </div>
  118. </div>
  119. </el-col>
  120. <el-col :span="14">
  121. <div class="user-add">
  122. <el-tooltip effect="dark" content="选择发送对象" placement="top">
  123. <el-button @click="showUserDialog('user')"
  124. icon="el-icon-plus"></el-button>
  125. </el-tooltip>
  126. </div>
  127. </el-col>
  128. </el-form-item>
  129. <!-- <el-form-item prop="user_id_list">-->
  130. <!-- <template slot='label'>-->
  131. <!-- <span>发放对象</span>-->
  132. <!-- <el-tooltip effect="dark" content="请输入昵称/ID/手机号查找用户"-->
  133. <!-- placement="top">-->
  134. <!-- <i class="el-icon-info"></i>-->
  135. <!-- </el-tooltip>-->
  136. <!-- </template>-->
  137. <!-- <el-input @keyup.enter.native="search" size="small" v-model="keyword_name" autocomplete="off" placeholder="昵称" style="width: 30%"></el-input>-->
  138. <!-- <el-input @keyup.enter.native="search" size="small" v-model="keyword_id" autocomplete="off" placeholder="ID" style="width: 16%"></el-input>-->
  139. <!-- <el-input @keyup.enter.native="search" size="small" v-model="keyword_mobile" autocomplete="off" placeholder="手机号" style="width: 30%"></el-input>-->
  140. <!-- <el-button size="small" :loading=foundLoading @click="search">查找用户</el-button>-->
  141. <!-- <el-checkbox-group class="user-list" v-model="id" size="medium">-->
  142. <!-- <el-checkbox-button class="user-item" v-for="item in userList" :label="item.id" :key="item.id">-->
  143. <!-- <img class="avatar" :src="item.avatar_url" alt="">-->
  144. <!-- <div class="username">{{ item.nickname }}</div>-->
  145. <!-- <div class="username">ID:{{ item.id }}</div><br>-->
  146. <!-- </el-checkbox-button>-->
  147. <!-- </el-checkbox-group>-->
  148. <!-- </el-form-item>-->
  149. <!-- </el-form>-->
  150. </div>
  151. <el-button class="button-item" type="primary" size="small" :loading=btnLoading @click="onSubmit">提交</el-button>
  152. <el-button class="button-item" @click="Cancel" size="small">取消</el-button>
  153. </el-card>
  154. <el-dialog @open="getUser" title="选择用户" :visible.sync="userDialog.visible" :close-on-click-modal="false">
  155. <el-form size="small" :inline="true" @submit.native.prevent>
  156. <el-form-item>
  157. <div class="input-item">
  158. <el-input @keyup.enter.native="search" size="small" v-model="keyword_name" autocomplete="off" placeholder="昵称" style="width: 30%"></el-input>
  159. <el-input @keyup.enter.native="search" size="small" v-model="keyword_id" autocomplete="off" placeholder="ID" style="width: 16%"></el-input>
  160. <el-input @keyup.enter.native="search" size="small" v-model="keyword_mobile" autocomplete="off" placeholder="手机号" style="width: 30%"></el-input>
  161. <el-button size="small" :loading=foundLoading @click="getUser">查找用户</el-button>
  162. </el-input>
  163. </div>
  164. </el-form-item>
  165. </el-form>
  166. <el-table :data="userDialog.list" v-loading="userDialog.loading" @selection-change="userSelectionChange">
  167. <el-table-column label="选择" type="selection"></el-table-column>
  168. <el-table-column label="ID" prop="id" width="100px"></el-table-column>
  169. <el-table-column label="头像" width="100px" prop="avatar_url">
  170. <template slot-scope="scope">
  171. <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>
  172. </template>
  173. </el-table-column>
  174. <el-table-column label="名称" prop="nickname"></el-table-column>
  175. </el-table>
  176. <div style="text-align: center; margin-top: 15px;">
  177. <el-pagination
  178. v-if="userDialog.pagination"
  179. style="display: inline-block"
  180. background
  181. @current-change="userDialogPageChange"
  182. layout="prev, pager, next"
  183. :page-size.sync="userDialog.pagination.pageSize"
  184. :total="Number(userDialog.pagination.totalCount)">
  185. </el-pagination>
  186. </div>
  187. <div slot="footer">
  188. <el-button @click="userDialog.visible = false">取 消</el-button>
  189. <el-button type="primary" @click="addUser">确 定</el-button>
  190. </div>
  191. </el-dialog>
  192. </section>
  193. <style>
  194. .user-list{
  195. width: 150%;
  196. }
  197. .user-item .el-checkbox-button__inner{
  198. border: 1px solid #e2e2e2;
  199. height: 125px;
  200. width: 120px;
  201. padding-top: 15px;
  202. text-align: center;
  203. margin: 0 20px 20px 0;
  204. cursor: pointer;
  205. border-radius: 0!important;
  206. }
  207. .user-item.active{
  208. background-color: #50A0E4;
  209. color: #fff;
  210. }
  211. .user-list .avatar{
  212. height: 60px;
  213. width: 60px;
  214. border-radius: 30px;
  215. }
  216. .username{
  217. margin-top: 8px;
  218. font-size: 13px;
  219. overflow:hidden;
  220. text-overflow:ellipsis;
  221. white-space:nowrap;
  222. }
  223. </style>
  224. <script>
  225. const app = new Vue({
  226. el: '#app',
  227. data() {
  228. return {
  229. form: {},
  230. count:null,
  231. foundLoading:false,
  232. btnLoading:false,
  233. userList:[],
  234. id:[],
  235. keyword:null,
  236. keyword_name:null,
  237. keyword_id:null,
  238. keyword_mobile:null,
  239. all_send:2,
  240. userDialog: {
  241. visible: false,
  242. page: 1,
  243. loading: null,
  244. pagination: null,
  245. list: [],
  246. index: 'user',
  247. selectedList: null,
  248. max: 20,//添加商品最大数量
  249. },
  250. ruleForm: {
  251. //商品详情页推荐设置
  252. user:{
  253. is_recommend_status:{title:"发放对象列表",value:0,remark:""},
  254. user_list:{title:"会员列表",value:[],remark:""},
  255. },
  256. },
  257. loading:false
  258. };
  259. },
  260. methods: {
  261. search(){
  262. this.foundLoading = true;
  263. request({
  264. params: {
  265. r: 'coupon/user-send/search-user',
  266. keyword_name: this.keyword_name,
  267. keyword_id: this.keyword_id,
  268. keyword_mobile: this.keyword_mobile,
  269. },
  270. }).then(e => {
  271. this.foundLoading = false;
  272. if (e.data.code == 0) {
  273. this.userList = e.data.data.list;
  274. }else {
  275. this.$message.error(e.data.msg);
  276. }
  277. }).catch(e => {
  278. this.foundLoading = false;
  279. });
  280. },
  281. getUser() {
  282. let self = this;
  283. self.userDialog.loading = true;
  284. request({
  285. params: {
  286. r: 'coupon/user-send/search-user',
  287. page: self.userDialog.page,
  288. keyword_name: this.keyword_name,
  289. keyword_id: this.keyword_id,
  290. keyword_mobile: this.keyword_mobile,
  291. type:this.userDialog.index,
  292. },
  293. method: 'get',
  294. }).then(e => {
  295. self.userDialog.loading = false;
  296. self.userDialog.list = e.data.data.list;
  297. self.userDialog.pagination = e.data.data.pagination;
  298. }).catch(e => {
  299. console.log(e);
  300. });
  301. },
  302. addUser() {
  303. this.userDialog.visible = false;
  304. var msg_user = "";
  305. for (let i in this.userDialog.selectedList) {
  306. const item = {
  307. id: this.userDialog.selectedList[i].id,
  308. nickname: this.userDialog.selectedList[i].nickname,
  309. avatar_url: this.userDialog.selectedList[i].avatar_url?this.userDialog.selectedList[i].avatar_url:"/resources/img/common/default-avatar.png",
  310. price: this.userDialog.selectedList[i].price,
  311. };
  312. if (this.ruleForm[this.userDialog.index].user_list.value.length < this.userDialog.max) {
  313. console.log(item)
  314. console.log(this.ruleForm[this.userDialog.index].user_list.value)
  315. var is_on = 1;
  316. for (let j in this.ruleForm[this.userDialog.index].user_list.value) {
  317. if (this.userDialog.selectedList[i].id == this.ruleForm[this.userDialog.index].user_list.value[j].id) {
  318. is_on = 2;
  319. }
  320. }
  321. if (is_on == 1) {
  322. this.ruleForm[this.userDialog.index].user_list.value.push(item);
  323. } else {
  324. msg_user = msg_user + (msg_user ? "," + this.userDialog.selectedList[i].nickname : this.userDialog.selectedList[i].nickname);
  325. }
  326. }
  327. }
  328. if(msg_user){
  329. this.$message({
  330. message: "会员 "+msg_user+" 已经选入",
  331. type: 'error'
  332. });
  333. }
  334. },
  335. deleteUser(userIndex, index) {
  336. this.ruleForm[index].user_list.value.splice(userIndex, 1);
  337. },
  338. showUserDialog(index) {
  339. this.userDialog.visible = true;
  340. this.userDialog.index = index;
  341. },
  342. userSelectionChange(e) {
  343. console.log(e)
  344. this.userDialog.selectedList = e;
  345. },
  346. userDialogPageChange(page) {
  347. this.userDialog.page = page;
  348. this.getUser();
  349. },
  350. Cancel(){
  351. window.history.go(-1)
  352. },
  353. onSubmit() {
  354. this.$refs.form.validate((valid) => {
  355. this.btnLoading = true;
  356. var user_id_list = [];
  357. if(this.all_send== "2"){
  358. for (let j in this.ruleForm[this.userDialog.index].user_list.value) {
  359. user_id_list.push(this.ruleForm[this.userDialog.index].user_list.value[j].id);
  360. }
  361. }
  362. if(!user_id_list){
  363. this.$message({
  364. message: "请选择发送对象",
  365. type: 'error'
  366. });
  367. return false;
  368. }
  369. if (valid) {
  370. let para = {
  371. coupon_id : this.form.id,
  372. user_id_list : user_id_list,
  373. is_send: this.form.is_send,
  374. all_send:this.all_send,
  375. coupon_num: this.form.coupon_num
  376. }
  377. request({
  378. params: {
  379. r: 'coupon/user-send/index',
  380. },
  381. data: para,
  382. method: 'post'
  383. }).then(e => {
  384. this.btnLoading = false;
  385. if (e.data.code === 0) {
  386. var msg = "发送成功";
  387. if(e.data.data!==true){
  388. msg = e.data.data;
  389. }
  390. this.$alert(msg, {
  391. confirmButtonText: '确定',
  392. callback: action => {
  393. navigateTo({ r: 'coupon/default/index' });
  394. }
  395. });
  396. } else {
  397. this.$message.error(e.data.msg);
  398. }
  399. }).catch(e => {
  400. this.btnLoading = false;
  401. });
  402. }
  403. });
  404. },
  405. getList() {
  406. this.loading = true;
  407. request({
  408. params: {
  409. r: 'coupon/user-send/index',
  410. id: getQuery('id'),
  411. },
  412. }).then(e => {
  413. this.loading = false;
  414. if (e.data.code == 0) {
  415. if(e.data.data.id > 0){
  416. this.form = e.data.data;
  417. }
  418. }
  419. }).catch(e => {
  420. this.loading = false;
  421. });
  422. },
  423. },
  424. created() {
  425. this.getList();
  426. }
  427. })
  428. </script>