edit.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. use common\helpers\AddonHelper;
  4. ComponentHelper::loadComponentView('com-image');
  5. ComponentHelper::loadComponentView('goods/goods-dialog-select', AddonHelper::getAddonRootPath('BusinessActivity') . 'backend/views/components/');
  6. ComponentHelper::loadComponentView('goods/com-attr', AddonHelper::getAddonRootPath('BusinessActivity') . 'backend/views/components/');
  7. ?>
  8. <div id="app" v-cloak>
  9. <el-card class="box-card" shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  10. <div slot="header">
  11. <div>
  12. <span>招商活动设置</span>
  13. </div>
  14. </div>
  15. <div class="form_box">
  16. <el-form :model="formData" :rules="rules" size="small" ref="ruleForm" label-width="160px" v-loading="loading">
  17. <div>
  18. <el-row>
  19. <el-form-item label="活动标题:" label-width="160px" prop="name" :rules="[{ required: true, message: '请输入活动标题', trigger: 'blur' }]">
  20. <el-col :span="12">
  21. <el-input placeholder="请输入活动标题" v-model="formData.name" type="text"></el-input>
  22. </el-col>
  23. </el-form-item>
  24. <el-form-item label="活动时间" label-width="160px" prop="activityTime" :rules="[{ type: 'array',required: true, message: '请输入活动时间', trigger: 'change' }]">
  25. <el-col :span="12">
  26. <el-date-picker size="small" v-model="formData.activityTime" @change="setActivityTime" type="datetimerange" range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期" value-format="yyyy-MM-dd HH:mm:ss" align="center">
  27. </el-date-picker>
  28. </el-col>
  29. </el-form-item>
  30. <el-form-item label="关联场地负责人">
  31. <el-col :span="12">
  32. <div>
  33. <el-button v-if="formData.venue.length <= 0" @click="dialogVisiblePop(1)">+选择负责人</el-button>
  34. </div>
  35. <div v-if="formData.venue.length > 0">
  36. <el-table max-height="400" :data="formData.venue" size="small" stripe border style="width: 100%;margin-top: 20px;">
  37. <el-table-column prop="id" label="ID" align="center" width="60">
  38. </el-table-column>
  39. <el-table-column prop="nickname" label="会员昵称" align="center" min-width="80"></el-table-column>
  40. <el-table-column prop="mobile" label="手机号" align="center" min-width="80">
  41. </el-table-column>
  42. <el-table-column prop="num" label="操作" align="center" min-width="80">
  43. <template slot-scope="scope">
  44. <el-button type="danger" @click="delSelectUser(scope.$index, 1)">删除</el-button>
  45. </template>
  46. </el-table-column>
  47. </el-table>
  48. </div>
  49. </el-col>
  50. </el-form-item>
  51. <el-form-item label="关联招商负责人">
  52. <el-col :span="12">
  53. <div>
  54. <el-button v-if="formData.merchants.length <= 0" @click="dialogVisiblePop(2)">+选择负责人</el-button>
  55. </div>
  56. <div v-if="formData.merchants.length > 0">
  57. <el-table max-height="400" :data="formData.merchants" size="small" stripe border style="width: 100%;margin-top: 20px;">
  58. <el-table-column prop="id" label="ID" align="center" width="60">
  59. </el-table-column>
  60. <el-table-column prop="nickname" label="会员昵称" align="center" min-width="80"></el-table-column>
  61. <el-table-column prop="mobile" label="手机号" align="center" min-width="80">
  62. </el-table-column>
  63. <el-table-column prop="num" label="操作" align="center" min-width="80">
  64. <template slot-scope="scope">
  65. <el-button type="danger" @click="delSelectUser(scope.$index, 2)">删除</el-button>
  66. </template>
  67. </el-table-column>
  68. </el-table>
  69. </div>
  70. </el-col>
  71. </el-form-item>
  72. <el-form-item prop="is_alone_commission" label="是否单独设置提成">
  73. <el-switch v-model="formData.is_alone_commission" :active-value="1" :inactive-value="0" active-color="#13ce66">
  74. </el-switch>
  75. </el-form-item>
  76. <el-form-item prop="commission_type" label="类型">
  77. <template>
  78. <el-radio v-model="formData.commission_type" :label="1">百分比</el-radio>
  79. <el-radio v-model="formData.commission_type" :label="2">固定值</el-radio>
  80. </template>
  81. </el-form-item>
  82. <el-form-item label="选择商品" label-width="160px">
  83. <goods-dialog-select :multiple="true" :url="'business-activity/activity/goods-search'" :params="{activity_id: formData.id}" @selected="goodsSelect" title="商品选择">
  84. <el-button type="primary">选择商品</el-button>
  85. </goods-dialog-select>
  86. <el-col :span="20">
  87. <el-table max-height="400" :data="formData.goods_info" size="small" stripe border style="width: 100%;margin-top: 20px;">
  88. <el-table-column type="index" label="序号" align="center" width="60">
  89. </el-table-column>
  90. <el-table-column prop="id" label="商品id" align="center" min-width="80">
  91. </el-table-column>
  92. <el-table-column label="商品信息" min-width="150" align="center">
  93. <template slot-scope="scope">
  94. <div style="display: flex;align-items: center;">
  95. <el-image fit="cover" :src="scope.row.cover_pic" style="width: 40px;height: 40px;display: block;margin-right: 5px;flex-shrink: 0;"></el-image>
  96. <div>
  97. <div>{{scope.row.goods_name}}</div>
  98. </div>
  99. </div>
  100. </template>
  101. </el-table-column>
  102. <el-table-column prop="merchants_commission" label="招商负责人" align="center" min-width="150">
  103. <template scope="scope">
  104. <el-input size="small" v-model="scope.row.merchants_commission" type="number" oninput="value=value.replace('-', '')" placeholder="请输入内容">
  105. <template slot="append">
  106. <span v-if="formData.commission_type == 1">%</span>
  107. <span v-else>元</span>
  108. </template>
  109. </el-input>
  110. </template>
  111. </el-table-column>
  112. <el-table-column prop="venue_commission" label="场地负责人" align="center" min-width="150">
  113. <template scope="scope">
  114. <el-input size="small" v-model="scope.row.venue_commission" type="number" oninput="value=value.replace('-', '')" placeholder="请输入内容">
  115. <template slot="append">
  116. <span v-if="formData.commission_type == 1">%</span>
  117. <span v-else>元</span>
  118. </template>
  119. </el-input>
  120. </template>
  121. </el-table-column>
  122. <el-table-column prop="merchants_commission" label="招商负责人上级" align="center" min-width="150">
  123. <template scope="scope">
  124. <el-input size="small" v-model="scope.row.merchants_parent_commission" type="number" oninput="value=value.replace('-', '')" placeholder="请输入内容">
  125. <template slot="append">
  126. <span v-if="formData.commission_type == 1">%</span>
  127. <span v-else>元</span>
  128. </template>
  129. </el-input>
  130. </template>
  131. </el-table-column>
  132. <el-table-column prop="venue_commission" label="场地负责人上级" align="center" min-width="150">
  133. <template scope="scope">
  134. <el-input size="small" v-model="scope.row.venue_parent_commission" type="number" oninput="value=value.replace('-', '')" placeholder="请输入内容">
  135. <template slot="append">
  136. <span v-if="formData.commission_type == 1">%</span>
  137. <span v-else>元</span>
  138. </template>
  139. </el-input>
  140. </template>
  141. </el-table-column>
  142. <el-table-column prop="num" label="操作" align="center" min-width="80">
  143. <template slot-scope="scope">
  144. <el-button type="danger" @click="delFun(scope.$index)">删除</el-button>
  145. </template>
  146. </el-table-column>
  147. </el-table>
  148. </el-col>
  149. </el-form-item>
  150. </el-row>
  151. </div>
  152. </el-form>
  153. <el-button :loading="btnLoading" class="button-item" type="primary" style="margin-top: 24px;" @click="save" size="small">
  154. 保存
  155. </el-button>
  156. </div>
  157. <!-- 选择开团会员-->
  158. <el-dialog title="选择负责人" :visible.sync="dialogVisible" width="50%">
  159. <el-form class="my_flex" style="margin-bottom: 10px;" v-model="searchForm" label-width="100px">
  160. <div style="width: 200px;margin-right: 10px;">
  161. <el-input size="small" v-model="searchForm.inviter_id" placeholder="请输入会员ID"></el-input>
  162. </div>
  163. <div style="width: 200px;margin-right: 10px;">
  164. <el-input size="small" v-model="searchForm.keyword" placeholder="请输入会员昵称/手机号"></el-input>
  165. </div>
  166. <div>
  167. <el-button type="primary" size="small" @click="searchFun">查 询</el-button>
  168. </div>
  169. <div class="claer"></div>
  170. </el-form>
  171. <div style="color:#909090;">已选:{{selectUser?selectUser.nickname:''}}</div>
  172. <el-table stripe v-loading="listLoading" :data="searchInfo" style="margin-top: 5px;" @selection-change="selectionChange">
  173. <el-table-column width="100px" label="ID" props="id" align="center">
  174. <template slot-scope="props">
  175. <el-radio-group v-model="radioSelection" @change="selectionChange(props.row)">
  176. <el-radio :label="props.row.id"></el-radio>
  177. </el-radio-group>
  178. </template>
  179. </el-table-column>
  180. <el-table-column label="头像">
  181. <template slot-scope="props">
  182. <div>
  183. <com-image width="40px" height="40px" mode="aspectFill" :src="props.row.avatar_url? props.row.avatar_url:'/resources/img/common/default-avatar.png'" style="border-radius: 50%;"></com-image>
  184. </div>
  185. </template>
  186. </el-table-column>
  187. <el-table-column label="昵称" prop="nickname"></el-table-column>
  188. <el-table-column label="手机" prop="mobile"></el-table-column>
  189. <el-table-column label="会员等级" prop="level_name"></el-table-column>
  190. </el-table>
  191. <span slot="footer" class="dialog-footer">
  192. <el-button @click="dialogVisible = false">取 消</el-button>
  193. <el-button :loading="btnLoading" type="primary" @click="confirmSelectUser">确认</el-button>
  194. </span>
  195. </el-dialog>
  196. </el-card>
  197. </div>
  198. <script>
  199. const app = new Vue({
  200. el: '#app',
  201. data() {
  202. return {
  203. radio: 0,
  204. dialogVisible: false,
  205. listLoading: false,
  206. searchForm: {
  207. inviter_id: '',
  208. keyword: '',
  209. },
  210. radioSelection: 0, //选中用户ID
  211. selectUser: '', //选中的用户
  212. searchInfo: [],
  213. select_user_list: [],
  214. select_user_list2: [],
  215. from: 1,
  216. formData: {
  217. id: 0,
  218. name: '',
  219. goods_id: 0,
  220. is_edit: 0,
  221. is_alone_commission: 0,
  222. commission_type: 1,
  223. goods_info: [],
  224. merchants: [],
  225. venue: [],
  226. activityTime: [],
  227. start_at: '',
  228. end_at: ''
  229. },
  230. loading: false,
  231. btnLoading: false,
  232. goods_list: [],
  233. goods_ids: [],
  234. goods_attr_list: [],
  235. rules: {},
  236. }
  237. },
  238. mounted: function() {
  239. if (getQuery('id')) {
  240. this.loadData(getQuery('id')); //请求详情的数据
  241. } else {
  242. this.loadData();
  243. }
  244. },
  245. methods: {
  246. // 打开修改推荐人窗口
  247. dialogVisiblePop(from) {
  248. this.searchForm = {
  249. inviter_id: '',
  250. keyword: '',
  251. }
  252. this.searchInfo.splice(0, this.searchInfo.length);
  253. this.radioSelection = 0;
  254. this.selectUser = null;
  255. this.dialogVisible = true;
  256. this.from = from;
  257. },
  258. confirmSelectUser() {
  259. this.dialogVisible = false;
  260. this.btnLoading = false;
  261. let user_info = this.searchInfo[0];
  262. let data = {
  263. id: user_info.id,
  264. avatar_url: user_info.avatar_url,
  265. nickname: user_info.nickname,
  266. mobile: user_info.mobile,
  267. };
  268. if (this.from == 1) {
  269. this.formData.venue.push(data);
  270. } else {
  271. this.formData.merchants.push(data);
  272. }
  273. },
  274. selectionChange(e) {
  275. this.selectUser = e;
  276. },
  277. // 搜索
  278. searchFun() {
  279. if (!this.searchForm.inviter_id && !this.searchForm.keyword) {
  280. this.$message.error('查询内容不能为空');
  281. this.listLoading = false;
  282. return false;
  283. }
  284. this.listLoading = true;
  285. request({
  286. params: {
  287. r: 'business-activity/activity/get-can-bind-inviter',
  288. inviter_id: this.searchForm.inviter_id,
  289. keyword: this.searchForm.keyword,
  290. user_id: this.user_id,
  291. },
  292. }).then(e => {
  293. this.listLoading = false;
  294. if (e.data.code === 0) {
  295. this.searchInfo = e.data.data.list.list;
  296. } else {
  297. this.$message.error(res.data.msg);
  298. }
  299. }).catch(e => {
  300. this.listLoading = false;
  301. });
  302. },
  303. // 选中商品处理
  304. goodsSelect(param) {
  305. let params = param;
  306. for (let j in params) {
  307. let item = params[j];
  308. let flag = true;
  309. if (this.goods_ids.indexOf(item.id) > -1) {
  310. flag = false;
  311. }
  312. if (flag) {
  313. this.formData.goods_info.push({
  314. id: item.id,
  315. price: item.price,
  316. goods_name: item.goods_name,
  317. cover_pic: item.cover_pic,
  318. merchants_commission: 0,
  319. merchants_parent_commission: 0,
  320. venue_commission: 0,
  321. venue_parent_commission: 0,
  322. });
  323. this.goods_ids.push(item.id);
  324. }
  325. }
  326. },
  327. // 删除商品
  328. delFun(index) {
  329. this.formData.goods_info.splice(index, 1);
  330. },
  331. // 删除会员
  332. delSelectUser(index, from = 1) {
  333. if (from == 1) {
  334. this.formData.venue.splice(index, 1);
  335. } else {
  336. this.formData.merchants.splice(index, 1)
  337. }
  338. },
  339. save() {
  340. if (this.formData.goods_info.length <= 0) return this.$message.error("请选择商品");
  341. this.$refs['ruleForm'].validate((valid) => {
  342. if (valid) {
  343. if (this.btnLoading) return;
  344. this.btnLoading = true;
  345. request({
  346. params: {
  347. r: 'business-activity/activity/edit',
  348. },
  349. method: 'post',
  350. data: this.formData
  351. }).then(e => {
  352. this.btnLoading = false;
  353. if (e.data.code == 0) {
  354. this.$navigate({
  355. r: 'business-activity/activity/index'
  356. })
  357. this.$message(e.data.msg);
  358. } else {
  359. this.btnLoading = false;
  360. this.$message.error(e.data.msg);
  361. }
  362. }).catch(e => {
  363. console.log(e);
  364. this.$message.error('网络错误');
  365. this.btnLoading = false;
  366. })
  367. } else {
  368. this.$message.error('请填写必要的参数!');
  369. return false;
  370. }
  371. });
  372. },
  373. loadData(id) {
  374. if (this.loading === true) return;
  375. this.loading = true;
  376. request({
  377. params: {
  378. r: 'business-activity/activity/edit',
  379. id: id
  380. },
  381. method: 'get'
  382. }).then(e => {
  383. this.loading = false;
  384. if (e.data.code == 0) {
  385. this.formData = Object.assign(this.formData, e.data.data);
  386. }
  387. }).catch(e => {
  388. this.loading = false;
  389. })
  390. },
  391. setActivityTime(params) {
  392. if (params) {
  393. let begin = params[0];
  394. let end = params[1];
  395. this.formData.start_at = begin;
  396. this.formData.end_at = end;
  397. } else {
  398. this.formData.end_at = '';
  399. this.formData.end_at = '';
  400. }
  401. },
  402. },
  403. });
  404. </script>
  405. <style>
  406. .form_box {
  407. /* background-color: #f3f3f3;
  408. padding: 0 0 20px; */
  409. background-color: #fff;
  410. padding: 20px;
  411. }
  412. .button-item {
  413. margin-top: 12px;
  414. padding: 9px 25px;
  415. }
  416. .el-input-group__append {
  417. background-color: #fff;
  418. color: #353535;
  419. }
  420. .el-card__body {
  421. padding: 0;
  422. }
  423. .el-card {
  424. border: none;
  425. }
  426. .el-table thead {
  427. font-size: 14px;
  428. color: #333;
  429. }
  430. /* .el-table__footer-wrapper, .el-table__header-wrapper{
  431. border-bottom: 1.4px solid #D6D6D6;
  432. } */
  433. .dialogClass .el-dialog__body {
  434. padding-bottom: 0;
  435. }
  436. .el-date-editor .el-range-separator {
  437. /* 设置选择日期框的中间的 ‘至’ 的宽度 */
  438. width: 8%;
  439. }
  440. .el-textarea__inner {
  441. display: block;
  442. resize: vertical;
  443. padding: 5px 15px !important;
  444. }
  445. .el-input-number .el-input__inner {
  446. text-align: left;
  447. }
  448. .my_flex {
  449. display: flex;
  450. }
  451. .message-font-size {
  452. font-size: 24px;
  453. padding-right: 6px;
  454. }
  455. .custom-bg-color {
  456. background-color: #f0f9eb;
  457. border-color: #e1f3d8;
  458. opacity: .85;
  459. }
  460. .el-date-editor.el-input,
  461. .el-date-editor.el-input__inner {
  462. width: 100% !important;
  463. }
  464. /* .edui-default .edui-editor{
  465. height: 250px;
  466. } */
  467. </style>