freight-edit.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383
  1. <?php
  2. use common\helpers\ComponentHelper;
  3. ComponentHelper::loadComponentView('com-district');
  4. ComponentHelper::loadComponentView('com-district-single');
  5. ?>
  6. <div id="app" v-cloak>
  7. <el-card shadow="never" style="border:0" class="box-card" body-style="background-color: #f3f3f3;padding: 10px 0 0;" class="box-card" v-loading="cardLoading">
  8. <div slot="header">
  9. <div flex="cross:center box:first">
  10. <div><span @click="$navigate({r:'mall/freight/rules'})" class="text">运费规则</span>/添加规则</div>
  11. </div>
  12. </div>
  13. <div class="form-body">
  14. <el-form :model="form" :rules="rules" size="small" ref="form" label-width="120px">
  15. <el-form-item label="规则名称" prop="name">
  16. <el-input size="small" v-model="form.name"></el-input>
  17. </el-form-item>
  18. <el-form-item label="计费方式" prop="type">
  19. <el-radio name="type" :label="1" v-model="form.type">按重计费</el-radio>
  20. <el-radio name="type" :label="2" v-model="form.type">按件计费</el-radio>
  21. </el-form-item>
  22. <el-form-item label="按商品计算" prop="compute_type">
  23. <el-radio name="type" :label="1" v-model="form.compute_type">按不同商品计算</el-radio>
  24. <el-radio name="type" :label="2" v-model="form.compute_type">按同件商品计算</el-radio>
  25. <div class="tips-text" v-if="form.compute_type == 1" style="line-height: 24px;">
  26. 运费规则:首件/重 15元,续件/重 1.5元<br />
  27. 商品A*1件 = 15元,商品A*2件 = 16.5元<br />
  28. 商品A*1件 + 商品B*1件 = 30元, 商品A*2件 + 商品B*1件 = 31.5元
  29. </div>
  30. <div class="tips-text" v-if="form.compute_type == 2" style="line-height: 24px;">
  31. 运费规则:首件/重 15元,续件/重 1.5元<br />
  32. 商品A*1件 = 15元,商品A*2件 = 16.5元<br />
  33. 商品A*1件 + 商品B*1件 = 16.5元, 商品A*2件 + 商品B*1件 = 18元<br />
  34. 规则:首件 + 续件 + 续件 + 续件……【注意:就算不同商品也是按续件算】
  35. </div>
  36. </el-form-item>
  37. <el-form-item label="选择地区" prop="type">
  38. <el-radio name="select_com" :disabled="form.id ? true : false" :label="0" v-model="form.select_com">多选地区</el-radio>
  39. <el-radio name="select_com" :disabled="form.id ? true : false" :label="1" v-model="form.select_com">单选地区</el-radio>
  40. </el-form-item>
  41. <el-form-item label="运费规则" prop="rule" required>
  42. <el-card shadow="never" style="margin-bottom: 12px;width: 650px" v-if="form.rule"v-for="(item, index) in form.rule" :key="item.id">
  43. <div flex="dir:left box:last">
  44. <div>
  45. <div>
  46. <el-breadcrumb separator="/">
  47. <el-breadcrumb-item>首重/件(克/个):{{item.first}}</el-breadcrumb-item>
  48. <el-breadcrumb-item>首费(元):{{item.firstPrice}}</el-breadcrumb-item>
  49. <el-breadcrumb-item>续重/件(克/个):{{item.second}}</el-breadcrumb-item>
  50. <el-breadcrumb-item>续费(元):{{item.secondPrice}}</el-breadcrumb-item>
  51. </el-breadcrumb>
  52. </div>
  53. <div flex="dir:left" style="flex-wrap: wrap">
  54. <div>区域:</div>
  55. <el-tag type="info" style="margin: 5px;border:0" v-for="(value, key) in item.list">
  56. {{value.name}}
  57. </el-tag>
  58. </div>
  59. </div>
  60. <div style="text-align: right">
  61. <el-button type="text" @click="editDistrict(item)" size="small" circle>
  62. <el-tooltip class="item" effect="dark" content="编辑" placement="top">
  63. <img src="resources/img/mall/edit.png" alt="">
  64. </el-tooltip>
  65. </el-button>
  66. <el-button style="margin-left: 0" type="text" @click="deleteDetail(index)" size="small"
  67. circle>
  68. <el-tooltip class="item" effect="dark" content="删除" placement="top">
  69. <img src="resources/img/mall/del.png" alt="">
  70. </el-tooltip>
  71. </el-button>
  72. </div>
  73. </div>
  74. </el-card>
  75. <el-button type="text" @click="openDistrict"><i class="el-icon-plus">新增规则</i></el-button>
  76. </el-form-item>
  77. <el-button class="button-item" :loading="btnLoading" type="primary" @click="submit('form')" size="small">保存</el-button>
  78. </el-form>
  79. </div>
  80. </el-card>
  81. <el-dialog :title="title" :visible.sync="dialogVisible" width="50%">
  82. <div style="margin-bottom: 1rem;">
  83. <el-form :model="rule" ref="rule" label-width="100px" :rules="ruleRules">
  84. <div flex="dir:left box:mean">
  85. <div style="padding: 0 1rem;">
  86. <el-form-item prop="first" :label="form.type == 1 ? '首重(克):' : '首件(个):'">
  87. <el-input v-model.number="rule.first" min="0" type="number"></el-input>
  88. </el-form-item>
  89. </div>
  90. <div style="padding: 0 1rem;">
  91. <el-form-item prop="firstPrice" label="首费(元)">
  92. <el-input v-model.number="rule.firstPrice" min="0" type="number"></el-input>
  93. </el-form-item>
  94. </div>
  95. </div>
  96. <div flex="dir:left box:mean">
  97. <div style="padding: 0 1rem;">
  98. <el-form-item prop="second" :label="form.type == 1 ? '续重(克):' : '续件(个):'">
  99. <el-input v-model.number="rule.second" min="0" type="number"></el-input>
  100. </el-form-item>
  101. </div>
  102. <div style="padding: 0 1rem;">
  103. <el-form-item prop="secondPrice" label="续费(元)">
  104. <el-input v-model.number="rule.secondPrice" min="0" type="number"></el-input>
  105. </el-form-item>
  106. </div>
  107. </div>
  108. <el-form-item v-if="form.select_com == 1" prop="list" label="地区选择">
  109. <com-district-single :rule="form.rule" ref="editSingle" :edit="rule.list" @selected="selectDistrict"
  110. :level="3"></com-district-single>
  111. </el-form-item>
  112. <el-form-item v-if="form.select_com == 0" prop="list" label="地区选择">
  113. <com-district :rule="form.rule" :edit="rule.list" @selected="selectDistrict"
  114. :level="3"></com-district>
  115. </el-form-item>
  116. <div style="text-align: right;margin-top: 1rem;">
  117. <el-button type="primary" @click="districtConfirm('rule')">
  118. 确定选择
  119. </el-button>
  120. </div>
  121. </el-form>
  122. </div>
  123. </el-dialog>
  124. </div>
  125. <script>
  126. const app = new Vue({
  127. el: '#app',
  128. data() {
  129. let min_number = (rule, value, callback) => {
  130. if (value < 0) {
  131. callback(new Error('输入值必须大于0'));
  132. } else {
  133. callback();
  134. }
  135. };
  136. return {
  137. form: {
  138. name: '',
  139. type: -1,
  140. compute_type: 1,
  141. select_com: 0,
  142. rule: []
  143. },
  144. btnLoading: false,
  145. rules: {
  146. name: [
  147. {
  148. required: true,
  149. message: '请输入规则名称',
  150. trigger: 'blur'
  151. }
  152. ],
  153. rule: [
  154. {
  155. required: true,
  156. message: '请输入运费规则'
  157. }
  158. ]
  159. },
  160. cardLoading: false,
  161. dialogVisible: false,
  162. is_add: false,
  163. title: '新增规则',
  164. rule: {
  165. first: 0,
  166. firstPrice: 0,
  167. second: 0,
  168. secondPrice: 0,
  169. list: []
  170. },
  171. ruleRules: {
  172. first: [
  173. {
  174. validator: min_number,
  175. trigger: 'blur'
  176. },
  177. {
  178. type: 'number',
  179. message: '请输入数字',
  180. trigger: 'blur',
  181. required: true
  182. }
  183. ],
  184. firstPrice: [
  185. {
  186. validator: min_number,
  187. trigger: 'blur'
  188. },
  189. {
  190. type: 'number',
  191. message: '请输入数字',
  192. trigger: 'blur',
  193. required: true
  194. }
  195. ],
  196. second: [
  197. {
  198. validator: min_number,
  199. trigger: 'blur'
  200. },
  201. {
  202. type: 'number',
  203. message: '请输入数字',
  204. trigger: 'blur',
  205. required: true
  206. }
  207. ],
  208. secondPrice: [
  209. {
  210. validator: min_number,
  211. trigger: 'blur'
  212. },
  213. {
  214. type: 'number',
  215. message: '请输入数字',
  216. trigger: 'blur',
  217. required: true
  218. }
  219. ],
  220. list: [
  221. {
  222. type: 'array',
  223. message: '请选择地区',
  224. trigger: 'blur',
  225. required: true
  226. }
  227. ]
  228. }
  229. }
  230. },
  231. mounted: function () {
  232. if (getQuery('id')) {
  233. this.getDetail(getQuery('id'));
  234. } else {
  235. this.form.type = 1;
  236. }
  237. },
  238. watch: {
  239. newType(val, oldVal) {
  240. if (oldVal == -1) {
  241. } else {
  242. this.form.rule.splice(0, this.form.rule.length);
  243. }
  244. }
  245. },
  246. computed: {
  247. newType() {
  248. return this.form.type;
  249. }
  250. },
  251. methods: {
  252. Cancel() {
  253. window.history.go(-1)
  254. },
  255. submit(formName) {
  256. this.btnLoading = true;
  257. this.$refs[formName].validate((valid) => {
  258. if (valid) {
  259. let rule = JSON.stringify(this.form.rule)
  260. let InitDataPara = {}
  261. // 对象深拷贝
  262. InitDataPara = JSON.parse(JSON.stringify(this.form))
  263. InitDataPara.rule = rule
  264. request({
  265. params: {
  266. r: 'mch/client/setting/freight-edit',
  267. id: getQuery('id')
  268. },
  269. method: 'post',
  270. data: {
  271. form: InitDataPara
  272. }
  273. }).then(e => {
  274. this.btnLoading = false;
  275. if (e.data.code == 0) {
  276. this.$message.success(e.data.msg);
  277. navigateTo({
  278. r: 'mch/client/setting/freight-rules',
  279. tab: 'second'
  280. })
  281. } else {
  282. this.$message.error(e.data.msg);
  283. }
  284. }).catch(e => {
  285. this.btnLoading = false;
  286. this.$message.error(e.data.msg);
  287. });
  288. } else {
  289. console.log('error submit!!');
  290. this.btnLoading = false;
  291. return false;
  292. }
  293. });
  294. },
  295. openDistrict() {
  296. if(this.form.select_com == 1 && this.$refs['editSingle'] !== undefined){
  297. this.$refs['editSingle'].backList = []
  298. }
  299. let self = this
  300. self.title = '新增规则';
  301. self.dialogVisible = true;
  302. self.rule = {
  303. first: 0,
  304. firstPrice: 0,
  305. second: 0,
  306. secondPrice: 0,
  307. list: []
  308. };
  309. self.is_add = true;
  310. },
  311. editDistrict(row) {
  312. this.title = '编辑规则';
  313. this.dialogVisible = true;
  314. this.rule = row;
  315. this.is_add = false;
  316. if (this.form.select_com == 1) {
  317. setTimeout(()=>{
  318. this.$refs['editSingle'].backList = this.form.rule[index].list
  319. },800)
  320. }
  321. },
  322. deleteDetail(index) {
  323. this.form.rule.splice(index, 1);
  324. },
  325. selectDistrict(e) {
  326. let list = [];
  327. for (let i in e) {
  328. let obj = {
  329. id: e[i].id,
  330. name: e[i].name
  331. };
  332. list.push(obj);
  333. }
  334. this.rule.list = list;
  335. },
  336. districtConfirm(formName) {
  337. this.$refs[formName].validate((valid) => {
  338. if (valid) {
  339. if (this.is_add) {
  340. this.form.rule.push(this.rule);
  341. }
  342. this.dialogVisible = false;
  343. this.$refs['form'].validate((valid) => {
  344. return false;
  345. });
  346. } else {
  347. console.log('error submit!!');
  348. return false;
  349. }
  350. });
  351. },
  352. getDetail(id = 0) {
  353. let self = this;
  354. self.cardLoading = true;
  355. request({
  356. params: {
  357. r: 'mch/client/setting/freight-edit',
  358. id: id
  359. },
  360. method: 'get'
  361. }).then(e => {
  362. self.cardLoading = false;
  363. if (e.data.code == 0) {
  364. self.form = Object.assign(self.form, e.data.data.detail);
  365. if (isEmpty(self.form.select_com)) self.form.select_com = 0;
  366. } else {
  367. self.$message.error(e.data.msg);
  368. }
  369. }).catch(e => {
  370. self.cardLoading = false;
  371. });
  372. }
  373. }
  374. });
  375. </script>