Procházet zdrojové kódy

Merge remote-tracking branch 'origin/master'

zyp před 1 týdnem
rodič
revize
829022124f

+ 53 - 0
src/api/hisStore/adv.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询广告列表
+export function listAdv(query) {
+  return request({
+    url: '/his/adv/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询广告详细
+export function getAdv(advId) {
+  return request({
+    url: '/his/adv/' + advId,
+    method: 'get'
+  })
+}
+
+// 新增广告
+export function addAdv(data) {
+  return request({
+    url: '/his/adv',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改广告
+export function updateAdv(data) {
+  return request({
+    url: '/his/adv',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除广告
+export function delAdv(advId) {
+  return request({
+    url: '/his/adv/' + advId,
+    method: 'delete'
+  })
+}
+
+// 导出广告
+export function exportAdv(query) {
+  return request({
+    url: '/his/adv/export',
+    method: 'get',
+    params: query
+  })
+}

+ 9 - 9
src/api/hisStore/city.js

@@ -3,14 +3,14 @@ import request from '@/utils/request'
 // 查询城市列表
 export function listCity(query) {
   return request({
-    url: '/store/city/list',
+    url: '/his/city/list',
     method: 'get',
     params: query
   })
 }
 export function getAllList(query) {
   return request({
-    url: '/store/city/getAllList',
+    url: '/his/city/getAllList',
     method: 'get',
     params: query
   })
@@ -18,7 +18,7 @@ export function getAllList(query) {
 
 export function getCitys() {
   return request({
-    url: '/store/city/getCitys',
+    url: '/his/city/getCitys',
     method: 'get'
   })
 }
@@ -28,7 +28,7 @@ export function getCitys() {
 // 查询城市详细
 export function getCity(id) {
   return request({
-    url: '/store/city/' + id,
+    url: '/his/city/' + id,
     method: 'get'
   })
 }
@@ -36,7 +36,7 @@ export function getCity(id) {
 // 新增城市
 export function addCity(data) {
   return request({
-    url: '/store/city',
+    url: '/his/city',
     method: 'post',
     data: data
   })
@@ -45,7 +45,7 @@ export function addCity(data) {
 // 修改城市
 export function updateCity(data) {
   return request({
-    url: '/store/city',
+    url: '/his/city',
     method: 'put',
     data: data
   })
@@ -54,7 +54,7 @@ export function updateCity(data) {
 // 删除城市
 export function delCity(id) {
   return request({
-    url: '/store/city/' + id,
+    url: '/his/city/' + id,
     method: 'delete'
   })
 }
@@ -62,8 +62,8 @@ export function delCity(id) {
 // 导出城市
 export function exportCity(query) {
   return request({
-    url: '/store/city/export',
+    url: '/his/city/export',
     method: 'get',
     params: query
   })
-}
+}

+ 76 - 0
src/api/hisStore/express.js

@@ -0,0 +1,76 @@
+import request from '@/utils/request'
+
+// 查询快递公司列表
+export function listExpress(query) {
+  return request({
+    url: '/his/express/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询快递公司详细
+export function getExpress(id) {
+  return request({
+    url: '/his/express/' + id,
+    method: 'get'
+  })
+}
+
+export function getExpressList() {
+  return request({
+    url: '/his/express/getExpressList',
+    method: 'get'
+  })
+}
+
+// 新增快递公司
+export function addExpress(data) {
+  return request({
+    url: '/his/express',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改快递公司
+export function updateExpress(data) {
+  return request({
+    url: '/his/express',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除快递公司
+export function delExpress(id) {
+  return request({
+    url: '/his/express/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出快递公司
+export function exportExpress(query) {
+  return request({
+    url: '/his/express/export',
+    method: 'get',
+    params: query
+  })
+}
+
+//分配快递公司
+export function allotExpress(data,omsCode) {
+  return request({
+    url: '/his/express/allotExpress/'+omsCode,
+    method: 'post',
+    data: data
+  })
+}
+
+export function getCompanyByOmsCode(omsCode) {
+  return request({
+    url: '/his/express/omsCode/' + omsCode,
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/hisStore/shippingTemplatesFree.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询免邮费列表
+export function listShippingTemplatesFree(query) {
+  return request({
+    url: '/store/shippingTemplatesFree/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询免邮费详细
+export function getShippingTemplatesFree(id) {
+  return request({
+    url: '/store/shippingTemplatesFree/' + id,
+    method: 'get'
+  })
+}
+
+// 新增免邮费
+export function addShippingTemplatesFree(data) {
+  return request({
+    url: '/store/shippingTemplatesFree',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改免邮费
+export function updateShippingTemplatesFree(data) {
+  return request({
+    url: '/store/shippingTemplatesFree',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除免邮费
+export function delShippingTemplatesFree(id) {
+  return request({
+    url: '/store/shippingTemplatesFree/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出免邮费
+export function exportShippingTemplatesFree(query) {
+  return request({
+    url: '/store/shippingTemplatesFree/export',
+    method: 'get',
+    params: query
+  })
+}

+ 53 - 0
src/api/hisStore/shippingTemplatesRegion.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询邮费区域列表
+export function listShippingTemplatesRegion(query) {
+  return request({
+    url: '/store/shippingTemplatesRegion/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询邮费区域详细
+export function getShippingTemplatesRegion(id) {
+  return request({
+    url: '/store/shippingTemplatesRegion/' + id,
+    method: 'get'
+  })
+}
+
+// 新增邮费区域
+export function addShippingTemplatesRegion(data) {
+  return request({
+    url: '/store/shippingTemplatesRegion',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改邮费区域
+export function updateShippingTemplatesRegion(data) {
+  return request({
+    url: '/store/shippingTemplatesRegion',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除邮费区域
+export function delShippingTemplatesRegion(id) {
+  return request({
+    url: '/store/shippingTemplatesRegion/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出邮费区域
+export function exportShippingTemplatesRegion(query) {
+  return request({
+    url: '/store/shippingTemplatesRegion/export',
+    method: 'get',
+    params: query
+  })
+}

+ 7 - 0
src/api/hisStore/storeOrder.js

@@ -285,3 +285,10 @@ export function orderDimensionStatisticsExport(query) {
     params: query
   })
 }
+
+export function importDeliveryNoteExpressTemplate() {
+  return request({
+    url: '/store/storeOrder/importDeliveryNoteExpressTemplate',
+    method: 'get'
+  })
+}

+ 53 - 0
src/api/user/complaint.js

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询用户投诉列表
+export function listComplaint(query) {
+  return request({
+    url: '/user/complaint/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户投诉详细
+export function getComplaint(id) {
+  return request({
+    url: '/user/complaint/' + id,
+    method: 'get'
+  })
+}
+
+// 新增用户投诉
+export function addComplaint(data) {
+  return request({
+    url: '/user/complaint',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户投诉
+export function updateComplaint(data) {
+  return request({
+    url: '/user/complaint',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户投诉
+export function delComplaint(id) {
+  return request({
+    url: '/user/complaint/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出用户投诉
+export function exportComplaint(query) {
+  return request({
+    url: '/user/complaint/export',
+    method: 'get',
+    params: query
+  })
+}

+ 264 - 0
src/components/City/index.vue

@@ -0,0 +1,264 @@
+<template>
+  <el-dialog :close-on-click-modal="false"
+             :visible.sync="addressView"
+             append-to-body
+             class="modal"
+             title="选择城市" width="950px">
+    <el-row :gutter="24" type="flex">
+      <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24" class="item">
+        <div class="check-btn">
+          <el-checkbox v-model="iSselect" @change="allCheckbox">全选</el-checkbox>
+          <div class="empty" @click="empty">清空</div>
+        </div>
+      </el-col>
+    </el-row>
+    <el-row  :gutter="24"  :loading="loading" >
+      <el-col  :xl="6" :lg="6" :md="6" :sm="8" :xs="6" class="item"  v-for="(item,index) in cityList" :key="index">
+        <div @mouseenter="enter(index)" @mouseleave="leave()" v-if="item.level==1">
+          <el-checkbox v-model="item.checked" :label="item.cityName" @change="checkedClick(index)">{{item.cityName}}</el-checkbox>
+          <div class="city" v-show="activeCity===index">
+            <div class="checkBox">
+              <div class="arrow"></div>
+              <div>
+                <el-checkbox v-model="subitem.checked" :label="subitem.cityName" @change="primary(index,subindex)"
+                class="itemn"  v-for="(subitem,subindex) in item.children" :key="subindex"
+                >{{subitem.cityName}}</el-checkbox>
+              </div>
+            </div>
+          </div>
+        </div>
+      </el-col>
+    </el-row>
+    <div slot="footer">
+      <el-button @click="close">取消</el-button>
+      <el-button type="primary" @click="confirm">确定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import {getAllList} from "@/api/hisStore/city";
+
+  export default {
+    name: 'city',
+    props: {
+      type: {
+        type: Number,
+        default: 0
+      }
+    },
+    data () {
+      return {
+        iSselect: false,
+        addressView: false,
+        cityList: [],
+        activeCity: -1,
+        loading: false
+      }
+    },
+    methods: {
+      enter (index) {
+        this.activeCity = index;
+      },
+      leave () {
+        this.activeCity = null;
+      },
+      getCityList () {
+        this.loading = true;
+        getAllList().then(res => {
+          this.loading = false;
+          console.log(res.data)
+          var data=res.data;
+          this.cityList=data.filter(item => item.level===1 )
+
+          this.cityList.forEach(function(item,index,arr){
+            var subData=data.filter(subitem => subitem.parentId===item.cityId )
+            console.log(subData)
+            item.children=subData;
+          });
+        })
+      },
+      /**
+       * 全选或者反选
+       * @param checked
+       */
+      allCheckbox: function () {
+        let that = this, checked = this.iSselect;
+        that.cityList.forEach(function (item, key) {
+          that.$set(that.cityList[key], 'checked', checked);
+          if (checked) {
+            that.$set(that.cityList[key], 'count', that.cityList[key].children.length);
+          } else {
+            that.$set(that.cityList[key], 'count', 0);
+          }
+          that.cityList[key].children.forEach(function (val, k) {
+            that.$set(that.cityList[key].children[k], 'checked', checked);
+          })
+        });
+      },
+      // 清空;
+      empty () {
+        let that = this;
+        that.cityList.forEach(function (item, key) {
+          that.$set(that.cityList[key], 'checked', false);
+          that.cityList[key].children.forEach(function (val, k) {
+            that.$set(that.cityList[key].children[k], 'checked', false);
+          });
+          that.$set(that.cityList[key], 'count', 0);
+        });
+        this.iSselect = false;
+      },
+      /**
+       * 点击省
+       * @param index
+       */
+      checkedClick: function (index) {
+        let that = this;
+        if (that.cityList[index].checked) {
+          that.$set(that.cityList[index], 'count', that.cityList[index].children.length);
+          that.cityList[index].children.forEach(function (item, key) {
+            that.$set(that.cityList[index].children[key], 'checked', true);
+          });
+        } else {
+          that.$set(that.cityList[index], 'count', 0);
+          that.$set(that.cityList[index], 'checked', false);
+          that.cityList[index].children.forEach(function (item, key) {
+            that.$set(that.cityList[index].children[key], 'checked', false);
+          });
+          that.iSselect = false;
+        }
+      },
+      /**
+       * 点击市区
+       * @param index
+       * @param ind
+       */
+      primary: function (index, ind) {
+        let checked = false, count = 0;
+        this.cityList[index].children.forEach(function (item, key) {
+          console.log("item:"+item.checked)
+          if (item.checked) {
+            checked = true;
+            count++;
+          }
+        });
+        this.$set(this.cityList[index], 'count', count);
+        this.$set(this.cityList[index], 'checked', checked);
+      },
+      // 确定;
+      confirm () {
+        let that = this;
+        // 被选中的省市;
+        let selectList = [];
+        that.cityList.forEach(function (item, key) {
+          let data = {};
+          if (item.checked) {
+            data = {
+              name: item.cityName,
+              cityId: item.cityId,
+              children: []
+            };
+
+          }
+          that.cityList[key].children.forEach(function (i, k) {
+            if (i.checked) {
+              data.children.push({
+                cityId: i.cityId
+              })
+            }
+          });
+          if (data.cityId !== undefined) {
+            selectList.push(data);
+          }
+        });
+        console.log(selectList);
+        if (selectList.length === 0) {
+          return this.$message({
+            message:'至少选择一个省份或者城市',
+            type: 'error'
+          });
+        } else {
+          this.$emit('selectCity', selectList, this.type);
+          that.addressView = false;
+          this.cityList = []
+        }
+      },
+      close () {
+        this.addressView = false;
+        this.cityList = []
+      }
+    },
+    mounted () {
+    }
+  }
+</script>
+
+<style scoped>
+
+  .modal .item {
+    position: relative;
+    margin-bottom: 20px;
+  }
+
+  .modal .item .city {
+    position: absolute;
+    z-index: 9;
+    top: 17px;
+    width: 100%;
+    padding-top: 18px;
+  }
+
+  .modal .item .city .checkBox {
+    width: 97%;
+    padding: 10px;
+    border: 1px solid #eee;
+    background-color: #fff;
+    max-height: 100px;
+    overflow-x: hidden;
+    overflow-y: auto;
+  }
+
+  .modal .item .city .checkBox .arrow {
+    position: absolute;
+    top: 3px;
+    width: 0;
+    height: 0;
+    border: 8px solid transparent;
+    border-bottom-color: #ddd;
+  }
+
+  .modal .item .city .checkBox .arrow:before {
+    position: absolute;
+    bottom: -8px;
+    right: -7px;
+    content: "";
+    width: 0;
+    height: 0;
+    border: 7px solid transparent;
+    border-bottom-color: #fff;
+  }
+
+  .modal .item .city .checkBox .itemn {
+    margin-bottom: 10px;
+  }
+
+  .radio {
+    padding: 5px 0;
+    font-size: 14px !important;
+  }
+
+  .red {
+    color: #ff0000;
+  }
+
+  .empty {
+    cursor: pointer;
+    margin-left:10px
+  }
+  .check-btn{
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: flex-end;
+  }
+</style>

+ 129 - 134
src/components/Editor/wang.vue

@@ -1,144 +1,139 @@
-<template>  
-    <div>
-      <div  ref='editor1' class="myedit"></div>
-    </div> 
-</template>  
-  
-<script>  
-  import E from 'wangeditor'  
-  export default {  
-    name: 'editoritem',  
-    data() {  
-      return {
-        uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadWang",
-        editor: null
-      }  
-    },
-    created() {
-       
-      
+<template>
+  <div>
+    <div ref='editor1' class="myedit"></div>
+  </div>
+</template>
+
+<script>
+import E from 'wangeditor'
+export default {
+  name: 'editoritem',
+  data() {
+    return {
+      uploadUrl: process.env.VUE_APP_BASE_API + "/common/uploadWang",
+      editor: null,
+      selectedImageCount: 0, // 记录选择的图片数量
+      uploadedImageCount: 0  // 记录已上传的图片数量
+    }
+  },
+  beforeDestroy() {
+    if (this.editor != null) {
+      this.editor.destroy()
+      this.editor = null
+    }
+  },
+  methods: {
+    initEditor() {
+      const that = this;
+      if (this.editor == null) {
+        this.editor = new E(that.$refs.editor1)
+        this.editor.config.uploadImgServer = this.uploadUrl;
+        this.editor.config.uploadImgMaxSize = 6 * 1024 * 1024 // 2M
+        this.editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
+        this.editor.config.uploadFileName = 'fileName'
+        this.editor.config.zIndex = 1
+
+        // 关键配置:允许多选,串行上传
+        this.editor.config.uploadImgMultiple = true;
+        this.editor.config.uploadImgMaxLength = 5;
+        this.editor.config.uploadImgConcurrent = 1;
+
+        this.editor.config.customUploadImg = function (files, insertImgFn) {
+          // 获取选择的图片数量
+          that.selectedImageCount = files.length;
+          that.uploadedImageCount = 0;
+          console.log(`已选择 ${that.selectedImageCount} 张图片,准备开始上传`);
+
+          that.$emit('image-selected', that.selectedImageCount);
+
+          const uploadNext = (index) => {
+            if (index >= files.length) {
+              console.log(`所有 ${files.length} 张图片上传处理完毕`);
+              that.$emit('all-images-uploaded', that.uploadedImageCount);
+              return;
+            }
+
+            const formData = new FormData();
+            formData.append(that.editor.config.uploadFileName, files[index]);
+
+            const xhr = new XMLHttpRequest();
+            xhr.open('POST', that.uploadUrl);
+
+            xhr.onload = function () {
+              if (xhr.status >= 200 && xhr.status < 300) {
+                const result = JSON.parse(xhr.responseText);
+                if (result.errno === 0 && result.data && result.data[0] && result.data[0].url) {
+                  insertImgFn(result.data[0].url);
+                  that.uploadedImageCount++;
+                  that.$emit('image-uploaded', that.uploadedImageCount, that.selectedImageCount);
+                } else {
+                  console.error(`第 ${index+1} 张图片上传失败:`, result);
+                  that.$emit('image-upload-error', index+1);
+                }
+              } else {
+                console.error(`第 ${index+1} 张图片上传请求失败:`, xhr.statusText);
+                that.$emit('image-upload-error', index+1);
+              }
+              uploadNext(index + 1);
+            };
+
+            xhr.onerror = function () {
+              console.error(`第 ${index+1} 张图片上传出错`);
+              that.$emit('image-upload-error', index+1);
+              uploadNext(index + 1);
+            };
+
+            // 发送请求
+            xhr.send(formData);
+          };
+
+          // 开始上传第一张
+          uploadNext(0);
+        };
+
+        this.editor.config.menus = [
+          'head', 'bold', 'fontSize', 'fontName', 'italic', 'underline',
+          'strikeThrough', 'indent', 'lineHeight', 'foreColor', 'backColor',
+          'link', 'list', 'todo', 'justify', 'quote', 'emoticon', 'image',
+          'table', 'code', 'splitLine', 'undo', 'redo'
+        ]
+
+        this.editor.config.onchange = function (newHtml) {
+          that.$emit("on-text-change", newHtml);
+        }
+
+        this.editor.config.pasteFilterStyle = false
+        this.editor.config.onchangeTimeout = 500
+
+        this.editor.create()
+      }
+      this.editor.txt.html("");
     },
-    beforeDestroy() {
-      // 销毁编辑器
-      if(this.editor!=null){
-        this.editor.destroy()
-        this.editor = null
+
+    setText(text) {
+      if (this.editor == null) {
+        this.initEditor()
       }
-      
+      this.editor.txt.html(text || "");
     },
-    methods:{
-      initEditor(){
-        var that=this;
-        if(this.editor==null){
-            //创建编辑器
-            this.editor = new E(that.$refs.editor1 )
-            this.editor.config.uploadImgServer = this.uploadUrl;
-            this.editor.config.uploadImgMaxSize = 2 * 1024 * 1024 // 2M
-            this.editor.config.uploadImgAccept = ['jpg', 'jpeg', 'png', 'gif', 'bmp', 'webp']
-            this.editor.config.uploadFileName = 'fileName'
-            this.editor.config.zIndex = 1
-            this.editor.config.menus = [
-              'head',
-              'bold',
-              'fontSize',
-              'fontName',
-              'italic',
-              'underline',
-              'strikeThrough',
-              'indent',
-              'lineHeight',
-              'foreColor',
-              'backColor',
-              'link',
-              'list',
-              'todo',
-              'justify',
-              'quote',
-              'emoticon',
-              'image',
-              // 'video',
-              'table',
-              'code',
-              'splitLine',
-              'undo',
-              'redo',
-          ]
-          this.editor.config.onchange = function (newHtml) {
-            console.log(newHtml)
-            that.$emit("on-text-change", newHtml);
-          }
-          this.editor.config.pasteFilterStyle = false
-          // 配置触发 onchange 的时间频率,默认为 200ms
-          this.editor.config.onchangeTimeout = 500 // 修改为 500ms
-            this.editor.config.uploadImgHooks = {
-                // 上传图片之前
-                before: function(xhr) {
-                    //console.log(xhr)
-                    
-                },
-                // 图片上传并返回了结果,图片插入已成功
-                success: function(xhr) {
-                    //console.log('success', xhr)
-                },
-                // 图片上传并返回了结果,但图片插入时出错了
-                fail: function(xhr, editor, resData) {
-                    console.log('fail', resData)
-                },
-                // 上传图片出错,一般为 http 请求的错误
-                error: function(xhr, editor, resData) {
-                    console.log('error', xhr, resData)
-                },
-                // 上传图片超时
-                timeout: function(xhr) {
-                    //console.log('timeout')
-                },
-                // 图片上传并返回了结果,想要自己把图片插入到编辑器中
-                // 例如服务器端返回的不是 { errno: 0, data: [...] } 这种格式,可使用 customInsert
-                customInsert: function(insertImg, result, editor) {
-                      console.log(result);
-                      // 图片上传并返回结果,自定义插入图片的事件(而不是编辑器自动插入图片!!!)
-                      // insertImg 是插入图片的函数,editor 是编辑器对象,result 是服务器端返回的结果
-                      // 举例:假如上传图片成功后,服务器端返回的是 {url:'....'} 这种格式,即可这样插入图片:
-                      var url =   result.data[0].url
-                      console.log(url);
-                      insertImg(url)
-                      // result 必须是一个 JSON 格式字符串!!!否则报错
-                }
-            }
-            this.editor.create()
-        }
-        this.editor.txt.html("");
-      },
-      setText(text){
-        if(this.editor==null){
-          this.initEditor()
-        }
-        if(text==undefined||text==null){
-          this.editor.txt.html("");
-        }
-        else{
-          this.editor.txt.html(text);
-        }
-        
-      },
-     }
-   
-  }  
-</script>  
-  
-<style scoped>
-.toolbar {
-  border: 1px solid #ccc;
+
+    getSelectedImageCount() {
+      return this.selectedImageCount;
+    },
+
+    getUploadedImageCount() {
+      return this.uploadedImageCount;
+    }
+  }
 }
+</script>
+
+<style scoped>
 .myedit {
   min-height: 300px;
   z-index: 1 !important;
 }
-.w-e-toolbar{
-  z-index: 1 !important;
-}
-.w-e-text-container{
+.w-e-toolbar, .w-e-text-container {
   z-index: 1 !important;
 }
- 
-</style>
+</style>

+ 4 - 71
src/views/his/user/index.vue

@@ -1,40 +1,6 @@
 <template>
   <div class="app-container">
     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
-      <el-form-item label="所属公司" prop="companyName">
-        <el-select
-          v-model="queryCompanyId"
-          placeholder="请选择所属公司"
-          clearable
-          filterable
-          size="small"
-          @change="handleQueryCompanyChange"
-        >
-          <el-option
-            v-for="item in companyQueryOptions"
-            :key="item.companyId"
-            :label="item.companyName"
-            :value="item.companyId">
-          </el-option>
-        </el-select>
-      </el-form-item>
-      <el-form-item label="所属销售" prop="companyUserId">
-
-        <el-select
-          v-model="queryCompanyUserId"
-          placeholder="请选择所属销售"
-          clearable
-          filterable
-          size="small"
-        >
-          <el-option
-            v-for="item in companyQueryUserOptions"
-            :key="item.userId"
-            :label="item.nickName"
-            :value="item.userId">
-          </el-option>
-        </el-select>
-      </el-form-item>
       <el-form-item label="会员ID" prop="userId">
         <el-input
           v-model="queryParams.userId"
@@ -149,8 +115,6 @@
               <dict-tag :options="userOptions" :value="scope.row.status"/>
          </template>
       </el-table-column>
-      <el-table-column label="所属公司" align="center" prop="companyName" />
-      <el-table-column label="所属销售" align="center" prop="companyUserNickName" />
       <el-table-column label="用户备注" align="center" prop="remark" />
       <el-table-column label="上级昵称" align="center" prop="tuiName" />
       <el-table-column label="app来源" align="center" prop="source" />
@@ -262,10 +226,6 @@ export default {
   components: {userDetails,userDetailsByNew},
   data() {
     return {
-      companyQueryOptions:[],
-      companyQueryUserOptions:[],
-      queryCompanyId:null,
-      queryCompanyUserId:null,
       companyName: null,
       companyUserNickName: null,
       companyOptions: [],
@@ -322,6 +282,7 @@ export default {
         isBuy:null,
         source:null,
         companyName: null,
+        userId: null
       },
       // 表单参数
       form: {},
@@ -369,10 +330,6 @@ export default {
     this.getDicts("sys_company_or").then(response => {
       this.orOptions = response.data;
     });
-    getCompanyList().then(response => {
-        if (response.code === 200) {
-          this.companyQueryOptions = response.data;
-        }});
   },
   methods: {
     /** 销售选择变化 */
@@ -398,26 +355,6 @@ export default {
                  this.$refs.userDetailsByNew.getDetails(row.userId);
             }, 1);
      },
-     handleQueryCompanyChange(companyId){
-      // 清空已选择的销售
-      this.queryCompanyUserId = null;
-      // 根据公司ID获取对应的销售列表
-      if (companyId) {
-        getCompanyUserList({ companyId: companyId }).then(response => {
-          if (response.code === 200) {
-            this.companyQueryUserOptions = response.data;
-          } else {
-            this.$message.error(response.msg || '获取销售列表失败');
-            this.companyQueryUserOptions = [];
-          }
-        }).catch(() => {
-          this.$message.error('获取销售列表失败');
-          this.companyQueryUserOptions = [];
-        });
-      } else {
-        this.companyQueryUserOptions = [];
-      }
-     },
     /** 查询用户列表 */
     getList() {
       this.loading = true;
@@ -460,8 +397,6 @@ export default {
     /** 搜索按钮操作 */
     handleQuery() {
       this.queryParams.pageNum = 1;
-      this.queryParams.companyId = this.queryCompanyId;
-      this.queryParams.companyUserId = this.queryCompanyUserId;
       this.getList();
     },
     /** 重置按钮操作 */
@@ -470,10 +405,6 @@ export default {
        this.createTime=null;
       this.queryParams.sTime=null;
       this.queryParams.eTime=null;
-      this.queryParams.companyName = null;
-      this.queryParams.companyUserNickName = null;
-      this.queryParams.companyId = null;
-      this.queryParams.companyUserId = null;
       this.handleQuery();
     },
     // 多选框选中数据
@@ -575,7 +506,9 @@ export default {
         }).then(response => {
           this.download(response.msg);
           this.exportLoading = false;
-        }).catch(() => {});
+        }).catch(() => {
+          this.exportLoading = false;
+      });
     },
   }
 };

+ 15 - 12
src/views/his/user/indexProject.vue

@@ -30,7 +30,7 @@
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-      <el-form-item label="注册时间" prop="createTimeRange">
+      <el-form-item label="绑定时间" prop="createTimeRange">
         <el-date-picker clearable size="small" style="width: 340px"
                         v-model="dateRange"
                         type="daterange"
@@ -186,7 +186,7 @@
       <el-table-column label="用户余额" align="center" prop="nowMoney" />
       <!--      <el-table-column label="推广佣金" align="center" prop="brokeragePrice" />-->
       <el-table-column label="积分" align="center" prop="integral" />
-      <el-table-column label="会员注册时间" align="center" prop="createTime" />
+      <el-table-column label="绑定时间" align="center" prop="bindTime" width="100" />
       <!--      <el-table-column label="累计消费金额" align="center" prop="totalAmount" />-->
       <!--      <el-table-column label="上次消费时间" align="center" prop="lastBuyTime" />-->
       <!--      <el-table-column label="上次消费金额(元)" align="center" prop="number" />-->
@@ -226,13 +226,13 @@
       </el-table-column>
       <el-table-column label="操作" align="center"  width="150px"   class-name="small-padding fixed-width">
         <template slot-scope="scope">
-          <el-button
-            size="mini"
-            type="text"
-            icon="el-icon-edit"
-            @click="handleUpdate(scope.row)"
-            v-hasPermi="['store:user:edit']"
-          >修改</el-button>
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-edit"-->
+<!--            @click="handleUpdate(scope.row)"-->
+<!--            v-hasPermi="['store:user:edit']"-->
+<!--          >修改</el-button>-->
 
           <el-button
             size="mini"
@@ -450,7 +450,8 @@ export default {
         startCreateTime: null,
         endCreateTime: null,
         companyId: null,
-        companyUserNickName: null
+        companyUserNickName: null,
+        userId: null
       },
       // 表单参数
       form: {},
@@ -489,7 +490,7 @@ export default {
     };
   },
   created() {
-    this.getDicts("user_status").then((response) => {
+    this.getDicts("project_user_status").then((response) => {
       this.statusOptions = response.data;
     });
     this.getDicts("user_level").then((response) => {
@@ -598,6 +599,8 @@ export default {
       this.queryParams.companyId = null;
       this.queryParams.companyUserNickName = null;
       this.companyQueryUserOptions = null;
+      this.queryParams.startCreateTime = null
+      this.queryParams.endCreateTime = null
       this.handleQuery();
     },
     /** 处理日期范围变化 */
@@ -649,7 +652,7 @@ export default {
         }else {
           this.form.status = null;
         }
-        
+
         this.open = true;
         this.title = "修改用户";
       });

+ 492 - 0
src/views/hisStore/adv/index.vue

@@ -0,0 +1,492 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="广告位置" prop="advType">
+        <el-select v-model="queryParams.advType" placeholder="请选择广告位置" clearable size="small">
+          <el-option
+                v-for="item in advTypeOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="显示类型" prop="showType">
+        <el-select v-model="queryParams.showType" placeholder="请选择显示类型" clearable size="small">
+           <el-option
+                v-for="item in showTypeOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </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="primary"
+          plain
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['store:adv:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          plain
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['store:adv:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          plain
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['store:adv:remove']"
+        >删除</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table  height="500" border v-loading="loading" :data="advList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="advId" />
+      <el-table-column label="广告标题" align="center" prop="advTitle" />
+      <el-table-column label="广告图片" align="center" width="120">
+        <template slot-scope="scope">
+          <el-popover
+            placement="right"
+            title=""
+            trigger="hover"
+          >
+            <img slot="reference" :src="scope.row.imageUrl" width="100">
+            <img :src="scope.row.imageUrl" style="max-width: 150px;">
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="URL地址" show-overflow-tooltip align="center" prop="advUrl" />
+      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column  label="广告位置" align="center" prop="advType">
+        <template slot-scope="scope">
+            <el-tag prop="advType" v-for="(item, index) in advTypeOptions"    v-if="scope.row.advType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column  label="显示方式" align="center" prop="showType">
+        <template slot-scope="scope">
+             <el-tag prop="showType" v-for="(item, index) in showTypeOptions"    v-if="scope.row.showType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column  label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+            <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['store:adv:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['store:adv:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改广告对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="680px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="广告标题" prop="advTitle">
+          <el-input v-model="form.advTitle" placeholder="请输入广告标题" />
+        </el-form-item>
+        <el-form-item label="展示类型" prop="urlType">
+          <el-radio-group v-model="form.urlType">
+            <el-radio :label="1">图片</el-radio>
+            <el-radio :label="2">视频</el-radio>
+          </el-radio-group>
+        </el-form-item>
+         <el-form-item label="广告图片" prop="imageUrl" v-if="form.urlType==1">
+            <el-upload
+              v-model="form.icon"
+              class="avatar-uploader"
+              :action="uploadUrl"
+              :show-file-list="false"
+              :on-success="handleAvatarSuccess"
+              :before-upload="beforeAvatarUpload">
+              <img v-if="form.imageUrl" :src="form.imageUrl" class="avatar">
+              <i v-else class="el-icon-plus avatar-uploader-icon"></i>
+            </el-upload>
+        </el-form-item>
+        <el-form-item label="广告视频" prop="video" v-if="form.urlType==2">
+          <div>
+            <el-upload
+              ref="upload"
+              class="upload-demo"
+              :action="uploadUrl"
+              :on-success="handleSuccess"
+              :before-upload="beforeUpload"
+              :limit="1"
+              :accept="videoAccept"
+            >
+              <el-button size="small" type="primary">点击上传视频</el-button>
+            </el-upload>
+            <video v-if="form.imageUrl" :src="form.imageUrl" controls style="max-width: 300px; max-height: 300px; margin-top: 10px"></video>
+          </div>
+        </el-form-item>
+
+        <el-form-item label="广告位置" prop="advType">
+          <el-radio-group v-model="form.advType">
+            <el-radio :label="item.dictValue" v-for="item in advTypeOptions" >{{item.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="显示方式" prop="showType" v-if="form.urlType==1">
+          <el-radio-group @change="showTypeChange" v-model="form.showType">
+            <el-radio :label="item.dictValue" v-for="item in showTypeOptions" >{{item.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="公众号链接" prop="advUrl" v-if="form.showType==1 && form.urlType==1 " >
+          <el-input v-model="form.advUrl" placeholder="请输入公众号链接" />
+        </el-form-item>
+        <el-form-item label="小程序地址" prop="advUrl" v-if="form.showType==2 && form.urlType==1 ">
+          <el-input v-model="form.advUrl" placeholder="请输入小程序地址" />
+        </el-form-item>
+        <el-form-item label="文章内容" v-if="form.showType==3 && form.urlType==1 ">
+          <editor ref="myeditor" @on-text-change="updateText" />
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio :label="item.dictValue" v-for="item in statusOptions" >{{item.dictLabel}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="排序" prop="sort">
+           <el-input-number v-model="form.sort"  :min="1" :max="99" ></el-input-number>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listAdv, getAdv, delAdv, addAdv, updateAdv, exportAdv } from "@/api/hisStore/adv";
+import Editor from '@/components/Editor/wang';
+export default {
+  name: "Adv",
+  components: {
+    Editor
+  },
+  data() {
+    return {
+      uploadUrl:process.env.VUE_APP_BASE_API+"/common/uploadOSS",
+      baseUrl: process.env.VUE_APP_BASE_API,
+      videoAccept:"video/*",
+      statusOptions:[],
+      advTypeOptions:[],
+      showTypeOptions:[],
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 广告表格数据
+      advList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        advTitle: null,
+        imageUrl: null,
+        advUrl: null,
+        content: null,
+        status: null,
+        sort: null,
+        advType: null,
+        showType: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        advTitle: [
+          { required: true, message: "广告标题不能为空", trigger: "blur" }
+        ],
+        imageUrl: [
+          { required: true, message: "广告图不能为空", trigger: "blur" }
+        ],
+
+      }
+    };
+  },
+  created() {
+    this.getDicts("common_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("adv_adv_type").then((response) => {
+      this.advTypeOptions = response.data;
+    });
+    this.getDicts("adv_show_type").then((response) => {
+      this.showTypeOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+    handleSuccess(response, file) {
+      // 上传成功后的回调函数
+      this.myloading.close();
+      this.form.imageUrl = response.url;
+      this.$refs.upload.clearFiles();
+    },
+    beforeUpload(file) {
+      // 上传前的钩子函数,可以在这里对文件进行处理
+      // 返回 false 则取消上传
+
+      // 例如限制文件大小
+      const isLt2M = file.size / 1024 / 1024 < 200;
+      if (!isLt2M) {
+        this.$message.error('上传视频文件大小不能超过 200MB!');
+        return false;
+      }
+      this.myloading = this.$loading({
+        lock: true,
+        text: '上传中',
+        spinner: 'el-icon-loading',
+        background: 'rgba(0, 0, 0, 0.7)'
+      });
+
+    },
+    showTypeChange(e){
+      console.log(e)
+      if(e==3){
+        setTimeout(() => {
+          this.$refs.myeditor.setText("");
+        }, 200);
+      }
+    },
+    updateText(text){
+      this.form.content=text
+    },
+    handleAvatarSuccess(res, file) {
+        if(res.code==200){
+          this.form.imageUrl=res.url;
+        }
+        else{
+          this.msgError(res.msg);
+        }
+
+    },
+    beforeAvatarUpload(file) {
+      const isLt1M = file.size / 1024 / 1024 < 200;
+      if (!isLt1M) {
+        this.$message.error('上传图片大小不能超过 200MB!');
+      }
+      return   isLt1M;
+    },
+    /** 查询广告列表 */
+    getList() {
+      this.loading = true;
+      listAdv(this.queryParams).then(response => {
+        this.advList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        advId: null,
+        urlType:1,
+        advTitle: null,
+        imageUrl: null,
+        advUrl: null,
+        content: null,
+        createTime: null,
+        updateTime: null,
+        status: "1",
+        sort: null,
+        advType: null,
+        showType: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.advId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加广告";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const advId = row.advId || this.ids
+      var that=this;
+      getAdv(advId).then(response => {
+        this.form = response.data;
+        this.form.status = response.data.status.toString();
+        this.form.advType = response.data.advType.toString();
+        this.form.showType = response.data.showType ? response.data.showType.toString() : "";
+        this.open = true;
+        this.title = "修改广告";
+        setTimeout(() => {
+          if(this.form.showType=="3"){
+            console.log(that.form.content)
+            if(this.form.content==null){
+                that.$refs.myeditor.setText("");
+            }
+            else{
+                that.$refs.myeditor.setText(that.form.content);
+            }
+          }
+        }, 200);
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.advId != null) {
+            updateAdv(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addAdv(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const advIds = row.advId || this.ids;
+      this.$confirm('是否确认删除广告编号为"' + advIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delAdv(advIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有广告数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportAdv(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>
+<style >
+ .avatar-uploader .el-upload {
+    border: 1px dashed #d9d9d9;
+    border-radius: 6px;
+    cursor: pointer;
+    position: relative;
+    overflow: hidden;
+  }
+  .avatar-uploader .el-upload:hover {
+    border-color: #409EFF;
+  }
+</style>
+<style scoped>
+
+  .avatar-uploader-icon {
+    font-size: 28px;
+    color: #8c939d;
+    width: 300px;
+    height: 150px;
+    line-height: 150px;
+    text-align: center;
+  }
+  .avatar {
+    width: 300px;
+    height: 150px;
+    display: block;
+  }
+
+
+</style>
+

+ 394 - 0
src/views/hisStore/express/index.vue

@@ -0,0 +1,394 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="公司名称" prop="name">
+        <el-input
+          v-model="queryParams.name"
+          placeholder="请输入快递公司名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" 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="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['store:express:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['store:express:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['store:express:remove']"
+        >删除</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table  height="500" border v-loading="loading" :data="expressList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="id" />
+      <el-table-column label="快递公司编号" align="center" prop="code" />
+      <el-table-column label="快递公司" align="center" prop="name" />
+      <el-table-column label="OMS编号" align="center" prop="omsCode" />
+      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleAllot(scope.row)"
+            v-hasPermi="['store:express:allot']"
+          >分配公司</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['store:express:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['store:express:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改快递公司对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="快递公司简称" prop="code">
+          <el-input v-model="form.code" placeholder="请输入快递公司简称" />
+        </el-form-item>
+        <el-form-item label="快递公司全称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入快递公司全称" />
+        </el-form-item>
+        <el-form-item label="OMS编号" prop="omsCode">
+          <el-input v-model="form.omsCode" placeholder="请输入快递公司简称" />
+        </el-form-item>
+        <el-form-item label="排序" prop="sort">
+          <el-input-number :min="0"  v-model="form.sort" placeholder="请输入排序" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <el-dialog :title="allot.title" :visible.sync="allot.open" width="1100px"   append-to-body>
+      <el-transfer
+        filterable
+        width="960px"
+        :filter-method="filterMethod"
+        filter-placeholder="请输入公司名称"
+        v-model="value"
+        :titles="['所有公司', '已选公司']"
+        :right-default-checked="value"
+        :data="allCompanies">
+      </el-transfer>
+      <div slot="footer" class="dialog-footer">
+          <el-button type="primary" @click="handleAllotCompany">分 配</el-button>
+          <el-button @click="cancel1">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listExpress, getExpress, delExpress, addExpress, updateExpress, exportExpress ,allotExpress ,getExpressList,getCompanyByOmsCode} from "@/api/hisStore/express";
+import { getCompanyList} from "@/api/company/company";
+export default {
+  name: "Express",
+  data() {
+    return {
+
+      formId:null,
+        value: [],
+        value2:[],
+        filterMethod(query, item) {
+          return item.label.indexOf(query) > -1;
+        },
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      allCompanies:undefined,
+      allot:{
+        title:"分配公司",
+        open:false,
+      },
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 快递公司表格数据
+      expressList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        code: null,
+        name: null,
+        sort: null,
+        isShow: null,
+        isDel: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        code: [
+          { required: true, message: "快递公司简称不能为空", trigger: "blur" }
+        ],
+        omsCode: [
+          { required: true, message: "OMS编号不能为空", trigger: "blur" }
+        ],
+        name: [
+          { required: true, message: "快递公司全称不能为空", trigger: "blur" }
+        ],
+        sort: [
+          { required: true, message: "排序不能为空", trigger: "blur" }
+        ],
+        isShow: [
+          { required: true, message: "是否显示不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+
+  },
+
+  methods: {
+    handleAllotCompany(){
+      console.log(this.value);
+      allotExpress(this.value,this.formId).then(response => {
+      if (response.code === 200) {
+      this.msgSuccess("修改成功");
+      this.allot.open = false;
+      this.getList();
+      }
+      });
+    },
+
+    /** 查询快递公司列表 */
+    getList() {
+      this.loading = true;
+      listExpress(this.queryParams).then(response => {
+        this.expressList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    cancel1() {
+      this.allot.open = false;
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        code: null,
+        omsCode: null,
+        name: null,
+        sort: null,
+        isShow: null,
+        createTime: null,
+        updateTime: null,
+        isDel: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加快递公司";
+    },
+    /**分配公司按钮 */
+    handleAllot(row){
+      this.allot.open = true;
+      this.formId = row.omsCode;
+      getCompanyList().then(response => {
+      let data = [];
+      response.data.forEach((item,index) => {
+        data.push({
+          key: item.companyId,
+          label:item.companyName,
+        })
+      });
+      this.allCompanies = data;
+    });
+    const omsCode = row.omsCode;
+    getCompanyByOmsCode(omsCode).then(response => {
+      this.value = response.data2
+      console.log(this.value);
+    });
+
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getExpress(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改快递公司";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateExpress(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addExpress(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除快递公司编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delExpress(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有快递公司数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportExpress(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  },
+};
+</script>
+<style scoped lang="scss">
+.container {
+  display: flex;
+  justify-content: space-between;
+  margin-bottom: 20px;
+}
+.box {
+  width: 300px;
+}
+.el-scrollbar {
+  max-height: 300px;
+  overflow-y: auto; /* 添加滚动条 */
+}
+/* 新增样式 */
+.container {
+  display: flex;
+  justify-content: center;
+  align-items: flex-start;
+}
+.box {
+  margin: 0 10px;
+}
+
+/deep/.el-transfer-panel {
+    width:40%;
+}
+/deep/.el-transfer-panel__body{
+  height: 450px;
+}
+/deep/.el-transfer-panel__list.is-filterable {
+   height: 88%;
+}
+
+</style>
+

+ 443 - 0
src/views/hisStore/shippingTemplates/index.vue

@@ -0,0 +1,443 @@
+<template>
+  <div class="app-container">
+
+    <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="['store:shippingTemplates:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['store:shippingTemplates:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['store:shippingTemplates:remove']"
+        >删除</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table  height="500" border v-loading="loading" :data="shippingTemplatesList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="模板ID" align="center" prop="id" />
+      <el-table-column label="模板名称" align="center" prop="name" />
+      <el-table-column label="计费方式" align="center" prop="type" >
+          <template slot-scope="scope">
+              <el-tag prop="type" v-for="(item, index) in typeOptions"    v-if="scope.row.type==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column label="指定包邮开关" align="center" prop="appoint" >
+          <template slot-scope="scope">
+              <el-tag prop="type" v-for="(item, index) in appointOptions"    v-if="scope.row.appoint==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column label="添加时间" align="center" prop="createTime" />
+      <el-table-column label="排序" align="center" prop="sort" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['store:shippingTemplates:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['store:shippingTemplates:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改运费模板对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="130px">
+        <el-form-item label="模板名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入模板名称" />
+        </el-form-item>
+        <el-form-item label="计费方式" prop="type">
+            <el-radio-group v-model="form.type" >
+               <el-radio :label="item.dictValue" v-for="item in typeOptions" >{{item.dictLabel}}</el-radio>-radio>
+            </el-radio-group>
+        </el-form-item>
+        <el-row :gutter="24" type="flex">
+          <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+            <el-form-item class="label" label="配送区域及运费:" props="state">
+              <el-table
+                ref="table"
+                :data="templateList"
+                empty-text="暂无数据"
+                border
+              >
+                <el-table-column prop="regionName" label="可配送区域" width="130" />
+                <el-table-column prop="first" label="首件" width="120">
+                  <template slot="header" slot-scope="scope">
+                    <span v-if="form.type == 1">首件</span>
+                    <span v-else-if="form.type == 2">首件重量(KG)</span>
+                    <span v-else>首件体积(m³)</span>
+                  </template>
+                  <template slot-scope="scope">
+                    <span><el-input type="text" v-model="scope.row.first" /></span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="price" label="运费(元)" width="110">
+                  <template slot-scope="scope">
+                    <span><el-input type="text" v-model="scope.row.price"/></span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="_continue" label="续件" width="120">
+                  <template slot="header" slot-scope="scope">
+                    <span v-if="form.type == 1">续件</span>
+                    <span v-else-if="form.type == 2">续件重量(KG)</span>
+                    <span v-else>续件体积(m³)</span>
+                  </template>
+                  <template slot-scope="scope">
+                    <span><el-input type="text" v-model="scope.row.continues"/></span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="continuePrice" label="续费(元)" width="110">
+                  <template slot-scope="scope">
+                    <span><el-input type="text" v-model="scope.row.continuePrice"/></span>
+                  </template>
+                </el-table-column>
+                <el-table-column  label="操作">
+                  <template slot-scope="scope">
+                    <a v-if="scope.row.regionName!=='默认全国'" @click="delCity(scope.row.index,1)">删除</a>
+                  </template>
+                </el-table-column>
+
+              </el-table>
+              <el-row type="flex" class="addTop">
+                <el-col>
+                  <el-button size="small" type="primary" icon="md-add" @click="addCity(1)">单独添加配送区域</el-button>
+                </el-col>
+              </el-row>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row :gutter="24" type="flex">
+          <el-col :xl="24" :lg="24" :md="24" :sm="24" :xs="24">
+            <el-form-item label="指定包邮:" prop="appoint">
+              <el-radio-group v-model="form.appoint" >
+                    <el-radio :label="item.dictValue" v-for="item in appointOptions" >{{item.dictLabel}}</el-radio>-radio>
+                  </el-radio-group>
+              <el-table
+                ref="table"
+                :data="appointList"
+                empty-text="暂无数据"
+                border
+                v-if="form.appoint === '1'"
+              >
+                <el-table-column prop="placeName" label="选择地区" />
+                <el-table-column prop="a_num" label="包邮件数" width="120" >
+                  <template slot="header" slot-scope="scope">
+                    <span v-if="form.type == 1">包邮件数</span>
+                    <span v-else-if="form.type == 2">包邮重量(KG)</span>
+                    <span v-else>包邮体积(m³)</span>
+                  </template>
+                  <template slot-scope="scope">
+                    <span><el-input type="text" v-model="scope.row.number"/></span>
+                  </template>
+                </el-table-column>
+                <el-table-column prop="price" label="包邮金额(元)" width="120">
+                  <template slot-scope="scope">
+                    <span><el-input type="text" v-model="scope.row.price"/></span>
+                  </template>
+                </el-table-column>
+                <el-table-column  label="操作">
+                  <template slot-scope="scope">
+                    <a v-if="scope.row.regionName!=='默认全国'" @click="delCity(scope.row.index,2)">删除</a>
+                  </template>
+                </el-table-column>
+
+              </el-table>
+              <el-row type="flex" v-if="form.appoint === '1'">
+                <el-col>
+                  <el-button size="small" type="primary" icon="md-add" @click="addCity(2)">单独指定包邮</el-button>
+                </el-col>
+              </el-row>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-form-item label="排序" prop="sort">
+          <el-input-number :min="0"  v-model="form.sort" placeholder="请输入排序" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <city ref="city" @selectCity="selectCity" :type="type"></city>
+  </div>
+</template>
+
+<script>
+import { listShippingTemplates, getShippingTemplates, delShippingTemplates, addShippingTemplates, updateShippingTemplates, exportShippingTemplates } from "@/api/hisStore/shippingTemplates";
+import City from '@/components/City'
+export default {
+  name: "ShippingTemplates",
+  components: {
+    City
+  },
+  data() {
+    return {
+      type:0,
+      appointList:[],
+      templateList:[],
+      appointOptions:[],
+      typeOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 运费模板表格数据
+      shippingTemplatesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        name: null,
+        type: null,
+        regionInfo: null,
+        appoint: null,
+        appointInfo: null,
+        isDel: null,
+        sort: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [
+          { required: true, message: "名称不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getDicts("store_shipping_type").then((response) => {
+      this.typeOptions = response.data;
+    });
+    this.getDicts("store_shipping_appoint").then((response) => {
+      this.appointOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+    delCity (index,type) {
+      console.log(index)
+      if (type === 1) {
+        this.templateList.splice(index, 1);
+      } else {
+        this.appointList.splice(index, 1);
+      }
+    },
+    selectCity: function (data, type) {
+      let cityName = data.map(function (item) {
+        return item.name;
+      }).join(';');
+      switch (type) {
+        case 1:
+          this.templateList.push({
+            region: data,
+            regionName: cityName,
+            first: 1,
+            price: 0,
+            continues: 1,
+            continuePrice: 0
+          });
+          break;
+        case 2:
+          this.appointList.push({
+            place: data,
+            placeName: cityName,
+            number: 0,
+            price: 0
+          });
+          break;
+      }
+    },
+    // 单独添加配送区域
+    addCity (type) {
+      this.$refs.city.addressView = true;
+      this.type = type;
+      this.$refs.city.getCityList()
+    },
+    /** 查询运费模板列表 */
+    getList() {
+      this.loading = true;
+      listShippingTemplates(this.queryParams).then(response => {
+        this.shippingTemplatesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        name: null,
+        type: "1",
+        appoint: "0",
+        createTime: null,
+        updateTime: null,
+        isDel: null,
+        sort: null
+      };
+      this.templateList = [
+        {
+          region: [
+            {
+              name: '默认全国',
+              cityId: 0
+            }
+          ],
+          regionName: '默认全国',
+          first: 1,
+          price: 0,
+          continues: 1,
+          continuePrice: 0
+        }
+      ];
+      this.appointList=[],
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加运费模板";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getShippingTemplates(id).then(response => {
+        this.form = response.data;
+        this.form.type = response.data.type.toString();
+        this.form.appoint = response.data.appoint.toString();
+        this.appointList=JSON.parse(this.form.appointInfo)
+        this.templateList=JSON.parse(this.form.regionInfo)
+        this.open = true;
+        this.title = "修改运费模板";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          this.form.regionInfo=this.templateList;
+          this.form.appointInfo=this.appointList;
+          if (this.form.id != null) {
+            updateShippingTemplates(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addShippingTemplates(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除运费模板编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delShippingTemplates(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有运费模板数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportShippingTemplates(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 366 - 0
src/views/hisStore/shippingTemplatesFree/index.vue

@@ -0,0 +1,366 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="模板ID" prop="tempId">
+        <el-input
+          v-model="queryParams.tempId"
+          placeholder="请输入模板ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="省ID" prop="provinceId">
+        <el-input
+          v-model="queryParams.provinceId"
+          placeholder="请输入省ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="城市ID" prop="cityId">
+        <el-input
+          v-model="queryParams.cityId"
+          placeholder="请输入城市ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="包邮件数" prop="number">
+        <el-input
+          v-model="queryParams.number"
+          placeholder="请输入包邮件数"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="包邮金额" prop="price">
+        <el-input
+          v-model="queryParams.price"
+          placeholder="请输入包邮金额"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="计费方式" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择计费方式" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="产品ID" prop="productId">
+        <el-input
+          v-model="queryParams.productId"
+          placeholder="请输入产品ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" 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="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['store:shippingTemplatesFree:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['store:shippingTemplatesFree:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['store:shippingTemplatesFree:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['store:shippingTemplatesFree:export']"
+        >导出</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="shippingTemplatesFreeList" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="模板ID" align="center" prop="tempId" />
+      <el-table-column label="省ID" align="center" prop="provinceId" />
+      <el-table-column label="城市ID" align="center" prop="cityId" />
+      <el-table-column label="包邮件数" align="center" prop="number" />
+      <el-table-column label="包邮金额" align="center" prop="price" />
+      <el-table-column label="计费方式" align="center" prop="type" />
+      <el-table-column label="产品ID" align="center" prop="productId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['store:shippingTemplatesFree:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['store:shippingTemplatesFree:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改免邮费对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="模板ID" prop="tempId">
+          <el-input v-model="form.tempId" placeholder="请输入模板ID" />
+        </el-form-item>
+        <el-form-item label="省ID" prop="provinceId">
+          <el-input v-model="form.provinceId" placeholder="请输入省ID" />
+        </el-form-item>
+        <el-form-item label="城市ID" prop="cityId">
+          <el-input v-model="form.cityId" placeholder="请输入城市ID" />
+        </el-form-item>
+        <el-form-item label="包邮件数" prop="number">
+          <el-input v-model="form.number" placeholder="请输入包邮件数" />
+        </el-form-item>
+        <el-form-item label="包邮金额" prop="price">
+          <el-input v-model="form.price" placeholder="请输入包邮金额" />
+        </el-form-item>
+        <el-form-item label="计费方式" prop="type">
+          <el-select v-model="form.type" placeholder="请选择计费方式">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="产品ID" prop="productId">
+          <el-input v-model="form.productId" placeholder="请输入产品ID" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listShippingTemplatesFree, getShippingTemplatesFree, delShippingTemplatesFree, addShippingTemplatesFree, updateShippingTemplatesFree, exportShippingTemplatesFree } from "@/api/hisStore/shippingTemplatesFree";
+
+export default {
+  name: "ShippingTemplatesFree",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 免邮费表格数据
+      shippingTemplatesFreeList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        tempId: null,
+        provinceId: null,
+        cityId: null,
+        number: null,
+        price: null,
+        type: null,
+        productId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        tempId: [
+          { required: true, message: "模板ID不能为空", trigger: "blur" }
+        ],
+        provinceId: [
+          { required: true, message: "省ID不能为空", trigger: "blur" }
+        ],
+        cityId: [
+          { required: true, message: "城市ID不能为空", trigger: "blur" }
+        ],
+        number: [
+          { required: true, message: "包邮件数不能为空", trigger: "blur" }
+        ],
+        price: [
+          { required: true, message: "包邮金额不能为空", trigger: "blur" }
+        ],
+        type: [
+          { required: true, message: "计费方式不能为空", trigger: "change" }
+        ],
+        productId: [
+          { required: true, message: "产品ID不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询免邮费列表 */
+    getList() {
+      this.loading = true;
+      listShippingTemplatesFree(this.queryParams).then(response => {
+        this.shippingTemplatesFreeList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        tempId: null,
+        provinceId: null,
+        cityId: null,
+        number: null,
+        price: null,
+        type: null,
+        productId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加免邮费";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getShippingTemplatesFree(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改免邮费";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateShippingTemplatesFree(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addShippingTemplatesFree(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除免邮费编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delShippingTemplatesFree(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有免邮费数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportShippingTemplatesFree(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 402 - 0
src/views/hisStore/shippingTemplatesRegion/index.vue

@@ -0,0 +1,402 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="省ID" prop="provinceId">
+        <el-input
+          v-model="queryParams.provinceId"
+          placeholder="请输入省ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="模板ID" prop="tempId">
+        <el-input
+          v-model="queryParams.tempId"
+          placeholder="请输入模板ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="城市ID" prop="cityId">
+        <el-input
+          v-model="queryParams.cityId"
+          placeholder="请输入城市ID"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="首件" prop="first">
+        <el-input
+          v-model="queryParams.first"
+          placeholder="请输入首件"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="首件运费" prop="firstPrice">
+        <el-input
+          v-model="queryParams.firstPrice"
+          placeholder="请输入首件运费"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="续件" prop="continues">
+        <el-input
+          v-model="queryParams.continues"
+          placeholder="请输入续件"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="续件运费" prop="continuePrice">
+        <el-input
+          v-model="queryParams.continuePrice"
+          placeholder="请输入续件运费"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="计费方式" prop="type">
+        <el-select v-model="queryParams.type" placeholder="请选择计费方式" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="分组唯一值" prop="productId">
+        <el-input
+          v-model="queryParams.productId"
+          placeholder="请输入分组唯一值"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="cyan" 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="primary"
+          icon="el-icon-plus"
+          size="mini"
+          @click="handleAdd"
+          v-hasPermi="['store:shippingTemplatesRegion:add']"
+        >新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="success"
+          icon="el-icon-edit"
+          size="mini"
+          :disabled="single"
+          @click="handleUpdate"
+          v-hasPermi="['store:shippingTemplatesRegion:edit']"
+        >修改</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="danger"
+          icon="el-icon-delete"
+          size="mini"
+          :disabled="multiple"
+          @click="handleDelete"
+          v-hasPermi="['store:shippingTemplatesRegion:remove']"
+        >删除</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['store:shippingTemplatesRegion:export']"
+        >导出</el-button>
+      </el-col>
+	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table v-loading="loading" :data="shippingTemplatesRegionList" @selection-change="handleSelectionChange" border>
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="编号" align="center" prop="id" />
+      <el-table-column label="省ID" align="center" prop="provinceId" />
+      <el-table-column label="模板ID" align="center" prop="tempId" />
+      <el-table-column label="城市ID" align="center" prop="cityId" />
+      <el-table-column label="首件" align="center" prop="first" />
+      <el-table-column label="首件运费" align="center" prop="firstPrice" />
+      <el-table-column label="续件" align="center" prop="continues" />
+      <el-table-column label="续件运费" align="center" prop="continuePrice" />
+      <el-table-column label="计费方式" align="center" prop="type" />
+      <el-table-column label="分组唯一值" align="center" prop="productId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-edit"
+            @click="handleUpdate(scope.row)"
+            v-hasPermi="['store:shippingTemplatesRegion:edit']"
+          >修改</el-button>
+          <el-button
+            size="mini"
+            type="text"
+            icon="el-icon-delete"
+            @click="handleDelete(scope.row)"
+            v-hasPermi="['store:shippingTemplatesRegion:remove']"
+          >删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+
+    <pagination
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+
+    <!-- 添加或修改邮费区域对话框 -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="省ID" prop="provinceId">
+          <el-input v-model="form.provinceId" placeholder="请输入省ID" />
+        </el-form-item>
+        <el-form-item label="模板ID" prop="tempId">
+          <el-input v-model="form.tempId" placeholder="请输入模板ID" />
+        </el-form-item>
+        <el-form-item label="城市ID" prop="cityId">
+          <el-input v-model="form.cityId" placeholder="请输入城市ID" />
+        </el-form-item>
+        <el-form-item label="首件" prop="first">
+          <el-input v-model="form.first" placeholder="请输入首件" />
+        </el-form-item>
+        <el-form-item label="首件运费" prop="firstPrice">
+          <el-input v-model="form.firstPrice" placeholder="请输入首件运费" />
+        </el-form-item>
+        <el-form-item label="续件" prop="continues">
+          <el-input v-model="form.continues" placeholder="请输入续件" />
+        </el-form-item>
+        <el-form-item label="续件运费" prop="continuePrice">
+          <el-input v-model="form.continuePrice" placeholder="请输入续件运费" />
+        </el-form-item>
+        <el-form-item label="计费方式" prop="type">
+          <el-select v-model="form.type" placeholder="请选择计费方式">
+            <el-option label="请选择字典生成" value="" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="分组唯一值" prop="productId">
+          <el-input v-model="form.productId" placeholder="请输入分组唯一值" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listShippingTemplatesRegion, getShippingTemplatesRegion, delShippingTemplatesRegion, addShippingTemplatesRegion, updateShippingTemplatesRegion, exportShippingTemplatesRegion } from "@/api/hisStore/shippingTemplatesRegion";
+
+export default {
+  name: "ShippingTemplatesRegion",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 邮费区域表格数据
+      shippingTemplatesRegionList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        provinceId: null,
+        tempId: null,
+        cityId: null,
+        first: null,
+        firstPrice: null,
+        continues: null,
+        continuePrice: null,
+        type: null,
+        productId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        provinceId: [
+          { required: true, message: "省ID不能为空", trigger: "blur" }
+        ],
+        tempId: [
+          { required: true, message: "模板ID不能为空", trigger: "blur" }
+        ],
+        cityId: [
+          { required: true, message: "城市ID不能为空", trigger: "blur" }
+        ],
+        first: [
+          { required: true, message: "首件不能为空", trigger: "blur" }
+        ],
+        firstPrice: [
+          { required: true, message: "首件运费不能为空", trigger: "blur" }
+        ],
+        continues: [
+          { required: true, message: "续件不能为空", trigger: "blur" }
+        ],
+        continuePrice: [
+          { required: true, message: "续件运费不能为空", trigger: "blur" }
+        ],
+        type: [
+          { required: true, message: "计费方式不能为空", trigger: "change" }
+        ],
+        productId: [
+          { required: true, message: "分组唯一值不能为空", trigger: "blur" }
+        ]
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询邮费区域列表 */
+    getList() {
+      this.loading = true;
+      listShippingTemplatesRegion(this.queryParams).then(response => {
+        this.shippingTemplatesRegionList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        provinceId: null,
+        tempId: null,
+        cityId: null,
+        first: null,
+        firstPrice: null,
+        continues: null,
+        continuePrice: null,
+        type: null,
+        productId: null
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.id)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加邮费区域";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id || this.ids
+      getShippingTemplatesRegion(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改邮费区域";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.id != null) {
+            updateShippingTemplatesRegion(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addShippingTemplatesRegion(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const ids = row.id || this.ids;
+      this.$confirm('是否确认删除邮费区域编号为"' + ids + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delShippingTemplatesRegion(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有邮费区域数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportShippingTemplatesRegion(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 747 - 580
src/views/hisStore/storeOrder/healthStoreList.vue

@@ -1,22 +1,22 @@
 <template>
   <div class="app-container">
-    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+    <el-form v-show="showSearch" ref="queryForm" :inline="true" :model="queryParams" label-width="68px">
 
       <el-form-item label="订单号" prop="orderCode">
         <el-input
           v-model="queryParams.orderCode"
-          placeholder="请输入订单号"
           clearable
+          placeholder="请输入订单号"
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
 
-       <el-form-item label="运单号" prop="deliveryId">
+      <el-form-item label="运单号" prop="deliveryId">
         <el-input
           v-model="queryParams.deliveryId"
-          placeholder="请输入运单号"
           clearable
+          placeholder="请输入运单号"
           size="small"
           @keyup.enter.native="handleQuery"
         />
@@ -25,8 +25,8 @@
       <el-form-item label="手机号" prop="userPhone">
         <el-input
           v-model="queryParams.userPhone"
-          placeholder="请输入手机号"
           clearable
+          placeholder="请输入手机号"
           size="small"
           @keyup.enter.native="handleQuery"
         />
@@ -35,8 +35,8 @@
         <el-input
 
           v-model="queryParams.realName"
-          placeholder="请输入收件人姓名"
           clearable
+          placeholder="请输入收件人姓名"
           size="small"
           @keyup.enter.native="handleQuery"
         />
@@ -46,104 +46,112 @@
         <el-input
 
           v-model="queryParams.productName"
-          placeholder="请输入产品名"
           clearable
+          placeholder="请输入产品名"
           size="small"
           @keyup.enter.native="handleQuery"
         />
       </el-form-item>
-<!--      <el-form-item label="订单类型" prop="orderType">
-         <el-select   v-model="queryParams.orderType" placeholder="请选择订单类型" clearable size="small" >
-         <el-option
-                v-for="item in orderTypeOptions"
-                :key="item.dictValue"
-                :label="item.dictLabel"
-                :value="item.dictValue"
-              />
-        </el-select>
-      </el-form-item>-->
-<!--      <el-form-item label="上传凭证" prop="isUpload">
-         <el-select   v-model="queryParams.isUpload" placeholder="请选择" clearable size="small" >
-          <el-option key="0"  label="未上传" value="0" />
-             <el-option key="1"  label="已上传" value="1" />
-        </el-select>
-      </el-form-item>-->
+      <!--      <el-form-item label="订单类型" prop="orderType">
+               <el-select   v-model="queryParams.orderType" placeholder="请选择订单类型" clearable size="small" >
+               <el-option
+                      v-for="item in orderTypeOptions"
+                      :key="item.dictValue"
+                      :label="item.dictLabel"
+                      :value="item.dictValue"
+                    />
+              </el-select>
+            </el-form-item>-->
+      <!--      <el-form-item label="上传凭证" prop="isUpload">
+               <el-select   v-model="queryParams.isUpload" placeholder="请选择" clearable size="small" >
+                <el-option key="0"  label="未上传" value="0" />
+                   <el-option key="1"  label="已上传" value="1" />
+              </el-select>
+            </el-form-item>-->
       <el-form-item label="物流状态" prop="deliveryStatus">
-         <el-select   v-model="queryParams.deliveryStatus" placeholder="请选择物流状态" clearable size="small" >
-         <el-option
-                v-for="item in deliveryStatusOptions"
-                :key="item.dictValue"
-                :label="item.dictLabel"
-                :value="item.dictValue"
-              />
+        <el-select v-model="queryParams.deliveryStatus" clearable placeholder="请选择物流状态" size="small">
+          <el-option
+            v-for="item in deliveryStatusOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="结算状态" prop="deliveryPayStatus">
-         <el-select style="width: 200px" v-model="queryParams.deliveryPayStatus" placeholder="请选择物流结算状态" clearable size="small" >
-         <el-option
-                v-for="item in deliveryPayStatusOptions"
-                :key="item.dictValue"
-                :label="item.dictLabel"
-                :value="item.dictValue"
-              />
+        <el-select v-model="queryParams.deliveryPayStatus" clearable placeholder="请选择物流结算状态"
+                   size="small" style="width: 200px"
+        >
+          <el-option
+            v-for="item in deliveryPayStatusOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
         </el-select>
       </el-form-item>
-        <el-form-item label="支付方式" prop="payType">
-         <el-select style="width: 200px" v-model="queryParams.payType" placeholder="请选择支付方式" clearable size="small" >
-         <el-option
-                v-for="item in payTypeOptions"
-                :key="item.dictValue"
-                :label="item.dictLabel"
-                :value="item.dictValue"
-              />
+      <el-form-item label="支付方式" prop="payType">
+        <el-select v-model="queryParams.payType" clearable placeholder="请选择支付方式" size="small"
+                   style="width: 200px"
+        >
+          <el-option
+            v-for="item in payTypeOptions"
+            :key="item.dictValue"
+            :label="item.dictLabel"
+            :value="item.dictValue"
+          />
         </el-select>
       </el-form-item>
       <el-form-item label="下单时间" prop="createTimeRange">
         <el-date-picker
-          style="width:205.4px"
-          clearable size="small"
           v-model="createTimeRange"
+          clearable end-placeholder="结束日期"
+          size="small"
+          start-placeholder="开始日期"
+          style="width:205.4px"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期">
+        >
         </el-date-picker>
       </el-form-item>
       <el-form-item label="支付时间" prop="payTimeRange">
         <el-date-picker
-          style="width:205.4px"
-          clearable size="small"
           v-model="payTimeRange"
+          clearable end-placeholder="结束日期"
+          size="small"
+          start-placeholder="开始日期"
+          style="width:205.4px"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期">
+        >
         </el-date-picker>
       </el-form-item>
       <el-form-item label="发货时间" prop="deliverySendTimeRange">
         <el-date-picker
-          style="width:205.4px"
-          clearable size="small"
           v-model="deliverySendTimeRange"
+          clearable end-placeholder="结束日期"
+          size="small"
+          start-placeholder="开始日期"
+          style="width:205.4px"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期">
+        >
         </el-date-picker>
       </el-form-item>
       <el-form-item label="回单时间" prop="deliveryImportTimeRange">
         <el-date-picker
-          style="width:205.4px"
-          clearable size="small"
           v-model="deliveryImportTimeRange"
+          clearable end-placeholder="结束日期"
+          size="small"
+          start-placeholder="开始日期"
+          style="width:205.4px"
           type="daterange"
           value-format="yyyy-MM-dd"
-          start-placeholder="开始日期"
-          end-placeholder="结束日期">
+        >
         </el-date-picker>
       </el-form-item>
       <el-form-item>
-        <el-button type="cyan" icon="el-icon-search" size="mini" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-search" size="mini" type="cyan" @click="handleQuery">搜索</el-button>
         <el-button icon="el-icon-refresh" size="mini" @click="resetQuery">重置</el-button>
       </el-form-item>
     </el-form>
@@ -158,30 +166,43 @@
         >创建订单</el-button>
       </el-col> -->
       <el-col :span="1.5">
-            <el-button  plain type="info" icon="el-icon-upload2" size="mini" @click="handleImport" v-hasPermi="['store:storeOrder:importExpress']">导入银行回单</el-button>
+        <el-button v-hasPermi="['store:storeOrder:importExpress']" icon="el-icon-upload2" plain size="mini" type="info"
+                   @click="handleImport"
+        >导入银行回单
+        </el-button>
       </el-col>
       <el-col :span="1.5">
         <el-button
-            type="warning"
+          v-hasPermi="['store:healthStoreOrder:export']"
           icon="el-icon-download"
           size="mini"
-            @click="handleExport"
-          v-hasPermi="['store:healthStoreOrder:export']"
-        >导出订单</el-button>
+          type="warning"
+          @click="handleExport"
+        >导出订单
+        </el-button>
       </el-col>
-        <el-col :span="1.5">
+      <el-col :span="1.5">
         <el-button
-            type="warning"
+          v-hasPermi="['store:healthStoreOrder:exportItems']"
           icon="el-icon-download"
           size="mini"
-            @click="handleExportItems"
-          v-hasPermi="['store:healthStoreOrder:exportItems']"
-        >导出订单明细</el-button>
+          type="warning"
+          @click="handleExportItems"
+        >导出订单明细
+        </el-button>
       </el-col>
-
-	  <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      <el-col :span="1.5">
+        <el-button
+          icon="el-icon-s-order"
+          size="mini"
+          type="warning"
+          @click="openDeliveryNote"
+        >批量更新订单状态
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
     </el-row>
-    <el-tabs type="card" v-model="activeName" @tab-click="handleClick">
+    <el-tabs v-model="activeName" type="card" @tab-click="handleClick">
       <el-tab-pane label="全部订单" name="00"></el-tab-pane>
       <el-tab-pane label="待支付" name="0"></el-tab-pane>
       <el-tab-pane label="待发货" name="1"></el-tab-pane>
@@ -191,18 +212,18 @@
       <el-tab-pane label="已退款" name="-2"></el-tab-pane>
       <el-tab-pane label="已取消" name="-3"></el-tab-pane>
     </el-tabs>
-    <el-table  height="500" border v-loading="loading" :data="storeOrderList" @selection-change="handleSelectionChange">
-      <el-table-column type="selection" width="55" align="center" />
-      <el-table-column label="订单号" align="center" prop="orderCode" width="200px" />
-      <el-table-column label="用户昵称" align="center" prop="nickname" width="150px" >
-          <template slot-scope="scope">
-              <span>{{scope.row.nickname}} </span>
-          </template>
+    <el-table v-loading="loading" :data="storeOrderList" border height="500" @selection-change="handleSelectionChange">
+      <el-table-column align="center" type="selection" width="55"/>
+      <el-table-column align="center" label="订单号" prop="orderCode" width="200px"/>
+      <el-table-column align="center" label="用户昵称" prop="nickname" width="150px">
+        <template slot-scope="scope">
+          <span>{{ scope.row.nickname }} </span>
+        </template>
       </el-table-column>
-      <el-table-column label="收件人" align="center" prop="realName" width="150px" >
-          <template slot-scope="scope">
-              <span>{{scope.row.realName}} </span>
-          </template>
+      <el-table-column align="center" label="收件人" prop="realName" width="150px">
+        <template slot-scope="scope">
+          <span>{{ scope.row.realName }} </span>
+        </template>
       </el-table-column>
       <!-- <el-table-column label="商品" align="center" width="300px" >
           <template slot-scope="scope">
@@ -217,54 +238,65 @@
               </div>
           </template>
       </el-table-column> -->
-      <el-table-column label="订单金额" align="center" prop="totalPrice" >
-          <template slot-scope="scope">
-              <span v-if="scope.row.totalPrice!=null">{{scope.row.totalPrice.toFixed(2)}}</span>
-          </template>
+      <el-table-column align="center" label="订单金额" prop="totalPrice">
+        <template slot-scope="scope">
+          <span v-if="scope.row.totalPrice!=null">{{ scope.row.totalPrice.toFixed(2) }}</span>
+        </template>
       </el-table-column>
-       <el-table-column label="应付金额" align="center" prop="payPrice" >
-          <template slot-scope="scope">
-              <span v-if="scope.row.payPrice!=null">{{scope.row.payPrice.toFixed(2)}}</span>
-          </template>
+      <el-table-column align="center" label="应付金额" prop="payPrice">
+        <template slot-scope="scope">
+          <span v-if="scope.row.payPrice!=null">{{ scope.row.payPrice.toFixed(2) }}</span>
+        </template>
       </el-table-column>
-      <el-table-column label="下单时间" align="center" prop="createTime" />
+      <el-table-column align="center" label="下单时间" prop="createTime"/>
       <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
-      <el-table-column label="支付时间" align="center" prop="payTime" width="180">
+      <el-table-column align="center" label="支付时间" prop="payTime" width="180">
       </el-table-column>
-      <el-table-column label="支付方式" align="center" prop="payType" >
-          <template slot-scope="scope">
-              <el-tag prop="payType" v-for="(item, index) in payTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</el-tag>
-          </template>
+      <el-table-column align="center" label="支付方式" prop="payType">
+        <template slot-scope="scope">
+          <el-tag v-for="(item, index) in payTypeOptions" v-if="scope.row.payType==item.dictValue" prop="payType">
+            {{ item.dictLabel }}
+          </el-tag>
+        </template>
       </el-table-column>
-<!--      <el-table-column label="订单类型" align="center" prop="orderType" >
-          <template slot-scope="scope">
-              <el-tag prop="status" v-for="(item, index) in orderTypeOptions"    v-if="scope.row.orderType==item.dictValue">{{item.dictLabel}}</el-tag>
-          </template>
-      </el-table-column>-->
-      <el-table-column label="状态" align="center" prop="status" >
-          <template slot-scope="scope">
-              <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
-          </template>
+      <!--      <el-table-column label="订单类型" align="center" prop="orderType" >
+                <template slot-scope="scope">
+                    <el-tag prop="status" v-for="(item, index) in orderTypeOptions"    v-if="scope.row.orderType==item.dictValue">{{item.dictLabel}}</el-tag>
+                </template>
+            </el-table-column>-->
+      <el-table-column align="center" label="状态" prop="status">
+        <template slot-scope="scope">
+          <el-tag v-for="(item, index) in statusOptions" v-if="scope.row.status==item.dictValue" prop="status">
+            {{ item.dictLabel }}
+          </el-tag>
+        </template>
       </el-table-column>
-      <el-table-column label="物流状态" align="center" prop="deliveryStatus" >
-          <template slot-scope="scope">
-              <el-tag prop="status" v-for="(item, index) in deliveryStatusOptions"    v-if="scope.row.deliveryStatus==item.dictValue">{{item.dictLabel}}</el-tag>
-          </template>
+      <el-table-column align="center" label="物流状态" prop="deliveryStatus">
+        <template slot-scope="scope">
+          <el-tag v-for="(item, index) in deliveryStatusOptions" v-if="scope.row.deliveryStatus==item.dictValue"
+                  prop="status"
+          >{{ item.dictLabel }}
+          </el-tag>
+        </template>
       </el-table-column>
-      <el-table-column label="物流结算状态" align="center" prop="deliveryPayStatus" >
-          <template slot-scope="scope">
-              <el-tag prop="status" v-for="(item, index) in deliveryPayStatusOptions"    v-if="scope.row.deliveryPayStatus==item.dictValue">{{item.dictLabel}}</el-tag>
-          </template>
+      <el-table-column align="center" label="物流结算状态" prop="deliveryPayStatus">
+        <template slot-scope="scope">
+          <el-tag v-for="(item, index) in deliveryPayStatusOptions" v-if="scope.row.deliveryPayStatus==item.dictValue"
+                  prop="status"
+          >{{ item.dictLabel }}
+          </el-tag>
+        </template>
       </el-table-column>
 
-      <el-table-column label="操作" fixed="right" width="80px" align="center">
+      <el-table-column align="center" fixed="right" label="操作" width="80px">
         <template slot-scope="scope">
           <el-button
+            v-hasPermi="['store:storeOrder:query']"
             size="mini"
             type="text"
             @click="handleDetails(scope.row)"
-            v-hasPermi="['store:storeOrder:query']"
-          >查看</el-button>
+          >查看
+          </el-button>
           <!-- <el-button
             size="mini"
             type="text"
@@ -277,242 +309,316 @@
 
     <pagination
       v-show="total>0"
-      :total="total"
-      :page.sync="queryParams.pageNum"
       :limit.sync="queryParams.pageSize"
+      :page.sync="queryParams.pageNum"
+      :total="total"
       @pagination="getList"
     />
     <el-drawer
-     size="75%"
-      :title="show.title" :visible.sync="show.open"
-      >
-      <product-order  ref="order" />
+      :title="show.title"
+      :visible.sync="show.open" size="75%"
+    >
+      <product-order ref="order"/>
     </el-drawer>
 
 
-     <el-dialog :title="title" v-if="open" :visible.sync="open" width="1000px" append-to-body>
-        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
-           <el-form-item label="会员信息" prop="userId">
-                <el-row  >
-                  <el-col >
-                      <el-input placeholder="请输入会员手机号" style="width:240px;cursor:pointer" v-model="phone">
-                      </el-input>
-                      <el-button plain style="margin-left:10px;"    @click="searchUser()">查询</el-button>
-                      <el-button plain style="margin-left:10px;" icon="el-icon-plus"  type="primary" @click="handleAddUser()">添加会员</el-button>
-                  </el-col>
-                </el-row>
-                <el-table border style="margin-top:5px;"  v-loading="userloading" :data="users">
-                  <el-table-column label="ID" align="center" prop="userId" />
-                  <el-table-column label="会员头像" align="center" width="80">
-                    <template slot-scope="scope">
-                      <el-popover
-                        placement="right"
-                        title=""
-                        trigger="hover"
-                      >
-                        <img slot="reference" :src="scope.row.avatar" width="50" >
-                        <img :src="scope.row.avatar" style="max-width: 120px;">
-                      </el-popover>
-                    </template>
-                  </el-table-column>
-                  <el-table-column label="昵称" align="center" prop="nickname" />
-                  <el-table-column label="手机号" align="center" prop="phone" />
-                  <el-table-column label="状态" align="center" prop="status" >
-                      <template slot-scope="scope">
-                          <el-tag prop="status" v-for="(item, index) in userStatusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</el-tag>
-                      </template>
-                  </el-table-column>
-                </el-table>
-            </el-form-item>
-            <el-form-item label="收货信息" prop="addressId">
-              <el-row  >
-                <el-col >
-                      <el-button plain  type="primary" icon="el-icon-plus"  @click="handleAddUserAddress()">添加收货地址</el-button>
-                </el-col>
-              </el-row>
-              <el-radio-group v-model="form.addressId" style="width:100%">
-              <el-table border  style="margin-top:5px;"  v-loading="addressloading" :data="address">
-                <el-table-column label="ID" align="center"  >
-                    <template slot-scope="scope">
-                       <el-radio :label="scope.row.id"></el-radio>
-                    </template>
-                </el-table-column>
-                <el-table-column label="收货人姓名" align="center" prop="realName" />
-                <el-table-column label="收货人电话" align="center" prop="phone" />
-                <el-table-column label="地址" align="center" prop="detail" >
-                    <template slot-scope="scope">
-                       {{scope.row.province}} {{scope.row.city}} {{scope.row.district}} {{scope.row.detail}}
-                    </template>
-                </el-table-column>
-              </el-table>
-              </el-radio-group>
-            </el-form-item>
-            <el-form-item label="商品列表" >
-              <el-row  >
-                <el-col >
-                      <el-button plain  type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button>
-                </el-col>
-              </el-row>
-              <el-table border :key = "tablekey" width="100%" style="margin-top:5px;"  :data="products">
-                <el-table-column label="商品编号" align="center" prop="barCode" />
-                <el-table-column label="商品图片" align="center" width="100">
-                  <template slot-scope="scope">
-                    <el-popover
-                      placement="right"
-                      title=""
-                      trigger="hover"
-                    >
-                      <img slot="reference" :src="scope.row.image" width="50">
-                      <img :src="scope.row.image" style="max-width: 50px;">
-                    </el-popover>
-                  </template>
-                </el-table-column>
-                <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
-                <el-table-column label="商品规格" align="center" prop="sku" />
-                <el-table-column label="库存" align="center" prop="stock" />
-                <el-table-column label="单价" align="center" prop="price" />
-                <el-table-column label="数量" align="center"  prop="count" width="200px" :key="tablekey">
-                   <template slot-scope="scope">
-                    <div>
-                        <el-input-number v-model="scope.row.count"  @change="handleProductCountChange(scope.row)"  size="mini" :min="1" :max="scope.row.stock"  ></el-input-number>
-                    </div>
-                  </template>
-                </el-table-column>
-                <el-table-column label="小计" align="center" prop="money"   />
-                <el-table-column label="操作" align="center" width="100px" >
-                  <template slot-scope="scope">
-                    <el-button
-                      size="mini"
-                      type="text"
-                      icon="el-icon-delete"
-                      @click="handleDelete(scope.row)"
-                    >删除</el-button>
-                  </template>
-                </el-table-column>
-              </el-table>
-              <el-row>
-                <el-col>
-                      <span>商品合计:{{products.length}}</span><span style="margin-left:10px;">商品总价:{{totalMoney.toFixed(2)}}</span>
-                </el-col>
-              </el-row>
-            </el-form-item>
-            <el-form-item label="订单备注" prop="mark">
-              <el-input  type="textarea" rows="2" v-model="form.mark" placeholder="" />
-            </el-form-item>
-        </el-form>
+    <el-dialog v-if="open" :title="title" :visible.sync="open" append-to-body width="1000px">
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="会员信息" prop="userId">
+          <el-row>
+            <el-col>
+              <el-input v-model="phone" placeholder="请输入会员手机号" style="width:240px;cursor:pointer">
+              </el-input>
+              <el-button plain style="margin-left:10px;" @click="searchUser()">查询</el-button>
+              <el-button icon="el-icon-plus" plain style="margin-left:10px;" type="primary" @click="handleAddUser()">
+                添加会员
+              </el-button>
+            </el-col>
+          </el-row>
+          <el-table v-loading="userloading" :data="users" border style="margin-top:5px;">
+            <el-table-column align="center" label="ID" prop="userId"/>
+            <el-table-column align="center" label="会员头像" width="80">
+              <template slot-scope="scope">
+                <el-popover
+                  placement="right"
+                  title=""
+                  trigger="hover"
+                >
+                  <img slot="reference" :src="scope.row.avatar" width="50">
+                  <img :src="scope.row.avatar" style="max-width: 120px;">
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" label="昵称" prop="nickname"/>
+            <el-table-column align="center" label="手机号" prop="phone"/>
+            <el-table-column align="center" label="状态" prop="status">
+              <template slot-scope="scope">
+                <el-tag v-for="(item, index) in userStatusOptions" v-if="scope.row.status==item.dictValue"
+                        prop="status"
+                >{{ item.dictLabel }}
+                </el-tag>
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+        <el-form-item label="收货信息" prop="addressId">
+          <el-row>
+            <el-col>
+              <el-button icon="el-icon-plus" plain type="primary" @click="handleAddUserAddress()">添加收货地址
+              </el-button>
+            </el-col>
+          </el-row>
+          <el-radio-group v-model="form.addressId" style="width:100%">
+            <el-table v-loading="addressloading" :data="address" border style="margin-top:5px;">
+              <el-table-column align="center" label="ID">
+                <template slot-scope="scope">
+                  <el-radio :label="scope.row.id"></el-radio>
+                </template>
+              </el-table-column>
+              <el-table-column align="center" label="收货人姓名" prop="realName"/>
+              <el-table-column align="center" label="收货人电话" prop="phone"/>
+              <el-table-column align="center" label="地址" prop="detail">
+                <template slot-scope="scope">
+                  {{ scope.row.province }} {{ scope.row.city }} {{ scope.row.district }} {{ scope.row.detail }}
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="商品列表">
+          <el-row>
+            <el-col>
+              <el-button icon="el-icon-plus" plain type="primary" @click="handleAddProduct">添加商品</el-button>
+            </el-col>
+          </el-row>
+          <el-table :key="tablekey" :data="products" border style="margin-top:5px;" width="100%">
+            <el-table-column align="center" label="商品编号" prop="barCode"/>
+            <el-table-column align="center" label="商品图片" width="100">
+              <template slot-scope="scope">
+                <el-popover
+                  placement="right"
+                  title=""
+                  trigger="hover"
+                >
+                  <img slot="reference" :src="scope.row.image" width="50">
+                  <img :src="scope.row.image" style="max-width: 50px;">
+                </el-popover>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" label="商品名称" prop="productName" show-overflow-tooltip/>
+            <el-table-column align="center" label="商品规格" prop="sku"/>
+            <el-table-column align="center" label="库存" prop="stock"/>
+            <el-table-column align="center" label="单价" prop="price"/>
+            <el-table-column :key="tablekey" align="center" label="数量" prop="count" width="200px">
+              <template slot-scope="scope">
+                <div>
+                  <el-input-number v-model="scope.row.count" :max="scope.row.stock" :min="1"
+                                   size="mini" @change="handleProductCountChange(scope.row)"
+                  ></el-input-number>
+                </div>
+              </template>
+            </el-table-column>
+            <el-table-column align="center" label="小计" prop="money"/>
+            <el-table-column align="center" label="操作" width="100px">
+              <template slot-scope="scope">
+                <el-button
+                  icon="el-icon-delete"
+                  size="mini"
+                  type="text"
+                  @click="handleDelete(scope.row)"
+                >删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+          <el-row>
+            <el-col>
+              <span>商品合计:{{ products.length }}</span><span style="margin-left:10px;"
+            >商品总价:{{ totalMoney.toFixed(2) }}</span>
+            </el-col>
+          </el-row>
+        </el-form-item>
+        <el-form-item label="订单备注" prop="mark">
+          <el-input v-model="form.mark" placeholder="" rows="2" type="textarea"/>
+        </el-form-item>
+      </el-form>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitForm">确 定</el-button>
         <el-button @click="cancel">取 消</el-button>
       </div>
     </el-dialog>
-    <el-dialog :title="product.title" v-if="product.open"  :visible.sync="product.open" width="1000px" append-to-body>
-        <product-select  @selectProduct="selectProduct" />
+    <el-dialog v-if="product.open" :title="product.title" :visible.sync="product.open" append-to-body width="1000px">
+      <product-select @selectProduct="selectProduct"/>
     </el-dialog>
-    <el-dialog :title="user.title" v-if="user.open"  :visible.sync="user.open" width="500px" append-to-body>
-        <add-user @addUser="addUser" />
+    <el-dialog v-if="user.open" :title="user.title" :visible.sync="user.open" append-to-body width="500px">
+      <add-user @addUser="addUser"/>
     </el-dialog>
-    <el-dialog :title="userAddress.title" v-if="userAddress.open"  :visible.sync="userAddress.open" width="800px" append-to-body>
-        <add-user-address ref="addUserAddress"   @addUserAddress="addUserAddress" />
+    <el-dialog v-if="userAddress.open" :title="userAddress.title" :visible.sync="userAddress.open" append-to-body
+               width="800px"
+    >
+      <add-user-address ref="addUserAddress" @addUserAddress="addUserAddress"/>
     </el-dialog>
-    <el-dialog :title="payQr.title" v-if="payQr.open"  :visible.sync="payQr.open" width="240px" append-to-body>
-        <div style="padding-bottom:15px;" >
-            <div  class="qrcode" ref="qrCodeUrl"></div>
-        </div>
+    <el-dialog v-if="payQr.open" :title="payQr.title" :visible.sync="payQr.open" append-to-body width="240px">
+      <div style="padding-bottom:15px;">
+        <div ref="qrCodeUrl" class="qrcode"></div>
+      </div>
     </el-dialog>
 
-    <el-dialog :title="upload.title" :visible.sync="upload.open" width="400px" append-to-body>
-      <el-upload ref="upload" :limit="1" accept=".xlsx, .xls" :headers="upload.headers" :action="upload.url + '?updateSupport=' + upload.updateSupport" :disabled="upload.isUploading" :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" :auto-upload="false" drag>
+    <el-dialog :title="upload.title" :visible.sync="upload.open" append-to-body width="400px">
+      <el-upload ref="upload" :action="upload.url + '?updateSupport=' + upload.updateSupport" :auto-upload="false" :disabled="upload.isUploading"
+                 :headers="upload.headers" :limit="1"
+                 :on-progress="handleFileUploadProgress" :on-success="handleFileSuccess" accept=".xlsx, .xls" drag
+      >
         <i class="el-icon-upload"></i>
         <div class="el-upload__text">
           将文件拖到此处,或
           <em>点击上传</em>
         </div>
-        <div class="el-upload__tip" slot="tip">
+        <div slot="tip" class="el-upload__tip">
           <!-- <el-checkbox v-model="upload.updateSupport" />是否更新已经存在的数据 -->
-          <el-link type="info" style="font-size:12px" @click="importTemplate">下载模板</el-link>
+          <el-link style="font-size:12px" type="info" @click="importTemplate">下载模板</el-link>
         </div>
-        <div class="el-upload__tip" style="color:red" slot="tip">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+        <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
       </el-upload>
       <div slot="footer" class="dialog-footer">
         <el-button type="primary" @click="submitFileForm">确 定</el-button>
         <el-button @click="upload.open = false">取 消</el-button>
       </div>
     </el-dialog>
-    <el-dialog title="导入结果" :close-on-press-escape="false" :close-on-click-modal="false" :visible.sync="importMsgOpen" width="500px" append-to-body>
-       <div class="import-msg" v-html="importMsg">
-       </div>
+    <el-dialog :close-on-click-modal="false" :close-on-press-escape="false" :visible.sync="importMsgOpen"
+               append-to-body title="导入结果" width="500px"
+    >
+      <h1>操作成功!</h1>
     </el-dialog>
 
+    <!-- 批量发货 -->
+    <el-dialog
+      :before-close="handleClose"
+      :visible.sync="deliveryNoteOpen"
+      center
+      title="批量发货"
+      width="35%"
+    >
+      <span slot="footer" class="dialog-footer">
+        <!-- 小程序Appid选择 -->
+<!--        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">-->
+<!--          <el-form-item label="小程序:" prop="miniAppId">-->
+<!--        <el-select-->
+<!--          v-model="ruleForm.miniAppId"-->
+<!--          clearable-->
+<!--          placeholder="请选择发货小程序"-->
+<!--          style="width: 100%"-->
+<!--        >-->
+<!--          <el-option-->
+<!--            v-for="item in miniAppList"-->
+<!--            :key="item.appId"-->
+<!--            :label="item.appName"-->
+<!--            :value="item.appId"-->
+<!--          />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
+<!--        </el-form>-->
+
+        <el-upload ref="upload" :action="orderUpload.url" :auto-upload="false" :disabled="orderUpload.isUploading" :headers="orderUpload.headers"
+                   :limit="1" :on-progress="handleFileUploadProgress"
+                   :on-success="handleFileSuccess" accept=".xlsx, .xls" drag
+        >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          将文件拖到此处,或
+          <em>点击上传</em>
+        </div>
+        <div slot="tip" class="el-upload__tip">
+          <el-link style="font-size:12px" type="info" @click="importDeliveryNoteTemplate">下载模板</el-link>
+        </div>
+        <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+      </el-upload>
+        <el-divider></el-divider>
+        <el-button @click="deliveryNoteOpen = false">取 消</el-button>
+        <el-button type="primary" @click="submitDeliveryNote">确 定</el-button>
+      </span>
+    </el-dialog>
   </div>
 </template>
 
 <script>
-import { importTemplate,exportHealthStoreOrderItems,createUserOrder,listHealthStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportHealthStoreOrder } from "@/api/hisStore/storeOrder";
-import { getUserList } from "@/api/hisStore/user";
-import { getAddressList } from "@/api/hisStore/userAddress";
-import productOrder from "../components/productOrder";
-import productSelect from "../components/productSelect";
-import addUser from "../components/addUser";
-import addUserAddress from "../components/addUserAddress";
-import { getToken } from "@/utils/auth";
+import {
+  importDeliveryNoteExpressTemplate,
+  importTemplate,
+  exportHealthStoreOrderItems,
+  createUserOrder,
+  listHealthStoreOrder,
+  getStoreOrder,
+  delStoreOrder,
+  addStoreOrder,
+  updateStoreOrder,
+  exportHealthStoreOrder
+} from '@/api/hisStore/storeOrder'
+import { getUserList } from '@/api/hisStore/user'
+import { getAddressList } from '@/api/hisStore/userAddress'
+import productOrder from '../components/productOrder'
+import productSelect from '../components/productSelect'
+import addUser from '../components/addUser'
+import addUserAddress from '../components/addUserAddress'
+import { getToken } from '@/utils/auth'
 import QRCode from 'qrcodejs2'
-import { getCompanyList } from "@/api/company/company";
+import { getCompanyList } from '@/api/company/company'
 
-import { treeselect } from "@/api/company/companyDept";
-import Treeselect from "@riophae/vue-treeselect";
-import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { treeselect } from '@/api/company/companyDept'
+import Treeselect from '@riophae/vue-treeselect'
+import '@riophae/vue-treeselect/dist/vue-treeselect.css'
+import { getConfigByKey } from '@/api/system/config'
 
 export default {
-  components: { productOrder,productSelect,addUser,addUserAddress,Treeselect },
-  name: "HisHealthStoreOrderList",
+  components: { productOrder, productSelect, addUser, addUserAddress, Treeselect },
+  name: 'HisHealthStoreOrderList',
   watch: {
     // 监听deptId
     'deptId': 'currDeptChange'
   },
   data() {
     return {
-      importMsgOpen:false,
-      importMsg:"",
-      deliveryPayStatusOptions:[],
-      deliveryStatusOptions:[],
-      companys:[],
-      deptOptions:[],
-      companyId:undefined,
-      deptId:undefined,
-      orderTypeOptions:[],
-      payTypeOptions:[],
-      payQr:{
-        open:false,
-        title:"付款二维码"
+      importMsgOpen: false,
+      importMsg: '',
+      deliveryPayStatusOptions: [],
+      deliveryStatusOptions: [],
+      companys: [],
+      deptOptions: [],
+      companyId: undefined,
+      deptId: undefined,
+      orderTypeOptions: [],
+      payTypeOptions: [],
+      payQr: {
+        open: false,
+        title: '付款二维码'
       },
-      user:{
-        open:false,
-        title:"创建会员"
+      user: {
+        open: false,
+        title: '创建会员'
       },
-      userAddress:{
-        open:false,
-        title:"创建收货地址"
+      userAddress: {
+        open: false,
+        title: '创建收货地址'
       },
-      tablekey:false,
-      totalMoney:0.00,
-      products:[],
-      product:{
-        open:false,
-        title:"商品选择"
+      tablekey: false,
+      totalMoney: 0.00,
+      products: [],
+      product: {
+        open: false,
+        title: '商品选择'
       },
-      userStatusOptions:[],
-      phone:null,
-      address:[],
+      userStatusOptions: [],
+      phone: null,
+      address: [],
       addressloading: false,
       userloading: false,
-      users:[],
-      userStatusOptions:[],
-      show:{
-        open:false,
-        title:"订单详情"
+      users: [],
+      show: {
+        open: false,
+        title: '订单详情'
       },
-      activeName:"00",
-      statusOptions:[],
+      activeName: '00',
+      statusOptions: [],
       // 遮罩层
       loading: true,
       // 选中数组
@@ -528,13 +634,13 @@ export default {
       // 订单表格数据
       storeOrderList: [],
       // 弹出层标题
-      title: "",
+      title: '',
       // 是否显示弹出层
       open: false,
-      createTimeRange:[],
-      payTimeRange:[],
-      deliveryImportTimeRange:[],
-      deliverySendTimeRange:[],
+      createTimeRange: [],
+      payTimeRange: [],
+      deliveryImportTimeRange: [],
+      deliverySendTimeRange: [],
       // 查询参数
       queryParams: {
         pageNum: 1,
@@ -583,451 +689,512 @@ export default {
         isChannel: null,
         isRemind: null,
         isSysDel: null,
-        deptId:null,
+        deptId: null
 
       },
       // 表单参数
       form: {
-        addressId:null,
-        userId:null,
+        addressId: null,
+        userId: null
       },
       // 表单校验
       rules: {
         userId: [
-          { required: true, message: "会员信息不能为空" }
+          { required: true, message: '会员信息不能为空' }
         ],
         addressId: [
-          { required: true, message: "收货信息不能为空" }
+          { required: true, message: '收货信息不能为空' }
+        ],
+        miniAppId: [
+          { required: true, message: '发货小程序不能为空' }
         ],
-
       },
       upload: {
         // 是否显示弹出层(用户导入)
         open: false,
         // 弹出层标题(用户导入)
-        title: "",
+        title: '',
         // 是否禁用上传
         isUploading: false,
         // 是否更新已经存在的用户数据
         updateSupport: 0,
         // 设置上传的请求头部
-        headers: { Authorization: "Bearer " + getToken() },
+        headers: { Authorization: 'Bearer ' + getToken() },
         // 上传的地址
-        url: process.env.VUE_APP_BASE_API + "/store/storeOrder/importExpress",
+        url: process.env.VUE_APP_BASE_API + '/store/storeOrder/importExpress'
       },
-    };
+      orderUpload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: '',
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: 'Bearer ' + getToken() },
+        // 上传的地址
+        url: process.env.VUE_APP_BASE_API + '/store/store/storeOrder/importDeliveryNoteExpress',
+      },
+      deliveryNoteOpen: false,
+      miniAppList: [],
+      ruleForm:{
+        miniAppId: null,
+      },
+    }
   },
   created() {
     getCompanyList().then(response => {
-        this.companys = response.data;
-         if(this.companys!=null&&this.companys.length>0){
-          this.companyId=this.companys[0].companyId;
-          this.getTreeselect();
-        }
-    });
-    this.getDicts("store_order_type").then((response) => {
-      this.orderTypeOptions = response.data;
-    });
-    this.getDicts("user_status").then((response) => {
-      this.userStatusOptions = response.data;
-    });
-    this.getDicts("store_pay_type").then((response) => {
-      this.payTypeOptions = response.data;
-    });
-    this.getDicts("store_order_status").then((response) => {
-      this.statusOptions = response.data;
-    });
-    this.getDicts("store_order_delivery_status").then((response) => {
-      this.deliveryStatusOptions = response.data;
-    });
-    this.getDicts("store_delivery_pay_status").then((response) => {
-      this.deliveryPayStatusOptions = response.data;
-    });
+      this.companys = response.data
+      if (this.companys != null && this.companys.length > 0) {
+        this.companyId = this.companys[0].companyId
+        this.getTreeselect()
+      }
+    })
+    this.getDicts('store_order_type').then((response) => {
+      this.orderTypeOptions = response.data
+    })
+    this.getDicts('user_status').then((response) => {
+      this.userStatusOptions = response.data
+    })
+    this.getDicts('store_pay_type').then((response) => {
+      this.payTypeOptions = response.data
+    })
+    this.getDicts('store_order_status').then((response) => {
+      this.statusOptions = response.data
+    })
+    this.getDicts('store_order_delivery_status').then((response) => {
+      this.deliveryStatusOptions = response.data
+    })
+    this.getDicts('store_delivery_pay_status').then((response) => {
+      this.deliveryPayStatusOptions = response.data
+    })
 
-    this.getList();
+    this.getList()
   },
   methods: {
-    handleGenPayUrl(row){
-      this.payQr.open=true;
+    handleGenPayUrl(row) {
+      this.payQr.open = true
       setTimeout(() => {
         var qrcode = new QRCode(this.$refs.qrCodeUrl, {
-            text: config.payQRUrl+row.id, // 需要转换为二维码的内容
-            width: 200,
-            height: 200,
-            colorDark: '#000000',
-            colorLight: '#ffffff',
-            correctLevel: QRCode.CorrectLevel.H
+          text: config.payQRUrl + row.id, // 需要转换为二维码的内容
+          width: 200,
+          height: 200,
+          colorDark: '#000000',
+          colorLight: '#ffffff',
+          correctLevel: QRCode.CorrectLevel.H
         })
-      }, 200);
+      }, 200)
     },
-    handleAddUser(){
-      this.user.open=true;
+    handleAddUser() {
+      this.user.open = true
     },
-    handleAddUserAddress(){
-      if(this.form.userId==null){
-        this.msgError("请选择会员");
-        return;
+    handleAddUserAddress() {
+      if (this.form.userId == null) {
+        this.msgError('请选择会员')
+        return
       }
-      this.userAddress.open=true;
+      this.userAddress.open = true
       setTimeout(() => {
-        this.$refs.addUserAddress.init(this.form.userId);
-      }, 500);
+        this.$refs.addUserAddress.init(this.form.userId)
+      }, 500)
     },
-    addUser(){
-      this.user.open=false;
+    addUser() {
+      this.user.open = false
     },
-    addUserAddress(){
-      this.userAddress.open=false;
+    addUserAddress() {
+      this.userAddress.open = false
       //获取地址
-      this.getAddressList(this.form.userId);
+      this.getAddressList(this.form.userId)
     },
-    compute(){
-      this.totalMoney=0;
-      var that=this;
-      this.products.forEach (function (value) {
-          that.totalMoney += value.money;
-      });
+    compute() {
+      this.totalMoney = 0
+      var that = this
+      this.products.forEach(function(value) {
+        that.totalMoney += value.money
+      })
       console.log(that.totalMoney)
     },
-    handleProductCountChange(row){
+    handleProductCountChange(row) {
       this.tablekey = !this.tablekey
       console.log(row)
-      row.money=row.count*row.price;
-      this.$forceUpdate();
-      this.compute();
+      row.money = row.count * row.price
+      this.$forceUpdate()
+      this.compute()
     },
-    selectProduct(row){
-      console.log(row);
-      for(var i=0;i<this.products.length;i++){
-        if(this.products[i].id==row.id){
-          return;
+    selectProduct(row) {
+      console.log(row)
+      for (var i = 0; i < this.products.length; i++) {
+        if (this.products[i].id == row.id) {
+          return
         }
       }
-      row.count=1;
-      row.money=row.count*row.price;
-      this.products.push(row);
-      this.compute();
+      row.count = 1
+      row.money = row.count * row.price
+      this.products.push(row)
+      this.compute()
     },
-    handleAddProduct(){
-      this.product.open=true;
+    handleAddProduct() {
+      this.product.open = true
     },
-    searchUser(){
-      if(this.phone==null||this.phone==""){
-        return;
+    searchUser() {
+      if (this.phone == null || this.phone == '') {
+        return
       }
-      var data={phone:this.phone}
-      this.userloading = true;
-      this.users=[];
-      this.address=[];
+      var data = { phone: this.phone }
+      this.userloading = true
+      this.users = []
+      this.address = []
       getUserList(data).then(response => {
-        this.users = response.data;
-        this.userloading = false;
-        if(this.users!=null&&this.users.length==1){
-          this.form.userId=this.users[0].userId;
+        this.users = response.data
+        this.userloading = false
+        if (this.users != null && this.users.length == 1) {
+          this.form.userId = this.users[0].userId
           this.getAddressList(this.form.userId)
         }
-      });
+      })
     },
-    getAddressList(userId){
-      var data={userId:userId}
-      this.addressloading = true;
-      this.address=[];
+    getAddressList(userId) {
+      var data = { userId: userId }
+      this.addressloading = true
+      this.address = []
       getAddressList(data).then(response => {
-        this.address = response.data;
-        this.addressloading = false;
-      });
+        this.address = response.data
+        this.addressloading = false
+      })
     },
-    handleDetails(row){
-      this.show.open=true;
-      const orderId = row.id ;
+    handleDetails(row) {
+      this.show.open = true
+      const orderId = row.id
       setTimeout(() => {
-        this.$refs.order.getOrder(orderId);
-      }, 500);
+        this.$refs.order.getOrder(orderId)
+      }, 500)
     },
     handleClick(tab, event) {
-      this.activeName=tab.name;
-      this.queryParams.status=tab.name
+      this.activeName = tab.name
+      this.queryParams.status = tab.name
       console.log(this.queryParams.status)
-      this.getList();
+      this.getList()
     },
     /** 查询订单列表 */
     getList() {
-      this.loading = true;
-      if(this.queryParams.status=='00'){
-        this.queryParams.status=null;
+      this.loading = true
+      if (this.queryParams.status == '00') {
+        this.queryParams.status = null
       }
 
-      if(this.createTimeRange!=null&&this.createTimeRange.length==2){
-        this.queryParams.createTimeRange=this.createTimeRange[0]+"--"+this.createTimeRange[1]
-      }
-      else{
-        this.queryParams.createTimeRange=null;
+      if (this.createTimeRange != null && this.createTimeRange.length == 2) {
+        this.queryParams.createTimeRange = this.createTimeRange[0] + '--' + this.createTimeRange[1]
+      } else {
+        this.queryParams.createTimeRange = null
       }
 
-      if(this.payTimeRange!=null&&this.payTimeRange.length==2){
-        this.queryParams.payTimeRange=this.payTimeRange[0]+"--"+this.payTimeRange[1]
-      }
-      else{
-        this.queryParams.payTimeRange=null;
-      }
-      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
-        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      if (this.payTimeRange != null && this.payTimeRange.length == 2) {
+        this.queryParams.payTimeRange = this.payTimeRange[0] + '--' + this.payTimeRange[1]
+      } else {
+        this.queryParams.payTimeRange = null
       }
-      else{
-        this.queryParams.deliveryImportTimeRange=null;
+      if (this.deliveryImportTimeRange != null && this.deliveryImportTimeRange.length == 2) {
+        this.queryParams.deliveryImportTimeRange = this.deliveryImportTimeRange[0] + '--' + this.deliveryImportTimeRange[1]
+      } else {
+        this.queryParams.deliveryImportTimeRange = null
       }
-      if(this.deliverySendTimeRange!=null&&this.deliverySendTimeRange.length==2){
-        this.queryParams.deliverySendTimeRange=this.deliverySendTimeRange[0]+"--"+this.deliverySendTimeRange[1]
-      }
-      else{
-        this.queryParams.deliverySendTimeRange=null;
+      if (this.deliverySendTimeRange != null && this.deliverySendTimeRange.length == 2) {
+        this.queryParams.deliverySendTimeRange = this.deliverySendTimeRange[0] + '--' + this.deliverySendTimeRange[1]
+      } else {
+        this.queryParams.deliverySendTimeRange = null
       }
 
       listHealthStoreOrder(this.queryParams).then(response => {
-        this.storeOrderList = response.rows;
-        this.total = response.total;
-        this.loading = false;
-      });
+        this.storeOrderList = response.rows
+        this.total = response.total
+        this.loading = false
+      })
     },
     // 取消按钮
     cancel() {
-      this.open = false;
-      this.reset();
+      this.open = false
+      this.reset()
     },
     // 表单重置
     reset() {
       this.form = {
-        addressId:null,
-        userId:null,
+        addressId: null,
+        userId: null
 
-      };
-      this.resetForm("form");
+      }
+      this.resetForm('form')
     },
     /** 搜索按钮操作 */
     handleQuery() {
-      this.queryParams.pageNum = 1;
-      this.getList();
+      this.queryParams.pageNum = 1
+      this.getList()
     },
     /** 重置按钮操作 */
     resetQuery() {
-      this.resetForm("queryForm");
-      this.handleQuery();
+      this.resetForm('queryForm')
+      this.handleQuery()
     },
     // 多选框选中数据
     handleSelectionChange(selection) {
       this.ids = selection.map(item => item.id)
-      this.single = selection.length!==1
+      this.single = selection.length !== 1
       this.multiple = !selection.length
     },
     /** 新增按钮操作 */
     handleAdd() {
-      this.reset();
-      this.open = true;
-      this.title = "创建订单";
+      this.reset()
+      this.open = true
+      this.title = '创建订单'
     },
     /** 修改按钮操作 */
     handleUpdate(row) {
-      this.reset();
+      this.reset()
       const id = row.id || this.ids
       getStoreOrder(id).then(response => {
-        this.form = response.data;
-        this.open = true;
-        this.title = "修改订单";
-      });
+        this.form = response.data
+        this.open = true
+        this.title = '修改订单'
+      })
     },
     /** 提交按钮 */
     submitForm() {
-      this.$refs["form"].validate(valid => {
-        this.form.products=this.products;
+      this.$refs['form'].validate(valid => {
+        this.form.products = this.products
         if (valid) {
-          console.log(this.form);
+          console.log(this.form)
           createUserOrder(this.form).then(response => {
             if (response.code === 200) {
-              this.msgSuccess("创建成功");
-              this.open = false;
-              this.getList();
+              this.msgSuccess('创建成功')
+              this.open = false
+              this.getList()
             }
-          });
+          })
 
         }
-      });
+      })
     },
     /** 删除按钮操作 */
     handleDelete(row) {
-       this.products.splice(this.products.findIndex(item => item.id === row.id), 1)
-       this.compute();
+      this.products.splice(this.products.findIndex(item => item.id === row.id), 1)
+      this.compute()
 
     },
     /** 导出按钮操作 */
     handleExport() {
-      if(this.queryParams.status=='00'){
-        this.queryParams.status=null;
-      }
-      if(this.createTimeRange!=null&&this.createTimeRange.length==2){
-        this.queryParams.createTimeRange=this.createTimeRange[0]+"--"+this.createTimeRange[1]
-      }
-      else{
-        this.queryParams.createTimeRange=null;
-      }
-      if(this.payTimeRange!=null&&this.payTimeRange.length==2){
-        this.queryParams.payTimeRange=this.payTimeRange[0]+"--"+this.payTimeRange[1]
+      if (this.queryParams.status == '00') {
+        this.queryParams.status = null
       }
-      else{
-        this.queryParams.payTimeRange=null;
+      if (this.createTimeRange != null && this.createTimeRange.length == 2) {
+        this.queryParams.createTimeRange = this.createTimeRange[0] + '--' + this.createTimeRange[1]
+      } else {
+        this.queryParams.createTimeRange = null
       }
-      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
-        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      if (this.payTimeRange != null && this.payTimeRange.length == 2) {
+        this.queryParams.payTimeRange = this.payTimeRange[0] + '--' + this.payTimeRange[1]
+      } else {
+        this.queryParams.payTimeRange = null
       }
-      else{
-        this.queryParams.deliveryImportTimeRange=null;
+      if (this.deliveryImportTimeRange != null && this.deliveryImportTimeRange.length == 2) {
+        this.queryParams.deliveryImportTimeRange = this.deliveryImportTimeRange[0] + '--' + this.deliveryImportTimeRange[1]
+      } else {
+        this.queryParams.deliveryImportTimeRange = null
       }
-      if(this.deliverySendTimeRange!=null&&this.deliverySendTimeRange.length==2){
-        this.queryParams.deliverySendTimeRange=this.deliverySendTimeRange[0]+"--"+this.deliverySendTimeRange[1]
+      if (this.deliverySendTimeRange != null && this.deliverySendTimeRange.length == 2) {
+        this.queryParams.deliverySendTimeRange = this.deliverySendTimeRange[0] + '--' + this.deliverySendTimeRange[1]
+      } else {
+        this.queryParams.deliverySendTimeRange = null
       }
-      else{
-        this.queryParams.deliverySendTimeRange=null;
-      }
-      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
-      this.$confirm('是否确认导出所有订单数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return exportHealthStoreOrder(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-        }).catch(function() {});
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange)
+      this.$confirm('是否确认导出所有订单数据项?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        return exportHealthStoreOrder(queryParams)
+      }).then(response => {
+        this.download(response.msg)
+      }).catch(function() {
+      })
     },
     handleExportItems() {
-      if(this.queryParams.status=='00'){
-        this.queryParams.status=null;
-      }
-      if(this.createTimeRange!=null&&this.createTimeRange.length==2){
-        this.queryParams.createTimeRange=this.createTimeRange[0]+"--"+this.createTimeRange[1]
-      }
-      else{
-        this.queryParams.createTimeRange=null;
-      }
-      if(this.payTimeRange!=null&&this.payTimeRange.length==2){
-        this.queryParams.payTimeRange=this.payTimeRange[0]+"--"+this.payTimeRange[1]
-      }
-      else{
-        this.queryParams.payTimeRange=null;
+      if (this.queryParams.status == '00') {
+        this.queryParams.status = null
       }
-      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
-        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      if (this.createTimeRange != null && this.createTimeRange.length == 2) {
+        this.queryParams.createTimeRange = this.createTimeRange[0] + '--' + this.createTimeRange[1]
+      } else {
+        this.queryParams.createTimeRange = null
       }
-      else{
-        this.queryParams.deliveryImportTimeRange=null;
+      if (this.payTimeRange != null && this.payTimeRange.length == 2) {
+        this.queryParams.payTimeRange = this.payTimeRange[0] + '--' + this.payTimeRange[1]
+      } else {
+        this.queryParams.payTimeRange = null
       }
-      if(this.deliverySendTimeRange!=null&&this.deliverySendTimeRange.length==2){
-        this.queryParams.deliverySendTimeRange=this.deliverySendTimeRange[0]+"--"+this.deliverySendTimeRange[1]
+      if (this.deliveryImportTimeRange != null && this.deliveryImportTimeRange.length == 2) {
+        this.queryParams.deliveryImportTimeRange = this.deliveryImportTimeRange[0] + '--' + this.deliveryImportTimeRange[1]
+      } else {
+        this.queryParams.deliveryImportTimeRange = null
       }
-      else{
-        this.queryParams.deliverySendTimeRange=null;
+      if (this.deliverySendTimeRange != null && this.deliverySendTimeRange.length == 2) {
+        this.queryParams.deliverySendTimeRange = this.deliverySendTimeRange[0] + '--' + this.deliverySendTimeRange[1]
+      } else {
+        this.queryParams.deliverySendTimeRange = null
       }
-      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
-      this.$confirm('是否确认导出所有订单明细数据项?', "警告", {
-          confirmButtonText: "确定",
-          cancelButtonText: "取消",
-          type: "warning"
-        }).then(function() {
-          return exportHealthStoreOrderItems(queryParams);
-        }).then(response => {
-          this.download(response.msg);
-        }).catch(function() {});
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange)
+      this.$confirm('是否确认导出所有订单明细数据项?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning'
+      }).then(function() {
+        return exportHealthStoreOrderItems(queryParams)
+      }).then(response => {
+        this.download(response.msg)
+      }).catch(function() {
+      })
     },
     handleImport() {
-      this.upload.title = "导入银行回单";
-      this.upload.open = true;
+      this.upload.title = '导入银行回单'
+      this.upload.open = true
     },
     submitFileForm() {
-      this.$refs.upload.submit();
+      this.$refs.upload.submit()
     },
     importTemplate() {
       importTemplate().then((response) => {
-        this.download(response.msg);
-      });
+        this.download(response.msg)
+      })
     },
     // 文件上传中处理
     handleFileUploadProgress(event, file, fileList) {
-      this.upload.isUploading = true;
+      this.upload.isUploading = true
     },
     // 文件上传成功处理
     handleFileSuccess(response, file, fileList) {
-      this.upload.open = false;
-      this.upload.isUploading = false;
-      this.$refs.upload.clearFiles();
-      this.importMsgOpen=true;
-      this.importMsg=response.msg
+      this.upload.open = false
+      this.upload.isUploading = false
+      this.$refs.upload.clearFiles()
+      this.importMsgOpen = true
+      this.importMsg = response.msg
       // this.$alert(response.msg, '导入结果', {
       //     dangerouslyUseHTMLString: true
       //   });
-      this.getList();
+      this.getList()
     },
 
-        /** 查询部门下拉树结构 */
+    /** 查询部门下拉树结构 */
     getTreeselect() {
-        var that=this;
-        var param={companyId:this.companyId}
-        treeselect(param).then((response) => {
-          this.deptOptions = response.data;
-          console.log(this.deptOptions)
-          if(response.data!=null&&response.data.length>0){
-            //this.queryParams.deptId=response.data[0].id;
-          }
-        });
+      var that = this
+      var param = { companyId: this.companyId }
+      treeselect(param).then((response) => {
+        this.deptOptions = response.data
+        console.log(this.deptOptions)
+        if (response.data != null && response.data.length > 0) {
+          //this.queryParams.deptId=response.data[0].id;
+        }
+      })
     },
-     companyChange(val){
-      console.log(val);
-      this.companyId=val;
-      this.getTreeselect();
+    companyChange(val) {
+      console.log(val)
+      this.companyId = val
+      this.getTreeselect()
     },
-     currDeptChange(val){
-          console.log(val)
-          this.queryParams.deptId=val;
-          this.getList();
+    currDeptChange(val) {
+      console.log(val)
+      this.queryParams.deptId = val
+      this.getList()
     },
+    //打开发货单
+    openDeliveryNote() {
+      this.deliveryNoteOpen = true
+      // this.getAppList();
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done()
+        })
+        .catch(_ => {
+        })
+    },
+    //发货单模板下载
+    importDeliveryNoteTemplate() {
+      importDeliveryNoteExpressTemplate().then((response) => {
+        this.download(response.msg)
+      })
+    },
+    getAppList() {
+      this.miniAppList = []
+      const key = 'courseMa.config'
+      getConfigByKey(key).then(response => {
+        const { code, data } = response
+        if (code === 200) {
+          let value = data?.configValue
+          if (value) {
+            const appList = JSON.parse(value)
+            this.miniAppList = appList.filter(v => v.type === '1').map(v => {
+              return { appId: v.appid, appName: v.name }
+            })
+          }
+        }
+      })
+    },
+    // 提交发货单
+    submitDeliveryNote() {
+      const uploadFiles = this.$refs.upload.uploadFiles;
+      if (uploadFiles.length === 0) {
+        this.$message.error('请选择要上传的文件');
+        return;
+      }
+      this.$refs.upload.submit();
+    }
+
   }
-};
+}
 </script>
-<style scoped lang="scss">
-.items{
+<style lang="scss" scoped>
+.items {
   margin: 5px 0px;
   display: flex;
   flex-direction: row;
   align-items: center;
   justify-content: flex-start;
-  .pic{
-    width:60px;
-    height:60px;
+
+  .pic {
+    width: 60px;
+    height: 60px;
   }
-  .goods-content{
+
+  .goods-content {
     margin-left: 10px;
     max-width: 200px;
     text-align: left;
-    .goods-title{
 
-      overflow:hidden;
+    .goods-title {
+
+      overflow: hidden;
       white-space: nowrap;
       text-overflow: ellipsis;
-      -o-text-overflow:ellipsis;
+      -o-text-overflow: ellipsis;
     }
   }
 }
-.el-message-box__message p{
+
+.el-message-box__message p {
   max-height: 400px;
-  overflow:scroll;
+  overflow: scroll;
 }
-.import-msg{
+
+.import-msg {
   height: 500px;
   overflow: auto;
 }
 </style>
 <style>
-  .el-descriptions-item__label.is-bordered-label{
-    font-weight: normal;
-  }
+.el-descriptions-item__label.is-bordered-label {
+  font-weight: normal;
+}
 
 </style>
 

+ 119 - 0
src/views/hisStore/storeOrder/index.vue

@@ -203,6 +203,14 @@
         >导出订单明细</el-button>
       </el-col>
       <el-col :span="1.5">
+<!--        <el-button-->
+<!--          type="warning"-->
+<!--          icon="el-icon-s-order"-->
+<!--          size="mini"-->
+<!--          @click="openDeliveryNote"-->
+<!--        >批量更新订单状态</el-button>-->
+<!--      </el-col>-->
+<!--      <el-col :span="1.5">-->
         <el-input
           v-model="orderItemNum"
           disabled
@@ -492,6 +500,54 @@
        </div>
     </el-dialog>
 
+    <!-- 批量发货 -->
+    <el-dialog
+      :before-close="handleClose"
+      :visible.sync="deliveryNoteOpen"
+      center
+      title="批量发货"
+      width="35%"
+    >
+      <span slot="footer" class="dialog-footer">
+        <!-- 小程序Appid选择 -->
+<!--        <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm">-->
+<!--          <el-form-item label="小程序:" prop="miniAppId">-->
+<!--        <el-select-->
+<!--          v-model="ruleForm.miniAppId"-->
+<!--          clearable-->
+<!--          placeholder="请选择发货小程序"-->
+<!--          style="width: 100%"-->
+<!--        >-->
+<!--          <el-option-->
+<!--            v-for="item in miniAppList"-->
+<!--            :key="item.appId"-->
+<!--            :label="item.appName"-->
+<!--            :value="item.appId"-->
+<!--          />-->
+<!--        </el-select>-->
+<!--      </el-form-item>-->
+<!--        </el-form>-->
+
+        <el-upload ref="upload" :action="orderUpload.url" :auto-upload="false" :disabled="orderUpload.isUploading" :headers="orderUpload.headers"
+                   :limit="1" :on-progress="handleFileUploadProgress"
+                   :on-success="handleFileSuccess" accept=".xlsx, .xls" drag
+        >
+        <i class="el-icon-upload"></i>
+        <div class="el-upload__text">
+          将文件拖到此处,或
+          <em>点击上传</em>
+        </div>
+        <div slot="tip" class="el-upload__tip">
+          <el-link style="font-size:12px" type="info" @click="importDeliveryNoteTemplate">下载模板</el-link>
+        </div>
+        <div slot="tip" class="el-upload__tip" style="color:red">提示:仅允许导入“xls”或“xlsx”格式文件!</div>
+      </el-upload>
+        <el-divider></el-divider>
+        <el-button @click="deliveryNoteOpen = false">取 消</el-button>
+        <el-button type="primary" @click="submitDeliveryNote">确 定</el-button>
+      </span>
+    </el-dialog>
+
   </div>
 </template>
 
@@ -510,6 +566,7 @@ import { getTcmScheduleList } from "@/api/company/schedule";
 import { treeselect } from "@/api/company/companyDept";
 import Treeselect from "@riophae/vue-treeselect";
 import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+import { getConfigByKey } from '@/api/system/config'
 
 export default {
   components: { productOrder,productSelect,addUser,addUserAddress,Treeselect },
@@ -668,6 +725,25 @@ export default {
         // 上传的地址
         url: process.env.VUE_APP_BASE_API + "/store/storeOrder/importExpress",
       },
+      orderUpload: {
+        // 是否显示弹出层(用户导入)
+        open: false,
+        // 弹出层标题(用户导入)
+        title: "",
+        // 是否禁用上传
+        isUploading: false,
+        // 是否更新已经存在的用户数据
+        updateSupport: 0,
+        // 设置上传的请求头部
+        headers: { Authorization: "Bearer " + getToken() },
+        // 上传的地址
+        url: '',
+      },
+      deliveryNoteOpen:false,
+      miniAppList: [],
+      ruleForm:{
+        miniAppId: null,
+      },
     };
   },
   created() {
@@ -1085,6 +1161,49 @@ export default {
           this.queryParams.deptId=val;
           this.getList();
     },
+    //打开发货单
+    openDeliveryNote(){
+      this.deliveryNoteOpen=true;
+      // this.getAppList();
+    },
+    handleClose(done) {
+      this.$confirm('确认关闭?')
+        .then(_ => {
+          done();
+        })
+        .catch(_ => {});
+    },
+    //发货单模板下载
+    importDeliveryNoteTemplate(){
+
+    },
+    getAppList() {
+      this.miniAppList = []
+      const key = "courseMa.config"
+      getConfigByKey(key).then(response => {
+        const {code,data} = response
+        if (code === 200) {
+          let value = data?.configValue
+          if (value) {
+            console.log("打印-----------------》",value)
+            const appList = JSON.parse(value);
+            this.miniAppList = appList.filter(v => v.type === '1').map(v => {
+              return { appId: v.appid, appName: v.name }
+            })
+          }
+        }
+      })
+    },
+    // 提交发货单
+    submitDeliveryNote() {
+      const uploadFiles = this.$refs.upload.uploadFiles;
+      if (uploadFiles.length === 0) {
+        this.$message.error('请选择要上传的文件');
+        return;
+      }
+      this.orderUpload.url = `${process.env.VUE_APP_BASE_API}/store/store/storeOrder/importDeliveryNoteExpress`;
+      this.$refs.upload.submit();
+    },
   }
 };
 </script>