com-offer-price.php 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. <style>
  2. .form-body {
  3. padding: 20px;
  4. background-color: #fff;
  5. margin-bottom: 20px;
  6. padding-right: 50%;
  7. min-width: 1000px;
  8. }
  9. .form-button {
  10. margin: 0;
  11. }
  12. .form-button .el-form-item__content {
  13. margin-left: 0 !important;
  14. }
  15. .button-item {
  16. padding: 9px 25px;
  17. }
  18. .el-dialog {
  19. min-width: 800px;
  20. }
  21. </style>
  22. <div id="com-offer-price" v-cloak>
  23. <el-card shadow="never" style="border:0" v-loading="loading"
  24. body-style="background-color: #f3f3f3;padding: 10px 0 0;">
  25. <el-form ref="ruleForm" label-width="150px" :model="ruleForm" :rules="rules"
  26. class="demo-ruleForm" position-label="right">
  27. <div class="form-body">
  28. <el-form-item label="是否开启" prop="is_enable" required>
  29. <el-switch
  30. v-model="ruleForm.is_enable"
  31. :active-value="1"
  32. :inactive-value="0">
  33. </el-switch>
  34. </el-form-item>
  35. <template v-if="ruleForm.is_enable == 1">
  36. <el-form-item label="全地区起送金额设置" prop="is_total_price" required>
  37. <el-switch
  38. v-model="ruleForm.is_total_price"
  39. :active-value="1"
  40. :inactive-value="0">
  41. </el-switch>
  42. </el-form-item>
  43. <el-form-item v-if="ruleForm.is_total_price" label="全地区起送金额" prop="total_price" required>
  44. <el-input size="small" v-model.number="ruleForm.total_price" type="number">
  45. <template slot="append">元</template>
  46. </el-input>
  47. </el-form-item>
  48. <el-form-item label="起送规则" prop="detail">
  49. <el-card shadow="never" style="margin-bottom: 12px;" v-if="ruleForm.detail"
  50. v-for="(item, index) in ruleForm.detail" :key="item.id">
  51. <div flex="dir:left box:last">
  52. <div>起送金额:{{item.total_price}}元
  53. </div>
  54. <div style="text-align: right">
  55. <el-button size="small" type="text" circle @click="openDistrict(index)">
  56. <el-tooltip class="item" effect="dark" content="编辑" placement="top">
  57. <img src="resources/img/mall/edit.png" alt="">
  58. </el-tooltip>
  59. </el-button>
  60. <el-button style="margin-left: -5px" size="small" type="text" circle
  61. @click="deleteDistrict(index)">
  62. <el-tooltip class="item" effect="dark" content="删除" placement="top">
  63. <img src="resources/img/mall/del.png" alt="">
  64. </el-tooltip>
  65. </el-button>
  66. </div>
  67. </div>
  68. <div flex="dir:left" style="flex-wrap: wrap">
  69. <div>区域:</div>
  70. <el-tag type="info" style="margin:5px;border:0" v-for="(value, key) in item.list"
  71. :key="key.id">
  72. {{value.name}}
  73. </el-tag>
  74. </div>
  75. </el-card>
  76. <el-button size="small" type="text" @click="openDistrict()"><i class="el-icon-plus">新增规则</i>
  77. </el-button>
  78. </el-form-item>
  79. </template>
  80. </div>
  81. <el-form-item class="form-button">
  82. <el-button class="button-item" :loading="submitLoading" type="primary" @click="onSubmit('ruleForm')">
  83. 保存
  84. </el-button>
  85. </el-form-item>
  86. </el-form>
  87. <el-dialog title="新增规则" :visible.sync="dialogVisible" width="50%">
  88. <el-form ref="detail" @submit.native.prevent :model="detail" label-width="150px" :rules="dialogRules">
  89. <el-form-item label="起送金额" prop="total_price">
  90. <el-input v-model="detail.total_price" type="number">
  91. <template slot="append">元</template>
  92. </el-input>
  93. </el-form-item>
  94. <el-form-item label="地区选择" prop="list">
  95. <div style="margin-bottom: 1rem;">
  96. <com-district :detail="ruleForm.detail" @selected="selectDistrict" :level="3"
  97. :edit="editDistrict.list"></com-district>
  98. <div style="text-align: right;margin-top: 1rem;">
  99. <el-button type="primary" @click="districtConfirm('detail')">
  100. 添加规则
  101. </el-button>
  102. </div>
  103. </div>
  104. </el-form-item>
  105. </el-form>
  106. </el-dialog>
  107. </el-card>
  108. </div>
  109. <script>
  110. Vue.component('com-offer-price', {
  111. template: '#com-offer-price',
  112. data() {
  113. let min_number = (rule, value, callback) => {
  114. if (value < 0) {
  115. callback(new Error('输入值必须大于等于0'));
  116. } else {
  117. callback();
  118. }
  119. };
  120. return {
  121. loading: false,
  122. submitLoading: false,
  123. dialogVisible: false,
  124. ruleForm: {
  125. is_enable: 0,
  126. total_price: 0,
  127. detail: [],
  128. is_total_price: 1,
  129. },
  130. rules: {
  131. is_enable: [
  132. {type: 'required', message: '请选择是否开启'}
  133. ],
  134. total_price: [
  135. {validator: min_number, trigger: 'change'},
  136. {required: true, type: 'number', trigger: 'change', message: '请输入起送金额'},
  137. ],
  138. },
  139. dialogRules: {
  140. total_price: [
  141. {required: true, message: '请输入起送金额', trigger: 'change'},
  142. {validator: min_number, trigger: 'change'},
  143. ],
  144. list: [
  145. {required: true, message: '请选择起送规则'}
  146. ]
  147. },
  148. detail: {
  149. total_price: 0,
  150. list: []
  151. },
  152. editDistrict: {
  153. total_price: 0,
  154. list: []
  155. },
  156. editIndex: -1
  157. }
  158. },
  159. mounted() {
  160. this.load();
  161. },
  162. methods: {
  163. load() {
  164. this.loading = true;
  165. request({
  166. params: {
  167. r: 'mall/offer-price/index'
  168. },
  169. method: 'get'
  170. }).then(e => {
  171. this.loading = false;
  172. if (e.data.code == 0) {
  173. this.ruleForm = Object.assign(this.ruleForm, e.data.data.model);
  174. } else {
  175. this.$message.error(e.data.msg);
  176. }
  177. }).catch(e => {
  178. this.loading = false;
  179. this.$message.error('获取数据出错');
  180. });
  181. },
  182. openDistrict(index) {
  183. if (typeof index != 'undefined') {
  184. this.editDistrict.list = this.ruleForm.detail[index].list;
  185. this.editDistrict.total_price = this.ruleForm.detail[index].total_price;
  186. this.editIndex = index;
  187. } else {
  188. this.editDistrict.list = [];
  189. this.editDistrict.total_price = 0;
  190. this.editIndex = -1;
  191. }
  192. this.detail = JSON.parse(JSON.stringify(this.editDistrict));
  193. this.dialogVisible = true;
  194. },
  195. deleteDistrict(index) {
  196. this.ruleForm.detail.splice(index, 1);
  197. },
  198. selectDistrict(e) {
  199. let list = [];
  200. for (let i in e) {
  201. let obj = {
  202. id: e[i].id,
  203. name: e[i].name
  204. };
  205. list.push(obj);
  206. }
  207. this.detail.list = list;
  208. },
  209. districtConfirm(formName) {
  210. let that = this;
  211. this.$refs[formName].validate(valid => {
  212. if (valid) {
  213. let detail = JSON.parse(JSON.stringify(this.detail));
  214. if (this.editIndex != -1) {
  215. this.ruleForm.detail[this.editIndex] = detail;
  216. } else {
  217. if (!this.ruleForm.detail) {
  218. this.ruleForm.detail = [];
  219. }
  220. this.ruleForm.detail.push(detail)
  221. }
  222. this.dialogVisible = false;
  223. setTimeout(function () {
  224. that.detail = {
  225. list: [],
  226. total_price: 0
  227. };
  228. that.$refs['detail'].clearValidate();
  229. }, 500)
  230. }
  231. });
  232. this.$refs['ruleForm'].validate(valid => {
  233. });
  234. },
  235. onSubmit(formName) {
  236. this.submitLoading = true;
  237. this.$refs[formName].validate(valid => {
  238. if (valid) {
  239. request({
  240. params: {
  241. r: 'mall/offer-price/index'
  242. },
  243. method: 'post',
  244. data: {
  245. form: this.ruleForm
  246. }
  247. }).then(e => {
  248. this.submitLoading = false;
  249. if (e.data.code == 0) {
  250. this.$message.success(e.data.msg);
  251. } else {
  252. this.$message.error(e.data.msg);
  253. }
  254. }).catch(e => {
  255. this.submitLoading = false;
  256. this.$message.error(e.data.msg);
  257. });
  258. } else {
  259. this.submitLoading = false;
  260. return false;
  261. }
  262. })
  263. }
  264. }
  265. });
  266. </script>