price-difference-gift-package-edit.php 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. $diyPath = dirname(__DIR__) . '/components';
  4. ComponentHelper::loadComponentView('com-dialog-select');
  5. ComponentHelper::loadComponentView('free-goods-choice', $diyPath);
  6. ?>
  7. <template id="price-difference-gift-package-edit">
  8. <el-dialog :visible.sync="edit.show" width="70%" :title="edit_row.title" center>
  9. <div>
  10. <el-form @submit.native.prevent size="small" label-width="100px" v-loading='loading'>
  11. <el-form-item label="升级等级" required>
  12. <el-select v-model="ruleForm.level" placeholder="请选择升级等级" @change="levelChange">
  13. <el-option
  14. v-for="item in level_list"
  15. :key="item.level"
  16. :label="item.name"
  17. :value="item.level"
  18. :disabled="item.status == 1?false:true"
  19. >
  20. </el-option>
  21. </el-select>
  22. </el-form-item>
  23. <el-form-item label="礼包名称" required>
  24. <el-input v-model="ruleForm.name" style="width: 210px" placeholder="请输入礼包名称">
  25. </el-input>
  26. </el-form-item>
  27. <el-form-item label="礼包主图:" prop="pic_type" required>
  28. <div class="flex-y-center" style="margin-bottom: 10px;">
  29. <el-radio style="margin-right: 0" v-model="ruleForm.pic_type" :label="0"
  30. @change="backgroundTypeChange"><span></span></el-radio>
  31. <div>默认:</div>
  32. </div>
  33. <div class="flex-y-center flex-y-top">
  34. <el-radio style="margin-right: 0" v-model="ruleForm.pic_type" :label="1"
  35. @change="backgroundTypeChange"><span></span></el-radio>
  36. <div style="line-height: 16px; margin-right: 20px">自定义:</div>
  37. <div v-if="ruleForm.pic_type==1">
  38. <com-attachment v-if="!ruleForm.pic" :multiple="false" :max="1" type="images"
  39. @selected="coverPic">
  40. <div class="card-upload">
  41. <i class="el-icon-plus"></i>
  42. </div>
  43. </com-attachment>
  44. <div class="card-coverimg" v-else>
  45. <el-image style="width: 80px; height: 80px" :src="ruleForm.pic"></el-image>
  46. <el-button @click="delPic" class="icon-close" type="primary" size="mini"
  47. icon="el-icon-close" circle></el-button>
  48. </div>
  49. <p class="tips-text">尺寸:84*84像素,小于1M,支持jpg、png、jpeg格式</p>
  50. </div>
  51. </div>
  52. </el-form-item>
  53. <el-form-item label="礼包商品" required>
  54. <div style="display: inline-block;flex: auto">
  55. <div flex="cross:center">
  56. <div style="display: flex;">
  57. <free-goods-choice :multiple="true" @selected="goodsSelect" title="商品选择">
  58. <el-button type="primary">选择商品</el-button>
  59. </free-goods-choice>
  60. &nbsp;
  61. <el-button type="primary" @click="deleteGoodsBatch">批量删除</el-button>
  62. </div>
  63. </div>
  64. </div>
  65. </el-form-item>
  66. <el-form-item v-if="goods">
  67. <div style="max-height: 300px;overflow-y: auto;background-color: #eee;">
  68. <div flex v-if="goods">
  69. <div style="padding-right: 10px;flex-grow: 0">
  70. <com-image mode="aspectFill"
  71. :src="goods.cover_pic"></com-image>
  72. </div>
  73. <div style="flex-grow: 1;">
  74. <com-ellipsis :line="2">{{goods.goods_name}}
  75. </com-ellipsis>
  76. </div>
  77. <div style="flex-grow: 0;">
  78. <el-button @click="deleteGoods"
  79. type="text" circle size="mini">
  80. <el-tooltip class="item" effect="dark"
  81. content="删除" placement="top">
  82. <img src="resources/img/mall/del.png" alt="">
  83. </el-tooltip>
  84. </el-button>
  85. </div>
  86. </div>
  87. </div>
  88. </el-form-item>
  89. <el-form-item :label-width="formLabelWidth">
  90. <template >
  91. <div class="table-body" style="padding-left: 0;padding-top: 0;">
  92. <template>
  93. <el-table :data="ruleForm.goods_list" border style="width: 100%"
  94. @selection-change="handleSelectionChange">
  95. <el-table-column type="selection" width="60px" label="ID" prop="id">
  96. </el-table-column>
  97. <el-table-column type="index" label="序号" width="50"></el-table-column>
  98. <el-table-column prop="id" label="商品id" width="100"></el-table-column>
  99. <el-table-column prop="name,cover_pic" label="商品名称" >
  100. <template slot-scope="scope">
  101. <div flex="box:first">
  102. <div style="padding-right: 10px;">
  103. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  104. </div>
  105. <div flex="cross:top cross:center">
  106. {{scope.row.goods_name }}
  107. </div>
  108. </div>
  109. </template>
  110. </el-table-column>
  111. <el-table-column label="操作" width="100">
  112. <template slot-scope="scope">
  113. <el-button @click="deleteGoods(scope.$index)" size="mini">删除</el-button>
  114. </template>
  115. </el-table-column>
  116. </el-table>
  117. </template>
  118. </div>
  119. </template>
  120. </el-form-item>
  121. <el-form-item label="礼包金额" required>
  122. <el-input v-model="ruleForm.price" style="width: 210px" placeholder="请输入礼包金额"
  123. onInput="value=toNumber(value,2)">
  124. </el-input>
  125. </el-form-item>
  126. <el-form-item label="推荐奖励" required>
  127. <el-radio v-model="ruleForm.is_range" label="1">全部代理</el-radio>
  128. <el-radio v-model="ruleForm.is_range" label="0">最近代理</el-radio>
  129. <el-table :data="ruleForm.recommend_reward" style="width: 100%">
  130. <el-table-column prop="name" label="等级" width="180"></el-table-column>
  131. <el-table-column prop="reward_fee" label="比例" width="180">
  132. <template slot-scope="scope">
  133. <el-input v-model="scope.row.reward_fee" onInput="value=toNumber(value,2)" placeholder="
  134. ">
  135. <template slot="append">%</template>
  136. </el-input>
  137. </template>
  138. </el-table-column>
  139. </el-table>
  140. </el-form-item>
  141. <el-form-item label="购买后是否可以成为业绩奖励团长" :label-width="formLabelWidth">
  142. <div>
  143. <el-switch v-model="ruleForm.is_achievement_user" :active-value="1" :inactive-value="0">
  144. </el-switch>
  145. </div>
  146. </el-form-item>
  147. <el-form-item label="不发放差价奖" :label-width="formLabelWidth">
  148. <div>
  149. <el-switch v-model="ruleForm.not_get_price_difference" :active-value="1" :inactive-value="0">
  150. </el-switch>
  151. </div>
  152. </el-form-item>
  153. <el-form-item label="推荐奖励截止至货款获得者" :label-width="formLabelWidth">
  154. <div>
  155. <el-switch v-model="ruleForm.not_distribute_payment_for_goods" :active-value="1"
  156. :inactive-value="0">
  157. </el-switch>
  158. </div>
  159. </el-form-item>
  160. </el-form>
  161. </div>
  162. <span slot="footer" class="dialog-footer">
  163. <el-button @click="editCancel" type="default" size="small">取消</el-button>
  164. <el-button type="primary" :loading="edit.btnLoading" style="margin-bottom: 10px;" size="small"
  165. @click="editSave">保存</el-button>
  166. </span>
  167. </el-dialog>
  168. </template>
  169. <script>
  170. Vue.component('price-difference-gift-package-edit', {
  171. template: '#price-difference-gift-package-edit',
  172. props: {
  173. value: {
  174. type: Boolean,
  175. default: false
  176. },
  177. edit_row: {
  178. type: Object,
  179. default: null
  180. }
  181. },
  182. data() {
  183. return {
  184. edit: {
  185. show: false,
  186. id: '',
  187. btnLoading: false,
  188. },
  189. ruleForm: {
  190. id: 0,
  191. name: '',
  192. level: '',
  193. pic_type: 0,
  194. pic: '',
  195. price: '',
  196. goods_id: [],
  197. status: 1,
  198. is_range: '1',
  199. is_achievement_user: 0,
  200. goods_list:[],
  201. recommend_reward:[],
  202. not_get_price_difference: 0,
  203. not_distribute_payment_for_goods: 0,
  204. },
  205. formLabelWidth: '150px',
  206. level_list: [],
  207. goods: null,
  208. loading:false,
  209. recommend_reward_arr: [],
  210. multipleSelection: [],
  211. }
  212. },
  213. watch: {
  214. value() {
  215. if (this.value) {
  216. this.getLevelList();
  217. this.edit.show = true;
  218. if (this.edit_row.id > 0) {
  219. this.edit.id = this.edit_row.id;
  220. this.loadData();
  221. }else{
  222. this.loadDataNoId();
  223. this.edit.id = 0;
  224. }
  225. this.changeLevelReward();
  226. } else {
  227. this.edit.show = false;
  228. }
  229. },
  230. 'edit.show'() {
  231. if (!this.edit.show) {
  232. this.edit_row.id = 0;
  233. this.ruleForm = {
  234. id: 0,
  235. name: '',
  236. level: '',
  237. pic_type: 0,
  238. pic: '',
  239. price: '',
  240. goods_id: [],
  241. status: 1,
  242. is_range: '1',
  243. is_achievement_user: 0,
  244. goods_list:[],
  245. recommend_reward: [],
  246. not_get_price_difference: 0,
  247. not_distribute_payment_for_goods: 0,
  248. }
  249. this.goods = null,
  250. this.goods2 = null,
  251. this.editCancel();
  252. }
  253. if (this.edit.id) {
  254. }
  255. }
  256. },
  257. mounted() {
  258. },
  259. methods: {
  260. backgroundTypeChange(value) {
  261. },
  262. backgroundChange(command) {
  263. if (this.ruleForm.background_type == 0) {
  264. this.ruleForm.background = this.defaultStyle[command].bg_url
  265. this.background_default = this.ruleForm.background;
  266. this.ruleForm.font_color = this.defaultStyle[command].font_color
  267. }
  268. },
  269. coverPic(e) { // 选择图片
  270. this.ruleForm.pic = e[0].url
  271. },
  272. delPic() {
  273. this.ruleForm.pic = null;
  274. },
  275. onInput(e) {
  276. this.$forceUpdate();
  277. },
  278. loadData() {
  279. this.loading = true;
  280. request({
  281. params: {
  282. r: 'cloud-stock/price-difference-gift-package/edit',
  283. id: this.edit.id
  284. },
  285. method: 'get',
  286. }).then(response => {
  287. this.loading = false;
  288. if (response.data.code == 0) {
  289. this.ruleForm = {
  290. level: response.data.data.level,
  291. give_goods_num:response.data.data.give_goods_num,
  292. name: response.data.data.name,
  293. status: response.data.data.status,
  294. is_range: response.data.data.is_range.toString(),
  295. is_achievement_user: response.data.data.is_achievement_user,
  296. price: response.data.data.price,
  297. goods_list:response.data.data.goods_list,
  298. goods_id:response.data.data.goods_id,
  299. pic_type: response.data.data.pic_type,
  300. pic: response.data.data.pic,
  301. recommend_reward: response.data.data.recommend_reward,
  302. not_get_price_difference: response.data.data.not_get_price_difference,
  303. not_distribute_payment_for_goods: response.data.data.not_distribute_payment_for_goods,
  304. }
  305. this.ruleForm.is_percent = this.ruleForm.is_percent.toString();
  306. this.recommend_reward_arr = response.data.data.recommend_reward;
  307. var level = this.ruleForm.level
  308. console.log('====', this.ruleForm.is_range);
  309. this.changeLevelReward(level);
  310. } else {
  311. this.$message.error(response.data.msg);
  312. }
  313. }).catch(response => {
  314. this.loading = false;
  315. });
  316. },
  317. loadDataNoId() {
  318. this.loading = true;
  319. request({
  320. params: {
  321. r: 'cloud-stock/price-difference-gift-package/edit',
  322. },
  323. method: 'get',
  324. }).then(response => {
  325. this.loading = false;
  326. if (response.data.code == 0) {
  327. this.ruleForm.recommend_reward = response.data.data.recommend_reward;
  328. console.log('+++++', this.ruleForm.recommend_reward);
  329. this.recommend_reward_arr = response.data.data.recommend_reward;
  330. this.changeLevelReward(0);
  331. } else {
  332. this.$message.error(response.data.msg);
  333. }
  334. }).catch(response => {
  335. this.loading = false;
  336. });
  337. },
  338. goodsSelect(param) {
  339. for (let j in param) {
  340. let item = param[j];
  341. let flag = true;
  342. for (let i in this.ruleForm.goods_id) {
  343. if (this.ruleForm.goods_id[i] == item.goods_id) {
  344. flag = false;
  345. break;
  346. }
  347. }
  348. if (flag) {
  349. this.ruleForm.goods_id.push(item.goods_id);
  350. this.ruleForm.goods_list.push({
  351. id: item.goods_id,
  352. goods_name: item.goods_name,
  353. cover_pic: item.cover_pic,
  354. });
  355. }
  356. }
  357. },
  358. deleteGoods(index) {
  359. this.ruleForm.goods_list.splice(index, 1);
  360. this.ruleForm.goods_id.splice(index, 1);
  361. },
  362. agentClick(row) {
  363. this.edit.id = row.id
  364. },
  365. getLevelList() {
  366. request({
  367. params: {
  368. r: 'cloud-stock/default/get-level-list',
  369. page:1,
  370. limit:100
  371. },
  372. method: 'get',
  373. }).then(response => {
  374. if (response.data.code == 0) {
  375. this.level_list = response.data.data;
  376. } else {
  377. this.$message.error(response.data.msg);
  378. }
  379. }).catch(response => {
  380. });
  381. },
  382. editCancel() {
  383. this.$emit('input', false);
  384. },
  385. editSave() {
  386. if (this.ruleForm.name == '') {
  387. this.$message.error('请输入礼包名称');
  388. return;
  389. }
  390. if (this.ruleForm.goods_id == 0) {
  391. this.$message.error('请选择礼包商品');
  392. return;
  393. }
  394. if (this.ruleForm.level == '') {
  395. this.$message.error('请选择升级等级');
  396. return;
  397. }
  398. let requestUrl = '';
  399. requestUrl = 'cloud-stock/price-difference-gift-package/edit';
  400. this.edit.btnLoading = true;
  401. this.ruleForm.id = this.edit.id;
  402. request({
  403. params: {
  404. r:requestUrl,
  405. },
  406. method: 'post',
  407. data: this.ruleForm
  408. }).then(response => {
  409. this.edit.btnLoading = false;
  410. if (response.data.code == 0) {
  411. this.$message.success('保存成功');
  412. //this.goods = null;
  413. this.$emit('refresdatafun',1);
  414. this.editCancel();
  415. this.ruleForm= {
  416. level: '',
  417. goods_id: 0,
  418. give_goods_num:'',
  419. give_goods_id:0,
  420. name: '',
  421. status: 1,
  422. is_percent: 0,
  423. }
  424. } else {
  425. this.$message.error(response.data.msg);
  426. }
  427. }).catch(response => {
  428. this.edit.btnLoading = false;
  429. });
  430. },
  431. keyUp() {
  432. },
  433. levelChange() {
  434. this.changeLevelReward()
  435. },
  436. changeLevelReward() {
  437. let self = this
  438. let newLeveReward = [];
  439. this.recommend_reward_arr.forEach(function (item, index) {
  440. newLeveReward.push(item)
  441. })
  442. self.ruleForm.recommend_reward = newLeveReward;
  443. },
  444. handleSelectionChange(val) {
  445. this.multipleSelection = val;
  446. },
  447. deleteGoodsBatch() {
  448. if (this.multipleSelection.length <= 0) {
  449. this.$message.error('未勾选商品');
  450. return false;
  451. }
  452. var ids = [];
  453. this.multipleSelection.forEach(row => {
  454. ids.push(row.id)
  455. })
  456. var new_goods_ids = [];
  457. var new_goods_list = [];
  458. for (var i in this.ruleForm.goods_list) {
  459. var temp = this.ruleForm.goods_list[i];
  460. if (!ids.includes(temp.id)) {
  461. new_goods_list.push(temp)
  462. new_goods_ids.push(temp.id)
  463. }
  464. }
  465. this.ruleForm.goods_list = new_goods_list;
  466. this.ruleForm.goods_id = new_goods_ids;
  467. },
  468. }
  469. });
  470. </script>
  471. <style>
  472. #app {
  473. display: flex;
  474. flex-direction: column;
  475. min-width: 1250px;
  476. }
  477. .diy-contain {
  478. flex: 1;
  479. overflow: auto;
  480. background: #F4F6F8;
  481. justify-content: space-between;
  482. }
  483. .diy-func-list {
  484. box-sizing: border-box;
  485. width: 354px;
  486. background: #FFFFFF;
  487. border-radius: 0px;
  488. }
  489. .diy-preview {
  490. background: #F4F6F8;
  491. justify-content: space-around;
  492. width: 467px;
  493. }
  494. .dsp-contain {
  495. flex: 1;
  496. }
  497. .flex {
  498. display: flex;
  499. }
  500. .flex-x-center {
  501. display: flex;
  502. justify-content: center;
  503. }
  504. .flex-y-center {
  505. display: flex;
  506. align-items: center;
  507. }
  508. .flex-x-y-center {
  509. display: flex;
  510. justify-content: center;
  511. align-items: center;
  512. }
  513. .flex-y-top {
  514. align-items: flex-start;
  515. }
  516. :root {
  517. /* 主题色 */
  518. --diy-theme: #F10009;
  519. /* 主要字体颜色 */
  520. --diy-color: #F10009;
  521. }
  522. .dsp-contain {
  523. position: relative;
  524. flex: 1;
  525. height: 100%;
  526. background: #FFFFFF;
  527. }
  528. .title {
  529. font-size: 16px;
  530. font-weight: bold;
  531. padding: 16px 0 0 16px;
  532. }
  533. .add-box {
  534. padding: 16px 0 0 16px;
  535. font-size: 16px;
  536. color: #1890FF;
  537. }
  538. .service-item + .service-item {
  539. margin-top: 10px;
  540. }
  541. .service-con {
  542. margin: 0 80px;
  543. background: #F5F5F5;
  544. justify-content: space-evenly;
  545. }
  546. .setting-item {
  547. text-align: center;
  548. padding: 0 16px 16px;
  549. }
  550. .dropdown-link {
  551. width: 111px;
  552. height: 40px;
  553. border: 1px solid #DCDFE6;
  554. }
  555. .dropdown-item + .dropdown-item {
  556. padding-left: 0;
  557. }
  558. .card-upload {
  559. width: 103px;
  560. height: 103px;
  561. line-height: 103px
  562. }
  563. </style>