Преглед на файлове

Merge branch 'test' into 'master'

Test

See merge request quanshu/mp-ui-pc!233
zhong chunping преди 3 години
родител
ревизия
14ff0db456

+ 21 - 0
src/api/business/exchange.js

@@ -0,0 +1,21 @@
+import request from '@/utils/request'
+
+// 用户兑换订单
+export function exchangeOrderList(urlParams,data) {
+  return request({
+    url: '/api/v1/mp/admin/exchange/order/list',
+    method: 'post',
+    urlParams,
+    data
+  })
+}
+
+// 用户兑换订单导出
+export function exchangeOrderExport(data) {
+  return request({
+    url: '/api/v1/mp/admin/exchange/order/export',
+    method: 'post',
+    timeout: 15 * 60 * 1000,
+    data
+  })
+}

+ 50 - 0
src/api/business/supplier.js

@@ -0,0 +1,50 @@
+import request from '@/utils/request'
+
+// 查询供应商列表
+export function getSupplierList(data) {
+  return request({
+    url: '/api/v1/mp/admin/supplier/list',
+    method: 'post',
+    data,
+  })
+}
+
+// 查询供应商详情
+export function getSupplierDetail(id) {
+  return request({
+    url: `/api/v1/mp/admin/supplier/detail/${id}`,
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/x-www-form-urlencoded'
+    },
+  })
+}
+
+// 修改供应商信息
+export function setSupplierList(data) {
+  return request({
+    url: '/api/v1/mp/admin/supplier/update',
+    method: 'post',
+    data
+  })
+}
+
+// 新增供应商信息
+export function addSupplierList(data) {
+  return request({
+    url: '/api/v1/mp/admin/supplier/create',
+    method: 'post',
+    data
+  })
+}
+
+// 删除供应商信息
+export function removeSupplierList(id) {
+  return request({
+    url: `/api/v1/mp/admin/supplier/delete/${id}`,
+    method: 'post',
+    headers: {
+      'Content-Type': 'application/x-www-form-urlencoded'
+    },
+  })
+}

+ 5 - 1
src/views/business/couponPkg/components/CouponAdd.vue

@@ -95,6 +95,10 @@ export default {
       type: Boolean,
       default: false,
     },
