edit.php 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550
  1. <!-- 引一个当前组件 -->
  2. <?php
  3. use common\helpers\ComponentHelper;
  4. use common\helpers\AddonHelper;
  5. ComponentHelper::loadComponentView('com-dialog-select', AddonHelper::getAddonRootPath('Bargain') . 'backend/views/components/');
  6. ComponentHelper::loadComponentView('com-rich-text');
  7. ?>
  8. <div id="app" v-loading.fullscreen.lock="pageLoading">
  9. <el-card shadow="never" style="border:0;min-width: 1200px;" body-style="background-color: #f3f3f3;padding: 0 0;">
  10. <div slot="header">
  11. <el-breadcrumb separator="/">
  12. <el-breadcrumb-item><span style="color: #409EFF;cursor: pointer">添加商品</span></el-breadcrumb-item>
  13. </el-breadcrumb>
  14. </div>
  15. <el-form :model="cForm" :rules="cRule" ref="ruleForm" label-width="180px" size="small"
  16. class="demo-ruleForm">
  17. <el-card shadow="never" class="mt-24">
  18. <el-form-item label="砍价活动名称">
  19. <el-input class="width-200" v-model="cForm.title"></el-input>
  20. </el-form-item>
  21. <el-form-item label="砍价分类" prop="parent_title">
  22. <el-select v-model="cate_name" placeholder="请选择" @change="handleChange">
  23. <el-option v-for="item,k in cateList" :key="item.id" :label="item.name" :value="item.id">
  24. </el-option>
  25. </el-select>
  26. </el-form-item>
  27. <el-form-item label="商品信息获取" width="120" prop="goods_id" required>
  28. <label slot="label">
  29. 商品信息获取
  30. </label>
  31. <div>
  32. <el-row type="flex">
  33. <com-dialog-select v-model="cForm.goods_id" :multiple="false" url="bargain/default/goods-list"
  34. @selected="selectGoodsWarehouse">
  35. <el-button>选择商品</el-button>
  36. </com-dialog-select>
  37. </el-row>
  38. </div>
  39. <p class="tips-text">只能从商城中获取商品信息,且基本信息与商城商品保持一致</p>
  40. </el-form-item>
  41. <el-form-item v-if="formGoodsList.length>0" label="活动商品">
  42. <div class="table-body">
  43. <template>
  44. <el-table
  45. :data="formGoodsList"
  46. border
  47. style="width: 800px">
  48. <el-table-column
  49. label="商品"
  50. min-width="650">
  51. <template slot-scope="scope">
  52. <div flex="box:first">
  53. <div style="padding-right: 10px;">
  54. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  55. </div>
  56. <div>
  57. <div>
  58. {{scope.row.goods_name}}
  59. </div>
  60. <div>
  61. <span style="color:red;margin-right: 10px;">
  62. ¥{{scope.row.price}}
  63. </span>
  64. <span>
  65. 库存:{{scope.row.stock}}
  66. </span>
  67. </div>
  68. </div>
  69. </div>
  70. </template>
  71. </el-table-column>
  72. <el-table-column label="操作" min-width="150">
  73. <template slot-scope="scope">
  74. <el-button @click="delGoods" type="text" size="small">删除</el-button>
  75. </template>
  76. </el-table-column>
  77. </el-table>
  78. </template>
  79. </div>
  80. </el-form-item>
  81. <el-form-item label="是否支持中途下单" prop="type">
  82. <el-radio-group v-model.number="cForm.type">
  83. <el-radio :label="1">允许中途下单</el-radio>
  84. <el-radio :label="2">必须砍到最低价下单</el-radio>
  85. </el-radio-group>
  86. <p class="tips-text">若选择允许中途下单,下单后减少库存,若选择最低价下单,以砍价成功到最低价减少库存</p>
  87. </el-form-item>
  88. <el-col :xl="12" :lg="16">
  89. <el-form-item label="活动库存" width="120" prop="stock">
  90. <label slot="label">
  91. 活动库存
  92. </label>
  93. <el-input required type="number" v-model.number="cForm.stock" placeholder="请输入活动库存" onkeyup="value=value.replace(/[^\d]/g,'')">
  94. </el-input>
  95. <p class="tips-text">活动库存与商城对应商品的总库存无关联</p>
  96. </el-form-item>
  97. <el-form-item label="砍价最低价" width="120" prop="min_price">
  98. <el-input required v-model="cForm.min_price"
  99. placeholder="请输入商品最低价" @input="priceChange" onInput="value=toNumber(value,2)"></el-input>
  100. </el-form-item>
  101. <el-form-item label="活动时间" width="120" prop="active_date" required>
  102. <label slot="label">活动时间</label>
  103. <el-date-picker
  104. v-model="cForm.active_date"
  105. type="datetimerange"
  106. value-format="yyyy-MM-dd HH:mm:ss"
  107. range-separator="至"
  108. start-placeholder="开始日期"
  109. end-placeholder="结束日期">
  110. </el-date-picker>
  111. <p class="tips-text">商品砍价时间,到时间则活动结束</p>
  112. </el-form-item>
  113. <el-form-item label="砍价有效期" width="120" prop="time">
  114. <label slot="label">砍价时间</label>
  115. <el-input required type="number" v-model="cForm.time" placeholder="请输入砍价时间" onkeyup="value=value.replace(/[^\d]/g,'')">
  116. <template slot="append">小时</template>
  117. </el-input>
  118. <p class="tips-text">若到时间没有购买,则视为砍价失败</p>
  119. </el-form-item>
  120. <el-form-item label="发起砍价参与等级"
  121. prop="join_limit_user_level"
  122. :rules="[{type: 'array', required: true, message: '请选择发起砍价参与等级'}]">
  123. <el-select v-model="cForm.join_limit_user_level" multiple placeholder="请选择">
  124. <el-option
  125. v-for="item in mall_join_members"
  126. :key="item.id"
  127. :label="item.name"
  128. :value="item.id">
  129. </el-option>
  130. </el-select>
  131. </el-form-item>
  132. <el-form-item label="发起次数" width="120" prop="join_time">
  133. <label slot="label">发起次数</label>
  134. <el-input-number v-model="cForm.join_time" :min="0" :precision="0" :step="1" label="请输入发起次数"></el-input-number>
  135. <p class="tips-text">填0,则表示不限发起次数; 若填写发起次数,则发起次数必须大于等于1;</p>
  136. </el-form-item>
  137. <el-form-item label="自动首砍不考虑帮砍规则" prop="is_creator_exempt" required>
  138. <el-switch
  139. v-model="cForm.is_creator_exempt" :active-value="1" :inactive-value="0"
  140. >
  141. </el-switch>
  142. <p class="tips-text">开启后,发起活动时,用户自身的砍价行为(即发起活动时的自动帮砍)不考虑帮砍等级计算,且不消耗帮砍次数;</p>
  143. </el-form-item>
  144. <el-form-item label="帮砍参与等级"
  145. prop="bargain_limit_user_level"
  146. :rules="[{type: 'array', required: true, message: '请选择帮砍参与等级'}]">
  147. <el-select v-model="cForm.bargain_limit_user_level" multiple placeholder="请选择">
  148. <el-option
  149. v-for="item in mall_members"
  150. :key="item.id"
  151. :label="item.name"
  152. :value="item.id">
  153. </el-option>
  154. </el-select>
  155. </el-form-item>
  156. <el-form-item label="可帮砍次数" width="120" prop="bargain_time">
  157. <label slot="label">可帮砍次数</label>
  158. <el-input-number v-model="cForm.bargain_time" :min="0" :precision="0" :step="1" label="请输入可帮砍次数"></el-input-number>
  159. <p class="tips-text">填0,则表示不限帮砍次数; 若填写帮砍次数,则帮砍次数必须大于等于1;</p>
  160. </el-form-item>
  161. <el-form-item label="是否允许重复帮砍" prop="is_repeat_bargain" required>
  162. <el-switch
  163. v-model="cForm.is_repeat_bargain" :active-value="1" :inactive-value="0"
  164. >
  165. </el-switch>
  166. <p class="tips-text">帮同个用户但不同砍价订单是否可以重复帮砍</p>
  167. </el-form-item>
  168. <el-form-item label="参与人数" width="120" prop="mode_data.bargain_people">
  169. <label slot="label">参与人数</label>
  170. <el-input required type="number" v-model.number="cForm.mode_data.bargain_people"
  171. placeholder="请输入参与人数" onkeyup="value=value.replace(/[^\d]/g,'')"></el-input>
  172. <p class="tips-text">填0,则表示不限参与人数,砍完为止; 若填写参与人数,则参与人数必须大于1; 刚好达到参与人数时砍价完成</p>
  173. </el-form-item>
  174. <el-form-item label="砍价方式" width="120">
  175. <label slot="label">砍价方式</label>
  176. <div>
  177. <el-col :span="12">
  178. <el-form-item prop="mode_data.bargain_human">
  179. <el-input required type="number" v-model.number="cForm.mode_data.bargain_human"
  180. placeholder="砍价人数" onkeyup="value=value.replace(/[^\d]/g,'')">
  181. <template slot="prepend">前</template>
  182. <template slot="append">人每人砍价</template>
  183. </el-input>
  184. <p class="tips-text">前N个人砍价波动值,剩余价格波动值</p>
  185. </el-form-item>
  186. </el-col>
  187. <el-col :span="6">
  188. <el-form-item prop="mode_data.bargain_first_min_price">
  189. <el-input required type="number" v-model="cForm.mode_data.bargain_first_min_price">
  190. <template slot="append">~</template>
  191. </el-input>
  192. </el-form-item>
  193. </el-col>
  194. <el-col :span="6">
  195. <el-form-item prop="mode_data.bargain_first_max_price">
  196. <el-input required type="number" v-model="cForm.mode_data.bargain_first_max_price">
  197. <template slot="append">元</template>
  198. </el-input>
  199. </el-form-item>
  200. </el-col>
  201. </div>
  202. <div style="clear: both;"></div>
  203. <div style="margin-top: 18px;">
  204. <el-col :span="12">
  205. <el-form-item prop="mode_data.bargain_second_min_price">
  206. <el-input required type="number" v-model="cForm.mode_data.bargain_second_min_price">
  207. <template slot="prepend">剩余每人砍价</template>
  208. </el-input>
  209. </el-form-item>
  210. </el-col>
  211. <el-col :span="12">
  212. <el-form-item prop="mode_data.bargain_second_max_price">
  213. <el-input required type="number" v-model="cForm.mode_data.bargain_second_max_price">
  214. <template slot="prepend">~</template>
  215. <template slot="append">元</template>
  216. </el-input>
  217. </el-form-item>
  218. </el-col>
  219. </div>
  220. <div style="clear: both;"></div>
  221. </el-form-item>
  222. <el-form-item label="砍价者获得佣金" prop="mode_data.commission_type" required>
  223. <el-switch
  224. v-model="cForm.mode_data.commission_type" active-value="1" inactive-value="0"
  225. >
  226. </el-switch>
  227. </el-form-item>
  228. <el-form-item label="聚合页活动规则" prop="introduction">
  229. <el-input type="textarea" :rows="3" placeholder="请输入聚合页活动规则" v-model="cForm.introduction" maxlength="200" show-word-limit></el-input>
  230. </el-form-item>
  231. <el-form-item label="完整活动规则" prop="description">
  232. <com-rich-text v-model="cForm.description"></com-rich-text>
  233. </el-form-item>
  234. </el-col>
  235. </el-card>
  236. </el-form>
  237. <div class="bottom-div" flex="cross:center">
  238. <el-button class="button-item" :loading="btnLoading" type="primary" size="small"
  239. @click="store('ruleForm')">保存
  240. </el-button>
  241. </div>
  242. </el-card>
  243. </div>
  244. <script>
  245. const app = new Vue({
  246. el: '#app',
  247. data() {
  248. return {
  249. id :0,
  250. pageLoading:false,
  251. btnLoading:false,
  252. goods_price:0,
  253. formGoodsList:[],
  254. cateList:[],//分类列表,
  255. cate_name: '',
  256. cate_id: 0,
  257. cForm:{
  258. title:'',
  259. cate_id:0,
  260. goods_id:'',
  261. type:1,
  262. stock:'',
  263. min_price:'',
  264. time:'',
  265. active_date: [],
  266. mode_data:{
  267. },
  268. bargain_people: '',
  269. bargain_human: '',
  270. bargain_first_min_price: '',
  271. bargain_first_max_price: '',
  272. bargain_second_min_price: '',
  273. bargain_second_max_price: '',
  274. attr_setting_type: 0,
  275. commission_type:'0',
  276. join_limit_user_level: [],
  277. join_time: 1,
  278. is_creator_exempt: 1,
  279. bargain_limit_user_level: [],
  280. bargain_time: 1,
  281. is_repeat_bargain: 1,
  282. introduction : '',
  283. description : '',
  284. },
  285. cRule:{
  286. title: [
  287. {
  288. validator: (rule, value, callback) => {
  289. if(value==''){
  290. callback('请输入砍价活动名称');
  291. }
  292. callback();
  293. }
  294. },
  295. ],
  296. goods_id: [
  297. {
  298. validator: (rule, value, callback) => {
  299. if(value==0){
  300. callback('请选择商品');
  301. }
  302. callback();
  303. }
  304. },
  305. ],
  306. stock:[
  307. {
  308. validator: (rule, value, callback) => {
  309. if(value<=0){
  310. callback('库存必须大于0');
  311. }
  312. callback();
  313. },trigger: 'blur'
  314. },
  315. ],
  316. min_price:[
  317. {
  318. validator: (rule, value, callback) => {
  319. if(value<0){
  320. callback('请输入最低价格');
  321. }
  322. callback();
  323. },trigger: 'blur'
  324. },
  325. ],
  326. time:[
  327. {
  328. validator: (rule, value, callback) => {
  329. if(value<=0){
  330. callback('请输入砍价时间');
  331. }
  332. callback();
  333. },trigger: 'blur'
  334. },
  335. ],
  336. mode_data:{
  337. bargain_people: [
  338. {
  339. validator: (rule, value, callback) => {
  340. if(value<0){
  341. callback('请输入参与人数');
  342. }
  343. callback();
  344. } ,trigger: 'blur'
  345. }
  346. ],
  347. bargain_human: [
  348. {
  349. validator: (rule, value, callback) => {
  350. if(value<=0){
  351. callback('请输入前面人数');
  352. }
  353. callback();
  354. },trigger: 'blur'
  355. }
  356. ],
  357. bargain_first_min_price: [
  358. {
  359. validator: (rule, value, callback) => {
  360. if(value<=0){
  361. callback('必须大于0');
  362. }
  363. if (value > this.goods_price) {
  364. callback('前面砍价最低值不能大于商品售价');
  365. }
  366. callback();
  367. },trigger: 'blur'
  368. }
  369. ],
  370. bargain_first_max_price: [
  371. {
  372. validator: (rule, value, callback) => {
  373. if(value<=0){
  374. callback('必须大于0');
  375. }
  376. if (value > this.goods_price) {
  377. callback('前面砍价最高值不能大于商品售价');
  378. }
  379. callback();
  380. },trigger: 'blur'
  381. }
  382. ],
  383. bargain_second_min_price: [
  384. {
  385. validator: (rule, value, callback) => {
  386. if(value<=0){
  387. callback('必须大于0');
  388. }
  389. if (value > this.goods_price) {
  390. callback('后面砍价最低值不能大于商品售价');
  391. }
  392. callback();
  393. },trigger: 'blur'
  394. }
  395. ],
  396. bargain_second_max_price: [
  397. {
  398. validator: (rule, value, callback) => {
  399. if(value<=0){
  400. callback('必须大于0');
  401. }
  402. if (value > this.goods_price) {
  403. callback('后面砍价最高值不能大于商品售价');
  404. }
  405. callback();
  406. },trigger: 'blur'
  407. }
  408. ],
  409. },
  410. active_date: [
  411. {required: true, message: '请输入活动时间'}
  412. ]
  413. },
  414. goodsDetail:{},
  415. mall_join_members: [],
  416. mall_members: [],
  417. };
  418. },
  419. methods: {
  420. loadData(){
  421. let self = this;
  422. self.pageLoading = true;
  423. request({
  424. params: {
  425. r: 'bargain/default/edit',
  426. id: self.id,
  427. },
  428. method: 'get',
  429. }).then(e => {
  430. self.pageLoading = false;
  431. if (e.data.code == 0) {
  432. self.cForm = e.data.data;
  433. this.cateList = e.data.data.cate_list;
  434. self.cate_name = e.data.data.cate.name;
  435. self.cForm.mode_data.commission_type = self.cForm.mode_data.commission_type.toString();
  436. self.mall_join_members = e.data.data.user_level_list;
  437. self.mall_members = e.data.data.user_level_list;
  438. delete e.data.data.user_level_list;
  439. if(self.id!=0){
  440. let formGoodsList = e.data.data.goods;
  441. this.goods_price = e.data.data.goods.price;
  442. self.formGoodsList.push(formGoodsList);
  443. }
  444. } else {
  445. this.$message.error(e.data.msg);
  446. }
  447. });
  448. },
  449. // 选择商品(清空弹窗已有商品)
  450. selectGoodsWarehouse(goods) {
  451. this.formGoodsList = [];
  452. this.cForm.goods_id = goods.id;
  453. this.goods_price = goods.price;
  454. this.formGoodsList.push(goods);
  455. //先验证商品
  456. this.$refs.ruleForm.validateField('goods_id');
  457. },
  458. //删除选中商品
  459. delGoods(){
  460. this.formGoodsList = [];
  461. this.cForm.goods_id = '';
  462. //先验证商品
  463. this.$refs.ruleForm.validateField('goods_id');
  464. },
  465. store(formName){
  466. let self = this;
  467. if(self.cForm.cate_id==0){
  468. this.$message({
  469. type: 'info',
  470. message: '请选择砍价分类'
  471. });
  472. return false;
  473. }
  474. this.$refs[formName].validate(valid => {
  475. if(valid){
  476. self.btnLoading = true;
  477. request({
  478. params: {
  479. r: 'bargain/default/edit',
  480. },
  481. method: 'post',
  482. data: self.cForm
  483. }).then(e => {
  484. self.btnLoading = false;
  485. if (e.data.code === 0) {
  486. self.$message.success(e.data.msg);
  487. navigateTo({
  488. r:'bargain/default/index'
  489. });
  490. } else {
  491. self.$message.error(e.data.msg);
  492. }
  493. }).catch(e => {
  494. console.log(e);
  495. });
  496. }
  497. })
  498. },
  499. handleChange(value) {
  500. this.cForm.cate_id = value;
  501. },
  502. priceChange(value){
  503. if(this.formGoodsList){
  504. let goodsPrice = parseFloat(this.formGoodsList[0].price)
  505. value = parseFloat(value)
  506. if(value >=goodsPrice){
  507. this.$message({type:'error',message:'砍价最低价格必须小于商品原价'})
  508. this.cForm.min_price = goodsPrice - 1
  509. }
  510. }
  511. }
  512. },
  513. created(){
  514. let id = getQuery("id");
  515. if(id){
  516. this.id = id;
  517. this.loadData();
  518. }else{
  519. this.id = 0;
  520. }
  521. }
  522. });
  523. </script>