create.vue 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476
  1. <template>
  2. <div class="app-container coupon-add">
  3. <br>
  4. <el-row>
  5. <!-- 模板名称部分 -->
  6. <el-form ref="addItem" :model="addData" :rules="rules" label-width="120px">
  7. <el-form-item label="模板名称:" prop="title">
  8. <el-input v-model="addData.title" :readonly="readonly" placeholder="请输入模板名称" :maxlength="32" show-word-limit style="width: 500px;"/>
  9. </el-form-item>
  10. <br>
  11. </el-form>
  12. <!-- 买家付费地区 -->
  13. <el-form label-width="120px">
  14. <el-form-item label="买家付费区域:">
  15. <el-form ref="addItemTwo" :model="{shippingTemplateRuleList}" label-width="120px">
  16. <table style="width: 75%" bordercolor="#ccc" border="1" cellpadding="0" cellspacing="0" class="spec-table">
  17. <tr>
  18. <th>付费区域</th>
  19. <th>首件(个)</th>
  20. <th>运费(元)</th>
  21. <th>续件(个)</th>
  22. <th>续费(元)</th>
  23. <th>操作</th>
  24. </tr>
  25. <tr v-if="shippingTemplateRuleList == ''">
  26. <td colspan="6">
  27. 暂无数据
  28. </td>
  29. </tr>
  30. <tr v-for="(item,index) in shippingTemplateRuleList" :key="index" style="">
  31. <td>
  32. <el-form-item :prop="`shippingTemplateRuleList.${index}.shippingTemplateRuleAreaList`" :rules="[{ required: true, message: '地区不能为空', trigger:['blur','change'] },{ type: 'array', message: '请选择地区' }]" style="width: 100%">
  33. <el-cascader @visible-change="listPidDisabled($event,index)" ref="cascaderAdd" :options="listPidProvince" clearable :props="props" v-model="item.shippingTemplateRuleAreaList" style="" ></el-cascader>
  34. </el-form-item>
  35. </td>
  36. <td>
  37. <el-form-item :prop="`shippingTemplateRuleList.${index}.defaultNumber`" :rules='[{ required: true, message: "件数不能为空", trigger: "blur" },{ pattern: /^([1-9]\d*)$/, message: "请输入正确的件数", trigger: ["blur", "change"]}]' label-width="0">
  38. <el-input v-model="item.defaultNumber" placeholder="请输入内容"></el-input>
  39. </el-form-item>
  40. </td>
  41. <td>
  42. <el-form-item :prop="`shippingTemplateRuleList.${index}.defaultPrice`" :rules="[{ required: true, message: '运费不能为空', trigger: 'blur' },{ pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: '请输入正确的金额,最多两位小数', trigger: ['blur', 'change'] }]" label-width="0">
  43. <el-input v-model="item.defaultPrice" placeholder="请输入内容"></el-input>
  44. </el-form-item>
  45. </td>
  46. <td>
  47. <el-form-item :prop="`shippingTemplateRuleList.${index}.createNumber`" :rules='[{ required: true, message: "件数不能为空", trigger: "blur" },{ pattern: /^([1-9]\d*)$/, message: "请输入正确的件数", trigger: ["blur", "change"]}]' label-width="0">
  48. <el-input v-model="item.createNumber" placeholder="请输入内容"></el-input>
  49. </el-form-item>
  50. </td>
  51. <td>
  52. <el-form-item :prop="`shippingTemplateRuleList.${index}.createPrice`" :rules="[{ required: true, message: '运费不能为空', trigger: 'blur' },{ pattern: /^([1-9]\d*(\.\d{1,2})?|([0](\.([0][1-9]|[1-9]\d{0,1}))))$/, message: '请输入正确的金额,最多两位小数', trigger: ['blur', 'change'] }]" label-width="0">
  53. <el-input v-model="item.createPrice" placeholder="请输入内容"></el-input>
  54. </el-form-item>
  55. </td>
  56. <td>
  57. <el-button type="text" @click="delRow(item)">删除</el-button>
  58. </td>
  59. </tr>
  60. </table>
  61. <el-col style="margin-top: 10px">
  62. <el-button type="primary" size="mini" @click="getListData">添加地区</el-button>
  63. </el-col>
  64. </el-form>
  65. </el-form-item>
  66. </el-form>
  67. <!-- 不发货地区 -->
  68. <el-form label-width="120px">
  69. <el-form-item label="不发货区域:">
  70. <el-form ref="addItemThree" :model="{shippingTemplateRuleList2}" label-width="120px">
  71. <table style="width: 75%" bordercolor="#ccc" border="1" cellpadding="0" cellspacing="0" class="spec-table">
  72. <tr>
  73. <th>不发货区域</th>
  74. <th>原因</th>
  75. <th>操作</th>
  76. </tr>
  77. <tr v-if="shippingTemplateRuleList2 == ''">
  78. <td colspan="3">
  79. 暂无数据
  80. </td>
  81. </tr>
  82. <tr v-for="(item,index) in shippingTemplateRuleList2" :key="index">
  83. <td>
  84. <el-form-item :prop="`shippingTemplateRuleList2.${index}.shippingTemplateRuleAreaList`" :rules="[{ required: true, message: '地区不能为空', trigger:['blur','change'] },{ type: 'array', message: '请选择地区' }]">
  85. <el-cascader @visible-change="listPidDisabled($event,shippingTemplateRuleList.length + index)" :options="listPidProvince" clearable :props="props" v-model="item.shippingTemplateRuleAreaList"></el-cascader>
  86. </el-form-item>
  87. </td>
  88. <td>
  89. <el-form-item :prop="`shippingTemplateRuleList2.${index}.remark`" :rules="{ required: true, message: '原因不能为空', trigger: 'blur' }">
  90. <el-input v-model="item.remark" placeholder="请输入内容"></el-input>
  91. </el-form-item>
  92. </td>
  93. <td>
  94. <el-button type="text" @click="delRowTwo(item)">删除</el-button>
  95. </td>
  96. </tr>
  97. </table>
  98. <el-col style="margin-top: 10px">
  99. <el-button type="primary" size="mini" @click="getListData2">添加地区</el-button>
  100. </el-col>
  101. </el-form>
  102. </el-form-item>
  103. </el-form>
  104. <el-form label-width="120px">
  105. <el-form-item label="包邮地区:" >
  106. 除以上地区外均为包邮地区
  107. </el-form-item>
  108. </el-form>
  109. </el-row>
  110. <el-row v-if="!readonly">
  111. <el-col :span="23" style="text-align: right">
  112. <el-button type="info" @click="$router.go(-1)">取消</el-button>
  113. <el-button :loading="addIng" type="primary" @click="update()">保存</el-button>
  114. </el-col>
  115. </el-row>
  116. </div>
  117. </template>
  118. <script>
  119. import RegionList from "./components/regionList";
  120. import { getTemplateList, addTemplateList, getTreeList, getTemplateDetail, setTemplateDetail} from "@/api/setting/template";
  121. import { accDiv, accMul } from '@/utils/util'
  122. import {addData} from "../../../api/system/dict/data";
  123. export default {
  124. components: {RegionList},
  125. data() {
  126. return {
  127. listPidProvince:[],//省
  128. props:{
  129. multiple: true,
  130. value:'areaId',
  131. label:'areaName',
  132. children:'cityList',
  133. },
  134. id: this.$route.query.id,
  135. select:false,
  136. addIng: false,
  137. readonly: this.$route.name === 'TemplateQuery',
  138. shippingTemplateRuleList:[],
  139. shippingTemplateRuleList2:[],
  140. addData:{
  141. title:'',
  142. shippingTemplateRuleList:[
  143. {
  144. createNumber: '',//新增数量
  145. createPrice: '',//新增价格
  146. defaultNumber: '',//默认数量
  147. defaultPrice: '',//默认价格
  148. type: '',//类型 1发货 2不发货
  149. shippingTemplateRuleAreaList:[
  150. {
  151. city: '',//市
  152. cityId: '',//市id
  153. province: '',//省
  154. provinceId: '',//省id
  155. remark:'不发货备注',
  156. },{
  157. city: '',//市
  158. cityId: '',//市id
  159. province: '',//省
  160. provinceId: '',//省id
  161. remark:'不发货备注',
  162. },{
  163. }
  164. ],
  165. },
  166. ],
  167. },
  168. //运费相关区域列表
  169. listPid:[],
  170. rules: {
  171. title: [{ required: true, message: '请输入模板名称', trigger: 'blur' }],
  172. }
  173. };
  174. },
  175. created() {
  176. this.getList()
  177. if (this.id) {
  178. getTemplateDetail(this.id).then(res => {
  179. const { id, title, shippingTemplateRuleList } = res.data
  180. shippingTemplateRuleList.map(item=>{
  181. item.createPrice = accDiv(item.createPrice,100)
  182. item.defaultPrice = accDiv(item.defaultPrice,100)
  183. let data = []
  184. item.shippingTemplateRuleAreaList.map(ressage => {
  185. data.push([ressage.provinceId,ressage.cityId])
  186. })
  187. item.shippingTemplateRuleAreaList = data
  188. if(item.type == 1){
  189. this.shippingTemplateRuleList.push(item)
  190. }
  191. if(item.type == 2){
  192. this.shippingTemplateRuleList2.push(item)
  193. }
  194. })
  195. this.addData = {id, title}
  196. })
  197. }
  198. },
  199. methods: {
  200. //获取省份
  201. getList(reset) {
  202. getTreeList().then(res => {
  203. if (res.code == 0) {
  204. this.listPidProvince = res.data || []
  205. }
  206. })
  207. },
  208. //付费地区
  209. getListData(){
  210. let data = this.shippingTemplateRuleList[this.shippingTemplateRuleList.length-1] || {}
  211. if(data.shippingTemplateRuleAreaList == 1 ||data.createNumber == '' || data.createPrice == '' || data.defaultNumber == '' || data.defaultPrice == ''){
  212. this.$message({
  213. showClose: true,
  214. message: '请输入完整后再添加',
  215. type: 'warning'
  216. });
  217. return
  218. }
  219. let data2 = {
  220. createNumber:'',
  221. createPrice:'',
  222. defaultNumber:'',
  223. defaultPrice:'',
  224. shippingTemplateRuleAreaList:1,
  225. type:1,
  226. }
  227. this.shippingTemplateRuleList.push(data2)
  228. },
  229. //不包邮地区
  230. getListData2(){
  231. let data = this.shippingTemplateRuleList2[this.shippingTemplateRuleList2.length-1] || {}
  232. if(data.shippingTemplateRuleAreaList == 1 || data.remark == ''){
  233. this.$message({
  234. showClose: true,
  235. message: '请输入完整后再添加',
  236. type: 'warning'
  237. });
  238. return
  239. }
  240. let data2 = {
  241. remark:'',
  242. shippingTemplateRuleAreaList:1,
  243. type:2,
  244. }
  245. this.shippingTemplateRuleList2.push(data2)
  246. },
  247. listPidDisabled(e,index,){
  248. let shippingTemplateRuleList = [...this.shippingTemplateRuleList,...this.shippingTemplateRuleList2]
  249. if(e){
  250. this.listPidProvince.map(item=>{//省
  251. item.cityList.map(res=>{//市
  252. shippingTemplateRuleList.map(listItem=>{//列表
  253. if(listItem.shippingTemplateRuleAreaList != 1){
  254. listItem.shippingTemplateRuleAreaList.map(listRes=>{//列表存在的省市
  255. if(res.areaId == listRes[1] ){
  256. // res.disabled = true
  257. this.$set(res,'disabled',true)
  258. }
  259. })
  260. }
  261. })
  262. })
  263. })
  264. this.listPidProvince.map(item=>{//省
  265. item.cityList.map(res=>{//市
  266. for (let i = 0; i < shippingTemplateRuleList[index].shippingTemplateRuleAreaList.length; i++) {
  267. if (res.areaId == shippingTemplateRuleList[index].shippingTemplateRuleAreaList[i][1] ){
  268. this.$delete(res,'disabled',)
  269. }
  270. }
  271. })
  272. })
  273. }else {
  274. this.listPidProvince.map(item=>{
  275. item.cityList.map(res=>{
  276. // res.disabled = false
  277. this.$set(res,'disabled',false)
  278. })
  279. })
  280. }
  281. },
  282. update() {
  283. this.$refs['addItem'].validate((valid) => {
  284. if (valid) {
  285. } else {
  286. return;
  287. }
  288. });
  289. this.$refs['addItemTwo'].validate((valid) => {
  290. if (valid) {
  291. } else {
  292. return;
  293. }
  294. });
  295. this.$refs['addItemThree'].validate((valid) => {
  296. if (valid) {
  297. } else {
  298. return;
  299. }
  300. });
  301. let arr = []
  302. if (this.shippingTemplateRuleList){
  303. for (let i = 0; i < this.shippingTemplateRuleList.length; i++) {
  304. let item = this.shippingTemplateRuleList[i]
  305. if(item.shippingTemplateRuleAreaList == 1 || item.createNumber == '' || item.createPrice == '' || item.defaultNumber == '' || item.defaultPrice == ''){
  306. this.$message({
  307. showClose: true,
  308. message: '请输入完整后再保存',
  309. type: 'warning'
  310. });
  311. return
  312. }
  313. }
  314. this.shippingTemplateRuleList.map(item =>{
  315. let ressage = []
  316. item.shippingTemplateRuleAreaList.map(res=>{
  317. let city = ''
  318. let province = ''
  319. for (let i = 0; i < this.listPidProvince.length; i++) {
  320. if(this.listPidProvince[i].areaId == res[0]){
  321. city = this.listPidProvince[i].areaName
  322. let cityList = this.listPidProvince[i].cityList
  323. for (let j = 0; j < cityList.length ; j++) {
  324. if(cityList[j].areaId == res[1]){
  325. province = cityList[j].areaName
  326. }
  327. }
  328. }
  329. }
  330. res = {
  331. provinceId:res[0],
  332. cityId:res[1],
  333. city:city,
  334. province:province,
  335. }
  336. ressage.push(res)
  337. })
  338. item.shippingTemplateRuleAreaList = ressage
  339. item.createPrice = accMul(item.createPrice,100)
  340. item.defaultPrice = accMul(item.defaultPrice,100)
  341. arr.push(item)
  342. })
  343. }
  344. if(this.shippingTemplateRuleList2){
  345. for (let i = 0; i < this.shippingTemplateRuleList2.length; i++) {
  346. let item = this.shippingTemplateRuleList2[i]
  347. if(item.shippingTemplateRuleAreaList == 1 || item.remark == ''){
  348. this.$message({
  349. showClose: true,
  350. message: '请输入完整后再保存',
  351. type: 'warning'
  352. });
  353. return
  354. }
  355. }
  356. this.shippingTemplateRuleList2.map(item =>{
  357. let ressage = []
  358. item.shippingTemplateRuleAreaList.map(res=>{
  359. let city = ''
  360. let province = ''
  361. for (let i = 0; i < this.listPidProvince.length; i++) {
  362. if(this.listPidProvince[i].areaId == res[0]){
  363. city = this.listPidProvince[i].areaName
  364. let cityList = this.listPidProvince[i].cityList
  365. for (let j = 0; j < cityList.length ; j++) {
  366. if(cityList[j].areaId == res[1]){
  367. province = cityList[j].areaName
  368. }
  369. }
  370. }
  371. }
  372. res = {
  373. provinceId:res[0],
  374. cityId:res[1],
  375. city:city,
  376. province:province,
  377. }
  378. ressage = res
  379. })
  380. item.shippingTemplateRuleAreaList = ressage
  381. arr.push(item)
  382. })
  383. }
  384. this.addData.shippingTemplateRuleList = arr
  385. this.submitForm()
  386. },
  387. submitForm(){
  388. if (this.id){
  389. setTemplateDetail(this.addData).then(res=>{
  390. if (res.code === 0) {
  391. this.$message({
  392. message: '修改成功!',
  393. type: 'success'
  394. })
  395. }
  396. this.$store.dispatch('tagsView/delView', this.$route)
  397. this.$router.go(-1)
  398. })
  399. }else {
  400. addTemplateList(this.addData).then(res=>{
  401. if (res.code === 0) {
  402. this.$message({
  403. message: '添加成功!',
  404. type: 'success'
  405. })
  406. this.$store.dispatch('tagsView/delView', this.$route)
  407. this.$router.go(-1)
  408. }
  409. })
  410. }
  411. },
  412. delRow(row){
  413. for (let i = 0; i < this.shippingTemplateRuleList.length; i++) {
  414. if(this.shippingTemplateRuleList[i] == row){
  415. this.shippingTemplateRuleList.splice(i,1)
  416. }
  417. }
  418. },
  419. delRowTwo(row){
  420. for (let i = 0; i < this.shippingTemplateRuleList2.length; i++) {
  421. if(this.shippingTemplateRuleList2[i] == row){
  422. this.shippingTemplateRuleList2.splice(i,1)
  423. }
  424. }
  425. }
  426. },
  427. };
  428. </script>
  429. <style lang="scss" scoped>
  430. .spec-table {
  431. border-collapse: collapse;
  432. width: 100%;
  433. line-height: 32px;
  434. color: #606266;
  435. font-size: 14px;
  436. th {
  437. background-color: #ECECEC;
  438. }
  439. td {
  440. text-align: center;
  441. }
  442. .pd {
  443. padding: 15px;
  444. }
  445. .required {
  446. position: relative;
  447. span {
  448. position: relative;
  449. top: -6px;
  450. left: 2px;
  451. font-size: 10px;
  452. color: red;
  453. }
  454. }
  455. }
  456. </style>