+    ids: {
+      type: Array,
+      default: () => []
+    }
   },
   data() {
     return {
@@ -122,7 +126,7 @@ export default {
           "&pageSize=" +
           this.pageParams.pageSize +
           "&",
-        { title: this.couponTitle, status: "on" }
+        { title: this.couponTitle, status: "on", excludeCouponIds: this.ids }
       ).then((res) => {
         this.couponList = res.rows.map((item) => {
           return {

+ 9 - 2
src/views/business/couponPkg/create.vue

@@ -47,7 +47,7 @@
         </el-table-column>
       <el-table-column v-if="!readonly" prop="date" label="操作" align="center">
         <template slot-scope="{ $index }">
-          <el-button type="text" class="del" @click="couponPkgItemList.splice($index, 1);getPrice();getCouponNum()">删除</el-button>
+          <el-button type="text" class="del" @click="couponPkgItemList.splice($index, 1);getIds();getPrice();getCouponNum()">删除</el-button>
         </template>
       </el-table-column>
     </el-table>
@@ -60,7 +60,7 @@
     </el-row>
     
     <!-- 添加券 -->
-    <coupon-add :dialog-visible="couponTableVisible" @close="couponTableVisible = false" @confirmCoupon="confirmCoupon" v-if="couponTableVisible" />
+    <coupon-add :dialog-visible="couponTableVisible" :ids="ids" @close="couponTableVisible = false" @confirmCoupon="confirmCoupon" v-if="couponTableVisible" />
   </div>
 </template>
 <script>
@@ -80,6 +80,7 @@ export default {
       couponPkgItemList: [],
       totalPrice: 0,
       totalCouponNum: 0,
+      ids: [],
       addIng: false,
       rules: {
         title: [{ required: true, message: '请输入券包名称', trigger: 'blur' }]
@@ -93,6 +94,7 @@ export default {
         this.addData = { title }
         this.totalPrice = facePrice
         this.totalCouponNum = couponNum
+        this.ids = couponPkgItemVOList.map(item => item.couponId)
         this.couponPkgItemList = couponPkgItemVOList.map(item => {
           return {
             ... item, 
@@ -105,6 +107,7 @@ export default {
   methods: {
     confirmCoupon(arr) {
       this.couponPkgItemList = this.couponPkgItemList.concat(arr)
+      this.getIds()
       this.getPrice()
       this.getCouponNum()
     },
@@ -127,6 +130,10 @@ export default {
       this.totalPrice = num
     },
 
+    getIds() {
+      this.ids = this.couponPkgItemList.map(item => item.couponId)
+    },
+
     getCouponNum() {
       let num = 0
       this.couponPkgItemList.forEach(item => {

+ 52 - 3
src/views/business/goods/add.vue

@@ -40,6 +40,30 @@
           </el-form-item>
         </el-col>
       </el-row>
+      <el-row :gutter="40" style="width: 500px">
+        <el-col :span="23">
+          <el-form-item label="供应商:" prop="supplierId">
+            <el-select
+              v-model="addData.supplierId"
+              placeholder="请选择供应商"
+              filterable
+              clearable
+            >
+              <el-option :label="item.name" :value="item.id" v-for="(item, index) in SupplierList" :key="index" />
+            </el-select>
+            <a style="margin-left: 20px;color:#3983EF;" @click="handleAdd">添加供应商</a>
+          </el-form-item>
+
+        </el-col>
+      </el-row>
+      <el-row :gutter="40" style="width: 500px">
+        <el-col :span="23">
+          <el-form-item label="商品采购链接:">
+            <el-input v-model="addData.shoppingLink" placeholder="请输入商品采购链接"/>
+          </el-form-item>
+        </el-col>
+      </el-row>
+
        <el-row :gutter="40" style="width: 500px">
         <el-col :span="23">
           <el-form-item label="商品标签:">
@@ -132,6 +156,11 @@
         <el-button type="primary" @click="updateItem()">保存</el-button>
       </el-col>
     </el-row>
+    <add-supplier
+      v-if="createShow"
+      :dialog-show="createShow"
+      @close="close"
+    />
   </div>
 </template>
 <script>
@@ -141,30 +170,36 @@ import Spec from './components/spec'
 import TinyEditor from '@/components/TinyEditor'
 import { getGoodsDetail, addGoods } from '@/api/business/goods'
 import { goodsCategoryItems } from '@/api/business/category'
+import { getSupplierList } from '@/api/business/supplier'
 import { goodsTagItems } from '@/api/business/tag'
 import { publicFileGetUrl } from "@/api/common"
 import { accDiv, accMul } from '@/utils/util'
+import AddSupplier from "../supplier/components/addSupplier";
 export default {
   components: {
     TinyEditor,
     WangEditor,
     Upload,
-    Spec
+    Spec,
+    AddSupplier
   },
   data() {
     return {
       IMG_URL: publicFileGetUrl,
       id: this.$route.query.id,
       goodsCategoryItemsList: [],
+      SupplierList: [],
       goodsTagItemsList: [],
       addData: {
         multiSku: 0,
         description: ''
       },
+      createShow:false,
       rules: {
         title: [{ required: true, message: '请输入商品名称', trigger: 'blur' }],
         picUrl: [{ required: true, message: '请上传商品图片', trigger: 'change' }],
         categoryId: [{ required: true, message: '请选择商品分类', trigger: 'change' }],
+        supplierId: [{ required: true, message: '请选择供应商', trigger: 'change' }],
         exchangeShow: [{ required: true, message: '请选择是否支持盲豆兑换', trigger: 'change' }],
         multiSku: [{ required: true, message: '请选择SKU类型', trigger: 'change' }],
         value: [
@@ -215,14 +250,15 @@ export default {
   },
   created() {
     this.getGoodsCategoryItems()
+    this.getSupplierItems()
     this.getGoodsTagItems()
     if (this.id) {
       getGoodsDetail(this.id).then(res => {
-        const { goodsId, title, goodsCode, picUrl,merchantInfo, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList, categoryId, tagIds } = res.data
+        const { goodsId, title, goodsCode, picUrl,merchantInfo, exchangeShow, multiSku, value, exchangePrice, cost, quantity, description, skuList, categoryId, supplierId, shoppingLink, tagIds } = res.data
         this.addData = {
           value: accDiv(value, 100),
           cost: cost == '' || cost == null ? '' : accDiv(cost, 100),
-          goodsId, title, goodsCode, picUrl,merchantInfo, exchangeShow, multiSku, exchangePrice, quantity, description, skuList, categoryId, tagIds
+          goodsId, title, goodsCode, picUrl,merchantInfo, exchangeShow, multiSku, exchangePrice, quantity, description, skuList, categoryId, supplierId, shoppingLink, tagIds
         }
         if(description) {
           this.$refs.editor.setContent(description)
@@ -241,6 +277,19 @@ export default {
         this.goodsCategoryItemsList = res && res.data
       })
     },
+    //获取供应商
+    getSupplierItems(){
+      getSupplierList({name:""}).then(res => {
+        this.SupplierList = res && res.rows
+      })
+    },
+    handleAdd() {
+      this.createShow = true;
+    },
+    close(){
+      this.createShow = false;
+      this.getSupplierItems()
+    },
     getGoodsTagItems(){
       goodsTagItems({}).then(res => {
         this.goodsTagItemsList = res && res.data

+ 6 - 4
src/views/business/goods/index.vue

@@ -200,6 +200,8 @@ export default {
         return
       }
       this.loading = true
+      console.log(this.queryParams.minCost)
+
       // if (reset) {
       //   this.queryParams = { pageNum: 1, pageSize: 20, orderByColumn: '', isAsc: '', }
       // }
@@ -210,10 +212,10 @@ export default {
         tagId: this.queryParams.tagId,
         status: this.queryParams.status,
         exchangeShow: this.queryParams.exchangeShow,
-        minCost: accMul(this.queryParams.minCost, 100),
-        maxCost: accMul(this.queryParams.maxCost, 100),
-        minValue: accMul(this.queryParams.minValue, 100),
-        maxValue: accMul(this.queryParams.maxValue, 100)
+        minCost: this.queryParams.minCost?accMul(this.queryParams.minCost, 100):this.queryParams.minCost,
+        maxCost: this.queryParams.maxCost?accMul(this.queryParams.maxCost, 100):this.queryParams.maxCost,
+        minValue: this.queryParams.minValue?accMul(this.queryParams.minValue, 100):this.queryParams.minValue,
+        maxValue: this.queryParams.maxValue?accMul(this.queryParams.maxValue, 100):this.queryParams.maxValue
       }).then(res => {
         this.loading = false
         if (res.code === 0) {

+ 156 - 0
src/views/business/supplier/components/addSupplier.vue

@@ -0,0 +1,156 @@
+<template>
+  <div>
+    <el-dialog
+      :title="title"
+      :visible.sync="dialogShow"
+      width="800px"
+      :before-close="close"
+    >
+      <el-form :model="form" ref="form" :rules="rules" label-width="100px" :inline="true">
+        <el-form-item label="供应商" prop="name">
+          <el-input
+            v-model="form.name"
+            style="width: 240px"
+            size="small"
+            placeholder="请输入供应商公司名称"
+          ></el-input>
+        </el-form-item>
+
+        <el-form-item label="联系人">
+          <el-input
+            v-model.number="form.contact"
+            style="width: 240px"
+            size="small"
+            placeholder="请输入联系人"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="手机号码" prop="phone">
+          <el-input
+            v-model.number="form.phone"
+            style="width: 240px"
+            size="small"
+            placeholder="请输入联系人手机号码"
+          ></el-input>
+        </el-form-item>
+        <el-form-item label="备注">
+          <el-input
+            v-model.number="form.remark"
+            style="width: 240px"
+            size="small"
+            placeholder="请输入备注信息"
+          ></el-input>
+        </el-form-item>
+      </el-form>
+
+      <!-- 按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button type="primary" :disabled="loading" @click="saveClick"
+        >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { getSupplierDetail, setSupplierList, addSupplierList, removeSupplierList} from "@/api/business/supplier";
+export default {
+  props: {
+    // 弹框显示
+    dialogShow: {
+      type: Boolean,
+      default: false,
+    },
+    // ID
+    id: {
+      type:[Number, String],
+      default: ''
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      form: {
+        type: 'link',
+        sort: 0
+      },
+
+      rules: {
+        name: [
+          { required: true, message: "请输入供应商名称", trigger: "blur" },
+        ],
+        phone: [
+          { pattern: /^([1-9]\d*)$/, message: "请输入正确的数字", trigger: ["blur", "change"] }
+        ]
+      },
+    };
+  },
+  computed: {
+    title() {
+      return this.id ? '编辑供应商' : '添加供应商';
+    },
+  },
+  created() {
+    if(this.id){
+      getSupplierDetail(this.id).then(res => {
+        const { name, phone, contact, remark} = res.data
+        this.form = { name, phone, contact, remark}
+      })
+    }
+  },
+  methods: {
+    // 关闭弹框
+    close() {
+      this.$emit("close");
+      this.loading = false;
+      this.$refs["form"].resetFields();
+    },
+
+    // 确认
+    saveClick() {
+      this.loading = true;
+      const subForm = this.$refs["form"];
+      subForm.validate((valid) => {
+        if (valid) {
+          this.submitForm(this.form);
+        } else {
+          this.loading = false;
+          return false;
+        }
+      });
+    },
+
+    // 提交
+    submitForm(form) {
+      let data = {
+        ... form,
+      };
+      let request = this.id ? setSupplierList : addSupplierList
+      if(this.id){
+        data.id = this.id
+      }
+      request(data)
+        .then((res) => {
+          if (res.code == 0) {
+            this.msgSuccess(this.id ? "修改成功" : '添加成功');
+            this.close();
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+  },
+};
+</script>
+<style scoped>
+.channel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.tip {
+  font-size: 12px;
+  color: #999;
+}
+</style>

+ 78 - 0
src/views/business/supplier/components/seeSupplier.vue

@@ -0,0 +1,78 @@
+<template>
+  <div>
+    <el-dialog
+      title="查看供应商"
+      :visible.sync="dialogShow"
+      width="800px"
+      :before-close="seeClose"
+    >
+      <el-form :model="form" ref="form"  label-width="100px" :inline="true">
+        <el-form-item label="供应商:">
+          <span v-model="form.name" style="width: 240px; display: inline-block"> {{form.name}}</span>
+        </el-form-item>
+        <el-form-item label="联系人:">
+          <span v-model="form.contact" style="width: 240px; display: inline-block"> {{form.contact}}</span>
+        </el-form-item>
+        <el-form-item label="手机号码:">
+          <span v-model="form.phone" style="width: 240px; display: inline-block"> {{form.phone}}</span>
+        </el-form-item>
+        <el-form-item label="备注:">
+          <span v-model="form.remark" style="width: 240px; display: inline-block"> {{form.remark}}</span>
+        </el-form-item>
+      </el-form>
+      <!-- 按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="seeClose">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+<script>
+import { getSupplierDetail } from "@/api/business/supplier";
+export default {
+  props: {
+    // 弹框显示
+    dialogShow: {
+      type: Boolean,
+      default: false,
+    },
+    // ID
+    id: {
+      type:[Number, String],
+      default: ''
+    }
+  },
+  data() {
+    return {
+      loading: false,
+      form: {},
+    };
+  },
+  created() {
+    if(this.id){
+      getSupplierDetail(this.id).then(res => {
+        const { name, phone, contact, remark} = res.data
+        this.form = { name, phone, contact, remark}
+      })
+    }
+  },
+  methods: {
+    // 关闭弹框
+    seeClose() {
+      this.$emit("seeClose");
+      this.loading = false;
+    },
+  },
+};
+</script>
+<style scoped>
+.channel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
+}
+.tip {
+  font-size: 12px;
+  color: #999;
+}
+</style>

+ 208 - 0
src/views/business/supplier/index.vue

@@ -0,0 +1,208 @@
+<template>
+  <div class="app-container">
+    <el-form
+      :model="queryParams"
+      ref="queryForm"
+      :inline="true"
+      v-show="showSearch"
+      label-width="90px" >
+      <el-form-item label="供应商名称">
+        <el-input v-model="queryParams.name" placeholder="请输入商品名称" clearable @clear="queryParams.pageNum = 1;getList()"  @keyup.enter.native="queryParams.pageNum = 1;getList()"></el-input>
+      </el-form-item>
+      <el-form-item >
+        <el-input v-show="false" />
+      </el-form-item>
+      <el-form-item>
+        <el-button
+          type="primary"
+          icon="el-icon-search"
+          size="mini"
+          @click="getList()"
+        >搜索</el-button
+        >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
+        >重置</el-button
+        >
+      </el-form-item>
+    </el-form>
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['business:supplier:add']"
+        >添加供应商</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList()"
+      ></right-toolbar>
+    </el-row>
+    <!-- 列表 -->
+    <el-table ref="table" v-loading="loading" :data="list">
+      <el-table-column label="供应商编号" prop="id" />
+      <el-table-column label="供应商名称" prop="name" />
+      <el-table-column label="联系人" prop="contact" />
+      <el-table-column label="手机号码" prop="phone" />
+      <el-table-column label="操作" align="center">
+        <template slot-scope="{ row }">
+          <div>
+            <el-button
+              v-hasPermi="['business:supplier:query']"
+              type="text"
+              @click="seeEdit(row)"
+            >查看</el-button
+            >
+            <el-button
+              v-hasPermi="['business:supplier:edit']"
+              type="text"
+              @click="edit(row)"
+            >编辑</el-button
+            >
+            <el-button
+              v-hasPermi="['business:supplier:remove']"
+              type="text"
+              class="del"
+              @click="del(row)"
+            >删除</el-button
+            >
+          </div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="pageParams.pageNum"
+      :limit.sync="pageParams.pageSize"
+      @pagination="getList"
+    />
+
+    <add-supplier
+      v-if="createShow"
+      :dialog-show="createShow"
+      :id="id"
+      @close="close"
+    />
+    <see-supplier
+      v-if="seeShow"
+      :dialog-show="seeShow"
+      :id="id"
+      @seeClose="seeClose"
+    />
+  </div>
+</template>
+<script>
+import { getSupplierList, removeSupplierList } from "@/api/business/supplier";
+import AddSupplier from "./components/addSupplier";
+import SeeSupplier from "./components/seeSupplier"
+export default {
+  name: "ListBanner",
+  components: {
+    AddSupplier,
+    SeeSupplier,
+  },
+  data() {
+    return {
+      loading: false,
+      showSearch: true,
+      queryParams: {
+        name:"",
+      },
+      pageParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 总条数
+      total: 0,
+      list: [],
+      createShow: false,
+      seeShow: false,
+      id: '',
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+
+    getList() {
+      this.loading = true;
+      let data = {
+        name:this.queryParams.name
+      }
+      getSupplierList(data,
+        "pageNum=" +
+        this.pageParams.pageNum +
+        "&pageSize=" +
+        this.pageParams.pageSize
+      )
+        .then((res) => {
+          this.loading = false;
+          if (res.code == 0) {
+            this.total = res.total;
+            this.list = res.rows;
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+
+    edit(item) {
+      this.id = item.id;
+      this.createShow = true;
+    },
+
+    seeEdit(item) {
+      this.id = item.id;
+      this.seeShow = true;
+    },
+
+
+    del(item) {
+      this.$confirm(`确认删除供应商 “${item.name}” 吗?`, "删除供应商", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      }).then(() => {
+        removeSupplierList(item.id).then((res) => {
+          if (res.code === 0) {
+            this.$message.success("操作已完成!");
+            this.getList();
+          }
+        });
+      });
+    },
+
+    // 重置
+    resetQuery() {
+      this.queryParams = {};
+      this.pageParams.pageNum = 1
+      this.getList();
+    },
+
+    handleAdd() {
+      this.createShow = true;
+    },
+
+    // 关闭弹框
+    close() {
+      this.createShow = false;
+      this.id = "";
+      this.getList();
+    },
+
+    seeClose() {
+      this.seeShow = false;
+    }
+  },
+};
+</script>
+<style>
+</style>

+ 16 - 6
src/views/business/ticket/components/GoodsAdd.vue

@@ -13,9 +13,16 @@
           placeholder="请输入商品名称"
           clearable
           size="small"
-          style="width: 240px"
-          @keyup.enter.native="getGoodsList()"
+          style="width: 220px" @clear="queryParams.pageNum = 1;getGoodsList()"
+          @keyup.enter.native="queryParams.pageNum = 1;getGoodsList()"
         />
+        <div style="margin-left: 20px">商品价格:</div>
+<!--        <el-input v-model="minValue" placeholder="最低价格" clearable @keyup.enter.native="pageParams.pageNum = 1;getList()" />-->
+        <el-input style="width: 220px" v-model="queryParams.minValue"  @clear="queryParams.pageNum = 1;getGoodsList()" placeholder="最低价格" clearable @keyup.enter.native="queryParams.pageNum = 1;getGoodsList()"/>
+        <div style="width: 20px;text-align: center">-</div>
+<!--        <el-input v-model="maxValue" placeholder="最高价格" clearable @keyup.enter.native="pageParams.pageNum = 1;getList()" />-->
+        <el-input style="width: 220px" v-model="queryParams.maxValue"  @clear="queryParams.pageNum = 1;getGoodsList()" placeholder="最高价格" clearable @keyup.enter.native="queryParams.pageNum = 1;getGoodsList()"/>
+
         <div class="ge"></div>
         <el-button
           type="primary"
@@ -80,6 +87,7 @@
 <script>
 import { publicFileGetUrl } from "@/api/common";
 import { getGoodsList } from "@/api/business/goods";
+import { accMul } from '@/utils/util'
 export default {
   name: "GoodsAdd",
   props: {
@@ -92,6 +100,8 @@ export default {
     return {
       loading: false,
       goodsTitle: "", // 商品名称
+      queryParams:{},
+
       goodsList: [], // 商品列表
       goodsTotal: 0, // 商品总数
       selectGoodsList: [], // 选中商品
@@ -114,7 +124,7 @@ export default {
           "&pageSize=" +
           this.pageParams.pageSize +
           "&",
-        { title: this.goodsTitle, status: "on" }
+        { title: this.goodsTitle,  status: "on", minValue: this.queryParams.minValue?accMul(this.queryParams.minValue, 100):this.queryParams.minValue, maxValue: this.queryParams.maxValue?accMul(this.queryParams.maxValue, 100):this.queryParams.maxValue,}
       ).then((res) => {
         this.goodsList = res.rows.map((item) => {
           return {
@@ -158,7 +168,7 @@ export default {
   line-height: 32px;
   margin-bottom: 20px;
   .ge {
-    width: 40px;
+    width: 20px;
   }
 }
 .dialog-btn {
@@ -167,7 +177,7 @@ export default {
   justify-content: flex-end;
   padding: 40px 0 0;
   .ge {
-    width: 40px;
+    width: 20px;
   }
 }
-</style>
+</style>

+ 2 - 3
src/views/business/ticket/index.vue

@@ -418,7 +418,7 @@ export default {
     getDetail(row) {
       this.$router.push({ name: "TicketDetail", query: { id: row.boxId } });
     },
-    
+
     // 编辑信息
     setDetail(row) {
       this.$router.push({ name: "TicketEdit", query: { id: row.boxId } });
@@ -427,7 +427,6 @@ export default {
     handleDetail() {},
 
     handleImport() {
-      console.log("handleImport ====================");
       this.importShow = true;
     },
 
@@ -474,7 +473,7 @@ export default {
       if (boxIds.length == 0) {
         this.$alert("请选择你要导出的盲票组!", "提示", { type: "warning" });
       } else {
-        this.$confirm("是否确认导出所选盲票数据项?", "警告", {
+        this.$confirm("是否确认导出所选盲票数据项?", "提示", {
           confirmButtonText: "确定",
           cancelButtonText: "取消",
           type: "warning",

+ 12 - 0
src/views/order/channel/detail.vue

@@ -58,6 +58,18 @@
         </div>
       </div>
     </div>
+    <!-- 买家留言 -->
+    <div class="info">
+      <div class="info-title">备注信息</div>
+      <div class="info-item">
+        <div class="info-item-content">
+          <div class="info-item-content-one">
+            <div class="title">买家留言:</div>
+            <div class="txt">{{ info.memo || "--" }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
     <!-- 订单状态 -->
     <div class="info">
       <div class="info-title">订单状态</div>

+ 1 - 3
src/views/order/channel/index.vue

@@ -341,8 +341,6 @@ export default {
       } else { //val为空时,还原数组
         this.siteList = this.siteCopyList;
       }
-      console.log("this.siteList == "+JSON.stringify(this.siteList))
-      console.log("this.siteCopyList == "+JSON.stringify(this.siteCopyList))
     },
 
     //搜索
@@ -434,7 +432,7 @@ export default {
 
     // 导出订单
     handleOrderExport() {
-      this.$confirm("是否确认导出订单?", "警告", {
+      this.$confirm("是否确认导出订单?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",

+ 12 - 0
src/views/order/deliver/detail.vue

@@ -54,6 +54,18 @@
         </div>
       </div>
     </div>
+    <!-- 买家留言 -->
+    <div class="info">
+      <div class="info-title">备注信息</div>
+      <div class="info-item">
+        <div class="info-item-content">
+          <div class="info-item-content-one">
+            <div class="title">买家留言:</div>
+            <div class="txt">{{ info.memo || "--" }}</div>
+          </div>
+        </div>
+      </div>
+    </div>
     <!-- 订单状态 -->
     <div class="info">
       <div class="info-title">订单状态</div>

+ 1 - 1
src/views/order/deliver/index.vue

@@ -347,7 +347,7 @@ export default {
 
     // 导出订单
     handleExportDraw() {
-      this.$confirm("是否确认导出订单?", "警告", {
+      this.$confirm("是否确认导出订单?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",

+ 213 - 0
src/views/order/exchange/index.vue

@@ -0,0 +1,213 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="90px" >
+      <el-form-item label="商品名称" prop="goodsName">
+        <el-input v-model="queryParams.goodsName"  placeholder="请输入商品名称" clearable size="small" style="width: 240px" @clear="queryParams.pageNum = 1;handleQuery()" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+
+      <el-form-item label="用户手机号" prop="phone">
+        <el-input v-model="queryParams.phone" placeholder="请输入用户手机号" clearable size="small" style="width: 240px" @clear="queryParams.pageNum = 1;handleQuery()" @keyup.enter.native="handleQuery" />
+      </el-form-item>
+
+      <el-form-item label="支付盲豆" prop="minExchangePrice">
+        <el-input v-model="queryParams.minExchangePrice" placeholder="最低数量" @clear="queryParams.pageNum = 1;handleQuery()" clearable @keyup.enter.native="queryParams.pageNum = 1;getList()" />
+      </el-form-item>
+      <el-form-item label="-" prop="maxExchangePrice" label-width="10px">
+        <el-input v-model="queryParams.maxExchangePrice" placeholder="最高数量" @clear="queryParams.pageNum = 1;handleQuery()" clearable @keyup.enter.native="queryParams.pageNum = 1;getList()" />
+      </el-form-item>
+
+      <el-form-item label="下单时间">
+        <el-date-picker @clear="queryParams.pageNum = 1;handleQuery()" v-model="tradeTimeArr" type="datetimerange" size="small" value-format="timestamp" range-separator="至" start-placeholder="时间选择" end-placeholder="时间选择" @change="tardeTime">
+        </el-date-picker>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery" >搜索</el-button >
+        <el-button icon="el-icon-refresh" size="mini" @click="resetQuery" >重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 导出、刷新 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button
+          type="infor"
+          plain
+          icon="el-icon-download"
+          size="small"
+          @click="handleExportDraw"
+          v-hasPermi="['order:exchange:export']"
+        >导出订单</el-button
+        >
+      </el-col>
+      <right-toolbar
+        :showSearch.sync="showSearch"
+        @queryTable="getList"
+      ></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table ref="table" v-loading="loading" :data="list">
+      <el-table-column label="兑换时间" min-width="100" align="center">
+        <template slot-scope="{ row }">
+          <div>{{ parseTime(row.createdTime) }}</div>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品主图" prop="picUrl" min-width="95" align="center">
+        <template slot-scope="{row}">
+          <div v-if="row.picUrl">
+            <el-image
+              style="width: 100px; height: 100px"
+              :src="IMG_URL + row.picUrl.split(',')[0]"
+              :preview-src-list="row.picUrl.split(',').map(item => { return IMG_URL + item })"
+            />
+          </div>
+          <span v-else>-</span>
+        </template>
+      </el-table-column>>
+      <el-table-column label="商品名称" prop="goodsName" min-width="95" align="center" />
+      <el-table-column label="商品规格" prop="sku" min-width="95" align="center" >
+        <template slot-scope="{row}">
+          <div v-if="row.sku">{{row.sku}}</div>
+          <div v-else>--</div>
+        </template>
+
+      </el-table-column>
+      <el-table-column label="单价(盲豆)" prop="exchangePrice" min-width="95" align="center"/>
+      <el-table-column label="兑换数量" prop="num" min-width="60" align="center" />
+      <el-table-column label="支付盲豆数" prop="payPrice" min-width="95" align="center"/>
+      <el-table-column label="用户昵称/手机号" min-width="120" align="center">
+        <template slot-scope="{ row }">
+          <div>{{ row.nickName }}/{{ row.phone }}</div>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <!-- 分页 -->
+    <pagination
+      v-show="total > 0"
+      :total="total"
+      :page.sync="pageParams.pageNum"
+      :limit.sync="pageParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+<script>
+import { publicFileGetUrl } from "@/api/common"
+import { exchangeOrderList, exchangeOrderExport } from "@/api/business/exchange";
+export default {
+  name: "exchange",
+  data() {
+    return {
+      IMG_URL: publicFileGetUrl,
+      loading: false,
+      showSearch: true,
+      // 筛选
+      queryParams: {
+        goodsName: "",
+        startTime: "",
+        endTime: "",
+        phone: "",
+        minExchangePrice: "",
+        maxExchangePrice: "",
+      },
+      // 分页
+      pageParams: {
+        pageNum: 1,
+        pageSize: 10,
+      },
+      // 总条数
+      total: 0,
+      list: [],
+      // 下单时间
+      tradeTimeArr: [],
+      // 订单列表状态
+      state: "null",
+    };
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    // 订单列表
+    getList() {
+      this.loading = true;
+      exchangeOrderList( "pageNum=" + this.pageParams.pageNum + "&pageSize=" + this.pageParams.pageSize + "&",this.queryParams)
+        .then((res) => {
+          this.loading = false;
+          if (res.code == 0) {
+            this.total = res.total;
+            this.list = res.rows;
+          }
+        })
+        .catch(() => {
+          this.loading = false;
+        });
+    },
+
+    //搜索
+    handleQuery() {
+      this.pageParams.pageNum = 1;
+      this.getList();
+    },
+
+    // 重置
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.tradeTimeArr = [];
+      this.pageParams.pageNum = 1;
+      this.queryParams.startTime = "";
+      this.queryParams.endTime = "";
+
+      this.getList();
+    },
+
+    // 选择下单时间
+    tardeTime(e) {
+      if (e) {
+        this.queryParams.startTime = e[0];
+        this.queryParams.endTime = e[1];
+        this.handleQuery();
+      } else {
+        this.queryParams.startTime = "";
+        this.queryParams.endTime = "";
+        this.handleQuery();
+      }
+    },
+
+    // 关闭发货弹框
+    close() {
+      this.getList();
+    },
+
+    // 导出订单
+    handleExportDraw() {
+      this.$confirm("是否确认导出订单?", "提示", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning",
+      })
+        .then(() => {
+          this.vloading = this.$loading({
+            lock: true,
+            text: "正在导出订单.....",
+            background: "rgba(0, 0, 0, 0.7)",
+          });
+          return exchangeOrderExport(this.queryParams);
+        })
+        .then((response) => {
+          this.vloading.close();
+          this.download(response.msg);
+        })
+        .catch(() => {
+          this.vloading.close();
+        });
+    },
+  },
+};
+</script>
+<style lang="scss" scoped>
+::v-deep .el-tabs--border-card > .el-tabs__content {
+  padding: 0;
+}
+</style>

+ 2 - 2
src/views/order/userTicket/detail.vue

@@ -48,7 +48,7 @@
             <div class="txt">{{ info.phone }}</div>
           </div>
           <div class="info-item-content-one">
-            <div class="title">上级渠道商:</div>
+            <div class="title">上级经销商:</div>
             <div class="txt">{{ info.channelName }}</div>
           </div>
         </div>
@@ -178,4 +178,4 @@ export default {
     text-align: center;
   }
 }
-</style>
+</style>

+ 2 - 2
src/views/order/userTicket/index.vue

@@ -273,7 +273,7 @@ export default {
 
     // 导出订单
     handleExportDraw() {
-      this.$confirm("是否确认导出订单?", "警告", {
+      this.$confirm("是否确认导出订单?", "提示", {
         confirmButtonText: "确定",
         cancelButtonText: "取消",
         type: "warning",
@@ -301,4 +301,4 @@ export default {
 ::v-deep .el-tabs--border-card > .el-tabs__content {
   padding: 0;
 }
-</style>
+</style>

+ 175 - 63
src/views/setting/template/components/regionList.vue

@@ -1,89 +1,201 @@
 <template>
-  <el-dialog title="添加地区" :visible.sync="selectShow" width="700px" :close-on-click-modal="false" :destroy-on-close="true">
-    <el-form  ref="shippingTemplateRuleAreaList" :model="shippingTemplateRuleAreaList" label-width="100px">
-      <flexbox class="ygp-form-items" align="flex-start" justify="flex-start">
-        <el-form-item label="省/市" style="width: 80%;">
+  <div>
+    <el-dialog
+      :title="title"
+      :visible.sync="dialogShow"
+      width="700px"
+      :before-close="close"
+    >
 
-          <el-cascader :options="listPidProvince" clearable :props="props" v-model="pidData"></el-cascader>
-        </el-form-item>
+    <div style="width: 462px; margin: 0 auto">
+      <el-cascader-panel v-model="ruleArea" style="height: 350px;" :options="listPidProvince" :props="props"></el-cascader-panel>
+    </div>
 
-      </flexbox>
-    </el-form>
-    <span slot="footer">
-      <el-button type="info" plain @click="selectShow = false">取消</el-button>
-      <el-button type="primary" @click="update">确定</el-button>
-    </span>
-  </el-dialog>
+      <!-- 按钮 -->
+      <div slot="footer" class="dialog-footer">
+        <el-button @click="close">取 消</el-button>
+        <el-button type="primary" :disabled="loading" @click="saveClick"
+        >确 定</el-button
+        >
+      </div>
+    </el-dialog>
+  </div>
 </template>
 <script>
-import { getTemplateList, } from "@/api/setting/template";
-import { publicFileGetUrl } from "@/api/common"
-import { listAreaByPid} from "@/api/admin/area";
+import {
+  getTreeList,
+} from "@/api/setting/template";
 export default {
-  name: "regionList",
+
   props: {
-    value: {
-      type: Array,
-      default: []
+    // 弹框显示
+    dialogShow: {
+      type: Boolean,
+      default: false,
+    },
+    // ID
+    id: {
+      type:[Number, String],
+      default: ''
+    },
+    list: {
+      type:[Object, Array],
+      default: ''
+    },
+    shippingTemplateRuleList: {
+      type:[Object, Array],
+      default: ''
+    },
+    shippingTemplateRuleList2: {
+      type:[Object, Array],
+      default: ''
     }
   },
   data() {
     return {
-      props:{
+      loading: false,
+      listPidProvince: [],//省
+      props: {
         multiple: true,
-        value:'areaId',
-        label:'areaName',
-        children:'cityList',
+        value: 'areaId',
+        label: 'areaName',
+        children: 'cityList',
       },
-      IMG_URL: publicFileGetUrl,
-      selectShow: false,
-      listPidProvince:[],//省
-      pidData:[],
-      shippingTemplateRuleAreaList:{
-          city: '',//市
-          cityId: '',//市id
-          province: '',//省
-          provinceId: '',//省id
-        },
-    }
+      ruleArea:'',//获取所选的地区
+      TemplateRuleList:[],
+      TemplateRuleList2:[],
+    };
   },
-  methods: {
-    show() {
-      this.getList(true)
-      this.selectShow = true
+  computed: {
+    title() {
+      return this.list ? '编辑地区' : '添加地区';
     },
-    getList(reset) {
-      getTemplateList().then(res =>{
-        if(res.code == 0){
-          this.listPidProvince = res.data || []
-        }
+  },
+  created() {
+    if (this.list) {
+      let data = []
+      this.list.map(ressage => {
+        data.push([ressage.provinceId, ressage.cityId])
+      })
+      this.ruleArea = data
+    }
+    if(this.shippingTemplateRuleList){
+      let data = []
+      this.shippingTemplateRuleList.map(ressage => {
+        let data2 = []
+        ressage.shippingTemplateRuleAreaList.map(res=>{
+          data2.push([res.provinceId, res.cityId])
+        })
+        data.push(data2)
+      })
+      this.TemplateRuleList = data
+      this.listPidDisabled()
+    }
+    if (this.shippingTemplateRuleList2){
+      let data = []
+      this.shippingTemplateRuleList2.map(ressage => {
+        let data2 = []
+        ressage.shippingTemplateRuleAreaList.map(res=>{
+          data2.push([res.provinceId, res.cityId])
+        })
+        data.push(data2)
       })
+      this.TemplateRuleList2 = data
+      this.listPidDisabled()
+    }
+
+
 
+  },
+  methods: {
+    // 关闭弹框
+    close() {
+      this.$emit("close");
+      this.loading = false;
     },
-    getCityList(){
-      getTemplateList().then(res =>{
-        if(res.code == 0){
-          this.listPidProvince = res.data || []
+
+    // 确认
+    saveClick() {
+      this.loading = true;
+      if (this.ruleArea == ''){
+        this.$message({
+          showClose: true,
+          message: '区域不能为空',
+          type: 'warning'
+        });
+        this.loading = false;
+        return
+      }
+      let ressage = []
+      this.ruleArea.map(res => {
+        let city = ''
+        let province = ''
+        for (let i = 0; i < this.listPidProvince.length; i++) {
+          if (this.listPidProvince[i].areaId == res[0]) {
+            city = this.listPidProvince[i].areaName
+            let cityList = this.listPidProvince[i].cityList
+            for (let j = 0; j < cityList.length; j++) {
+              if (cityList[j].areaId == res[1]) {
+                province = cityList[j].areaName
+              }
+            }
+          }
+        }
+        res = {
+          provinceId: res[0],
+          cityId: res[1],
+          city: city,
+          province: province,
         }
+        ressage.push(res)
       })
+      this.ruleArea = ressage
+      this.$emit("close",this.ruleArea);
     },
 
-
-
-    update() {
-      // this.$emit('input', this.shippingTemplateRuleAreaList)
-      this.selectShow = false
-    }
-  }
-}
+    //多选框状态
+     async listPidDisabled() {
+       let resData = await getTreeList({})
+       this.listPidProvince = resData.data
+       let TemplateRuleList = [...this.TemplateRuleList,...this.TemplateRuleList2]
+        this.listPidProvince.map(item => {//省
+          item.cityList.map(res => {//市
+            for (let i = 0; i < TemplateRuleList.length; i++) {
+              for (let j = 0; j < TemplateRuleList[i].length; j++) {
+                if (res.areaId == TemplateRuleList[i][j][1]){
+                  this.$set(res, 'disabled', true)
+                }
+              }
+            }
+          })
+        })
+       this.listPidProvince.map(item => {//省
+         item.cityList.map(res => {//市
+           for (let i = 0; i < this.ruleArea.length; i++) {
+             if (res.areaId == this.ruleArea[i][1]){
+               this.$delete(res, 'disabled',)
+             }
+           }
+         })
+       })
+    },
+  },
+};
 </script>
-
-<style lang="scss">
-.ygp-form-items {
-.el-form-item {
-  padding: 0 15px;
-
+<style scoped>
+.channel {
+  display: flex;
+  align-items: center;
+  justify-content: space-between;
 }
+.tip {
+  font-size: 12px;
+  color: #999;
+}
+::v-deep .el-cascader-menu__wrap {
+  height: 354px!important;
+}
+::v-deep .el-cascader-menu {
+  min-width: 230px!important;
 }
 </style>
-

+ 135 - 141
src/views/setting/template/create.vue

@@ -29,14 +29,14 @@
                 </td>
               </tr>
               <tr v-for="(item,index) in shippingTemplateRuleList" :key="index" style="">
-                <td>
-                  <el-form-item :prop="`shippingTemplateRuleList.${index}.shippingTemplateRuleAreaList`"
-                                :rules="[{ required: true, message: '地区不能为空', trigger:['blur','change'] },{ type: 'array', message: '请选择地区' }]"
-                                style="width: 100%" label-width="0">
-                    <el-cascader @visible-change="listPidDisabled($event,index)" ref="cascaderAdd" collapse-tags
-                                 :options="listPidProvince" clearable :props="props"
-                                 v-model="item.shippingTemplateRuleAreaList" style="width: 100%;"></el-cascader>
-                  </el-form-item>
+                <td class="spec-table-td" style="text-align: left">
+                  <div style="width: 100%;" v-for="(areas,index) in item.filterList" :key="index" class="spec-table-td-link" >
+                    <div>
+                      <div style="float: left">{{ areas.city }}</div>
+                      <div v-if="areas.provinceList.length > 0">({{ areas.provinceList.join(',') }})</div>
+                    </div>
+                  </div>
+                  <a @click="setListData(item.shippingTemplateRuleAreaList,index+1)" style="color:#00aaff;text-underline: #00aaff;float: right">编辑</a>
                 </td>
                 <td>
                   <el-form-item :prop="`shippingTemplateRuleList.${index}.defaultNumber`"
@@ -72,7 +72,7 @@
               </tr>
             </table>
             <el-col style="margin-top: 10px">
-              <el-button type="primary" size="mini" @click="getListData">添加地区</el-button>
+              <el-button type="primary" size="mini" @click="getListData">添加付费区域</el-button>
             </el-col>
 
           </el-form>
@@ -95,14 +95,14 @@
                 </td>
               </tr>
               <tr v-for="(item,index) in shippingTemplateRuleList2" :key="index">
-                <td>
-                  <el-form-item :prop="`shippingTemplateRuleList2.${index}.shippingTemplateRuleAreaList`"
-                                :rules="[{ required: true, message: '地区不能为空', trigger:['blur','change'] },{ type: 'array', message: '请选择地区' }]"
-                                label-width="0">
-                    <el-cascader @visible-change="listPidDisabled($event,shippingTemplateRuleList.length + index)"
-                                 :options="listPidProvince" clearable :props="props"  collapse-tags
-                                 v-model="item.shippingTemplateRuleAreaList" style="width: 100%;"></el-cascader>
-                  </el-form-item>
+                <td class="spec-table-td" style="text-align: left">
+                  <div style="width: 100%;" v-for="(areas,index) in item.filterList" :key="index" class="spec-table-td-link" >
+                    <div>
+                      <div style="float: left">{{ areas.city }}</div>
+                      <div v-if="areas.provinceList.length > 0">({{ areas.provinceList.join(',') }})</div>
+                    </div>
+                  </div>
+                  <a @click="setListData(item.shippingTemplateRuleAreaList,shippingTemplateRuleList.length+index+1)" style="color:#00aaff;text-underline: #00aaff;float: right">编辑</a>
                 </td>
                 <td>
                   <el-form-item :prop="`shippingTemplateRuleList2.${index}.remark`"
@@ -116,7 +116,7 @@
               </tr>
             </table>
             <el-col style="margin-top: 10px">
-              <el-button type="primary" size="mini" @click="getListData2">添加地区</el-button>
+              <el-button type="primary" size="mini" @click="getListData2">添加不发货区域</el-button>
             </el-col>
           </el-form>
         </el-form-item>
@@ -136,7 +136,13 @@
       </el-col>
     </el-row>
 
-<!--    <region-list ></region-list>-->
+    <region-list
+      v-if="createShow"
+      :dialog-show="createShow"
+      :shippingTemplateRuleList="shippingTemplateRuleList" :shippingTemplateRuleList2="shippingTemplateRuleList2"
+      :id="id" :list="list"
+      @close="close"
+    />
   </div>
 </template>
 <script>
@@ -155,6 +161,7 @@ export default {
   components: {RegionList},
   data() {
     return {
+      createShow: false,
       listPidProvince: [],//省
       props: {
         multiple: true,
@@ -163,7 +170,8 @@ export default {
         children: 'cityList',
       },
       id: this.$route.query.id,
-      select: false,
+      listId:'',
+      type:'',
       addIng: false,
       readonly: this.$route.name === 'TemplateQuery',
       shippingTemplateRuleList: [],
@@ -184,13 +192,7 @@ export default {
                 province: '',//省
                 provinceId: '',//省id
                 remark: '不发货备注',
-              }, {
-                city: '',//市
-                cityId: '',//市id
-                province: '',//省
-                provinceId: '',//省id
-                remark: '不发货备注',
-              }, {}
+              }
             ],
           },
         ],
@@ -200,7 +202,8 @@ export default {
 
       rules: {
         title: [{required: true, message: '请输入模板名称', trigger: 'blur'}],
-      }
+      },
+      provinceList:{}//省(市)
     };
   },
   created() {
@@ -211,25 +214,19 @@ export default {
         shippingTemplateRuleList.map(item => {
           item.createPrice = accDiv(item.createPrice, 100)
           item.defaultPrice = accDiv(item.defaultPrice, 100)
-          let data = []
-          item.shippingTemplateRuleAreaList.map(ressage => {
-            data.push([ressage.provinceId, ressage.cityId])
-          })
-          item.shippingTemplateRuleAreaList = data
-
-          if (item.type == 1) {
-            this.shippingTemplateRuleList.push(item)
-          }
-          if (item.type == 2) {
-            this.shippingTemplateRuleList2.push(item)
+        if (item.type == 1){
+          this.shippingTemplateRuleList.push(item)
+        }else {
+          this.shippingTemplateRuleList2.push(item)
           }
         })
         this.addData = {id, title}
+        this.filterList()
       })
+
     }
   },
   methods: {
-
     //获取省份
     getList(reset) {
       getTreeList().then(res => {
@@ -239,82 +236,92 @@ export default {
       })
     },
 
-    //付费地区
-    getListData() {
-      let data = this.shippingTemplateRuleList[this.shippingTemplateRuleList.length - 1] || {}
-      if (data.shippingTemplateRuleAreaList == 1 || data.defaultNumber == '' || data.defaultPrice == '') {
-        this.$message({
-          showClose: true,
-          message: '请输入完整后再添加',
-          type: 'warning'
-        });
+    // 关闭弹框
+    close(ruleArea) {
+      this.createShow = false;
+      if(ruleArea == undefined){
         return
       }
-      let data2 = {
-        createNumber: '',
-        createPrice: '',
-        defaultNumber: '',
-        defaultPrice: '',
-        shippingTemplateRuleAreaList: 1,
-        type: 1,
+      if (this.listId == ''){
+        if(this.type == 1){
+          let data = {
+            createNumber: '',
+            createPrice: '',
+            defaultNumber: '',
+            defaultPrice: '',
+            shippingTemplateRuleAreaList: ruleArea,
+            type: 1,
+          }
+          this.shippingTemplateRuleList.push(data);
+        }else {
+          let data = {
+            remark: '',
+            shippingTemplateRuleAreaList: ruleArea,
+            type: 2,
+          }
+          this.shippingTemplateRuleList2.push(data)
+        }
+      }else {
+        let shippingTemplateRuleList = [...this.shippingTemplateRuleList,...this.shippingTemplateRuleList2]
+        for (let i = 0; i < shippingTemplateRuleList.length; i++) {
+          shippingTemplateRuleList[this.listId-1].shippingTemplateRuleAreaList = ruleArea
+        }
       }
-      this.shippingTemplateRuleList.push(data2)
+      this.filterList()
+    },
+
+    filterList() {
+      let shippingTemplateRuleList = [...this.shippingTemplateRuleList,...this.shippingTemplateRuleList2]
+      shippingTemplateRuleList.forEach(item => {
+        item.filterList = []
+        let data = item.shippingTemplateRuleAreaList
+        let cityArr = [... new Set(data.map(item => item.city))]
+        for (let i = 0; i < cityArr.length; i++) {
+          let obj = {
+            city: cityArr[i],
+            provinceList: []
+          }
+          for (let j = 0; j < data.length; j++) {
+            if(cityArr[i] == data[j].city) {
+              obj.provinceList.push(data[j].province)
+            }
+          }
+          item.filterList.push(obj)
+        }
+        // //折叠市
+        for (let i = 0; i < this.listPidProvince.length; i++) {
+          let data = this.listPidProvince[i]
+          for (let j = 0; j < item.filterList.length; j++) {
+            if(data.areaName == item.filterList[j].city && data.cityList.length == item.filterList[j].provinceList.length){
+              item.filterList[j].provinceList = []
+            }
+          }
+        }
+      })
+    },
+
+    //付费地区
+    getListData() {
+      this.listId = ""
+      this.list = null
+      this.type = 1
+      this.createShow = true;
+
     },
 
     //不包邮地区
     getListData2() {
-      let data = this.shippingTemplateRuleList2[this.shippingTemplateRuleList2.length - 1] || {}
-      if (data.shippingTemplateRuleAreaList == 1 || data.remark == '') {
-        this.$message({
-          showClose: true,
-          message: '请输入完整后再添加',
-          type: 'warning'
-        });
-        return
-      }
-      let data2 = {
-        remark: '',
-        shippingTemplateRuleAreaList: 1,
-        type: 2,
-      }
-      this.shippingTemplateRuleList2.push(data2)
+      this.listId = ""
+      this.list = null
+      this.type = 2
+      this.createShow = true;
     },
 
-    listPidDisabled(e, index,) {
-      let shippingTemplateRuleList = [...this.shippingTemplateRuleList, ...this.shippingTemplateRuleList2]
-      if (e) {
-        this.listPidProvince.map(item => {//省
-          item.cityList.map(res => {//市
-            shippingTemplateRuleList.map(listItem => {//列表
-              if (listItem.shippingTemplateRuleAreaList != 1) {
-                listItem.shippingTemplateRuleAreaList.map(listRes => {//列表存在的省市
-                  if (res.areaId == listRes[1]) {
-                    // res.disabled = true
-                    this.$set(res, 'disabled', true)
-                  }
-                })
-              }
-            })
-          })
-        })
-        this.listPidProvince.map(item => {//省
-          item.cityList.map(res => {//市
-            for (let i = 0; i < shippingTemplateRuleList[index].shippingTemplateRuleAreaList.length; i++) {
-              if (res.areaId == shippingTemplateRuleList[index].shippingTemplateRuleAreaList[i][1]) {
-                this.$delete(res, 'disabled',)
-              }
-            }
-          })
-        })
-
-      } else {
-        this.listPidProvince.map(item => {
-          item.cityList.map(res => {
-            // res.disabled = false
-            this.$set(res, 'disabled', false)
-          })
-        })
-      }
+    //编辑
+    setListData(list,index){
+      this.list = list
+      this.listId = index
+      this.createShow = true;
     },
 
     update() {
@@ -336,6 +343,7 @@ export default {
           return;
         }
       });
+
       if (this.addData.title == "") {
         this.$message({
           showClose: true,
@@ -345,7 +353,6 @@ export default {
         return;
       }
 
-      let arr = []
       //判断付费区域
       if (this.shippingTemplateRuleList) {
         for (let i = 0; i < this.shippingTemplateRuleList.length; i++) {
@@ -360,6 +367,7 @@ export default {
           }
         }
       }
+
       //判断不发货区域
       if (this.shippingTemplateRuleList2) {
         for (let i = 0; i < this.shippingTemplateRuleList2.length; i++) {
@@ -375,42 +383,15 @@ export default {
         }
       }
 
-      let shippingTemplateRuleList = [...this.shippingTemplateRuleList, ...this.shippingTemplateRuleList2]
-      shippingTemplateRuleList.map(item => {
-        let ressage = []
-        item.shippingTemplateRuleAreaList.map(res => {
-          let city = ''
-          let province = ''
-          for (let i = 0; i < this.listPidProvince.length; i++) {
-            if (this.listPidProvince[i].areaId == res[0]) {
-              city = this.listPidProvince[i].areaName
-              let cityList = this.listPidProvince[i].cityList
-              for (let j = 0; j < cityList.length; j++) {
-                if (cityList[j].areaId == res[1]) {
-                  province = cityList[j].areaName
-                }
-              }
-            }
-          }
-          res = {
-            provinceId: res[0],
-            cityId: res[1],
-            city: city,
-            province: province,
-          }
-          ressage.push(res)
-        })
-        item.shippingTemplateRuleAreaList = ressage
-        arr.push(item)
-      })
 
-      for (let i = 0; i < arr.length; i++) {
-        if (arr[i].type == 1) {
-          arr[i].createPrice = accMul(arr[i].createPrice, 100)
-          arr[i].defaultPrice = accMul(arr[i].defaultPrice, 100)
+      let shippingTemplateRuleList = [...this.shippingTemplateRuleList, ...this.shippingTemplateRuleList2]
+      for (let i = 0; i < shippingTemplateRuleList.length; i++) {
+        if (shippingTemplateRuleList[i].type == 1) {
+          shippingTemplateRuleList[i].createPrice = accMul(shippingTemplateRuleList[i].createPrice, 100)
+          shippingTemplateRuleList[i].defaultPrice = accMul(shippingTemplateRuleList[i].defaultPrice, 100)
         }
       }
-      this.addData.shippingTemplateRuleList = arr
+      this.addData.shippingTemplateRuleList = shippingTemplateRuleList
 
       this.submitForm()
     },
@@ -489,5 +470,18 @@ export default {
       color: red;
     }
   }
+  &-td{
+    text-align: left;
+    &-link{
+      display: inline-block;
+      font-size: 13px;
+      height: 20px;
+      line-height: 20px;
+      margin: 0;padding: 0;
+    }
+  }
+}
+::v-deep .spec-table[data-v-4ba0ac48]{
+  line-height: 20px;
 }
 </style>