edit.php 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-dialog-select');
  4. ?>
  5. <style lang="scss" scoped>
  6. /* .el-card__header {
  7. padding: 8px 20px;
  8. }
  9. .el-form-item--mini.el-form-item, .el-form-item--small.el-form-item {
  10. margin: 5px;
  11. }
  12. .el-form-item__content, .el-form-item__label{
  13. margin-top: 10px;
  14. } */
  15. ::v-deep .el-input__inner{
  16. height: 5px;
  17. }
  18. .all-change-form {
  19. border: 1px solid #e5e5e5;
  20. border-bottom: 0px;
  21. .el-form-item {
  22. margin-bottom: 0px;
  23. padding: 10px;
  24. }
  25. }
  26. </style>
  27. <div id="app" v-cloak>
  28. <el-card class="box-card">
  29. <div slot="header">
  30. <span>积分商品</span>
  31. </div>
  32. <el-card shadow="never" style="border:0;min-width: 1000px;" body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  33. <el-form ref="form" :model="form" label-width="120px" size="small" v-loading="loading">
  34. <el-card style="margin-top: 10px" class="edit-card" shadow="never">
  35. <div slot="header" class="clearfix">
  36. <div class="card-title">基础设置</div>
  37. </div>
  38. <el-form-item style="margin-left: 10px;" label="商品分类" required>
  39. <el-select class="width-150" placeholder="请选择分类" @change="handle('selectType', $event)" v-model="form.catName">
  40. <el-option v-for="items in cate_list" :label="items.name" :value="items.id"></el-option>
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item style="margin-left: 10px;" label="优惠限制" required>
  44. <el-switch v-model="form.use_coupon" :active-value="0" :inactive-value="1"></el-switch>
  45. <div class="tips-text">开启时,积分商品不参与优惠券抵扣</div>
  46. </el-form-item>
  47. </el-card>
  48. <el-card class="edit-card" shadow="never">
  49. <div slot="header" class="clearfix">
  50. <div class="card-title">商品设置</div>
  51. </div>
  52. <el-form-item style="margin-left: 10px;" label="商品信息" required>
  53. <com-dialog-select v-if="type != 'edit'" :multiple="false" @selected="goodsSelect" title="商品选择" url="score-mall/default/goods-list">
  54. <el-button>选择商品</el-button>
  55. </com-dialog-select>
  56. <div v-if="exchange && goods_info.length > 0" class="table-body" style="padding-left: 0;padding-top: 10px;">
  57. <template>
  58. <el-table :data="goods_info" border style="width: 30%">
  59. <el-table-column fixed type="index" label="编号" show-overflow-tooltip width="50">
  60. </el-table-column>
  61. <el-table-column prop="goods_name,cover_pic" label="商品名称" >
  62. <template slot-scope="scope">
  63. <div flex="box:first">
  64. <div style="padding-right: 10px;">
  65. <com-image mode="aspectFill" :src="scope.row.cover_pic"></com-image>
  66. </div>
  67. <div flex="cross:top cross:center">
  68. {{scope.row.goods_name}}
  69. </div>
  70. </div>
  71. </template>
  72. </el-table-column>
  73. <el-table-column fixed="right" label="操作" width="100">
  74. <template slot-scope="scope">
  75. <el-button :disabled="type == 'edit'" @click="handle('deleteGoods')" type="primary" size="mini">删除</el-button>
  76. </template>
  77. </el-table-column>
  78. </el-table>
  79. </template>
  80. </div>
  81. </el-form-item>
  82. <el-form-item v-if="exchange" style="margin-left: 10px;" label="兑换条件" required prop="type">
  83. <el-radio-group @change="handle('switchType', $event)" v-model="form.type">
  84. <el-radio :label="1">全积分兑换</el-radio>
  85. <el-radio :label="2">积分+金额兑换</el-radio>
  86. <el-radio :label="3">积分抵扣</el-radio>
  87. </el-radio-group>
  88. </el-form-item>
  89. <el-form-item v-if="exchange" style="margin-left: 10px;" label="兑换价格" required>
  90. <el-form label-position="left" size="small" label-width="75px" class="all-change-form" v-if="form.type != 3">
  91. <el-form-item>
  92. <template slot="label">
  93. <span>批量修改</span>
  94. </template>
  95. <el-input v-model="number">
  96. <template slot="prepend">
  97. <el-select v-model="selectType" placeholder="请选择" style="width: 100px;">
  98. <el-option v-for="item in selectTypeOption" :value="item.value" :label="item.title" :key="item.value">
  99. </el-option>
  100. </el-select>
  101. </template>
  102. <template slot="append">
  103. <el-button @click="submitAll">修改</el-button>
  104. </template>
  105. </el-input>
  106. </el-form-item>
  107. </el-form>
  108. <el-table :data="form.attr" border ref="form.attr" ref="scoreTable" @selection-change="handleSelectionChange">
  109. <el-table-column
  110. type="selection"
  111. width="40">
  112. </el-table-column>
  113. <el-table-column prop="name" label="规格">
  114. <template slot-scope="scope">
  115. {{scope.row.name ? scope.row.name : '默认'}}
  116. </template>
  117. </el-table-column>
  118. <el-table-column label="售价">
  119. <template slot-scope="scope">
  120. ¥{{scope.row.price}}
  121. </template>
  122. </el-table-column>
  123. <el-table-column v-if="form.type == 1" prop="name" label="兑换价" key="1">
  124. <template slot-scope="scope">
  125. <el-form-item :porp="'attr[' + scope.$index + '].scoreGoodsAttr.score'">
  126. <el-input v-model="form.attr[scope.$index].scoreGoodsAttr.score" size="mini" style="width: 100px;margin-right:10px" placeholder="输入积分" onInput="value = toNumber(value, 2)">
  127. </el-input>积分
  128. </el-form-item>
  129. </template>
  130. </el-table-column>
  131. <el-table-column v-if="form.type == 2" prop="name" label="兑换价" key="2">
  132. <template slot-scope="scope">
  133. <el-form-item>
  134. <el-input v-model="scope.row.scoreGoodsAttr.score" min=1 size="mini" style="width: 100px;margin-right:10px" placeholder="输入积分" onInput="value = toNumber(value, 2)">
  135. </el-input>积分&nbsp;+&nbsp;
  136. <el-input v-model="scope.row.scoreGoodsAttr.money" min=1 size="mini" style="width: 100px;margin-right:10px" placeholder="输入金额" onInput="value = toNumber(value, 2)">
  137. </el-input>元
  138. </el-form-item>
  139. </template>
  140. </el-table-column>
  141. <el-table-column v-if="form.type == 3" prop="name" label="兑换价" key="3">
  142. <template slot-scope="scope">
  143. <el-form-item>
  144. 最低抵扣<el-input v-model="form.attr[scope.$index].scoreGoodsAttr.deduction_limit[0]['limit'] == 0 ? '' :
  145. scope.row.scoreGoodsAttr.deduction_limit[0]['score']"
  146. :disabled="scope.row.scoreGoodsAttr.deduction_limit[0]['limit'] == 0" size="mini" min=1
  147. style="width: 100px;margin:3px 10px" placeholder="输入积分" onInput="value = toNumber(value, 2)">
  148. </el-input>
  149. <el-checkbox @change="handle('setMinLimit', scope.$index, $event)" :label="1" :key="scope.$index + 1" v-model="form.attr[scope.$index].scoreGoodsAttr.deduction_limit[0]['limit'] == 0">不限制</el-checkbox>
  150. </el-form-item>
  151. <el-form-item>
  152. 最高抵扣<el-input v-model="form.attr[scope.$index].scoreGoodsAttr.deduction_limit[1]['limit'] == 0 ? '' :
  153. scope.row.scoreGoodsAttr.deduction_limit[1]['score']" size="mini"
  154. :disabled="scope.row.scoreGoodsAttr.deduction_limit[1]['limit'] == 0" min=1 style="width: 100px;margin:3px 10px"
  155. placeholder="输入积分" onInput="value = toNumber(value, 2)">
  156. </el-input>
  157. <el-checkbox @change="handle('setMaxLimit', scope.$index, $event)" :label="1" :key="scope.$index + 1" v-model="scope.row.scoreGoodsAttr.deduction_limit[1]['limit'] == 0">不限制</el-checkbox>
  158. </el-form-item>
  159. </template>
  160. </el-table-column>
  161. </el-table>
  162. </el-form-item>
  163. </el-card>
  164. </el-form>
  165. </el-card>
  166. <el-button class="button-item" :loading="loading" type="primary" size="small" @click="send('submit')">保存</el-button>
  167. </el-card>
  168. </div>
  169. <script>
  170. const app = new Vue({
  171. el: '#app',
  172. data: {
  173. loading: false,
  174. exchange: false,
  175. type: 'edit',
  176. goods_id: '<?=$goods_id?>',
  177. cate_list: [],
  178. attr_list: [],
  179. form: {
  180. ids: '',
  181. catName: '',
  182. cate_id: '',
  183. use_coupon: 1,
  184. goods_id: 0,
  185. type: 1,
  186. price: 0,
  187. attr: []
  188. },
  189. multipleSelection: [],
  190. selectType: '',
  191. goods_info: [],
  192. selectTypeOption: [
  193. {
  194. title: '积分',
  195. value: 'score',
  196. },
  197. {
  198. title: '金额',
  199. value: 'money',
  200. },
  201. ],
  202. number: '',
  203. },
  204. mounted() {
  205. this.send('getData');
  206. this.type = this.goods_id ? 'edit' : 'add';
  207. },
  208. methods: {
  209. ttt(param){
  210. return true
  211. },
  212. send(type, param1 = null) {
  213. switch (type) {
  214. //获取积分商品
  215. case 'getData':
  216. this.loading = true;
  217. request({
  218. params: {
  219. r: 'score-mall/default/edit',
  220. goods_id: this.goods_id
  221. },
  222. method: 'get'
  223. }).then(e=>{
  224. this.loading = false;
  225. if (e.data.code == 0) {
  226. this.cate_list = e.data.data.cate_list;
  227. if (e.data.data.data && this.type == 'edit') {
  228. this.form.cate_id = e.data.data.data.cate_id;
  229. this.form.use_coupon = e.data.data.data.use_coupon;
  230. this.form.goods_id = e.data.data.data.goods_id;
  231. this.form.type = e.data.data.data.type;
  232. this.form.price = e.data.data.data.price;
  233. this.send('getAttr', e.data.data.goods_info);
  234. if (this.cate_list[this.form.cate_id]) {
  235. this.form.catName = this.cate_list[this.form.cate_id]['name'];
  236. }
  237. this.goods_info = [e.data.data.goods_info];
  238. this.exchange = true;
  239. }
  240. } else {
  241. this.$message.error(e.data.msg);
  242. }
  243. }).catch(e => {
  244. this.loading = false;
  245. self.$message.error(e.data.msg);
  246. });
  247. break;
  248. //获取属性:
  249. case 'getAttr':
  250. let goods_id = param1.id;
  251. this.loading = true;
  252. request({
  253. params: {
  254. r: 'score-mall/default/attr-list',
  255. goods_id: goods_id,
  256. type: this.type
  257. },
  258. method: 'get'
  259. }).then(e=>{
  260. this.loading = false;
  261. if (e.data.code == 0) {
  262. console.log(e.data.data);
  263. this.form.attr = e.data.data;
  264. let scoreGoodsAttr = {score: 0, money: 0.00, deduction_limit: [{score:0,limit:0},{score:0,limit:0}]};
  265. //设置默认值
  266. for (let i = 0; i < this.form.attr.length; i++) {
  267. if (this.type == 'add') {
  268. this.$set(this.form.attr[i], 'scoreGoodsAttr', JSON.parse(JSON.stringify(scoreGoodsAttr)))
  269. } else {
  270. if (!e.data.data[i]['scoreGoodsAttr']['deduction_limit']) {
  271. e.data.data[i]['scoreGoodsAttr']['deduction_limit'] = '[{"score":0,"limit":0},{"score":0,"limit":0}]';
  272. }
  273. e.data.data[i]['scoreGoodsAttr']['deduction_limit'] = JSON.parse(e.data.data[i]['scoreGoodsAttr']['deduction_limit']);
  274. this.$set(this.form.attr[i], 'scoreGoodsAttr', JSON.parse(JSON.stringify(e.data.data[i]['scoreGoodsAttr'])));
  275. }
  276. }
  277. this.exchange = true;
  278. } else {
  279. this.$message.error(e.data.msg);
  280. }
  281. }).catch(e=>{
  282. this.loading = false;
  283. this.$message.error(e.data.msg);
  284. })
  285. break;
  286. //提交
  287. case 'submit':
  288. this.loading = true;
  289. let data = Object.assign(this.form, {action: this.type});
  290. let money = 0.00;
  291. let score = 0;
  292. if (this.form.type == 2 || this.form.type == 1) {
  293. money = this.form.attr[0].scoreGoodsAttr.money;
  294. score = this.form.attr[0].scoreGoodsAttr.score;
  295. }
  296. data = Object.assign(data, {money: money, score: score});
  297. request({
  298. params: {r: 'score-mall/default/edit'},
  299. data: data,
  300. method: 'post'
  301. }).then(e=>{
  302. this.loading = false;
  303. if (e.data.code == 0) {
  304. this.$message.success(e.data.msg);
  305. let info = {r: 'score-mall/default/index'};
  306. navigateTo(info);
  307. } else {
  308. this.$message.error(e.data.msg);
  309. }
  310. }).catch(e=>{
  311. this.loading = false;
  312. this.$message.error(e.data.msg);
  313. })
  314. break;
  315. }
  316. },
  317. handle(type, param1 = null, param2 = null) {
  318. switch (type) {
  319. //选择商品分类
  320. case 'selectType':
  321. this.form.cate_id = param1;
  322. break;
  323. //切换类型
  324. case 'switchType':
  325. this.form.type = param1;
  326. break;
  327. //点击最小限制
  328. case 'setMinLimit':
  329. let limit1 = param2 ? 0 : 1;
  330. this.form.attr[param1]['scoreGoodsAttr']['deduction_limit'][0]['limit'] = limit1;
  331. if (param2) {
  332. this.form.attr[param1]['scoreGoodsAttr']['deduction_limit'][0]['score'] = -1;
  333. } else {
  334. this.form.attr[param1]['scoreGoodsAttr']['deduction_limit'][0]['score'] = 0;
  335. }
  336. break;
  337. //点击最大限制
  338. case 'setMaxLimit':
  339. let limit2 = param2 ? 0 : 1;
  340. this.form.attr[param1]['scoreGoodsAttr']['deduction_limit'][1]['limit'] = limit2;
  341. if (param2) {
  342. this.form.attr[param1]['scoreGoodsAttr']['deduction_limit'][1]['score'] = -1;
  343. } else {
  344. this.form.attr[param1]['scoreGoodsAttr']['deduction_limit'][1]['score'] = 0;
  345. }
  346. break;
  347. //删除选中商品
  348. case 'deleteGoods':
  349. this.goods_info = [];
  350. this.form.attr = [];
  351. this.exchange = false;
  352. break;
  353. }
  354. },
  355. goodsSelect(param) {
  356. this.form.goods_id = param.id;
  357. this.goods_info = [param];
  358. this.form.price = param.price;
  359. this.send('getAttr', param);
  360. },
  361. toggleSelection(rows) {
  362. if (rows) {
  363. rows.forEach(row => {
  364. this.$refs.multipleTable.toggleRowSelection(row);
  365. });
  366. } else {
  367. this.$refs.multipleTable.clearSelection();
  368. }
  369. },
  370. handleSelectionChange(val) {
  371. this.multipleSelection = val;
  372. },
  373. submitAll() {
  374. this.multipleSelection.map(item => {
  375. if (this.selectType == 'score' || this.selectType == 'money') {
  376. item.scoreGoodsAttr[this.selectType] = this.number
  377. }
  378. })
  379. // this.form.attr = {...this.form.attr, ...this.multipleSelection}
  380. },
  381. }
  382. })
  383. </script>