Jelajahi Sumber

商城迁移销售端代码

chenguo 4 minggu lalu
induk
melakukan
b1879889a4
37 mengubah file dengan 11343 tambahan dan 0 penghapusan
  1. 62 0
      src/api/hisStore/city.js
  2. 33 0
      src/api/hisStore/statistics.js
  3. 88 0
      src/api/hisStore/storeAfterSales.js
  4. 155 0
      src/api/hisStore/storeOrder.js
  5. 19 0
      src/api/hisStore/storeOrderAudit.js
  6. 72 0
      src/api/hisStore/storeOrderOffline.js
  7. 71 0
      src/api/hisStore/storePayment.js
  8. 23 0
      src/api/hisStore/storeProduct.js
  9. 8 0
      src/api/hisStore/storeProductCategory.js
  10. 53 0
      src/api/hisStore/storeProductPackage.js
  11. 53 0
      src/api/hisStore/userOnlineState.js
  12. 766 0
      src/views/hisStore/components/addOrder.vue
  13. 309 0
      src/views/hisStore/components/addOrderOffline.vue
  14. 72 0
      src/views/hisStore/components/addUser.vue
  15. 153 0
      src/views/hisStore/components/addUserAddress.vue
  16. 373 0
      src/views/hisStore/components/offlineOrder.vue
  17. 92 0
      src/views/hisStore/components/paymentSelect.vue
  18. 397 0
      src/views/hisStore/components/productAfterSalesOrder.vue
  19. 144 0
      src/views/hisStore/components/productDetails.vue
  20. 922 0
      src/views/hisStore/components/productOrder.vue
  21. 903 0
      src/views/hisStore/components/productOrder2.vue
  22. 135 0
      src/views/hisStore/components/productPackageDetails.vue
  23. 100 0
      src/views/hisStore/components/productSelect.vue
  24. 344 0
      src/views/hisStore/statistics/storeOrder.vue
  25. 344 0
      src/views/hisStore/statistics/storePayment.vue
  26. 403 0
      src/views/hisStore/storeAfterSales/list.vue
  27. 310 0
      src/views/hisStore/storeAfterSales/myList.vue
  28. 828 0
      src/views/hisStore/storeOrder/allList.vue
  29. 1000 0
      src/views/hisStore/storeOrder/list.vue
  30. 722 0
      src/views/hisStore/storeOrder/myList.vue
  31. 240 0
      src/views/hisStore/storeOrderAudit/index.vue
  32. 283 0
      src/views/hisStore/storeOrderOffline/index.vue
  33. 245 0
      src/views/hisStore/storeOrderOffline/myList.vue
  34. 409 0
      src/views/hisStore/storePayment/index.vue
  35. 216 0
      src/views/hisStore/storeProduct/index.vue
  36. 603 0
      src/views/hisStore/storeProductPackage/index.vue
  37. 393 0
      src/views/hisStore/userOnlineState/index.vue

+ 62 - 0
src/api/hisStore/city.js

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

+ 33 - 0
src/api/hisStore/statistics.js

@@ -0,0 +1,33 @@
+import request from '@/utils/request'
+
+
+export function storeOrder(query) {
+  return request({
+    url: '/store/store/statistics/storeOrder',
+    method: 'get',
+    params: query
+  })
+}
+export function exportStoreOrder(query) {
+  return request({
+    url: '/store/store/statistics/exportStoreOrder',
+    method: 'get',
+    params: query
+  })
+}
+
+export function storePayment(query) {
+  return request({
+    url: '/store/store/statistics/storePayment',
+    method: 'get',
+    params: query
+  })
+}
+export function exportStorePayment(query) {
+  return request({
+    url: '/store/store/statistics/exportStorePayment',
+    method: 'get',
+    params: query
+  })
+}
+

+ 88 - 0
src/api/hisStore/storeAfterSales.js

@@ -0,0 +1,88 @@
+import request from '@/utils/request'
+
+// 查询售后记录列表
+export function listStoreAfterSales(query) {
+  return request({
+    url: '/store/store/storeAfterSales/list',
+    method: 'get',
+    params: query
+  })
+}
+export function myListStoreAfterSales(query) {
+  return request({
+    url: '/store/store/storeAfterSales/myList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询售后记录详细
+export function getStoreAfterSales(id) {
+  return request({
+    url: '/store/store/storeAfterSales/' + id,
+    method: 'get'
+  })
+}
+
+// 新增售后记录
+export function addStoreAfterSales(data) {
+  return request({
+    url: '/store/store/storeAfterSales',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改售后记录
+export function updateStoreAfterSales(data) {
+  return request({
+    url: '/store/store/storeAfterSales',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后记录
+export function delStoreAfterSales(id) {
+  return request({
+    url: '/store/store/storeAfterSales/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出售后记录
+export function exportStoreAfterSales(query) {
+  return request({
+    url: '/store/store/storeAfterSales/export',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+export function cancel(data) {
+  return request({
+    url: '/store/store/storeAfterSales/cancel',
+    method: 'post',
+    data: data
+  })
+}
+
+export function refund(data) {
+  return request({
+    url: '/store/store/storeAfterSales/refund',
+    method: 'post',
+    data: data
+  })
+}
+
+export function audit(data) {
+  return request({
+    url: '/store/store/storeAfterSales/audit',
+    method: 'post',
+    data: data
+  })
+}
+

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

@@ -0,0 +1,155 @@
+import request from '@/utils/request'
+
+// 查询订单列表
+export function listStoreOrder(query) {
+  return request({
+    url: '/store/store/storeOrder/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
+export function listAllStoreOrder(query) {
+  return request({
+    url: '/store/store/storeOrder/allList',
+    method: 'get',
+    params: query
+  })
+}
+export function getCustomerOrderList(query) {
+  return request({
+    url: '/store/store/storeOrder/getCustomerOrderList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+export function myListStoreOrder(query) {
+  return request({
+    url: '/store/store/storeOrder/myList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询订单详细
+export function getStoreOrder(id) {
+  return request({
+    url: '/store/store/storeOrder/' + id,
+    method: 'get'
+  })
+}
+// 查询电话
+export function getUserPhone(id) {
+  return request({
+    url: '/store/store/storeOrder/queryPhone/' + id,
+    method: 'get'
+  })
+}
+
+// 查询订单详细
+export function getStoreOrderAddress(id) {
+  return request({
+    url: '/store/store/storeOrder/queryAddress/' + id,
+    method: 'get'
+  })
+}
+
+export function getExpress(id) {
+  return request({
+    url: '/store/store/storeOrder/getExpress/' + id,
+    method: 'get'
+  })
+}
+
+
+// 新增订单
+export function addStoreOrder(data) {
+  return request({
+    url: '/store/store/storeOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+
+
+
+// 修改订单
+export function updateStoreOrder(data) {
+  return request({
+    url: '/store/store/storeOrder',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除订单
+export function delStoreOrder(id) {
+  return request({
+    url: '/store/store/storeOrder/' + id,
+    method: 'delete'
+  })
+}
+
+// 导出订单
+export function exportStoreOrder(query) {
+  return request({
+    url: '/store/store/storeOrder/export',
+    method: 'get',
+    params: query
+  })
+}
+
+export function exportStoreOrderItems(query) {
+  return request({
+    url: '/store/store/storeOrder/exportItems',
+    method: 'get',
+    params: query
+  })
+}
+
+
+export function createUserOrder(data) {
+  return request({
+    url: '/store/store/storeOrder/createUserOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+export function editPayPrice(data) {
+  return request({
+    url: '/store/store/storeOrder/editPayPrice',
+    method: 'post',
+    data: data
+  })
+}
+
+
+export function bindCustomer(data) {
+  return request({
+    url: '/store/store/storeOrder/bindCustomer',
+    method: 'post',
+    data: data
+  })
+}
+
+export function uploadCredentials(data) {
+  return request({
+    url: '/store/store/storeOrder/uploadCredentials',
+    method: 'post',
+    data: data
+  })
+}
+
+//获取制单类型
+export function getCreateOrderType() {
+  return request({
+    url: '/store/store/storeOrder/getCreateOrderType',
+    method: 'get'
+  })
+}
+

+ 19 - 0
src/api/hisStore/storeOrderAudit.js

@@ -0,0 +1,19 @@
+import request from '@/utils/request'
+
+// 获取审核列表
+export const list = (query) => {
+  return request({
+    url: '/store/store/storeOrderAudit/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 审核
+export const audit = (data) => {
+  return request({
+    url: '/store/store/storeOrderAudit/audit',
+    method: 'post',
+    data: data
+  })
+}

+ 72 - 0
src/api/hisStore/storeOrderOffline.js

@@ -0,0 +1,72 @@
+import request from '@/utils/request'
+
+// 查询线下订单列表
+export function listStoreOrderOffline(query) {
+  return request({
+    url: '/store/store/storeOrderOffline/list',
+    method: 'get',
+    params: query
+  })
+}
+
+
+// 查询线下订单列表
+export function myOrderList(query) {
+  return request({
+    url: '/store/store/storeOrderOffline/myList',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询线下订单详细
+export function getStoreOrderOffline(orderId) {
+  return request({
+    url: '/store/store/storeOrderOffline/' + orderId,
+    method: 'get'
+  })
+}
+
+// 新增线下订单
+export function createOrder(data) {
+  return request({
+    url: '/store/store/storeOrderOffline/createOrder',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改线下订单
+export function updateStoreOrderOffline(data) {
+  return request({
+    url: '/store/store/storeOrderOffline',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除线下订单
+export function delStoreOrderOffline(orderId) {
+  return request({
+    url: '/store/store/storeOrderOffline/' + orderId,
+    method: 'delete'
+  })
+}
+
+// 导出线下订单
+export function exportStoreOrderOffline(query) {
+  return request({
+    url: '/store/store/storeOrderOffline/export',
+    method: 'get',
+    params: query
+  })
+}
+
+// 上传凭证
+export function uploadCredentials(data) {
+  return request({
+    url: '/store/store/storeOrderOffline/uploadCredentials',
+    method: 'post',
+    data: data
+  })
+}

+ 71 - 0
src/api/hisStore/storePayment.js

@@ -0,0 +1,71 @@
+import request from '@/utils/request'
+
+// 查询支付明细列表
+export function listStorePayment(query) {
+  return request({
+    url: '/store/store/storePayment/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getStorePaymentList(query) {
+  return request({
+    url: '/store/store/storePayment/getStorePaymentList',
+    method: 'get',
+    params: query
+  })
+}
+export function getMyPaymentList(query) {
+  return request({
+    url: '/store/store/storePayment/getMyPaymentList',
+    method: 'get',
+    params: query
+  })
+}
+
+
+
+
+
+// 查询支付明细详细
+export function getStorePayment(paymentId) {
+  return request({
+    url: '/store/store/storePayment/' + paymentId,
+    method: 'get'
+  })
+}
+
+// 新增支付明细
+export function addStorePayment(data) {
+  return request({
+    url: '/store/store/storePayment',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改支付明细
+export function updateStorePayment(data) {
+  return request({
+    url: '/store/store/storePayment',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除支付明细
+export function delStorePayment(paymentId) {
+  return request({
+    url: '/store/store/storePayment/' + paymentId,
+    method: 'delete'
+  })
+}
+
+// 导出支付明细
+export function exportStorePayment(query) {
+  return request({
+    url: '/store/store/storePayment/export',
+    method: 'get',
+    params: query
+  })
+}

+ 23 - 0
src/api/hisStore/storeProduct.js

@@ -0,0 +1,23 @@
+import request from '@/utils/request'
+
+// 查询商品列表
+export function listStoreProduct(query) {
+  return request({
+    url: '/store/store/storeProduct/list',
+    method: 'get',
+    params: query
+  })
+}
+export function getStoreProductAttrValueList(query) {
+  return request({
+    url: '/store/store/storeProduct/getStoreProductAttrValueList',
+    method: 'get',
+    params: query
+  })
+}
+export function getStoreProduct(productId) {
+  return request({
+    url: '/store/store/storeProduct/' + productId,
+    method: 'get'
+  })
+}

+ 8 - 0
src/api/hisStore/storeProductCategory.js

@@ -0,0 +1,8 @@
+import request from '@/utils/request'
+
+export function getAllStoreProductCategory() {
+  return request({
+    url: '/store/store/storeProductCategory/getAllList' ,
+    method: 'get'
+  })
+}

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

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询商品组合套餐列表
+export function listStoreProductPackage(query) {
+  return request({
+    url: '/store/store/storeProductPackage/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询商品组合套餐详细
+export function getStoreProductPackage(packageId) {
+  return request({
+    url: '/store/store/storeProductPackage/' + packageId,
+    method: 'get'
+  })
+}
+
+// 新增商品组合套餐
+export function addStoreProductPackage(data) {
+  return request({
+    url: '/store/store/storeProductPackage',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改商品组合套餐
+export function updateStoreProductPackage(data) {
+  return request({
+    url: '/store/store/storeProductPackage',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品组合套餐
+export function delStoreProductPackage(packageId) {
+  return request({
+    url: '/store/store/storeProductPackage/' + packageId,
+    method: 'delete'
+  })
+}
+
+// 导出商品组合套餐
+export function exportStoreProductPackage(query) {
+  return request({
+    url: '/store/store/storeProductPackage/export',
+    method: 'get',
+    params: query
+  })
+}

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

@@ -0,0 +1,53 @@
+import request from '@/utils/request'
+
+// 查询用户上线情况列表
+export function listUserOnlineState(query) {
+  return request({
+    url: '/store/store/userOnlineState/list',
+    method: 'get',
+    params: query
+  })
+}
+
+// 查询用户上线情况详细
+export function getUserOnlineState(userId) {
+  return request({
+    url: '/store/store/userOnlineState/' + userId,
+    method: 'get'
+  })
+}
+
+// 新增用户上线情况
+export function addUserOnlineState(data) {
+  return request({
+    url: '/store/store/userOnlineState',
+    method: 'post',
+    data: data
+  })
+}
+
+// 修改用户上线情况
+export function updateUserOnlineState(data) {
+  return request({
+    url: '/store/store/userOnlineState',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除用户上线情况
+export function delUserOnlineState(userId) {
+  return request({
+    url: '/store/store/userOnlineState/' + userId,
+    method: 'delete'
+  })
+}
+
+// 导出用户上线情况
+export function exportUserOnlineState(query) {
+  return request({
+    url: '/store/store/userOnlineState/export',
+    method: 'get',
+    params: query
+  })
+}

+ 766 - 0
src/views/hisStore/components/addOrder.vue

@@ -0,0 +1,766 @@
+<template>
+  <div class="app-container">
+    <!-- 添加一个加载状态,在获取createOrderType之前显示 -->
+    <div v-if="!formReady" style="text-align: center; padding: 50px;">
+      <i class="el-icon-loading"></i> 正在加载...
+    </div>
+
+    <!-- 只有在formReady为true时才显示表单 -->
+    <el-form v-if="formReady" 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" width="200px" v-if="createOrderType == 1">
+            <template slot-scope="scope">
+              <el-input-number v-model="scope.row.price" @change="handleProductCountChange(scope.row)" size="mini" :min="0.01"></el-input-number>
+            </template>
+          </el-table-column>
+          <el-table-column label="单价" align="center" prop="price" v-if="createOrderType == 2"/>
+          <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="orderType">
+        <el-select v-model="form.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="orderMedium" v-if="orderMediumOptions.length>0">
+        <el-select v-model="form.orderMedium" placeholder="请选择媒体来源" clearable size="small">
+          <el-option v-for="item in orderMediumOptions" :key="item.dictValue" :label="item.dictLabel" :value="item.dictValue" />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="支付方式" prop="payType">
+        <el-select v-model="form.payType" placeholder="请选择支付方式" clearable size="small">
+          <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="payPrice" v-if="createOrderType == 2">
+        <el-input-number v-model="form.payPrice" placeholder="修改商品总价" size="medium" :precision="2" :min="0.01" :step="0.1" />
+      </el-form-item>
+
+      <el-form-item label="物流代收" prop="amount" v-if="form.payType == '3'">
+        <el-input-number v-model="form.amount" placeholder="平台支付价格" size="medium" :precision="2" :min="0.01" :step="0.1" />
+      </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>
+
+    <div v-if="formReady" slot="footer" class="dialog-footer" style="float: right; margin-bottom: 20px;">
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="cancel">取 消</el-button>
+    </div>
+
+    <!-- 对话框部分保持不变 -->
+    <el-dialog :title="product.title" v-if="product.open" :visible.sync="product.open" width="1000px" append-to-body>
+      <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>
+    <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>
+    <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>
+  </div>
+</template>
+
+<script>
+import {exportStoreOrderItems, createUserOrder,listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder,getCreateOrderType } from "@/api/hisStore/storeOrder";
+import { getUserList } from "@/api/users/user";
+import { getAddressList } from "@/api/users/userAddress";
+import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import productOrder from "@/views/hisStore/components/productOrder";
+import productSelect from "@/views/hisStore/components/productSelect";
+import addUser from "@/views/hisStore/components/addUser";
+import addUserAddress from "@/views/hisStore/components/addUserAddress";
+import config from "@/utils/config";
+import QRCode from 'qrcodejs2'
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  components: { Treeselect,productOrder,productSelect,addUser,addUserAddress },
+  name: "StoreOrder",
+  props: {
+    customerId: {
+      type: Number,
+      required: false
+    },
+    userId: {
+      type: Number,
+      required: false
+    }
+  },
+  data() {
+    return {
+      // 添加表单准备状态
+      formReady: false,
+      createOrderType: null,
+      // 部门树选项
+      deptOptions: undefined,
+      // 部门名称
+      deptName: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      deliveryPayStatusOptions:[],
+      deliveryStatusOptions:[],
+      dateRange: [],
+      orderTypeOptions:[],
+      orderMediumOptions:[],
+      payTypeOptions:[],
+      payQr:{
+        open:false,
+        title:"付款二维码"
+      },
+      user:{
+        open:false,
+        title:"创建会员"
+      },
+      userAddress:{
+        open:false,
+        title:"创建收货地址"
+      },
+      tablekey:false,
+      totalMoney:0.00,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      phone:null,
+      address:[],
+      addressloading: false,
+      userloading: false,
+      users:[],
+      userStatusOptions:[],
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      activeName:"00",
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单表格数据
+      storeOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      createTimeRange:[],
+      payTimeRange:[],
+      deliveryImportTimeRange:[],
+      scheduleOptions:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        extendOrderId: null,
+        userId: null,
+        realName: null,
+        userPhone: null,
+        userAddress: null,
+        cartId: null,
+        freightPrice: null,
+        totalNum: null,
+        totalPrice: null,
+        totalPostage: null,
+        payPrice: null,
+        payPostage: null,
+        deductionPrice: null,
+        couponId: null,
+        couponPrice: null,
+        paid: null,
+        payTime: null,
+        payType: null,
+        status: null,
+        refundStatus: null,
+        refundReasonWapImg: null,
+        refundReasonWapExplain: null,
+        refundReasonTime: null,
+        refundReasonWap: null,
+        refundReason: null,
+        refundPrice: null,
+        deliverySn: null,
+        deliveryName: null,
+        deliveryType: null,
+        deliveryId: null,
+        gainIntegral: null,
+        useIntegral: null,
+        payIntegral: null,
+        backIntegral: null,
+        mark: null,
+        isDel: null,
+        cost: null,
+        verifyCode: null,
+        storeId: null,
+        shippingType: null,
+        isChannel: null,
+        isRemind: null,
+        isSysDel: null
+      },
+      // 表单参数
+      form: {
+        addressId:null,
+        userId:null,
+        products:[],
+      },
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "会员信息不能为空", trigger: "submit" }
+        ],
+        addressId: [
+          { required: true, message: "收货信息不能为空", trigger: "submit" }
+        ],
+        products: [
+          { required: true, message: "商品不能为空", trigger: "submit" }
+        ],
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+      this.$refs.tree.filter(val);
+    },
+  },
+  created() {
+    // 先获取createOrderType,然后再初始化其他数据
+    this.initializeForm();
+  },
+  methods: {
+    // 初始化表单的方法
+    async initializeForm() {
+      try {
+        // 1. 首先获取createOrderType
+        const response = await getCreateOrderType();
+        this.createOrderType = response.createSalesOrderType;
+
+        // 2. 然后并行加载其他数据
+        await Promise.all([
+          this.loadDictionaries(),
+          this.loadOtherData(),
+          this.initUser()
+        ]);
+
+        // 3. 所有数据加载完成后,设置表单为准备状态
+        this.formReady = true;
+        console.log('Form is ready to display');
+
+      } catch (error) {
+        console.error('Error initializing form:', error);
+        this.$message.error('表单初始化失败');
+      }
+    },
+
+    // 加载字典数据
+    async loadDictionaries() {
+      const dictPromises = [
+        this.getDicts("crm_customer_source").then((response) => {
+          this.orderMediumOptions = response.data;
+        }),
+        this.getDicts("store_order_type").then((response) => {
+          this.orderTypeOptions = response.data;
+        }),
+        this.getDicts("store_pay_type").then((response) => {
+          this.payTypeOptions = response.data;
+        }),
+        this.getDicts("user_status").then((response) => {
+          this.userStatusOptions = 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;
+        })
+      ];
+
+      await Promise.all(dictPromises);
+    },
+
+    // 加载其他数据
+    async loadOtherData() {
+      await Promise.all([
+        this.getTreeselect(),
+        getTcmScheduleList().then(response => {
+          this.scheduleOptions = response.data;
+        })
+      ]);
+    },
+
+    initUser(){
+      return new Promise((resolve) => {
+        if(this.userId != null){
+          var data={userId:this.userId}
+          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.getAddressList(this.form.userId).then(() => {
+                resolve();
+              });
+            } else {
+              resolve();
+            }
+          }).catch(() => {
+            resolve();
+          });
+        } else {
+          resolve();
+        }
+      });
+    },
+
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      return treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+
+    // 修改getAddressList方法,返回Promise
+    getAddressList(userId){
+      var data={userId:userId}
+      this.addressloading = true;
+      this.address=[];
+      return getAddressList(data).then(response => {
+        this.address = response.data;
+        this.addressloading = false;
+      });
+    },
+
+    // 其他方法保持不变...
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.getList();
+    },
+    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
+        })
+      }, 200);
+    },
+    handleAddUser(){
+      this.user.open=true;
+    },
+    handleAddUserAddress(){
+      if(this.form.userId==null){
+        this.msgError("请选择会员");
+        return;
+      }
+      this.userAddress.open=true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    addUserAddress(){
+      this.userAddress.open=false;
+      //获取地址
+      this.getAddressList(this.form.userId);
+    },
+    addUser(){
+      this.user.open=false;
+    },
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+    },
+    handleProductCountChange(row){
+      this.tablekey = !this.tablekey
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+    selectProduct(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.$message.success("商品"+ row.productName + "添加成功")
+      this.compute();
+    },
+    handleAddProduct(){
+      this.product.open=true;
+    },
+    searchUser(){
+      if(this.phone==null||this.phone==""){
+        return;
+      }
+      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.getAddressList(this.form.userId)
+        }
+      });
+    },
+    handleDetails(row){
+      this.show.open=true;
+      const orderId = row.id ;
+      setTimeout(() => {
+        this.$refs.order.getOrder(orderId);
+      }, 500);
+    },
+    handleClick(tab, event) {
+       if(tab.name=="all"){
+        this.queryParams.status==null;
+      }
+      else{
+         this.queryParams.status=tab.name;
+      }
+      this.getList();
+    },
+    /** 查询订单列表 */
+    getList() {
+      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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      this.loading = true;
+      listStoreOrder(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.storeOrderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+      this.$emit("closePackage")
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        addressId:null,
+        userId:null,
+        products: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
+      getStoreOrder(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if(this.products.length==0){
+          this.msgError("请选择商品");
+          return;
+        }
+        this.form.products=this.products;
+        if (valid) {
+          this.form.customerId = this.customerId;
+          createUserOrder(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.$emit("closePackage")
+            }
+          });
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+       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]
+      }
+      else{
+        this.queryParams.payTimeRange=null;
+      }
+      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrder(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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单明细数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrderItems(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+.el-message-box__message p{
+  max-height: 400px;
+  overflow:scroll;
+}
+.import-msg{
+  height: 500px;
+  overflow: auto;
+}
+</style>
+
+<style>
+.el-descriptions-item__label.is-bordered-label{
+  font-weight: normal;
+}
+</style>

+ 309 - 0
src/views/hisStore/components/addOrderOffline.vue

@@ -0,0 +1,309 @@
+<template>
+  <div class="app-container">
+        <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+           <el-form-item label="客户信息" prop="crmId">
+                <el-row  >
+                  <el-col >
+                    <el-input placeholder="请输入客户手机号" clearable style="width:240px;cursor:pointer" v-model="phone">
+                    </el-input>
+                    <el-button plain style="margin-left:10px;"    @click="searchUser()">查询</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="customerId" />
+                  <el-table-column label="客户编码" align="center" prop="customerCode" />
+                  <el-table-column label="客户名称" align="center" prop="customerName" />
+                  <el-table-column label="手机号" align="center" prop="mobile" />
+                  <el-table-column  label="客户来源" align="center" prop="source">
+                    <template slot-scope="scope">
+                      <el-tag prop="status" v-for="(item, index) in sourceOptions"    v-if="scope.row.source==item.dictValue">{{item.dictLabel}}</el-tag>
+                    </template>
+                  </el-table-column>
+                </el-table>
+            </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="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"   ></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="uploadUserId">
+              <el-select style="width:220px" v-model="form.uploadUserId" placeholder="请选择" clearable size="small" >
+                <el-option
+                  v-for="item in salesmanList"
+                  :key="item.dictValue"
+                  :label="item.dictLabel"
+                  :value="item.dictValue"
+                />
+              </el-select>
+            </el-form-item>
+            <el-form-item label="价格" prop="payPrice">
+              <el-input-number v-model="form.payPrice"  size="mini"    ></el-input-number>
+            </el-form-item>
+            <el-form-item label="订单备注" prop="remark">
+              <el-input  type="textarea" rows="2" v-model="form.remark" placeholder="" />
+            </el-form-item>
+        </el-form>
+      <div slot="footer" class="dialog-footer" style="float: right; margin-bottom: 20px;">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    <el-dialog :title="product.title" v-if="product.open"  :visible.sync="product.open" width="1000px" append-to-body>
+        <product-select  @selectProduct="selectProduct" />
+    </el-dialog>
+
+
+  </div>
+</template>
+
+<script>
+import { getMyCustomerList,recover,exportCustomer  } from "@/api/crm/customer";
+import {createOrder} from "@/api/hisStore/storeOrderOffline";
+import { getSalesman } from "@/api/company/companyUser";
+
+
+import productSelect from "@/views/hisStore/components/productSelect";
+
+export default {
+  components: { productSelect },
+  name: "AddOrderOffline",
+  data() {
+    return {
+      salesmanList:[],
+      tablekey:false,
+      totalMoney:0.00,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      phone:null,
+
+      userloading: false,
+      users:[],
+      sourceOptions:[],
+      userStatusOptions:[],
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单表格数据
+      storeOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+
+
+      // 表单参数
+      form: {
+        crmId:null,
+        uploadUserId:null,
+        products:[],
+      },
+      // 表单校验
+      rules: {
+        crmId: [
+          { required: true, message: "客户信息不能为空", trigger: "submit" }
+        ],
+        uploadUserId: [
+          { required: true, message: "核实业务员不能为空", trigger: "blur" }
+        ],
+
+        products: [
+          { required: true, message: "商品不能为空", trigger: "submit" }
+        ],
+
+      }
+    };
+  },
+  created() {
+    this.getDicts("crm_customer_source").then((response) => {
+      this.sourceOptions = response.data;
+    });
+    getSalesman().then((response) => {
+      this.salesmanList = response.data;
+    });
+  },
+  methods: {
+    handleAddProduct(){
+      this.product.open=true;
+    },
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+    },
+    handleProductCountChange(row){
+      this.tablekey = !this.tablekey
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+    selectProduct(row){
+      for(var i=0;i<this.products.length;i++){
+        if(this.products[i].id===row.id){
+          this.$message.warning("商品已存在")
+          return;
+        }
+      }
+      row.count=1;
+      row.money=row.count*row.price;
+      this.products.push(row);
+      this.compute();
+      this.$message.success("商品添加成功")
+    },
+
+    searchUser(crmId){
+      if(this.phone==null||this.phone===""){
+        return;
+      }
+      var data={mobile:this.phone}
+      this.userloading = true;
+      this.users=[];
+      getMyCustomerList(data).then(response => {
+        this.users = response.rows;
+        this.userloading = false;
+        if(this.users!=null&&this.users.length===1){
+          this.form.crmId=this.users[0].customerId;
+        }
+      });
+    },
+
+    // 取消按钮
+    cancel() {
+      this.$emit("closeOrderOffline")
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+
+        userId:null,
+        products:null,
+
+      };
+      this.resetForm("form");
+    },
+
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if(this.products.length==0){
+          this.msgError("请选择商品");
+          return;
+        }
+        this.form.products=this.products;
+        if (valid) {
+          createOrder(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.$emit("closeOrderOffline")
+            }
+          });
+
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+       this.products.splice(this.products.findIndex(item => item.id === row.id), 1)
+       this.compute();
+
+    },
+
+  }
+};
+</script>
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+.el-message-box__message p{
+  max-height: 400px;
+  overflow:scroll;
+}
+.import-msg{
+  height: 500px;
+  overflow: auto;
+}
+</style>
+<style>
+  .el-descriptions-item__label.is-bordered-label{
+    font-weight: normal;
+  }
+
+</style>

+ 72 - 0
src/views/hisStore/components/addUser.vue

@@ -0,0 +1,72 @@
+<template>
+  <div >
+       <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="会员昵称" prop="nickname">
+          <el-input v-model="form.nickname" placeholder="请输入用户昵称" />
+        </el-form-item>
+        <el-form-item label="手机号码" prop="phone">
+          <el-input v-model="form.phone" placeholder="请输入手机号码" />
+        </el-form-item>
+        <el-form-item label="状态">
+            <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>
+      <div    style="text-align:right;">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+  </div>
+</template>
+
+<script>
+import { listUser, getUser, delUser, addUser, updateUser, exportUser } from "@/api/users/user";
+
+export default {
+  name: "add",
+  data() {
+    return {
+      statusOptions:[],
+      // 表单参数
+      form: {
+        status:"1"
+      },
+      // 表单校验
+      rules: {
+        phone: [
+          { required: true, message: "手机号不能为空", trigger: "blur" }
+        ],
+        nickname: [
+          { required: true, message: "会员昵称不能为空", trigger: "blur" }
+        ],
+         
+      }
+    };
+  },
+  created() {
+    this.getDicts("user_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+  },
+
+  methods: {
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          addUser(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("新增成功");
+              this.$emit("addUser",this.form.phone)
+              
+            }
+          });
+        }
+      });
+    },
+     
+  }
+};
+</script>
+<style scoped>
+ 
+</style>

+ 153 - 0
src/views/hisStore/components/addUserAddress.vue

@@ -0,0 +1,153 @@
+<template>
+  <div >
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-form-item label="收货人姓名" prop="realName">
+          <el-input v-model="form.realName" placeholder="请输入收货人姓名" />
+        </el-form-item>
+        <el-form-item label="收货人电话" prop="phone">
+          <el-input v-model="form.phone" placeholder="请输入收货人电话" />
+        </el-form-item>
+        <el-form-item label="收货地址" prop="district">
+          <el-row :gutter="20">
+          <el-col :span="6">
+             <el-select @change="provinceChange" v-model="form.province" placeholder="请选择">
+                <el-option
+                  v-for="item in province"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+          <el-col :span="6">
+            <el-select @change="cityChange" v-model="form.city" placeholder="请选择">
+                <el-option
+                  v-for="item in city"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+          <el-col :span="6">
+             <el-select @change="districtChange" v-model="form.district" placeholder="请选择">
+                <el-option
+                  v-for="item in district"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+        </el-row>
+        </el-form-item>
+        <el-form-item label="详细地址" prop="detail">
+          <el-input v-model="form.detail" placeholder="请输入收货人详细地址" />
+        </el-form-item>
+      </el-form>
+      <div  style="text-align:right;">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+      </div>
+  </div>
+</template>
+
+<script>
+import { listUserAddress, getUserAddress, delUserAddress, addUserAddress, updateUserAddress, exportUserAddress } from "@/api/users/userAddress";
+import {getCitys} from "@/api/hisStore/city";
+export default {
+  name: "add",
+  data() {
+    return {
+      citys:[],
+      province:[],
+      city:[],
+      district:[],
+      // 表单参数
+      form: {
+        province:null,
+        city:null,
+        district:null,
+        cityId:null,
+      },
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "会员不能为空", trigger: "blur" }
+        ],
+        realName: [
+          { required: true, message: "姓名不能为空", trigger: "blur" }
+        ],
+        phone: [
+          { required: true, message: "电话不能为空", trigger: "blur" }
+        ],
+        detail: [
+          { required: true, message: "详细地址不能为空", trigger: "blur" }
+        ],
+        district: [
+          { required: true, message: "收货地址不能为空", trigger: "blur" }
+        ],
+
+      }
+    };
+  },
+  created(){
+    this.getCityList();
+  },
+  methods: {
+    districtChange(val){
+      const item = this.district.find(i => i.cityId === val)
+      this.form.district=item.name;
+    },
+    cityChange(val){
+      const item = this.city.find(i => i.cityId === val)
+      this.district = item.children
+      this.form.district=null;
+      this.form.city=item.name;
+      this.form.cityId=val;
+    },
+    provinceChange(val){
+      const item = this.citys.find(i => i.cityId === val)
+      this.city = item.children
+      this.district=[];
+      this.form.city=null;
+      this.form.district=null;
+      this.form.province=item.name;
+    },
+    getCityList(){
+      getCitys().then(res => {
+          this.loading = false;
+          this.citys = this.convertCityData(res.data)
+          this.province=this.citys.filter(item => item.parentId===0 )
+        })
+    },
+    convertCityData(array) {
+      return array.map(item => {
+        return {
+          'cityId': item.value,
+          'name': item.label,
+          'parentId':  item.pid,
+          'children': item.children && this.convertCityData(item.children)
+        }
+      });
+    },
+    init(userId){
+      this.form.userId=userId;
+    },
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          addUserAddress(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("新增成功");
+              this.$emit("addUserAddress")
+            }
+          });
+        }
+      });
+    },
+  }
+};
+</script>
+<style scoped>
+
+</style>

+ 373 - 0
src/views/hisStore/components/offlineOrder.vue

@@ -0,0 +1,373 @@
+<template>
+  <div class="order-content">
+      <div class="order-status" v-if="order!=null" >
+          <el-steps  :active="order.status===3?order.status+1:order.status" align-center>
+            <el-step title="客服制单"></el-step>
+            <el-step title="待业务核实"></el-step>
+            <el-step title="待主管审核"></el-step>
+            <el-step title="内勤对流向"></el-step>
+          </el-steps>
+      </div>
+      <div>
+
+      <el-card shadow="never" style="margin-top: 15px">
+      <div class="operate-container"  v-if="order!=null">
+        <span  style="margin-left: 20px" class="color-danger">订单状态:
+           <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="order.status.toString()===item.dictValue">{{item.dictLabel}}</el-tag>
+        </span>
+
+        <div class="operate-button-container" >
+          <el-button size="mini" v-if="order.status ===1" @click="handleCertificates()"  v-hasPermi="['store:storeOrderOffline:uploadCredentials']" >上传凭证</el-button>
+          <el-button size="mini" v-if="order.crmId!=null&&order.crmId>0"  @click="handleCustomer()"    >查看客户详情</el-button>
+        </div>
+      </div>
+      <div style="margin: 20px 0px"  v-if="order!=null">
+        <span class="font-small">
+          基本信息
+        </span>
+      </div>
+      <el-descriptions :column="4" border  >
+        <el-descriptions-item label="订单ID"  >
+                <span v-if="order!=null">
+                  {{order.orderId}}
+                </span>
+        </el-descriptions-item>
+            <el-descriptions-item label="订单编号"  >
+                <span v-if="order!=null">
+                  {{order.orderCode}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="客户名称"  >
+                <span v-if="order!=null">
+                  {{order.customerName}}
+                </span>
+            </el-descriptions-item>
+
+
+            <el-descriptions-item label="客户电话"  >
+                <span v-if="order!=null ">
+                  {{order.mobile }}
+                </span>
+                <el-button icon="el-icon-search" size="mini" @click="handlePhone()" style="margin-left: 20px;" circle v-hasPermi="['store:storeOrder:queryPhone']"></el-button>
+              </el-descriptions-item>
+              <el-descriptions-item v-if="order!=null " label="应付金额"  >
+                <span >
+                  {{order.payPrice }}
+                </span>
+              </el-descriptions-item>
+              <el-descriptions-item v-if="order!=null " label="实付金额"  >
+                <span >
+                  {{order.payMoney }}
+                </span>
+              </el-descriptions-item>
+              <el-descriptions-item v-if="customerInfo!=null " label="客户编码"  >
+                <span >
+                  {{customerInfo.customerCode }}
+                </span>
+              </el-descriptions-item>
+            <el-descriptions-item label="创建时间"  >
+                <span v-if="order!=null ">
+                  {{order.createTime }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="所属客服"  >
+                <span v-if="order!=null ">
+                  {{order.companyUserName }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="所属部门"  >
+              <span v-if="order!=null ">
+                {{order.companyName }}
+              </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="所属业务员"  >
+              <span v-if="order!=null ">
+                {{order.uploadUserName }}
+              </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="凭证上传时间"  >
+                  <span v-if="order!=null ">
+                    {{order.uploadTime }}
+                  </span>
+            </el-descriptions-item>
+        <el-descriptions-item label="审核人"  >
+                  <span v-if="order!=null ">
+                    {{order.auditBy }}
+                  </span>
+        </el-descriptions-item>
+        <el-descriptions-item label="审核时间"  >
+                  <span v-if="order!=null ">
+                    {{order.auditTime }}
+                  </span>
+        </el-descriptions-item>
+            <el-descriptions-item label="备注"  >
+                <span v-if="order!=null ">
+                  {{order.remark }}
+                </span>
+            </el-descriptions-item>
+
+
+
+      </el-descriptions>
+      <div style="margin: 20px 0px"  v-if="certificates!=null">
+        <span class="font-small">
+          凭证信息
+        </span>
+      </div>
+      <el-image
+          v-if="this.certificates != null"
+          :src="certificates"
+          :preview-src-list="[certificates]"
+          :style="{ width: '100px', height: '100px' }"
+          @click.native="showImageDialog"
+        ></el-image>
+        <el-dialog :visible.sync="dialogVisibleImage" width="10%">
+          <img :src="certificates" style="width: 100%" alt="">
+        </el-dialog>
+
+      <div style="margin-top: 20px">
+        <span class="font-small">商品信息</span>
+      </div>
+      <el-table
+        border
+        v-if="items!=null"
+        :data="items"
+        size="small"
+        style="width: 100%;margin-top: 20px" >
+        <el-table-column label="商品图片" width="150" align="center">
+          <template slot-scope="scope">
+            <img :src="JSON.parse(scope.row.jsonInfo).image" style="height: 80px">
+          </template>
+        </el-table-column>
+        <el-table-column label="商品名称" width="300" align="center">
+          <template slot-scope="scope">
+            <p>{{JSON.parse(scope.row.jsonInfo).productName}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="单价" width="240" align="center">
+          <template slot-scope="scope">
+            <p>¥{{JSON.parse(scope.row.jsonInfo).price.toFixed(2)}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="规格" width="240" align="center">
+          <template slot-scope="scope">
+            {{JSON.parse(scope.row.jsonInfo).sku}}
+          </template>
+        </el-table-column>
+        <el-table-column label="数量" width="180" align="center">
+          <template slot-scope="scope">
+            {{scope.row.num}}
+          </template>
+        </el-table-column>
+<!--        <el-table-column label="小计"  align="center">-->
+<!--          <template slot-scope="scope" >-->
+<!--            ¥{{scope.row.num*JSON.parse(scope.row.jsonInfo).price.toFixed(2)}}-->
+<!--          </template>-->
+<!--        </el-table-column>-->
+      </el-table>
+<!--      <div style="float: right;margin: 20px" v-if="order!=null">-->
+<!--        合计:<span class="color-danger">¥{{order.totalPrice.toFixed(2)}}</span>-->
+<!--      </div>-->
+      </el-card>
+    </div>
+    <el-dialog :title="certificateDialig.title" :visible.sync="certificateDialig.open" append-to-body>
+      <el-form ref="certificateForm" :model="certificateForm" :rules="certificateRules" label-width="100px">
+        <el-form-item label="凭证" prop="certificates">
+          <ImageUpload v-model="photoArr" type="image" :limit="1" :width="150" :height="150" />
+        </el-form-item>
+        <el-form-item label="实付金额" prop="payPrice">
+          <el-input-number v-model="certificateForm.payMoney"  size="mini"    ></el-input-number>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handleConfirm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-drawer
+      :append-to-body="true"
+      size="75%"
+      :title="customer.title" :visible.sync="customer.open" append-to-body
+      >
+        <customer-details  ref="customerDetails" />
+    </el-drawer>
+    <el-dialog :title="addSms.title" :visible.sync="addSms.open" width="800px" append-to-body>
+        <add-sms ref="sms" @close="closeSms()"></add-sms>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { listStoreOrderOffline, getStoreOrderOffline, uploadCredentials } from "@/api/hisStore/storeOrderOffline";
+import ImageUpload from '@/components/ImageUpload'
+import customerDetails from '../../crm/components/customerDetails.vue';
+import addSms from '../../crm/components/addSms.vue';
+export default {
+  name: "offlineOrder",
+  components: {customerDetails,
+    ImageUpload,addSms},
+  data() {
+    return {
+      customerUserStatusOptions:[],
+      scheduleOptions:[],
+      dialogVisibleImage: false,
+      customerInfo:null,
+      customer:{
+        title:"客户详情",
+        open:false,
+      },
+      photoArr:null,
+      certificateDialig:{
+        title:"上传凭证",
+        open:false,
+      },
+      certificateForm:{
+        payMoney:null,
+        certificates:null,
+      },
+      addSms:{
+        open:false,
+        title:"发短信"
+      },
+      certificateRules:{
+        certificates:[
+          { required: true, message: "凭证不能为空", trigger: "change" }
+        ]
+      },
+      customers:[],
+
+      orderId:null,
+      statusOptions:[],
+      certificates:null,
+      order:null,
+      user:{},
+      logs:[],
+      items:[],
+      express:[],
+      traces:[],
+      payments:[],
+    };
+  },
+  created() {
+    this.getDicts("crm_customer_user_status").then((response) => {
+            this.customerUserStatusOptions = response.data;
+        });
+    this.getDicts("sys_order_offline_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+
+  },
+  computed: {
+    company(){
+      return this.$store.state.user.user;
+    }
+  },
+  methods: {
+
+    closeSms(){
+      this.addSms.open=false;
+    },
+    handleSms(mobile){
+      this.addSms.open=true;
+      var that=this;
+      setTimeout(() => {
+          that.$refs.sms.getOrderId(this.orderId,mobile,2);
+      }, 500);
+    },
+    handlePhone(){
+      const id = this.order.id;
+        getUserPhone(id).then(response =>{
+          this.order.userPhone = response.userPhone;
+        })
+      },
+
+    showImageDialog() {
+      this.dialogVisible = true;
+    },
+    handleCustomer(){
+      var that=this;
+      this.customer.open = true;
+      setTimeout(() => {
+          that.$refs.customerDetails.getDetails(this.order.crmId);
+      }, 200);
+    },
+    handleCertificates(){
+      this.certificateDialig.open = true;
+      this.photoArr = null;
+    },
+    handleConfirm(){
+      this.certificateForm.orderId = this.orderId;
+      this.certificateForm.certificates = this.photoArr;
+      uploadCredentials(this.certificateForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("上传成功");
+                this.certificateDialig.open = false;
+                this.getOfflineOrder(this.orderId);
+              }
+            });
+    },
+    getOfflineOrder(orderId){
+      this.order = null;
+      this.orderId=orderId;
+      this.certificates = null;
+      getStoreOrderOffline(orderId).then(response => {
+            this.order = response.order;
+            if(response.order.certificates != null){
+              this.certificates = response.order.certificates;
+            }
+            this.items = response.items;
+            this.customerInfo=response.customer;
+        });
+     }
+  }
+};
+</script>
+<style scoped>
+.order-content{
+  margin: 10px;
+}
+.detail-container {
+  width: 80%;
+  padding: 20px 20px 20px 20px;
+  margin: 20px auto;
+}
+
+.operate-container {
+  background: #F2F6FC;
+  height: 60px;
+  margin: -20px -20px 0;
+  line-height: 60px;
+}
+
+.operate-button-container {
+  float: right;
+  margin-right: 20px
+}
+
+.table-layout {
+  margin-top: 20px;
+  border-left: 1px solid #DCDFE6;
+  border-top: 1px solid #DCDFE6;
+}
+
+.table-cell {
+  height: 60px;
+  line-height: 40px;
+  border-right: 1px solid #DCDFE6;
+  border-bottom: 1px solid #DCDFE6;
+  padding: 10px;
+  font-size: 14px;
+  color: #606266;
+  text-align: center;
+  overflow: hidden;
+}
+
+.table-cell-title {
+  border-right: 1px solid #DCDFE6;
+  border-bottom: 1px solid #DCDFE6;
+  padding: 10px;
+  background: #F2F6FC;
+  text-align: center;
+  font-size: 14px;
+  color: #303133;
+}
+</style>

+ 92 - 0
src/views/hisStore/components/paymentSelect.vue

@@ -0,0 +1,92 @@
+<template>
+  <div >
+    <el-table border v-loading="loading" :data="list">
+      <el-table-column label="支付订单号" align="center" prop="payCode" width="120px" />
+      <el-table-column label="会员手机号" align="center" prop="userPhone" />
+      <el-table-column label="支付类型" align="center" prop="payTypeCode" />
+      <el-table-column label="支付金额" align="center" prop="payMoney" />
+      <el-table-column label="退款金额" align="center" prop="refundMoney" />
+      <el-table-column label="交易单号" align="center" prop="bankTransactionId" />
+      <el-table-column label="银行单号" align="center" prop="bankSerialNo" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="所属部门" align="center" prop="deptName" />
+      <el-table-column label="员工" align="center" prop="companyUserNickName" />
+      <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" prop="createTime" width="180">
+      </el-table-column>
+      <el-table-column label="支付时间" align="center" prop="payTime" width="180">
+      </el-table-column>
+      <el-table-column label="操作" fixed="right" align="center" width="100px" >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleSelect(scope.row)"
+          >选择</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      style="padding-bottom:10px;"
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { getMyPaymentList, getStorePayment, delStorePayment, addStorePayment, updateStorePayment, exportStorePayment } from "@/api/hisStore/storePayment";
+
+export default {
+  name: "paymentSelect",
+  data() {
+    return {
+      statusOptions:[],
+      loading: true,
+      list:[],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10
+      }
+    };
+  },
+  created() {
+    this.getDicts("store_payment_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    getPaymentList(){
+      this.getList();
+    },
+    handleSelect(row){
+      this.$emit('selectPayment',row);
+
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    getList(){
+      this.loading = true;
+      getMyPaymentList(this.queryParams).then(response => {
+        this.list = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    }
+  }
+};
+</script>
+<style scoped>
+
+</style>

+ 397 - 0
src/views/hisStore/components/productAfterSalesOrder.vue

@@ -0,0 +1,397 @@
+<template>
+  <div class="order-content">
+      <div class="order-status" v-if="afterSales!=null" >
+          <el-steps :active="afterSales.status==4?afterSales.status+1:afterSales.status" align-center>
+            <el-step title="待审核(24小时自动审核)"></el-step>
+            <el-step title="平台已审核等待用户发货"></el-step>
+            <el-step title="用户已发货待仓库审核"></el-step>
+            <el-step title="财务审核"></el-step>
+            <el-step title="退款成功"></el-step>
+          </el-steps>
+      </div>
+      <div v-if="afterSales!=null">
+      <el-card shadow="never"  style="margin-top: 15px">
+        <div class="operate-container">
+          <span style="margin-left: 20px" class="color-danger">售后状态:
+            <el-tag prop="status" v-for="(item, index) in salesStatusOptions"    v-if="afterSales.salesStatus==item.dictValue">{{item.dictLabel}}</el-tag>
+          </span>
+          <div class="operate-button-container"  >
+            <el-button size="mini" v-hasPermi="['store:storeAfterSales:edit']" v-show="afterSales.salesStatus==0&&afterSales.status===1"  @click="addDelivery">编辑物流</el-button>
+            <el-button size="mini"  @click="showOrder">查看订单</el-button>
+         </div>
+        </div>
+        <div style="margin: 20px 0px">
+          <span class="font-small">基本信息</span>
+        </div>
+        <el-descriptions :column="4" border  >
+            <el-descriptions-item label="订单单号"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.orderCode}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="会员"  >
+                <span v-if="user!=null">
+                  {{user.nickname}}({{user.phone}})
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="退款金额"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.refundAmount}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="申请类型"  >
+                <span v-if="afterSales!=null">
+                  <el-tag prop="serviceType" v-for="(item, index) in serviceTypeOptions"    v-if="afterSales.serviceType==item.dictValue">{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="申请原因"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.reasons}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="说明"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.explains}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="状态"  >
+                <span v-if="afterSales!=null">
+                  <el-tag   v-for="(item, index) in statusOptions"    v-if="afterSales.status==item.dictValue" >{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="售后状态"  >
+                <span v-if="afterSales!=null">
+                  <el-tag  v-for="(item, index) in salesStatusOptions"    v-if="afterSales.salesStatus==item.dictValue" >{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+        </el-descriptions>
+        <div style="margin: 20px 0px">
+          <span class="font-small">收货信息</span>
+        </div>
+        <el-descriptions   :column="4" border  >
+            <el-descriptions-item label="收货人"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.consignee}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="收货人"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.consignee}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="手机号码"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.phoneNumber}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="收货地址"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.address}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="快递公司"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.deliveryName}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="运单号"  >
+                <span v-if="afterSales!=null">
+                  {{afterSales.deliverySn}}
+                </span>
+            </el-descriptions-item>
+        </el-descriptions>
+        <div style="margin-top: 20px">
+          <span class="font-small">商品信息</span>
+        </div>
+        <el-table
+          border
+          :data="items"
+          size="small"
+          style="width: 100%;margin-top: 20px" >
+          <el-table-column label="商品图片" width="150" align="center">
+            <template slot-scope="scope">
+              <img :src="JSON.parse(scope.row.jsonInfo).image" style="height: 80px">
+            </template>
+          </el-table-column>
+          <el-table-column label="商品名称" width="300" align="center">
+            <template slot-scope="scope">
+              <p>{{JSON.parse(scope.row.jsonInfo).productName}}</p>
+            </template>
+          </el-table-column>
+          <el-table-column label="价格" width="240" align="center">
+            <template slot-scope="scope">
+              <p>价格:¥{{JSON.parse(scope.row.jsonInfo).price}}</p>
+
+            </template>
+          </el-table-column>
+          <el-table-column label="属性" width="240" align="center">
+            <template slot-scope="scope">
+              {{JSON.parse(scope.row.jsonInfo).sku}}
+            </template>
+          </el-table-column>
+          <el-table-column label="数量" width="180" align="center">
+            <template slot-scope="scope">
+                {{JSON.parse(scope.row.jsonInfo).num}}
+            </template>
+          </el-table-column>
+          <el-table-column label="小计"  align="center">
+            <template slot-scope="scope">
+              ¥{{JSON.parse(scope.row.jsonInfo).num*JSON.parse(scope.row.jsonInfo).price}}
+            </template>
+          </el-table-column>
+        </el-table>
+        <div style="margin-top: 20px">
+          <span class="font-small">操作信息</span>
+        </div>
+        <el-table style="margin-top: 20px;width: 100%"
+                  ref="orderHistoryTable"
+                  :data="logs" border>
+          <el-table-column label="操作时间"  width="160" align="center">
+            <template slot-scope="scope">
+              {{scope.row.changeTime}}
+            </template>
+          </el-table-column>
+          <el-table-column label="备注" align="center">
+            <template slot-scope="scope">
+              {{scope.row.changeMessage}}
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-card>
+
+    </div>
+    <el-dialog :title="audit.title" :visible.sync="audit.open" width="800px" append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="退款金额" prop="refundAmount"  >
+          <el-input-number v-model="form.refundAmount"  />
+        </el-form-item>
+        <el-form-item label="退货联系人" prop="consignee"  v-if="form.serviceType==1" >
+          <el-input v-model="form.consignee" placeholder="请输入收货人" />
+        </el-form-item>
+        <el-form-item label="退货手机号" prop="phoneNumber"  v-if="form.serviceType==1">
+          <el-input v-model="form.phoneNumber" placeholder="请输入手机号" />
+        </el-form-item>
+        <el-form-item label="退货地址" prop="address" v-if="form.serviceType==1">
+          <el-input v-model="form.address" placeholder="请输入地址" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitAuditForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="show.title" v-if="show.open" :visible.sync="show.open" width="1000px" append-to-body>
+        <product-order  ref="productOrder" />
+    </el-dialog>
+    <el-dialog :title="add.title" :visible.sync="add.open" width="500px" append-to-body>
+
+    <div slot="footer" class="dialog-footer">
+      <el-form ref="addForm" :model="addForm" :rules="addRules" label-width="100px">
+          <el-form-item label="id" prop="id" v-if="false">
+            <el-input v-model="addForm.id" placeholder="请输入"  />
+          </el-form-item>
+          <el-form-item label="快递公司" prop="deliveryName">
+            <el-input v-model="addForm.deliveryName" placeholder="请输入"  />
+          </el-form-item>
+          <el-form-item label="运单号" prop="deliverySn">
+            <el-input v-model="addForm.deliverySn" placeholder="请输入"  />
+          </el-form-item>
+        </el-form>
+      <el-button type="primary" @click="submitForm">确 定</el-button>
+      <el-button @click="cancel1">取 消</el-button>
+    </div>
+  </el-dialog>
+  </div>
+</template>
+
+<script>
+import {getStoreAfterSales,cancel,refund,audit,updateStoreAfterSales } from "@/api/hisStore/storeAfterSales";
+
+import productOrder from "./productOrder";
+export default {
+  components: { productOrder },
+  name: "order",
+  data() {
+    return {
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      audit:{
+          title:"审核",
+          open:false,
+      },
+      add:{
+        open:false,
+        title:"添加物流"
+      },
+      addForm:{
+        id:null,
+        deliveryName:null,
+        deliverySn:null
+      },
+      addRules:{
+        deliveryName: [
+          { required: true, message: "物流名称不能为空", trigger: "blur" }
+        ],
+        deliverySn: [
+          { required: true, message: "物流单号不能为空", trigger: "blur" }
+        ],
+      },
+      order:null,
+      user:null,
+      serviceTypeOptions:[],
+      salesStatusOptions:[],
+      statusOptions:[],
+      afterSales:null,
+      items:[],
+      logs:[],
+      form:{
+        serviceType:1,
+        refundAmount:0,
+        consignee:null,
+        phoneNumber:null,
+        address:null,
+
+      },
+      rules:{
+        status: [
+          { required: true, message: "状态不能为空", trigger: "blur" }
+        ],
+        refundAmount: [
+          { required: true, message: "退款金额不能为空", trigger: "blur" }
+        ],
+         consignee: [
+          { required: true, message: "退货联系人不能为空", trigger: "blur" }
+        ],
+        phoneNumber: [
+          { required: true, message: "退货手机号不能为空", trigger: "blur" }
+        ],
+         address: [
+          { required: true, message: "退货地址不能为空", trigger: "blur" }
+        ],
+
+      }
+
+    };
+  },
+  created() {
+    this.getDicts("store_after_sales_sales_status").then((response) => {
+        this.salesStatusOptions = response.data;
+    });
+    this.getDicts("store_after_sales_status").then((response) => {
+        this.statusOptions = response.data;
+    });
+     this.getDicts("store_after_sales_service_type").then((response) => {
+        this.serviceTypeOptions = response.data;
+    });
+  },
+  methods: {
+    submitForm() {
+      var id=this.afterSales.id;
+      this.addForm.id = id;
+      updateStoreAfterSales(this.addForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("编辑成功");
+                this.add.open = false;
+                this.getStoreAfterSales(id);
+              }
+            });
+    },
+    cancel1(){
+      this.add.open = false;
+    },
+    addDelivery(){
+      this.add.open = true;
+      this.addForm.deliveryName = this.afterSales.deliveryName;
+      this.addForm.deliverySn = this.afterSales.deliverySn;
+    },
+    showOrder(){
+      this.show.open=true;
+      const orderId = this.order.id ;
+      setTimeout(() => {
+        this.$refs.productOrder.getOrder(orderId);
+      }, 500);
+    },
+    handleAudit(){
+        this.audit.open=true;
+        this.form.serviceType=this.afterSales.serviceType;
+        this.form.salesId=this.afterSales.id;
+        this.form.refundAmount=this.afterSales.refundAmount;
+    },
+    submitAuditForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+           audit(this.form).then(response => {
+              if (response.code === 200) {
+                this.audit.open = false;
+                this.getStoreAfterSales(this.afterSales.id);
+                this.msgSuccess("操作成功");
+              }
+            });
+        }
+      });
+    },
+    cancel(){
+      var id=this.afterSales.id;
+      this.$confirm('是否确认取消订单?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          var data={salesId:id}
+          return cancel(data);
+        }).then(() => {
+          this.getStoreAfterSales(id);
+          this.msgSuccess("操作成功");
+        }).catch(function() {});
+    },
+    refund(){
+      var id=this.afterSales.id;
+      this.$confirm('是否确认收货,确认后将自动退款给客户', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          var data={salesId:id}
+          return refund(data);
+        }).then(() => {
+          this.getStoreAfterSales(id);
+          this.msgSuccess("操作成功");
+        }).catch(function() {});
+    },
+    getStoreAfterSales(id){
+        getStoreAfterSales(id).then(response => {
+            this.afterSales = response.afterSales;
+            this.logs = response.logs;
+            this.items = response.items;
+            this.user=response.user;
+            this.order=response.order;
+        });
+     }
+  }
+};
+</script>
+<style scoped>
+.order-content{
+  margin: 10px;
+}
+.detail-container {
+  width: 80%;
+  padding: 20px 20px 20px 20px;
+  margin: 20px auto;
+}
+
+.operate-container {
+  background: #F2F6FC;
+  height: 80px;
+  margin: -20px -20px 0;
+  line-height: 80px;
+}
+
+.operate-button-container {
+  float: right;
+  margin-right: 20px
+}
+
+
+</style>

+ 144 - 0
src/views/hisStore/components/productDetails.vue

@@ -0,0 +1,144 @@
+<template>
+  <div class="content">
+    <el-descriptions :column="4" border  >
+      <el-descriptions-item label="商品图片"  >
+          <span v-if="product!=null">
+            <el-popover
+            placement="right"
+            title=""
+            trigger="hover"
+          >
+            <img slot="reference" :src="product.image" width="100">
+            <img :src="product.image" style="max-width: 150px;">
+          </el-popover>
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="商品名称"  >
+          <span v-if="product!=null">
+            {{product.productName}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="售价"  >
+          <span v-if="product!=null">
+            {{product.price}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="原价"  >
+          <span v-if="product!=null">
+            {{product.otPrice}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="销量"  >
+          <span v-if="product!=null">
+            {{product.sales}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="库存"  >
+          <span v-if="product!=null">
+            {{product.stock}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="类型"  >
+          <span v-if="product!=null">
+            <el-tag prop="productType" v-for="(item, index) in productTypeOptions"    v-if="product.productType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="状态"  >
+          <span v-if="product!=null">
+            <el-tag prop="productType" v-for="(item, index) in isShowOptions"    v-if="product.isShow==item.dictValue">{{item.dictLabel}}</el-tag>
+          </span>
+      </el-descriptions-item>
+    </el-descriptions>
+    <div style="margin: 20px 0px"  v-if="items!=null">
+        <span class="font-small">
+          规格列表
+        </span>
+    </div>
+    <el-table
+      border
+      v-if="items!=null"
+      :data="items"
+      size="small"
+      style="width: 100%;margin-top: 20px" >
+      <el-table-column label="ID"  align="center">
+        <template slot-scope="scope">
+          <p>{{scope.row.id}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品图片"   align="center">
+          <template slot-scope="scope">
+            <img :src="scope.row.image" style="height: 80px">
+          </template>
+        </el-table-column>
+      <el-table-column label="规格"   align="center">
+        <template slot-scope="scope">
+          <p>{{scope.row.sku}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="售价"   align="center">
+        <template slot-scope="scope">
+          <p>¥{{scope.row.price.toFixed(2)}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="原价"   align="center">
+        <template slot-scope="scope">
+          <p>¥{{scope.row.otPrice.toFixed(2)}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品编码"   align="center">
+        <template slot-scope="scope">
+          {{scope.row.barCode}}
+        </template>
+      </el-table-column>
+      <el-table-column label="库存"  align="center">
+        <template slot-scope="scope">
+          {{scope.row.stock}}
+        </template>
+      </el-table-column>
+      <el-table-column label="销量" width="180" align="center">
+        <template slot-scope="scope">
+          {{scope.row.sales}}
+        </template>
+      </el-table-column>
+    </el-table>
+    <div v-html="product.description"></div>
+  </div>
+</template>
+
+<script>
+import {  getStoreProduct  } from "@/api/hisStore/storeProduct";
+
+export default {
+  name: "product",
+  data() {
+    return {
+      product:null,
+      isShowOptions:[],
+      productTypeOptions:[],
+      items:[],
+    };
+  },
+  created() {
+    this.getDicts("store_product_type").then((response) => {
+      this.productTypeOptions = response.data;
+    });
+    this.getDicts("store_product_is_show").then((response) => {
+      this.isShowOptions = response.data;
+    });
+  },
+  methods: {
+    getStoreProduct(productId) {
+      getStoreProduct(productId).then(response => {
+        this.product = response.product;
+        this.items=response.values
+      });
+    },
+  }
+};
+</script>
+<style scoped>
+.content{
+  margin: 10px;
+}
+
+</style>

+ 922 - 0
src/views/hisStore/components/productOrder.vue

@@ -0,0 +1,922 @@
+<template>
+  <div class="order-content">
+      <div class="order-status" v-if="order!=null" >
+          <el-steps  :active="order.status==3?order.status+1:order.status" align-center>
+            <el-step title="待支付"></el-step>
+            <el-step title="待发货"></el-step>
+            <el-step title="待收货"></el-step>
+            <el-step title="交易完成"></el-step>
+          </el-steps>
+      </div>
+      <div>
+
+      <el-card shadow="never" style="margin-top: 15px">
+      <div class="operate-container"  v-if="order!=null">
+        <span  style="margin-left: 20px" class="color-danger">订单状态:
+           <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="order.status==item.dictValue">{{item.dictLabel}}</el-tag>
+        </span>
+
+        <div class="operate-button-container" >
+          <el-button size="mini" @click="handleCertificates()"  v-hasPermi="['store:storeOrder:uploadCredentials']" >上传凭证</el-button>
+          <el-button size="mini" @click="handleEditAddress()" v-if="order.status==0||order.status==1"  v-hasPermi="['store:storeOrder:editAddress']" >修改收货地址</el-button>
+          <el-button size="mini" @click="handleBindCustomer()"  v-hasPermi="['store:storeOrder:bindCustomer']" >关联客户</el-button>
+          <el-button size="mini" @click="editOrder()"  v-hasPermi="['store:storeOrder:edit']" >修改订单</el-button>
+          <!-- <el-button size="mini" @click="handleEditUser()"  v-hasPermi="['users:user:edit']" >修改会员修改</el-button> -->
+          <el-button size="mini" v-if="order.customerId!=null&&order.customerId>0"  @click="handleCustomer()"    >查看客户详情</el-button>
+        </div>
+        <div class="operate-button-container"  v-hasPermi="['store:storeOrder:express']"  >
+          <el-button size="mini" @click="showExpress()" >查看物流</el-button>
+        </div>
+      </div>
+      <div style="margin: 20px 0px"  v-if="order!=null">
+        <span class="font-small">
+          基本信息
+        </span>
+      </div>
+      <el-descriptions :column="4" border  >
+            <el-descriptions-item label="订单编号"  >
+                <span v-if="order!=null">
+                  {{order.orderCode}}
+                </span>
+                <el-tag  v-for="(item, index) in createTypeOptions"    v-if="order!=null&&order.orderCreateType==item.dictValue">{{item.dictLabel}}
+                </el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item label="会员"  >
+                <span v-if="user!=null">
+                  {{user.nickname}}({{user.phone}})
+                </span>
+            </el-descriptions-item>
+            <!-- <el-descriptions-item label="进线时间"  >
+                <span v-if="user!=null">
+                  {{user.registerDate}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="推线编码"  >
+                <span v-if="user!=null">
+                  {{user.registerCode}}
+                </span>
+            </el-descriptions-item> -->
+
+            <el-descriptions-item label="收货人"  >
+                <span v-if="order!=null ">
+                  {{order.realName }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="手机号码"  >
+                <span v-if="order!=null ">
+                  {{order.userPhone }}
+                </span>
+                <el-button type="text" size="mini" @click="callNumber(0,0,orderId)"  v-hasPermi="['store:storeOrder:callNumber']">拨号</el-button>
+                <el-button type="text" size="mini" @click="handleSms(order.userPhone)" v-hasPermi="['store:storeOrder:sendSms']">短信</el-button>
+                <el-button icon="el-icon-search" size="mini" @click="handlePhone()" style="margin-left: 20px;" circle v-hasPermi="['store:storeOrder:queryPhone']"></el-button>
+            </el-descriptions-item>
+            <el-descriptions-item label="收货地址"  >
+              <el-popover
+                v-if="order!=null"
+                placement="top-start"
+                title="收货地址"
+                width="300"
+                trigger="hover"
+                :content="order.userAddress">
+                <span slot="reference">{{order.userAddress}}</span>
+                <el-button icon="el-icon-search" size="mini" @click="handleAddress()" style="margin-left: 20px;" circle v-hasPermi="['store:storeOrder:queryAddress']"></el-button>
+              </el-popover>
+            </el-descriptions-item>
+            <el-descriptions-item label="支付方式"  >
+                <span v-if="order!=null ">
+                  <el-tag prop="orderType" v-for="(item, index) in payTypeOptions"    v-if="order.payType==item.dictValue">{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="订单类型"  >
+                <span v-if="order!=null ">
+                  <el-tag prop="orderType" v-for="(item, index) in orderTypeOptions"    v-if="order.orderType==item.dictValue">{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="物流公司编号"  >
+                <span v-if="order!=null ">
+                  {{order.deliverySn }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="物流公司名称"  >
+                <span v-if="order!=null ">
+                  {{order.deliveryName }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="快递单号"  >
+                <span v-if="order!=null ">
+                  {{order.deliveryId }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="档期归属"  >
+              <el-tag prop="scheduleId" v-for="(item, index) in scheduleOptions"    v-if="order!=null&&order.scheduleId==item.id">{{item.name}}
+              </el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item label="用户备注"  >
+                <span v-if="order!=null ">
+                  {{order.mark }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="平台备注"  >
+                <span v-if="order!=null ">
+                  {{order.remark }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="跟随阶段"  v-if="company.companyId == 174">
+              <span v-if="order!=null ">
+                <el-tag prop="orderVisit" v-for="(item, index) in customerUserStatusOptions"    v-if="order.orderVisit==item.dictValue">{{item.dictLabel}}</el-tag>
+              </span>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="customerInfo!=null " label="客户编码"  >
+                <span >
+                  {{customerInfo.customerCode }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="customerInfo!=null " label="进线时间"  >
+                <span >
+                  {{customerInfo.registerDate }}
+                </span>
+            </el-descriptions-item>
+
+      </el-descriptions>
+      <div style="margin: 20px 0px"  v-if="order!=null">
+        <span class="font-small">
+          凭证信息
+        </span>
+      </div>
+      <el-image
+          v-if="this.certificates != null"
+          :src="certificates"
+          :preview-src-list="[certificates]"
+          :style="{ width: '100px', height: '100px' }"
+          @click.native="showImageDialog"
+        ></el-image>
+        <el-dialog :visible.sync="dialogVisibleImage" width="10%">
+          <img :src="certificates" style="width: 100%" alt="">
+        </el-dialog>
+
+      <div style="margin-top: 20px">
+        <span class="font-small">商品信息</span>
+      </div>
+      <el-table
+        border
+        v-if="items!=null"
+        :data="items"
+        size="small"
+        style="width: 100%;margin-top: 20px" >
+        <el-table-column label="商品图片" width="150" align="center">
+          <template slot-scope="scope">
+            <img :src="JSON.parse(scope.row.jsonInfo).image" style="height: 80px">
+          </template>
+        </el-table-column>
+        <el-table-column label="商品名称" width="300" align="center">
+          <template slot-scope="scope">
+            <p>{{JSON.parse(scope.row.jsonInfo).productName}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="单价" width="240" align="center">
+          <template slot-scope="scope">
+            <p>¥{{JSON.parse(scope.row.jsonInfo).price.toFixed(2)}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="规格" width="240" align="center">
+          <template slot-scope="scope">
+            {{JSON.parse(scope.row.jsonInfo).sku}}
+          </template>
+        </el-table-column>
+        <el-table-column label="数量" width="180" align="center">
+          <template slot-scope="scope">
+            {{scope.row.num}}
+          </template>
+        </el-table-column>
+        <el-table-column label="小计"  align="center">
+          <template slot-scope="scope" >
+            ¥{{scope.row.num*JSON.parse(scope.row.jsonInfo).price.toFixed(2)}}
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="float: right;margin: 20px" v-if="order!=null">
+        合计:<span class="color-danger">¥{{order.totalPrice.toFixed(2)}}</span>
+      </div>
+
+      <div style="margin: 60px 0px 20px 0px">
+        <span class="font-small">费用信息</span>
+      </div>
+      <el-descriptions   :column="4" border  >
+          <el-descriptions-item label="商品合计"  >
+              <span v-if="order!=null">
+                ¥{{order.totalPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="应付金额"  >
+              <span v-if="order!=null">
+                ¥{{order.payPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="运费"  >
+              <span v-if="order!=null">
+                ¥{{order.payPostage.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="优惠券"  >
+              <span v-if="order!=null">
+                ¥{{order.couponPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="积分抵扣"  >
+              <span v-if="order!=null">
+                ¥{{order.deductionPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="实付金额"  >
+              <span v-if="order!=null">
+                ¥{{order.payMoney.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="代收金额"  >
+              <span v-if="order!=null">
+                ¥{{order.payDelivery.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+      </el-descriptions>
+
+      <div style="margin-top: 20px">
+        <svg-icon icon-class="marker" style="color: #606266"></svg-icon>
+        <span class="font-small">支付信息</span>
+      </div>
+      <el-table
+        border
+        :data="payments"
+        size="small"
+        style="width: 100%;margin-top: 20px" >
+          <el-table-column label="支付单号" align="center" prop="payCode" width="120px" />
+          <el-table-column label="支付金额" align="center" prop="payMoney" />
+          <el-table-column label="类型" align="center" prop="payTypeCode" />
+          <el-table-column label="交易单号" align="center" prop="bankTransactionId" />
+          <el-table-column label="银行单号" align="center" prop="bankSerialNo" />
+          <el-table-column label="创建时间" align="center" prop="createTime" />
+          <el-table-column label="支付时间" align="center" prop="payTime" />
+      </el-table>
+
+      <div style="margin-top: 20px">
+        <span class="font-small">操作信息</span>
+      </div>
+      <el-table style="margin-top: 20px;width: 100%"
+                ref="orderHistoryTable"
+                :data="logs" border>
+        <el-table-column label="操作时间"  width="160" align="center">
+          <template slot-scope="scope">
+            {{scope.row.changeTime}}
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" align="center">
+          <template slot-scope="scope">
+            {{scope.row.changeMessage}}
+          </template>
+        </el-table-column>
+      </el-table>
+
+        <div style="margin-top: 20px">
+          <span class="font-small">审批信息</span>
+        </div>
+        <el-table style="margin-top: 20px;width: 100%"
+                  :data="auditLogs" border>
+          <el-table-column label="操作时间"  width="160" align="center">
+            <template slot-scope="scope">
+              {{scope.row.createTime}}
+            </template>
+          </el-table-column>
+          <el-table-column label="备注" align="center">
+            <template slot-scope="scope">
+              {{scope.row.content}}
+            </template>
+          </el-table-column>
+        </el-table>
+      </el-card>
+    </div>
+    <el-dialog :title="edit.title" :visible.sync="edit.open" width="600px" append-to-body>
+      <el-form ref="editForm" :model="editForm" :rules="editRules" label-width="100px">
+        <el-form-item label="订单类型" prop="orderType"  >
+            <el-select style="width: 200px" v-model="editForm.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="scheduleId"  >
+            <el-select filterable style="width: 200px" v-model="editForm.scheduleId" placeholder="请选择档期" clearable size="small" >
+              <el-option
+                      v-for="item in scheduleOptions"
+                      :key="item.id"
+                      :label="item.name"
+                      :value="item.id"
+                    />
+            </el-select>
+        </el-form-item>
+        <el-form-item label="跟随阶段" prop="orderVisit" v-if="company.companyId == 174" >
+          <el-select filterable style="width: 200px" v-model="editForm.orderVisit" placeholder="请选择跟随阶段" clearable size="small" >
+            <el-option
+                v-for="item in customerUserStatusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="mark"  >
+          <el-input v-model="editForm.mark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="editUser.title" :visible.sync="editUser.open" width="600px" append-to-body>
+      <el-form ref="editUserForm" :model="editUserForm" :rules="editUserRules" label-width="100px">
+         <el-form-item label="进线时间" prop="registerDate">
+          <el-date-picker clearable size="small"
+            v-model="editUserForm.registerDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择进线时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="推线编码" prop="registerCode">
+          <el-input v-model="editUserForm.registerCode" placeholder="请输入推线编码" />
+        </el-form-item>
+          <el-form-item label="渠道来源" prop="source">
+          <el-input v-model="editUserForm.source" placeholder="请输入渠道来源" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditUserForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="editAddress.title" :visible.sync="editAddress.open" width="600px" append-to-body>
+      <el-form ref="editAddressForm" :model="editAddressForm" :rules="editAddressRules" label-width="100px">
+        <el-form-item label="收件人" prop="realName">
+          <el-input v-model="editAddressForm.realName" placeholder="请输入收件人" />
+        </el-form-item>
+          <el-form-item label="联系电话" prop="source">
+          <el-input v-model="editAddressForm.userPhone" placeholder="请输入联系电话" />
+        </el-form-item>
+        <el-form-item label="收货地址" prop="district">
+          <el-row :gutter="20">
+          <el-col :span="6">
+             <el-select @change="provinceChange" v-model="editAddressForm.provinceId" placeholder="请选择">
+                <el-option
+                  v-for="item in province"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+          <el-col :span="6">
+            <el-select @change="cityChange" v-model="editAddressForm.cityId" placeholder="请选择">
+                <el-option
+                  v-for="item in city"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+          <el-col :span="6">
+             <el-select @change="districtChange" v-model="editAddressForm.districtId" placeholder="请选择">
+                <el-option
+                  v-for="item in district"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+        </el-row>
+        </el-form-item>
+        <el-form-item label="详细地址" prop="detail">
+          <el-input v-model="editAddressForm.detail" placeholder="请输入收货人详细地址" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditAddressForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="expressDialog.title" :visible.sync="expressDialog.open" width="600px" append-to-body>
+      <el-table style="margin-top: 20px;width: 100%"
+                ref="orderHistoryTable"
+                :data="traces" border>
+        <el-table-column label="操作时间"  width="160" align="center">
+          <template slot-scope="scope">
+            {{scope.row.AcceptTime}}
+          </template>
+        </el-table-column>
+         <el-table-column label="位置" align="center">
+          <template slot-scope="scope">
+            {{scope.row.Location}}
+          </template>
+        </el-table-column>
+        <el-table-column label="描述" align="center">
+          <template slot-scope="scope">
+            {{scope.row.AcceptStation}}
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+    <el-dialog :title="bindCustomerDialog.title" :visible.sync="bindCustomerDialog.open" width="800px" append-to-body>
+      <el-form ref="bindCustomerForm" :model="bindCustomerForm" :rules="bindCustomerRules" label-width="100px">
+        <el-form-item label="客户查询">
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-input v-model="bindCustomerForm.mobile"   placeholder="请输入客户手机号"/>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="primary" @click="searchCustomer">查看</el-button>
+            </el-col>
+          </el-row>
+
+        </el-form-item>
+        <el-form-item label="客户选择"  prop="customerIds">
+          <el-table   @selection-change="handleSelectionChange"
+                :data="customers" border>
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="ID" align="center" prop="customerId" />
+            <el-table-column label="客户编号"  width="160" align="center">
+              <template slot-scope="scope">
+                {{scope.row.customerCode}}
+              </template>
+            </el-table-column>
+            <el-table-column label="客户名称"  width="160" align="center">
+              <template slot-scope="scope">
+                {{scope.row.customerName}}
+              </template>
+            </el-table-column>
+            <el-table-column label="客户手机号"  width="160" align="center">
+              <template slot-scope="scope">
+                {{scope.row.mobile}}
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitBindCustomerForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="certificateDialig.title" :visible.sync="certificateDialig.open" append-to-body>
+      <el-form ref="certificateForm" :model="certificateForm" :rules="certificateRules" label-width="100px">
+        <el-form-item label="凭证" prop="certificates">
+          <ImageUpload v-model="photoArr" type="image" :num="10" :width="150" :height="150" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handleConfirm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-drawer
+      :append-to-body="true"
+      size="75%"
+      :title="customer.title" :visible.sync="customer.open"
+      >
+        <customer-details  ref="customerDetails" />
+    </el-drawer>
+    <el-dialog :title="addSms.title" :visible.sync="addSms.open" width="800px" append-to-body>
+        <add-sms ref="sms" @close="closeSms()"></add-sms>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {updateUser,getUser } from "@/api/users/user";
+import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import {getCustomerListBySearch } from "@/api/crm/customer";
+import ImageUpload from '@/components/ImageUpload'
+import Material from '@/components/Material'
+import {bindCustomer,getExpress, listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder,uploadCredentials, getStoreOrderAddress,getUserPhone} from "@/api/hisStore/storeOrder";
+import {getCitys} from "@/api/hisStore/city";
+import customerDetails from '../../crm/components/customerDetails.vue';
+import addSms from '../../crm/components/addSms.vue';
+export default {
+  name: "order",
+  components: {customerDetails,
+    ImageUpload,Material ,addSms},
+  data() {
+    return {
+      customerUserStatusOptions:[],
+      scheduleOptions:[],
+      dialogVisibleImage: false,
+      customerInfo:null,
+      customer:{
+        title:"客户详情",
+        open:false,
+      },
+      photoArr:null,
+      certificateDialig:{
+        title:"上传凭证",
+        open:false,
+      },
+      certificateForm:{
+        orderCode:null,
+        certificates:null,
+      },
+      addSms:{
+        open:false,
+        title:"发短信"
+      },
+      certificateRules:{
+        certificates:[
+          { required: true, message: "凭证不能为空", trigger: "change" }
+        ]
+      },
+      customers:[],
+      bindCustomerDialog:{
+        title:"关联客户",
+        open:false,
+      },
+      bindCustomerForm:{
+        mobile:null,
+        customerIds:null,
+      },
+      bindCustomerRules:{
+        customerIds: [
+            { required: true, message: "客户不能为空", trigger: "change" }
+        ],
+
+      },
+      orderId:null,
+      expressDialog:{
+        title:"物流信息",
+        open:false,
+      },
+      citys:[],
+      province:[],
+      city:[],
+      district:[],
+      editAddress:{
+        title:"修改收货地址",
+        open:false,
+      },
+      editAddressForm:{
+        districtId:null,
+
+      },
+      editAddressRules:{
+
+      },
+      editUser:{
+        title:"修改会员信息",
+        open:false,
+      },
+      editUserForm:{
+        registerDate:null,
+        registerCode:"",
+        source:"",
+      },
+      editUserRules:{
+
+      },
+      edit:{
+        title:"",
+        open:false,
+      },
+      editForm:{
+        orderType:null,
+        scheduleId:null,
+        orderVisit:null,
+        mark:"",
+      },
+      editRules:{
+
+      },
+      createTypeOptions:[],
+      orderTypeOptions:[],
+      payTypeOptions:[],
+      statusOptions:[],
+      certificates:null,
+      order:null,
+      user:{},
+      logs:[],
+      items:[],
+      express:[],
+      traces:[],
+      payments:[],
+      auditLogs: []
+    };
+  },
+  created() {
+    this.getDicts("crm_customer_user_status").then((response) => {
+            this.customerUserStatusOptions = response.data;
+        });
+    this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
+    this.getDicts("store_order_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("store_order_create_type").then((response) => {
+      this.createTypeOptions = response.data;
+    });
+    getTcmScheduleList().then(response => {
+      this.scheduleOptions = response.data;
+    });
+  },
+  computed: {
+    company(){
+      return this.$store.state.user.user;
+    }
+  },
+  methods: {
+    closeSms(){
+      this.addSms.open=false;
+    },
+    handleSms(mobile){
+        this.addSms.open=true;
+        var that=this;
+        setTimeout(() => {
+            that.$refs.sms.getOrderId(this.orderId,mobile,2);
+        }, 500);
+
+    },
+    handlePhone(){
+      const id = this.order.id;
+        getUserPhone(id).then(response =>{
+          this.order.userPhone = response.userPhone;
+        })
+      },
+    handleAddress(){
+      const id = this.order.id;
+      getStoreOrderAddress(id).then(response =>{
+          this.order.userAddress = response.address;
+      })
+    },
+    showImageDialog() {
+      this.dialogVisible = true;
+    },
+    handleCustomer(){
+      var that=this;
+      this.customer.open = true;
+      setTimeout(() => {
+          that.$refs.customerDetails.getDetails(this.order.customerId);
+      }, 200);
+    },
+    handleSelectionChange(selection) {
+      this.bindCustomerForm.customerIds = selection.map(item => item.customerId)
+    },
+    searchCustomer(){
+      if(this.bindCustomerForm.mobile==null||this.bindCustomerForm.mobile==""){
+        this.msgError("请输入手机号");
+        return;
+      }
+      var data={mobile:this.bindCustomerForm.mobile};
+      getCustomerListBySearch(data).then(response => {
+          this.customers=response.data;
+      });
+    },
+    handleBindCustomer() {
+      this.customers=[];
+      this.bindCustomerDialog.open = true;
+      this.bindCustomerForm.mobile=null;
+      this.bindCustomerForm.orderId=this.orderId;
+      this.bindCustomerForm.customerIds=null;
+    },
+    /** 提交按钮 */
+    submitBindCustomerForm() {
+      this.$refs["bindCustomerForm"].validate(valid => {
+        if (valid) {
+          bindCustomer(this.bindCustomerForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.bindCustomerDialog.open = false;
+              }
+            });
+        }
+      });
+    },
+    handleCertificates(){
+      this.certificateDialig.open = true;
+      this.photoArr = null;
+    },
+    handleConfirm(){
+      this.certificateForm.id = this.orderId;
+      this.certificateForm.orderCode = this.order.orderCode;
+      this.certificateForm.certificates = this.photoArr;
+      uploadCredentials(this.certificateForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("上传成功");
+                this.certificateDialig.open = false;
+                this.getOrder(this.order.id);
+              }
+            });
+    },
+    showExpress(){
+      this.expressDialog.open=true;
+      getExpress(this.orderId).then(response => {
+          this.express = response.data;
+          if(this.express!=null&&this.express.Traces!=null){
+              this.traces=this.express.Traces
+          }
+
+      });
+
+    },
+    districtChange(val){
+      var item=this.citys.find((item)=>{
+        return item.cityId==val&&item.level==2;
+      })
+      this.editAddressForm.district=item.name;
+
+    },
+    cityChange(val){
+      this.district=this.citys.filter(item => item.parentId===val )
+      this.editAddressForm.districtId=null;
+      var item=this.citys.find((item)=>{
+        return item.cityId==val&&item.level==1;
+      })
+      this.editAddressForm.city=item.name;
+
+
+    },
+    provinceChange(val){
+      this.city=this.citys.filter(item => item.parentId===val )
+      this.district=[];
+      this.editAddressForm.cityId=null;
+      this.editAddressForm.districtId=null;
+      var item=this.citys.find((item)=>{
+        return item.cityId==val&&item.level==0;
+      })
+      this.editAddressForm.province=item.name;
+    },
+    getCityList(){
+      getCitys().then(res => {
+          this.citys=res.data;
+          this.province=res.data.filter(item => item.level===0 )
+        })
+    },
+    handleEditAddress() {
+        this.getCityList();
+        this.editAddressForm.id=this.order.id;
+        this.editAddressForm.realName=this.order.realName;
+        this.editAddressForm.userPhone=this.order.userPhone;
+        var address=this.order.userAddress.split(' ')
+        var province=this.citys.find((item)=>{
+          return item.name==address[0]&&item.level==0;
+        })
+        if(province!=null){
+          this.editAddressForm.provinceId=province.cityId;
+          this.city=this.citys.filter(item => item.parentId===province.cityId&&item.level==1 )
+        }
+        var city=this.citys.find((item)=>{
+          return item.name==address[1]&&item.level==1;
+        })
+
+        if(city!=null){
+          this.editAddressForm.cityId=city.cityId;
+          this.district=this.citys.filter(item => item.parentId===city.cityId&&item.level==2 )
+        }
+        var district=this.citys.find((item)=>{
+          return item.name==address[2]&&item.level==2;
+        })
+        if(district!=null){
+          this.editAddressForm.districtId=district.cityId;
+        }
+
+        this.editAddress.open = true;
+    },
+    /** 提交按钮 */
+    submitEditAddressForm() {
+      this.$refs["editAddressForm"].validate(valid => {
+        if (valid) {
+           this.editAddressForm.userAddress=this.editAddressForm.province+" "+this.editAddressForm.city+" "+this.editAddressForm.district+" "+this.editAddressForm.detail;
+            updateStoreOrder(this.editAddressForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.editAddress.open = false;
+                this.getOrder(this.order.id);
+              }
+            });
+        }
+      });
+    },
+    handleEditUser() {
+      const userId = this.order.userId
+      getUser(userId).then(response => {
+        this.editUserForm.userId=response.data.userId;
+        this.editUserForm.registerDate=response.data.registerDate;
+        this.editUserForm.registerCode=response.data.registerCode;
+        this.editUserForm.source=response.data.source;
+        this.editUser.open = true;
+      });
+    },
+    /** 提交按钮 */
+    submitEditUserForm() {
+      this.$refs["editUserForm"].validate(valid => {
+        if (valid) {
+            updateUser(this.editUserForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.editUser.open = false;
+                this.getOrder(this.order.id);
+              }
+            });
+        }
+      });
+    },
+    submitEditForm(){
+        this.$refs["editForm"].validate(valid => {
+        if (valid) {
+          updateStoreOrder(this.editForm).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("操作成功");
+              this.edit.open = false;
+              this.getOrder(this.order.id);
+            }
+          });
+
+        }
+      });
+    },
+    editOrder(){
+        this.edit.open=true;
+        this.editForm.mark=this.order.mark
+        this.editForm.id=this.order.id;
+        if(this.order.orderType!=null){
+          this.editForm.orderType=this.order.orderType.toString();
+        }
+        this.editForm.scheduleId=this.order.scheduleId;
+        this.editForm.orderVisit = this.order.orderVisit;
+
+    },
+    getOrder(orderId){
+        this.orderId=orderId;
+        this.certificates = null;
+        getStoreOrder(orderId).then(response => {
+            this.order = response.order;
+            if(response.order.certificates != null){
+              this.certificates = response.order.certificates;
+            }
+            this.user = response.user;
+            this.logs = response.logs;
+            this.items = response.items;
+            this.payments=response.payments;
+            this.customerInfo=response.customer;
+            this.auditLogs = response.auditLogs;
+        });
+     }
+  }
+};
+</script>
+<style scoped>
+.order-content{
+  margin: 10px;
+}
+.detail-container {
+  width: 80%;
+  padding: 20px 20px 20px 20px;
+  margin: 20px auto;
+}
+
+.operate-container {
+  background: #F2F6FC;
+  height: 60px;
+  margin: -20px -20px 0;
+  line-height: 60px;
+}
+
+.operate-button-container {
+  float: right;
+  margin-right: 20px
+}
+
+.table-layout {
+  margin-top: 20px;
+  border-left: 1px solid #DCDFE6;
+  border-top: 1px solid #DCDFE6;
+}
+
+.table-cell {
+  height: 60px;
+  line-height: 40px;
+  border-right: 1px solid #DCDFE6;
+  border-bottom: 1px solid #DCDFE6;
+  padding: 10px;
+  font-size: 14px;
+  color: #606266;
+  text-align: center;
+  overflow: hidden;
+}
+
+.table-cell-title {
+  border-right: 1px solid #DCDFE6;
+  border-bottom: 1px solid #DCDFE6;
+  padding: 10px;
+  background: #F2F6FC;
+  text-align: center;
+  font-size: 14px;
+  color: #303133;
+}
+</style>

+ 903 - 0
src/views/hisStore/components/productOrder2.vue

@@ -0,0 +1,903 @@
+<template>
+  <div class="order-content">
+      <div class="order-status" v-if="order!=null" >
+          <el-steps  :active="order.status==3?order.status+1:order.status" align-center>
+            <el-step title="待支付"></el-step>
+            <el-step title="待发货"></el-step>
+            <el-step title="待收货"></el-step>
+            <el-step title="交易完成"></el-step>
+          </el-steps>
+      </div>
+      <div>
+
+      <el-card shadow="never" style="margin-top: 15px">
+      <div class="operate-container"  v-if="order!=null">
+        <span  style="margin-left: 20px" class="color-danger">订单状态:
+           <el-tag prop="status" v-for="(item, index) in statusOptions"    v-if="order.status==item.dictValue">{{item.dictLabel}}</el-tag>
+        </span>
+
+        <div class="operate-button-container" >
+          <el-button size="mini" @click="handleCertificates()"  v-hasPermi="['store:storeOrder:uploadCredentials']" >上传凭证</el-button>
+          <el-button size="mini" @click="handleEditAddress()" v-if="order.status==0||order.status==1"  v-hasPermi="['store:storeOrder:editAddress']" >修改收货地址</el-button>
+          <el-button size="mini" @click="handleBindCustomer()"  v-hasPermi="['store:storeOrder:bindCustomer']" >关联客户</el-button>
+          <el-button size="mini" @click="editOrder()"  v-hasPermi="['store:storeOrder:edit']" >修改订单</el-button>
+          <!-- <el-button size="mini" @click="handleEditUser()"  v-hasPermi="['users:user:edit']" >修改会员修改</el-button> -->
+          <el-button size="mini" v-if="order.customerId!=null&&order.customerId>0"  @click="handleCustomer()"    >查看客户详情</el-button>
+        </div>
+        <div class="operate-button-container"  v-hasPermi="['store:storeOrder:express']"  >
+          <el-button size="mini" @click="showExpress()" >查看物流</el-button>
+        </div>
+      </div>
+      <div style="margin: 20px 0px"  v-if="order!=null">
+        <span class="font-small">
+          基本信息
+        </span>
+      </div>
+      <el-descriptions :column="4" border  >
+            <el-descriptions-item label="订单编号"  >
+                <span v-if="order!=null">
+                  {{order.orderCode}}
+                </span>
+                <el-tag  v-for="(item, index) in createTypeOptions"    v-if="order!=null&&order.orderCreateType==item.dictValue">{{item.dictLabel}}
+                </el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item label="会员"  >
+                <span v-if="user!=null">
+                  {{user.nickname}}({{user.phone}})
+                </span>
+            </el-descriptions-item>
+            <!-- <el-descriptions-item label="进线时间"  >
+                <span v-if="user!=null">
+                  {{user.registerDate}}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="推线编码"  >
+                <span v-if="user!=null">
+                  {{user.registerCode}}
+                </span>
+            </el-descriptions-item> -->
+
+            <el-descriptions-item label="收货人"  >
+                <span v-if="order!=null ">
+                  {{order.realName }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="手机号码"  >
+                <span v-if="order!=null ">
+                  {{order.userPhone }}
+                </span>
+                <el-button type="text" size="mini" @click="callNumber(0,0,orderId)"  v-hasPermi="['store:storeOrder:callNumber']">拨号</el-button>
+                <el-button type="text" size="mini" @click="handleSms(order.userPhone)" v-hasPermi="['store:storeOrder:sendSms']">短信</el-button>
+                <el-button icon="el-icon-search" size="mini" @click="handlePhone()" style="margin-left: 20px;" circle v-hasPermi="['store:storeOrder:queryPhone']"></el-button>
+            </el-descriptions-item>
+            <el-descriptions-item label="收货地址"  >
+              <el-popover
+                v-if="order!=null"
+                placement="top-start"
+                title="收货地址"
+                width="300"
+                trigger="hover"
+                :content="order.userAddress">
+                <span slot="reference">{{order.userAddress}}</span>
+                <el-button icon="el-icon-search" size="mini" @click="handleAddress()" style="margin-left: 20px;" circle v-hasPermi="['store:storeOrder:queryAddress']"></el-button>
+              </el-popover>
+            </el-descriptions-item>
+            <el-descriptions-item label="支付方式"  >
+                <span v-if="order!=null ">
+                  <el-tag prop="orderType" v-for="(item, index) in payTypeOptions"    v-if="order.payType==item.dictValue">{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="订单类型"  >
+                <span v-if="order!=null ">
+                  <el-tag prop="orderType" v-for="(item, index) in orderTypeOptions"    v-if="order.orderType==item.dictValue">{{item.dictLabel}}</el-tag>
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="物流公司编号"  >
+                <span v-if="order!=null ">
+                  {{order.deliverySn }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="物流公司名称"  >
+                <span v-if="order!=null ">
+                  {{order.deliveryName }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="快递单号"  >
+                <span v-if="order!=null ">
+                  {{order.deliveryId }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="档期归属"  >
+              <el-tag prop="scheduleId" v-for="(item, index) in scheduleOptions"    v-if="order!=null&&order.scheduleId==item.id">{{item.name}}
+              </el-tag>
+            </el-descriptions-item>
+            <el-descriptions-item label="用户备注"  >
+                <span v-if="order!=null ">
+                  {{order.mark }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="平台备注"  >
+                <span v-if="order!=null ">
+                  {{order.remark }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item label="跟随阶段"  v-if="company.companyId == 174">
+              <span v-if="order!=null ">
+                <el-tag prop="orderVisit" v-for="(item, index) in customerUserStatusOptions"    v-if="order.orderVisit==item.dictValue">{{item.dictLabel}}</el-tag>
+              </span>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="customerInfo!=null " label="客户编码"  >
+                <span >
+                  {{customerInfo.customerCode }}
+                </span>
+            </el-descriptions-item>
+            <el-descriptions-item v-if="customerInfo!=null " label="进线时间"  >
+                <span >
+                  {{customerInfo.registerDate }}
+                </span>
+            </el-descriptions-item>
+
+      </el-descriptions>
+      <div style="margin: 20px 0px"  v-if="order!=null">
+        <span class="font-small">
+          凭证信息
+        </span>
+      </div>
+      <el-image
+          v-if="this.certificates != null"
+          :src="certificates"
+          :preview-src-list="[certificates]"
+          :style="{ width: '100px', height: '100px' }"
+          @click.native="showImageDialog"
+        ></el-image>
+        <el-dialog :visible.sync="dialogVisibleImage" width="10%">
+          <img :src="certificates" style="width: 100%" alt="">
+        </el-dialog>
+
+      <div style="margin-top: 20px">
+        <span class="font-small">商品信息</span>
+      </div>
+      <el-table
+        border
+        v-if="items!=null"
+        :data="items"
+        size="small"
+        style="width: 100%;margin-top: 20px" >
+        <el-table-column label="商品图片" width="150" align="center">
+          <template slot-scope="scope">
+            <img :src="JSON.parse(scope.row.jsonInfo).image" style="height: 80px">
+          </template>
+        </el-table-column>
+        <el-table-column label="商品名称" width="300" align="center">
+          <template slot-scope="scope">
+            <p>{{JSON.parse(scope.row.jsonInfo).productName}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="单价" width="240" align="center">
+          <template slot-scope="scope">
+            <p>¥{{JSON.parse(scope.row.jsonInfo).price.toFixed(2)}}</p>
+          </template>
+        </el-table-column>
+        <el-table-column label="规格" width="240" align="center">
+          <template slot-scope="scope">
+            {{JSON.parse(scope.row.jsonInfo).sku}}
+          </template>
+        </el-table-column>
+        <el-table-column label="数量" width="180" align="center">
+          <template slot-scope="scope">
+            {{scope.row.num}}
+          </template>
+        </el-table-column>
+        <el-table-column label="小计"  align="center">
+          <template slot-scope="scope" >
+            ¥{{scope.row.num*JSON.parse(scope.row.jsonInfo).price.toFixed(2)}}
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="float: right;margin: 20px" v-if="order!=null">
+        合计:<span class="color-danger">¥{{order.totalPrice.toFixed(2)}}</span>
+      </div>
+
+      <div style="margin: 60px 0px 20px 0px">
+        <span class="font-small">费用信息</span>
+      </div>
+      <el-descriptions   :column="4" border  >
+          <el-descriptions-item label="商品合计"  >
+              <span v-if="order!=null">
+                ¥{{order.totalPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="应付金额"  >
+              <span v-if="order!=null">
+                ¥{{order.payPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="运费"  >
+              <span v-if="order!=null">
+                ¥{{order.payPostage.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="优惠券"  >
+              <span v-if="order!=null">
+                ¥{{order.couponPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="积分抵扣"  >
+              <span v-if="order!=null">
+                ¥{{order.deductionPrice.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="实付金额"  >
+              <span v-if="order!=null">
+                ¥{{order.payMoney.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+          <el-descriptions-item label="代收金额"  >
+              <span v-if="order!=null">
+                ¥{{order.payDelivery.toFixed(2)}}
+              </span>
+          </el-descriptions-item>
+      </el-descriptions>
+
+      <div style="margin-top: 20px">
+        <svg-icon icon-class="marker" style="color: #606266"></svg-icon>
+        <span class="font-small">支付信息</span>
+      </div>
+      <el-table
+        border
+        :data="payments"
+        size="small"
+        style="width: 100%;margin-top: 20px" >
+          <el-table-column label="支付单号" align="center" prop="payCode" width="120px" />
+          <el-table-column label="支付金额" align="center" prop="payMoney" />
+          <el-table-column label="类型" align="center" prop="payTypeCode" />
+          <el-table-column label="交易单号" align="center" prop="bankTransactionId" />
+          <el-table-column label="银行单号" align="center" prop="bankSerialNo" />
+          <el-table-column label="创建时间" align="center" prop="createTime" />
+          <el-table-column label="支付时间" align="center" prop="payTime" />
+      </el-table>
+
+      <div style="margin-top: 20px">
+        <span class="font-small">操作信息</span>
+      </div>
+      <el-table style="margin-top: 20px;width: 100%"
+                ref="orderHistoryTable"
+                :data="logs" border>
+        <el-table-column label="操作时间"  width="160" align="center">
+          <template slot-scope="scope">
+            {{scope.row.changeTime}}
+          </template>
+        </el-table-column>
+        <el-table-column label="备注" align="center">
+          <template slot-scope="scope">
+            {{scope.row.changeMessage}}
+          </template>
+        </el-table-column>
+      </el-table>
+      </el-card>
+    </div>
+    <el-dialog :title="edit.title" :visible.sync="edit.open" width="600px" append-to-body>
+      <el-form ref="editForm" :model="editForm" :rules="editRules" label-width="100px">
+        <el-form-item label="订单类型" prop="orderType"  >
+            <el-select style="width: 200px" v-model="editForm.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="scheduleId"  >
+            <el-select filterable style="width: 200px" v-model="editForm.scheduleId" placeholder="请选择档期" clearable size="small" >
+              <el-option
+                      v-for="item in scheduleOptions"
+                      :key="item.id"
+                      :label="item.name"
+                      :value="item.id"
+                    />
+            </el-select>
+        </el-form-item>
+        <el-form-item label="跟随阶段" prop="orderVisit" v-if="company.companyId == 174" >
+          <el-select filterable style="width: 200px" v-model="editForm.orderVisit" placeholder="请选择跟随阶段" clearable size="small" >
+            <el-option
+                v-for="item in customerUserStatusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="备注" prop="mark"  >
+          <el-input v-model="editForm.mark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="editUser.title" :visible.sync="editUser.open" width="600px" append-to-body>
+      <el-form ref="editUserForm" :model="editUserForm" :rules="editUserRules" label-width="100px">
+         <el-form-item label="进线时间" prop="registerDate">
+          <el-date-picker clearable size="small"
+            v-model="editUserForm.registerDate"
+            type="date"
+            value-format="yyyy-MM-dd"
+            placeholder="选择进线时间">
+          </el-date-picker>
+        </el-form-item>
+        <el-form-item label="推线编码" prop="registerCode">
+          <el-input v-model="editUserForm.registerCode" placeholder="请输入推线编码" />
+        </el-form-item>
+          <el-form-item label="渠道来源" prop="source">
+          <el-input v-model="editUserForm.source" placeholder="请输入渠道来源" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditUserForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="editAddress.title" :visible.sync="editAddress.open" width="600px" append-to-body>
+      <el-form ref="editAddressForm" :model="editAddressForm" :rules="editAddressRules" label-width="100px">
+        <el-form-item label="收件人" prop="realName">
+          <el-input v-model="editAddressForm.realName" placeholder="请输入收件人" />
+        </el-form-item>
+          <el-form-item label="联系电话" prop="source">
+          <el-input v-model="editAddressForm.userPhone" placeholder="请输入联系电话" />
+        </el-form-item>
+        <el-form-item label="收货地址" prop="district">
+          <el-row :gutter="20">
+          <el-col :span="6">
+             <el-select @change="provinceChange" v-model="editAddressForm.provinceId" placeholder="请选择">
+                <el-option
+                  v-for="item in province"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+          <el-col :span="6">
+            <el-select @change="cityChange" v-model="editAddressForm.cityId" placeholder="请选择">
+                <el-option
+                  v-for="item in city"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+          <el-col :span="6">
+             <el-select @change="districtChange" v-model="editAddressForm.districtId" placeholder="请选择">
+                <el-option
+                  v-for="item in district"
+                  :key="item.cityId"
+                  :label="item.name"
+                  :value="item.cityId">
+                </el-option>
+              </el-select>
+          </el-col>
+        </el-row>
+        </el-form-item>
+        <el-form-item label="详细地址" prop="detail">
+          <el-input v-model="editAddressForm.detail" placeholder="请输入收货人详细地址" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitEditAddressForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="expressDialog.title" :visible.sync="expressDialog.open" width="600px" append-to-body>
+      <el-table style="margin-top: 20px;width: 100%"
+                ref="orderHistoryTable"
+                :data="traces" border>
+        <el-table-column label="操作时间"  width="160" align="center">
+          <template slot-scope="scope">
+            {{scope.row.AcceptTime}}
+          </template>
+        </el-table-column>
+         <el-table-column label="位置" align="center">
+          <template slot-scope="scope">
+            {{scope.row.Location}}
+          </template>
+        </el-table-column>
+        <el-table-column label="描述" align="center">
+          <template slot-scope="scope">
+            {{scope.row.AcceptStation}}
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-dialog>
+    <el-dialog :title="bindCustomerDialog.title" :visible.sync="bindCustomerDialog.open" width="800px" append-to-body>
+      <el-form ref="bindCustomerForm" :model="bindCustomerForm" :rules="bindCustomerRules" label-width="100px">
+        <el-form-item label="客户查询">
+          <el-row :gutter="10" class="mb8">
+            <el-col :span="1.5">
+              <el-input v-model="bindCustomerForm.mobile"   placeholder="请输入客户手机号"/>
+            </el-col>
+            <el-col :span="1.5">
+              <el-button type="primary" @click="searchCustomer">查看</el-button>
+            </el-col>
+          </el-row>
+
+        </el-form-item>
+        <el-form-item label="客户选择"  prop="customerIds">
+          <el-table   @selection-change="handleSelectionChange"
+                :data="customers" border>
+            <el-table-column type="selection" width="55" align="center" />
+            <el-table-column label="ID" align="center" prop="customerId" />
+            <el-table-column label="客户编号"  width="160" align="center">
+              <template slot-scope="scope">
+                {{scope.row.customerCode}}
+              </template>
+            </el-table-column>
+            <el-table-column label="客户名称"  width="160" align="center">
+              <template slot-scope="scope">
+                {{scope.row.customerName}}
+              </template>
+            </el-table-column>
+            <el-table-column label="客户手机号"  width="160" align="center">
+              <template slot-scope="scope">
+                {{scope.row.mobile}}
+              </template>
+            </el-table-column>
+          </el-table>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitBindCustomerForm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog :title="certificateDialig.title" :visible.sync="certificateDialig.open" append-to-body>
+      <el-form ref="certificateForm" :model="certificateForm" :rules="certificateRules" label-width="100px">
+        <el-form-item label="凭证" prop="certificates">
+          <ImageUpload v-model="photoArr" type="image" :num="10" :width="150" :height="150" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handleConfirm">确 定</el-button>
+      </div>
+    </el-dialog>
+    <el-drawer
+      :append-to-body="true"
+      size="75%"
+      :title="customer.title" :visible.sync="customer.open"
+      >
+        <customer-details  ref="customerDetails" />
+    </el-drawer>
+    <el-dialog :title="addSms.title" :visible.sync="addSms.open" width="800px" append-to-body>
+        <add-sms ref="sms" @close="closeSms()"></add-sms>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {updateUser,getUser } from "@/api/users/user";
+import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import {getCustomerListBySearch } from "@/api/crm/customer";
+import ImageUpload from '@/components/ImageUpload'
+import Material from '@/components/Material'
+import {bindCustomer,getExpress, listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder,uploadCredentials, getStoreOrderAddress,getUserPhone} from "@/api/hisStore/storeOrder";
+import {getCitys} from "@/api/hisStore/city";
+import customerDetails from '../../crm/components/customerDetails.vue';
+import addSms from '../../crm/components/addSms.vue';
+export default {
+  name: "order",
+  components: {customerDetails,
+    ImageUpload,Material ,addSms},
+  data() {
+    return {
+      customerUserStatusOptions:[],
+      scheduleOptions:[],
+      dialogVisibleImage: false,
+      customerInfo:null,
+      customer:{
+        title:"客户详情",
+        open:false,
+      },
+      photoArr:null,
+      certificateDialig:{
+        title:"上传凭证",
+        open:false,
+      },
+      certificateForm:{
+        orderCode:null,
+        certificates:null,
+      },
+      addSms:{
+        open:false,
+        title:"发短信"
+      },
+      certificateRules:{
+        certificates:[
+          { required: true, message: "凭证不能为空", trigger: "change" }
+        ]
+      },
+      customers:[],
+      bindCustomerDialog:{
+        title:"关联客户",
+        open:false,
+      },
+      bindCustomerForm:{
+        mobile:null,
+        customerIds:null,
+      },
+      bindCustomerRules:{
+        customerIds: [
+            { required: true, message: "客户不能为空", trigger: "change" }
+        ],
+
+      },
+      orderId:null,
+      expressDialog:{
+        title:"物流信息",
+        open:false,
+      },
+      citys:[],
+      province:[],
+      city:[],
+      district:[],
+      editAddress:{
+        title:"修改收货地址",
+        open:false,
+      },
+      editAddressForm:{
+        districtId:null,
+
+      },
+      editAddressRules:{
+
+      },
+      editUser:{
+        title:"修改会员信息",
+        open:false,
+      },
+      editUserForm:{
+        registerDate:null,
+        registerCode:"",
+        source:"",
+      },
+      editUserRules:{
+
+      },
+      edit:{
+        title:"",
+        open:false,
+      },
+      editForm:{
+        orderType:null,
+        scheduleId:null,
+        orderVisit:null,
+        mark:"",
+      },
+      editRules:{
+
+      },
+      createTypeOptions:[],
+      orderTypeOptions:[],
+      payTypeOptions:[],
+      statusOptions:[],
+      certificates:null,
+      order:null,
+      user:{},
+      logs:[],
+      items:[],
+      express:[],
+      traces:[],
+      payments:[],
+    };
+  },
+  created() {
+    this.getDicts("crm_customer_user_status").then((response) => {
+            this.customerUserStatusOptions = response.data;
+        });
+    this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
+    this.getDicts("store_order_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("store_order_create_type").then((response) => {
+      this.createTypeOptions = response.data;
+    });
+    getTcmScheduleList().then(response => {
+      this.scheduleOptions = response.data;
+    });
+  },
+  computed: {
+    company(){
+      return this.$store.state.user.user;
+    }
+  },
+  methods: {
+    closeSms(){
+      this.addSms.open=false;
+    },
+    handleSms(mobile){
+        this.addSms.open=true;
+        var that=this;
+        setTimeout(() => {
+            that.$refs.sms.getOrderId(this.orderId,mobile,2);
+        }, 500);
+
+    },
+    handlePhone(){
+      const id = this.order.id;
+        getUserPhone(id).then(response =>{
+          this.order.userPhone = response.userPhone;
+        })
+      },
+    handleAddress(){
+      const id = this.order.id;
+      getStoreOrderAddress(id).then(response =>{
+          this.order.userAddress = response.address;
+      })
+    },
+    showImageDialog() {
+      this.dialogVisible = true;
+    },
+    handleCustomer(){
+      var that=this;
+      this.customer.open = true;
+      setTimeout(() => {
+          that.$refs.customerDetails.getDetails(this.order.customerId);
+      }, 200);
+    },
+    handleSelectionChange(selection) {
+      this.bindCustomerForm.customerIds = selection.map(item => item.customerId)
+    },
+    searchCustomer(){
+      if(this.bindCustomerForm.mobile==null||this.bindCustomerForm.mobile==""){
+        this.msgError("请输入手机号");
+        return;
+      }
+      var data={mobile:this.bindCustomerForm.mobile};
+      getCustomerListBySearch(data).then(response => {
+          this.customers=response.data;
+      });
+    },
+    handleBindCustomer() {
+      this.customers=[];
+      this.bindCustomerDialog.open = true;
+      this.bindCustomerForm.mobile=null;
+      this.bindCustomerForm.orderId=this.orderId;
+      this.bindCustomerForm.customerIds=null;
+    },
+    /** 提交按钮 */
+    submitBindCustomerForm() {
+      this.$refs["bindCustomerForm"].validate(valid => {
+        if (valid) {
+          bindCustomer(this.bindCustomerForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.bindCustomerDialog.open = false;
+              }
+            });
+        }
+      });
+    },
+    handleCertificates(){
+      this.certificateDialig.open = true;
+      this.photoArr = null;
+    },
+    handleConfirm(){
+      this.certificateForm.id = this.orderId;
+      this.certificateForm.orderCode = this.order.orderCode;
+      this.certificateForm.certificates = this.photoArr;
+      uploadCredentials(this.certificateForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("上传成功");
+                this.certificateDialig.open = false;
+                this.getOrder(this.order.id);
+              }
+            });
+    },
+    showExpress(){
+      this.expressDialog.open=true;
+      getExpress(this.orderId).then(response => {
+          this.express = response.data;
+          if(this.express!=null&&this.express.Traces!=null){
+              this.traces=this.express.Traces
+          }
+
+      });
+
+    },
+    districtChange(val){
+      var item=this.citys.find((item)=>{
+        return item.cityId==val&&item.level==2;
+      })
+      this.editAddressForm.district=item.name;
+
+    },
+    cityChange(val){
+      this.district=this.citys.filter(item => item.parentId===val )
+      this.editAddressForm.districtId=null;
+      var item=this.citys.find((item)=>{
+        return item.cityId==val&&item.level==1;
+      })
+      this.editAddressForm.city=item.name;
+
+
+    },
+    provinceChange(val){
+      this.city=this.citys.filter(item => item.parentId===val )
+      this.district=[];
+      this.editAddressForm.cityId=null;
+      this.editAddressForm.districtId=null;
+      var item=this.citys.find((item)=>{
+        return item.cityId==val&&item.level==0;
+      })
+      this.editAddressForm.province=item.name;
+    },
+    getCityList(){
+      getCitys().then(res => {
+          this.citys=res.data;
+          this.province=res.data.filter(item => item.level===0 )
+        })
+    },
+    handleEditAddress() {
+        this.getCityList();
+        this.editAddressForm.id=this.order.id;
+        this.editAddressForm.realName=this.order.realName;
+        this.editAddressForm.userPhone=this.order.userPhone;
+        var address=this.order.userAddress.split(' ')
+        var province=this.citys.find((item)=>{
+          return item.name==address[0]&&item.level==0;
+        })
+        if(province!=null){
+          this.editAddressForm.provinceId=province.cityId;
+          this.city=this.citys.filter(item => item.parentId===province.cityId&&item.level==1 )
+        }
+        var city=this.citys.find((item)=>{
+          return item.name==address[1]&&item.level==1;
+        })
+
+        if(city!=null){
+          this.editAddressForm.cityId=city.cityId;
+          this.district=this.citys.filter(item => item.parentId===city.cityId&&item.level==2 )
+        }
+        var district=this.citys.find((item)=>{
+          return item.name==address[2]&&item.level==2;
+        })
+        if(district!=null){
+          this.editAddressForm.districtId=district.cityId;
+        }
+
+        this.editAddress.open = true;
+    },
+    /** 提交按钮 */
+    submitEditAddressForm() {
+      this.$refs["editAddressForm"].validate(valid => {
+        if (valid) {
+           this.editAddressForm.userAddress=this.editAddressForm.province+" "+this.editAddressForm.city+" "+this.editAddressForm.district+" "+this.editAddressForm.detail;
+            updateStoreOrder(this.editAddressForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.editAddress.open = false;
+                this.getOrder(this.order.id);
+              }
+            });
+        }
+      });
+    },
+    handleEditUser() {
+      const userId = this.order.userId
+      getUser(userId).then(response => {
+        this.editUserForm.userId=response.data.userId;
+        this.editUserForm.registerDate=response.data.registerDate;
+        this.editUserForm.registerCode=response.data.registerCode;
+        this.editUserForm.source=response.data.source;
+        this.editUser.open = true;
+      });
+    },
+    /** 提交按钮 */
+    submitEditUserForm() {
+      this.$refs["editUserForm"].validate(valid => {
+        if (valid) {
+            updateUser(this.editUserForm).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.editUser.open = false;
+                this.getOrder(this.order.id);
+              }
+            });
+        }
+      });
+    },
+    submitEditForm(){
+        this.$refs["editForm"].validate(valid => {
+        if (valid) {
+          updateStoreOrder(this.editForm).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("操作成功");
+              this.edit.open = false;
+              this.getOrder(this.order.id);
+            }
+          });
+
+        }
+      });
+    },
+    editOrder(){
+        this.edit.open=true;
+        this.editForm.mark=this.order.mark
+        this.editForm.id=this.order.id;
+        if(this.order.orderType!=null){
+          this.editForm.orderType=this.order.orderType.toString();
+        }
+        this.editForm.scheduleId=this.order.scheduleId;
+        this.editForm.orderVisit = this.order.orderVisit;
+
+    },
+    getOrder(orderId){
+        this.orderId=orderId;
+        this.certificates = null;
+        getStoreOrder(orderId).then(response => {
+            this.order = response.order;
+            if(response.order.certificates != null){
+              this.certificates = response.order.certificates;
+            }
+            this.user = response.user;
+            this.logs = response.logs;
+            this.items = response.items;
+            this.payments=response.payments;
+            this.customerInfo=response.customer;
+        });
+     }
+  }
+};
+</script>
+<style scoped>
+.order-content{
+  margin: 10px;
+}
+.detail-container {
+  width: 80%;
+  padding: 20px 20px 20px 20px;
+  margin: 20px auto;
+}
+
+.operate-container {
+  background: #F2F6FC;
+  height: 60px;
+  margin: -20px -20px 0;
+  line-height: 60px;
+}
+
+.operate-button-container {
+  float: right;
+  margin-right: 20px
+}
+
+.table-layout {
+  margin-top: 20px;
+  border-left: 1px solid #DCDFE6;
+  border-top: 1px solid #DCDFE6;
+}
+
+.table-cell {
+  height: 60px;
+  line-height: 40px;
+  border-right: 1px solid #DCDFE6;
+  border-bottom: 1px solid #DCDFE6;
+  padding: 10px;
+  font-size: 14px;
+  color: #606266;
+  text-align: center;
+  overflow: hidden;
+}
+
+.table-cell-title {
+  border-right: 1px solid #DCDFE6;
+  border-bottom: 1px solid #DCDFE6;
+  padding: 10px;
+  background: #F2F6FC;
+  text-align: center;
+  font-size: 14px;
+  color: #303133;
+}
+</style>

+ 135 - 0
src/views/hisStore/components/productPackageDetails.vue

@@ -0,0 +1,135 @@
+<template>
+  <div class="content">
+    <el-descriptions :column="4" border  >
+      <el-descriptions-item label="封面"  >
+          <span v-if="package!=null">
+            <el-popover
+            placement="right"
+            title=""
+            trigger="hover"
+          >
+            <img slot="reference" :src="package.imgUrl" width="100">
+            <img :src="package.imgUrl" style="max-width: 150px;">
+          </el-popover>
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="标题"  >
+          <span v-if="package!=null">
+            {{package.title}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="描述"  >
+          <span v-if="package!=null" >
+            {{package.descs}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="原价"  >
+          <span v-if="package!=null">
+            {{package.money.toFixed(2)}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="套餐价格"  >
+          <span v-if="package!=null">
+            {{package.payMoney.toFixed(2)}}
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="支付类型"  >
+          <span v-if="package!=null">
+            <el-tag prop="payType" v-for="(item, index) in storePayTypeOptions"    v-if="package.payType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </span>
+      </el-descriptions-item>
+      <el-descriptions-item label="限购次数"  >
+          <span v-if="package!=null">
+            {{package.limitCount}}
+          </span>
+      </el-descriptions-item>
+
+    </el-descriptions>
+    <div style="margin: 20px 0px"  v-if="items!=null">
+        <span class="font-small">
+          商品列表
+        </span>
+    </div>
+    <el-table
+      border
+      v-if="items!=null"
+      :data="items"
+      size="small"
+      style="width: 100%;margin-top: 20px" >
+      <el-table-column label="ID"  align="center">
+        <template slot-scope="scope">
+          <p>{{scope.row.id}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品图片"   align="center">
+          <template slot-scope="scope">
+            <img :src="scope.row.image" style="height: 80px">
+          </template>
+      </el-table-column>
+      <el-table-column label="商品名称"   align="center">
+        <template slot-scope="scope">
+          <p>{{scope.row.productName}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="规格"   align="center">
+        <template slot-scope="scope">
+          <p>{{scope.row.sku}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="售价"   align="center">
+        <template slot-scope="scope">
+          <p>¥{{scope.row.price.toFixed(2)}}</p>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品编码"   align="center">
+        <template slot-scope="scope">
+          {{scope.row.barCode}}
+        </template>
+      </el-table-column>
+      <el-table-column label="数量" width="180" align="center">
+        <template slot-scope="scope">
+          {{scope.row.count}}
+        </template>
+      </el-table-column>
+    </el-table>
+    <div v-html="package.content"></div>
+  </div>
+</template>
+
+<script>
+import {  getStoreProductPackage  } from "@/api/hisStore/storeProductPackage";
+
+export default {
+  name: "product",
+  data() {
+    return {
+      cateOptions:[],
+      storePayTypeOptions:[],
+      package:null,
+      items:[],
+    };
+  },
+  created() {
+    this.getDicts("store_product_package_cate").then((response) => {
+      this.cateOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.storePayTypeOptions = response.data;
+    });
+  },
+  methods: {
+    getStoreProductPackage(id) {
+      getStoreProductPackage(id).then(response => {
+        this.package = response.productPckage;
+        this.items = response.productList;
+      });
+    },
+  }
+};
+</script>
+<style scoped>
+.content{
+  margin: 10px;
+}
+
+</style>

+ 100 - 0
src/views/hisStore/components/productSelect.vue

@@ -0,0 +1,100 @@
+<template>
+  <div >
+    <el-form :model="queryParams" ref="queryForm" :inline="true" label-width="68px">
+      <el-form-item label="商品名称" prop="productName">
+        <el-input
+          style="width:200px"
+          v-model="queryParams.productName"
+          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-form-item>
+    </el-form>
+    <el-table border v-loading="loading" :data="list">
+      <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="80">
+            <img :src="scope.row.image" style="max-width: 80px;">
+          </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="agentPrice" />
+      <el-table-column label="操作" align="center" width="100px" >
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleSelect(scope.row)"
+          >选择</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination
+      style="padding-bottom:10px;"
+      v-show="total>0"
+      :total="total"
+      :page.sync="queryParams.pageNum"
+      :limit.sync="queryParams.pageSize"
+      @pagination="getList"
+    />
+  </div>
+</template>
+
+<script>
+import { getStoreProductAttrValueList } from "@/api/hisStore/storeProduct";
+export default {
+  name: "selectProduct",
+  data() {
+    return {
+      loading: true,
+      list:[],
+      total: 0,
+      queryParams: {
+        productName:"",
+        pageNum: 1,
+        pageSize: 10
+      }
+    };
+  },
+  created() {
+     this.getList();
+  },
+
+  methods: {
+    handleSelect(row){
+      this.$emit('selectProduct',row);
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    getList(){
+      this.loading = true;
+      getStoreProductAttrValueList(this.queryParams).then(response => {
+        this.list = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    }
+  }
+};
+</script>
+<style scoped>
+
+</style>

+ 344 - 0
src/views/hisStore/statistics/storeOrder.vue

@@ -0,0 +1,344 @@
+<template>
+  <div class="app-container">
+      <div class="app-content">
+           <div class="title">
+             商城订单统计
+          </div>
+         <el-form class="search-form" :inline="true" >
+          <el-form-item >
+            <el-select v-model="value" placeholder="请选择日期">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item >
+            <treeselect :clearable="false"  v-model="deptId"  :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+          </el-form-item>
+          <el-form-item>
+            <el-select filterable v-model="userIds" placeholder="请选择员工" clearable size="small">
+                <el-option
+                  v-for="item in users"
+                  :key="item.userId"
+                  :label="item.nickName"
+                  :value="item.userId">
+                </el-option>
+              </el-select>
+          </el-form-item>
+          <el-form-item label="筛选日期" prop="createTime">
+                  <el-date-picker clearable size="small" style="width: 205.4px"
+                    v-model="dateRange"
+                    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"   @click="storeOrder">搜索</el-button>
+          </el-form-item>
+        </el-form>
+         <div class="data-box">
+            <div class="echart-box">
+              <div id="echart-customer"></div>
+            </div>
+            <div class="table-box">
+                  <el-button class="export" size="small"  @click="handleExport"   v-hasPermi="['statistics:customer:index']">导出</el-button>
+                  <el-table
+                  :data="list"
+                  border
+                  :summary-method="getSummaries"
+                  show-summary
+                  max-height="500"
+                  style="width: 100%;">
+                  <el-table-column
+                    prop="nickName"
+                    label="员工姓名">
+                  </el-table-column>
+                  <el-table-column
+                    prop="orderCount"
+                    label="订单数">
+                  </el-table-column>
+                  <el-table-column
+                    prop="payPrice"
+                    label="订单金额">
+                  </el-table-column>
+
+                </el-table>
+            </div>
+        </div>
+      </div>
+
+    </div>
+</template>
+
+<script>
+import { storeOrder,exportStoreOrder } from "@/api/hisStore/statistics";
+import { getUserListByDeptId} from "@/api/company/companyUser";
+import echarts from 'echarts'
+import resize from '../../dashboard/mixins/resize'
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+name: 'Index',
+mixins: [resize],
+components: { Treeselect },
+watch: {
+// 监听deptId
+'deptId': 'currDeptChange'
+},
+data() {
+return {
+ deptOptions:[],
+ deptId:undefined,
+ userIds:undefined,
+ users:[],
+ dateRange:[],
+ chart: null,
+ options: [{
+    value: '1',
+    label: '今天'
+  }, {
+    value: '2',
+    label: '昨天'
+  }, {
+    value: '3',
+    label: '本周'
+  }, {
+    value: '4',
+    label: '上周'
+  }, {
+    value: '5',
+    label: '本月'
+  }
+  , {
+    value: '6',
+    label: '上月'
+  }
+  , {
+    value: '7',
+    label: '本季度'
+  }
+  , {
+    value: '8',
+    label: '上季度'
+  }
+  , {
+    value: '9',
+    label: '本年'
+  }
+  , {
+    value: '10',
+    label: '上年'
+  }],
+  value: '5',
+  list:[],
+  dates:[],
+  orderCount:[],
+  payPrice:[],
+
+}
+},
+created() {
+this.getTreeselect();
+},
+methods: {
+  currDeptChange(val){
+  this.deptId=val;
+  this.getUserListByDeptId();
+},
+/** 查询部门下拉树结构 */
+getTreeselect() {
+var that=this;
+treeselect().then((response) => {
+  this.deptOptions = response.data;
+  if(response.data!=null&&response.data.length>0){
+    this.deptId=response.data[0].id;
+    that.storeOrder()
+  }
+});
+},
+handleExport(){
+  var data;
+  if(this.userIds!=undefined){
+      data={type:this.value,userIds:this.userIds+"",deptId:this.deptId}
+  }
+  else{
+      data={type:this.value,deptId:this.deptId}
+  }
+  exportStoreOrder(data).then((response) => {
+     this.download(response.msg);
+  });
+
+},
+getUserListByDeptId() {
+  this.userIds=undefined;
+  var data={deptId:this.deptId};
+  getUserListByDeptId(data).then(response => {
+    this.users = response.data;
+
+  });
+},
+storeOrder(){
+    var data;
+    if(this.userIds!=undefined){
+        data={type:this.value,userIds:this.userIds+"",deptId:this.deptId}
+    }
+    else{
+        data={type:this.value,deptId:this.deptId}
+    }
+    storeOrder(data).then((response) => {
+     this.list=response.list;
+     this.dates=response.dates;
+     this.orderCount=response.orderCount;
+     this.payPrice=response.payPrice;
+      setTimeout(() => {
+        this.initEchart();
+      }, 500);
+  });
+},
+initEchart(){
+  var option = {
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
+            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
+        }
+    },
+    legend: {
+        data: ['订单数', '订单金额' ]
+    },
+    grid: {
+        left: '3%',
+        right: '4%',
+        bottom: '3%',
+        containLabel: true
+    },
+    xAxis: [
+        {
+            type: 'category',
+            data: this.dates
+        }
+    ],
+    yAxis: [
+        {
+            type: 'value',
+            axisLabel:{
+              formatter:'{value}'
+            }
+        }
+    ],
+    series: [
+        {
+
+            name: '订单数',
+            type: 'bar',
+            emphasis: {
+                focus: 'series'
+            },
+            data: this.orderCount
+        },
+        {
+
+            name: '订单金额',
+            type: 'bar',
+            emphasis: {
+                focus: 'series'
+            },
+            data: this.payPrice
+        }
+
+    ]
+  };
+  this.chart=echarts.init(document.getElementById("echart-customer"));
+  this.chart.setOption(option,true);
+},
+ getSummaries(param) {
+  const { columns, data } = param;
+  const sums = [];
+  columns.forEach((column, index) => {
+    if (index === 0) {
+      sums[index] = '总计';
+      return;
+    }
+    const values = data.map(item => Number(item[column.property]));
+    if (!values.every(value => isNaN(value))) {
+      sums[index] = values.reduce((prev, curr) => {
+        const value = Number(curr);
+        if (!isNaN(value)) {
+          return prev + curr;
+        } else {
+          return prev;
+        }
+      }, 0);
+      sums[index] += ' ';
+    } else {
+      sums[index] = '';
+    }
+  });
+
+  return sums;
+}
+}
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container{
+border: 1px solid #e6e6e6;
+padding: 12px;
+
+.app-content{
+background-color: white;
+.title{
+  padding: 20px 30px 0px 30px;
+  font-size: 18px;
+  font-weight: bold;
+  color: black;
+
+}
+.search-form{
+  margin: 20px 30px 0px 30px;
+}
+.data-box{
+  padding: 30px;
+  background-color:  rgb(255, 255, 255);
+  height: 100%;
+
+  .echart-box{
+    margin: 0 auto;
+    text-align: center;
+  }
+  .el-select{
+    margin: 5px 10px;
+  }
+  .table-box{
+    margin-top: 15px;
+    .export{
+      float: right;
+      margin: 10px 0px;
+    }
+  }
+}
+}
+}
+#echart-customer{
+width:100%;
+height:320px
+}
+.vue-treeselect{
+width: 217px;
+height: 36px;
+}
+
+</style>
+<style>
+.vue-treeselect__control{
+display: block;
+}
+</style>

+ 344 - 0
src/views/hisStore/statistics/storePayment.vue

@@ -0,0 +1,344 @@
+<template>
+  <div class="app-container">
+      <div class="app-content">
+           <div class="title">
+             商城订单统计
+          </div>
+         <el-form class="search-form" :inline="true" >
+          <el-form-item >
+            <el-select v-model="value" placeholder="请选择日期">
+              <el-option
+                v-for="item in options"
+                :key="item.value"
+                :label="item.label"
+                :value="item.value">
+              </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item >
+            <treeselect :clearable="false"  v-model="deptId"  :options="deptOptions" :show-count="true" placeholder="请选择归属部门" />
+          </el-form-item>
+          <el-form-item>
+            <el-select filterable v-model="userIds" placeholder="请选择员工" clearable size="small">
+                <el-option
+                  v-for="item in users"
+                  :key="item.userId"
+                  :label="item.nickName"
+                  :value="item.userId">
+                </el-option>
+              </el-select>
+          </el-form-item>
+          <el-form-item label="筛选日期" prop="createTime">
+                  <el-date-picker clearable size="small" style="width: 205.4px"
+                    v-model="dateRange"
+                    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"   @click="storePayment">搜索</el-button>
+          </el-form-item>
+        </el-form>
+         <div class="data-box">
+            <div class="echart-box">
+              <div id="echart-customer"></div>
+            </div>
+            <div class="table-box">
+                  <el-button class="export" size="small"  @click="handleExport"   v-hasPermi="['statistics:customer:index']">导出</el-button>
+                  <el-table
+                  :data="list"
+                  border
+                  :summary-method="getSummaries"
+                  show-summary
+                  max-height="500"
+                  style="width: 100%;">
+                  <el-table-column
+                    prop="nickName"
+                    label="员工姓名">
+                  </el-table-column>
+                  <el-table-column
+                    prop="orderCount"
+                    label="订单数">
+                  </el-table-column>
+                  <el-table-column
+                    prop="payMoney"
+                    label="订单金额">
+                  </el-table-column>
+
+                </el-table>
+            </div>
+        </div>
+      </div>
+
+    </div>
+</template>
+
+<script>
+import { storePayment,exportStorePayment } from "@/api/hisStore/statistics";
+import { getUserListByDeptId} from "@/api/company/companyUser";
+import echarts from 'echarts'
+import resize from '../../dashboard/mixins/resize'
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+name: 'Index',
+mixins: [resize],
+components: { Treeselect },
+watch: {
+// 监听deptId
+'deptId': 'currDeptChange'
+},
+data() {
+return {
+ deptOptions:[],
+ deptId:undefined,
+ userIds:undefined,
+ users:[],
+ dateRange:[],
+ chart: null,
+ options: [{
+    value: '1',
+    label: '今天'
+  }, {
+    value: '2',
+    label: '昨天'
+  }, {
+    value: '3',
+    label: '本周'
+  }, {
+    value: '4',
+    label: '上周'
+  }, {
+    value: '5',
+    label: '本月'
+  }
+  , {
+    value: '6',
+    label: '上月'
+  }
+  , {
+    value: '7',
+    label: '本季度'
+  }
+  , {
+    value: '8',
+    label: '上季度'
+  }
+  , {
+    value: '9',
+    label: '本年'
+  }
+  , {
+    value: '10',
+    label: '上年'
+  }],
+  value: '5',
+  list:[],
+  dates:[],
+  orderCount:[],
+  payMoney:[],
+
+}
+},
+created() {
+this.getTreeselect();
+},
+methods: {
+  currDeptChange(val){
+  this.deptId=val;
+  this.getUserListByDeptId();
+},
+/** 查询部门下拉树结构 */
+getTreeselect() {
+  var that=this;
+  treeselect().then((response) => {
+    this.deptOptions = response.data;
+    if(response.data!=null&&response.data.length>0){
+      this.deptId=response.data[0].id;
+      that.storePayment()
+    }
+  });
+},
+handleExport(){
+  var data;
+  if(this.userIds!=undefined){
+      data={type:this.value,userIds:this.userIds+"",deptId:this.deptId}
+  }
+  else{
+      data={type:this.value,deptId:this.deptId}
+  }
+  exportStorePayment(data).then((response) => {
+     this.download(response.msg);
+  });
+
+},
+getUserListByDeptId() {
+  this.userIds=undefined;
+  var data={deptId:this.deptId};
+  getUserListByDeptId(data).then(response => {
+    this.users = response.data;
+
+  });
+},
+storePayment(){
+    var data;
+    if(this.userIds!=undefined){
+        data={type:this.value,userIds:this.userIds+"",deptId:this.deptId}
+    }
+    else{
+        data={type:this.value,deptId:this.deptId}
+    }
+    storePayment(data).then((response) => {
+     this.list=response.list;
+     this.dates=response.dates;
+     this.orderCount=response.orderCount;
+     this.payMoney=response.payMoney;
+      setTimeout(() => {
+        this.initEchart();
+      }, 500);
+  });
+},
+initEchart(){
+  var option = {
+    tooltip: {
+        trigger: 'axis',
+        axisPointer: {            // 坐标轴指示器,坐标轴触发有效
+            type: 'shadow'        // 默认为直线,可选为:'line' | 'shadow'
+        }
+    },
+    legend: {
+        data: ['订单数', '订单金额' ]
+    },
+    grid: {
+        left: '3%',
+        right: '4%',
+        bottom: '3%',
+        containLabel: true
+    },
+    xAxis: [
+        {
+            type: 'category',
+            data: this.dates
+        }
+    ],
+    yAxis: [
+        {
+            type: 'value',
+            axisLabel:{
+              formatter:'{value}'
+            }
+        }
+    ],
+    series: [
+        {
+
+            name: '订单数',
+            type: 'bar',
+            emphasis: {
+                focus: 'series'
+            },
+            data: this.orderCount
+        },
+        {
+
+            name: '订单金额',
+            type: 'bar',
+            emphasis: {
+                focus: 'series'
+            },
+            data: this.payMoney
+        }
+
+    ]
+  };
+  this.chart=echarts.init(document.getElementById("echart-customer"));
+  this.chart.setOption(option,true);
+},
+ getSummaries(param) {
+  const { columns, data } = param;
+  const sums = [];
+  columns.forEach((column, index) => {
+    if (index === 0) {
+      sums[index] = '总计';
+      return;
+    }
+    const values = data.map(item => Number(item[column.property]));
+    if (!values.every(value => isNaN(value))) {
+      sums[index] = values.reduce((prev, curr) => {
+        const value = Number(curr);
+        if (!isNaN(value)) {
+          return prev + curr;
+        } else {
+          return prev;
+        }
+      }, 0);
+      sums[index] += ' ';
+    } else {
+      sums[index] = '';
+    }
+  });
+
+  return sums;
+}
+}
+}
+</script>
+
+<style lang="scss" scoped>
+.app-container{
+border: 1px solid #e6e6e6;
+padding: 12px;
+
+.app-content{
+background-color: white;
+.title{
+  padding: 20px 30px 0px 30px;
+  font-size: 18px;
+  font-weight: bold;
+  color: black;
+
+}
+.search-form{
+  margin: 20px 30px 0px 30px;
+}
+.data-box{
+  padding: 30px;
+  background-color:  rgb(255, 255, 255);
+  height: 100%;
+
+  .echart-box{
+    margin: 0 auto;
+    text-align: center;
+  }
+  .el-select{
+    margin: 5px 10px;
+  }
+  .table-box{
+    margin-top: 15px;
+    .export{
+      float: right;
+      margin: 10px 0px;
+    }
+  }
+}
+}
+}
+#echart-customer{
+width:100%;
+height:320px
+}
+.vue-treeselect{
+width: 217px;
+height: 36px;
+}
+
+</style>
+<style>
+.vue-treeselect__control{
+display: block;
+}
+</style>

+ 403 - 0
src/views/hisStore/storeAfterSales/list.vue

@@ -0,0 +1,403 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+
+     <el-form-item label="所属部门" prop="deptId">
+        <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
+     </el-form-item>
+
+      <el-form-item label="订单单号" prop="orderCode">
+        <el-input
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+      <el-form-item label="运单号" prop="deliverySn">
+            <el-input
+                style="width:220px"
+                v-model="queryParams.deliverySn"
+                placeholder="请输入运单号"
+                clearable
+                size="small"
+                @keyup.enter.native="handleQuery" />
+      </el-form-item>
+
+       <el-form-item label="员工姓名" prop="companyUserNickName">
+        <el-input
+
+          v-model="queryParams.companyUserNickName"
+          placeholder="请输入员工姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="手机号" prop="consigneePhone">
+        <el-input
+          v-model="queryParams.consigneePhone"
+          placeholder="请输入手机号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+
+       <el-form-item label="退款时间" prop="createTimeRange">
+            <el-date-picker
+            style="width:220px"
+              clearable size="small"
+              v-model="dateRange"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
+
+      <el-form-item label="状态" prop="status">
+        <el-select  v-model="queryParams.status" placeholder="请选择状态" clearable size="small" >
+         <el-option
+                v-for="item in statusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="售后状态" prop="salesStatus">
+        <el-select   v-model="queryParams.salesStatus" placeholder="请选择状态" clearable size="small" >
+         <el-option
+                v-for="item in salesStatusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </el-form-item>
+
+      <el-form-item label="退款类型" prop="serviceType">
+        <el-select   v-model="queryParams.serviceType" placeholder="请选择类型" clearable size="small" >
+         <el-option
+                v-for="item in serviceTypeOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </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="warning"
+              icon="el-icon-download"
+              size="mini"
+                @click="handleExport"
+
+            >导出</el-button>
+          </el-col>
+
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+    <el-table  height="500" border v-loading="loading" :data="storeAfterSalesList" @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="orderCode" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="所属员工" align="center" prop="companyUserNickName" />
+      <el-table-column label="会员手机号" align="center" prop="userPhone" />
+      <el-table-column label="退款金额" align="center" prop="refundAmount" />
+       <el-table-column label="退款类型" align="center" prop="serviceType" >
+          <template slot-scope="scope">
+              <div prop="serviceType" v-for="(item, index) in serviceTypeOptions"    v-if="scope.row.serviceType==item.dictValue">{{item.dictLabel}}</div>
+          </template>
+      </el-table-column>
+      <el-table-column label="申请原因" align="center" prop="reasons" />
+      <el-table-column label="说明" align="center" prop="explains" />
+      <el-table-column label="状态" align="center" prop="status" >
+          <template slot-scope="scope">
+              <div prop="status" v-for="(item, index) in statusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</div>
+          </template>
+      </el-table-column>
+      <el-table-column label="售后状态" align="center" prop="salesStatus" >
+          <template slot-scope="scope">
+              <div prop="status" v-for="(item, index) in salesStatusOptions"    v-if="scope.row.salesStatus==item.dictValue">{{item.dictLabel}}</div>
+          </template>
+      </el-table-column>
+      <el-table-column label="提交时间" align="center" prop="createTime" />
+
+      <el-table-column label="操作" align="center"  fixed="right" width="120px" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleShow(scope.row)"
+            v-hasPermi="['store:storeAfterSales:query']"
+          >查看</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-drawer
+     size="75%"
+      :title="title" :visible.sync="open"
+      >
+      <product-after-sales-order  ref="afterSalesOrder" />
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import { listStoreAfterSales, getStoreAfterSales, delStoreAfterSales, addStoreAfterSales, updateStoreAfterSales, exportStoreAfterSales } from "@/api/hisStore/storeAfterSales";
+import productAfterSalesOrder from "../components/productAfterSalesOrder";
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  components: { productAfterSalesOrder,Treeselect },
+  name: "StoreAfterSales",
+  data() {
+    return {
+      // 部门树选项
+      deptOptions: undefined,
+      deptName: undefined,
+      serviceTypeOptions:[],
+      salesStatusOptions:[],
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后记录表格数据
+      storeAfterSalesList: [],
+      dateRange:[],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        refundAmount: null,
+        serviceType: null,
+        reasons: null,
+        explains: null,
+        explainImg: null,
+        shipperCode: null,
+        deliverySn: null,
+        deliveryName: null,
+        status: null,
+        salesStatus: null,
+        isDel: null,
+        userId: null,
+        consignee: null,
+        phoneNumber: null,
+        address: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+   watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+        this.$refs.tree.filter(val);
+      },
+  },
+  created() {
+    this.getTreeselect();
+    this.getDicts("store_after_sales_sales_status").then((response) => {
+        this.salesStatusOptions = response.data;
+    });
+    this.getDicts("store_after_sales_status").then((response) => {
+        this.statusOptions = response.data;
+    });
+     this.getDicts("store_after_sales_service_type").then((response) => {
+        this.serviceTypeOptions = response.data;
+    });
+
+    this.getList();
+  },
+  methods: {
+    /** 查询部门下拉树结构 */
+     getTreeselect() {
+      treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.getList();
+    },
+    handleShow(row){
+      this.title="售后订单"
+      this.open=true;
+      setTimeout(() => {
+        this.$refs.afterSalesOrder.getStoreAfterSales(row.id);
+      }, 200);
+
+    },
+
+    /** 查询售后记录列表 */
+    getList() {
+      this.loading = true;
+      listStoreAfterSales(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.storeAfterSalesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        orderCode: null,
+        refundAmount: null,
+        serviceType: null,
+        reasons: null,
+        explains: null,
+        explainImg: null,
+        shipperCode: null,
+        deliverySn: null,
+        deliveryName: null,
+        status: 0,
+        salesStatus: 0,
+        createTime: null,
+        isDel: null,
+        userId: null,
+        consignee: null,
+        phoneNumber: null,
+        address: 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
+      getStoreAfterSales(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) {
+            updateStoreAfterSales(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addStoreAfterSales(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 delStoreAfterSales(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有售后记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreAfterSales(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 310 - 0
src/views/hisStore/storeAfterSales/myList.vue

@@ -0,0 +1,310 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单单号" prop="orderCode">
+        <el-input
+
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="员工姓名" prop="companyUserNickName">
+        <el-input
+
+          v-model="queryParams.companyUserNickName"
+          placeholder="请输入员工姓名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="状态" prop="status">
+        <el-select  v-model="queryParams.status" placeholder="请选择状态" clearable size="small" >
+         <el-option
+                v-for="item in statusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="售后状态" prop="salesStatus">
+        <el-select   v-model="queryParams.salesStatus" placeholder="请选择状态" clearable size="small" >
+         <el-option
+                v-for="item in salesStatusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </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-table  height="500" border v-loading="loading" :data="storeAfterSalesList" @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="orderCode" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="所属员工" align="center" prop="companyUserNickName" />
+      <el-table-column label="会员手机号" align="center" prop="userPhone" />
+      <el-table-column label="退款金额" align="center" prop="refundAmount" />
+       <el-table-column label="退款类型" align="center" prop="serviceType" >
+          <template slot-scope="scope">
+              <div prop="serviceType" v-for="(item, index) in serviceTypeOptions"    v-if="scope.row.serviceType==item.dictValue">{{item.dictLabel}}</div>
+          </template>
+      </el-table-column>
+      <el-table-column label="申请原因" align="center" prop="reasons" />
+      <el-table-column label="说明" align="center" prop="explains" />
+      <el-table-column label="状态" align="center" prop="status" >
+          <template slot-scope="scope">
+              <div prop="status" v-for="(item, index) in statusOptions"    v-if="scope.row.status==item.dictValue">{{item.dictLabel}}</div>
+          </template>
+      </el-table-column>
+      <el-table-column label="售后状态" align="center" prop="salesStatus" >
+          <template slot-scope="scope">
+              <div prop="status" v-for="(item, index) in salesStatusOptions"    v-if="scope.row.salesStatus==item.dictValue">{{item.dictLabel}}</div>
+          </template>
+      </el-table-column>
+      <el-table-column label="提交时间" align="center" prop="createTime" />
+      <el-table-column label="操作" align="center" fixed="right" width="120px" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleShow(scope.row)"
+            v-hasPermi="['store:storeAfterSales:query']"
+          >查看</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-drawer
+     size="75%"
+      :title="title" :visible.sync="open"
+      >
+      <product-after-sales-order  ref="afterSalesOrder" />
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import { myListStoreAfterSales, getStoreAfterSales, delStoreAfterSales, addStoreAfterSales, updateStoreAfterSales, exportStoreAfterSales } from "@/api/hisStore/storeAfterSales";
+import productAfterSalesOrder from "../components/productAfterSalesOrder";
+export default {
+  components: { productAfterSalesOrder },
+  name: "StoreAfterSales",
+  data() {
+    return {
+      serviceTypeOptions:[],
+      salesStatusOptions:[],
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后记录表格数据
+      storeAfterSalesList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        refundAmount: null,
+        serviceType: null,
+        reasons: null,
+        explains: null,
+        explainImg: null,
+        shipperCode: null,
+        deliverySn: null,
+        deliveryName: null,
+        status: null,
+        salesStatus: null,
+        isDel: null,
+        userId: null,
+        consignee: null,
+        phoneNumber: null,
+        address: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getDicts("store_after_sales_sales_status").then((response) => {
+        this.salesStatusOptions = response.data;
+    });
+    this.getDicts("store_after_sales_status").then((response) => {
+        this.statusOptions = response.data;
+    });
+     this.getDicts("store_after_sales_service_type").then((response) => {
+        this.serviceTypeOptions = response.data;
+    });
+
+    this.getList();
+  },
+  methods: {
+    handleShow(row){
+      this.title="售后订单"
+      this.open=true;
+      setTimeout(() => {
+        this.$refs.afterSalesOrder.getStoreAfterSales(row.id);
+      }, 200);
+
+    },
+
+    /** 查询售后记录列表 */
+    getList() {
+      this.loading = true;
+      myListStoreAfterSales(this.queryParams).then(response => {
+        this.storeAfterSalesList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        id: null,
+        orderCode: null,
+        refundAmount: null,
+        serviceType: null,
+        reasons: null,
+        explains: null,
+        explainImg: null,
+        shipperCode: null,
+        deliverySn: null,
+        deliveryName: null,
+        status: 0,
+        salesStatus: 0,
+        createTime: null,
+        isDel: null,
+        userId: null,
+        consignee: null,
+        phoneNumber: null,
+        address: 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
+      getStoreAfterSales(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) {
+            updateStoreAfterSales(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addStoreAfterSales(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 delStoreAfterSales(ids);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有售后记录数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreAfterSales(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 828 - 0
src/views/hisStore/storeOrder/allList.vue

@@ -0,0 +1,828 @@
+<template>
+  <div class="app-container">
+      <!--用户数据-->
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="公司名" prop="companyId">
+            <el-select filterable  v-model="queryParams.companyId" placeholder="请选择公司名"  @change="companyChange" clearable size="small">
+                <el-option
+                  v-for="item in companys"
+                  :key="item.companyId"
+                  :label="item.companyName"
+                  :value="item.companyId"
+                />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="所属部门" prop="deptId">
+              <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
+          </el-form-item>
+          <el-form-item label="订单号" prop="orderCode">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.orderCode"
+              placeholder="请输入订单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="运单号" prop="deliveryId">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.deliveryId"
+              placeholder="请输入运单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="收件人" prop="realName">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.realName"
+              placeholder="请输入收件人"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="产品" prop="productName">
+        <el-input
+
+          v-model="queryParams.productName"
+          placeholder="请输入产品名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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-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="userPhone">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.userPhone"
+              placeholder="请输入收件人手机号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="员工姓名" prop="companyUserNickName">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.companyUserNickName"
+              placeholder="请输入员工姓名"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="订单类型" prop="orderType">
+            <el-select style="width:220px" 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="deliveryStatus">
+            <el-select  style="width:220px" 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>
+          </el-form-item>
+          <el-form-item label="结算状态" prop="deliveryPayStatus">
+            <el-select style="width:220px" 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>
+          </el-form-item>
+          <el-form-item label="下单时间" prop="createTimeRange">
+            <el-date-picker
+            style="width:220px"
+              clearable size="small"
+              v-model="createTimeRange"
+              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:220px"
+              clearable size="small"
+              v-model="payTimeRange"
+              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:220px"
+              clearable size="small"
+              v-model="deliveryImportTimeRange"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="档期归属" prop="scheduleId"  >
+            <el-select filterable style="width: 200px" v-model="queryParams.scheduleId" placeholder="请选择档期" clearable size="small" >
+              <el-option
+                      v-for="item in scheduleOptions"
+                      :key="item.id"
+                      :label="item.name"
+                      :value="item.id"
+                    />
+            </el-select>
+        </el-form-item>
+        <el-form-item label="跟随阶段" prop="orderVisit"  >
+          <el-select filterable style="width: 200px" v-model="queryParams.orderVisit" placeholder="请选择跟随阶段" clearable size="small" >
+            <el-option
+                v-for="item in customerUserStatusOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+          </el-select>
+        </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">
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+        <el-tabs type="card" v-model="activeName" @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>
+          <el-tab-pane label="待收货" name="2"></el-tab-pane>
+          <el-tab-pane label="交易完成" name="3"></el-tab-pane>
+          <el-tab-pane label="退款中" name="-1"></el-tab-pane>
+          <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" />
+          <el-table-column label="所属公司" align="center" prop="companyName" />
+          <el-table-column label="所属员工" align="center" prop="companyUserNickName" />
+          <el-table-column label="用户昵称" align="center" 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>
+          <el-table-column label="跟随阶段" align="center" prop="orderVisit" >
+            <template slot-scope="scope">
+                <el-tag prop="orderVisit" v-for="(item, index) in customerUserStatusOptions"    v-if="scope.row.orderVisit==item.dictValue">{{item.dictLabel}}</el-tag>
+            </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>
+          <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>
+          <el-table-column label="下单时间" align="center" prop="createTime" />
+          <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
+          <el-table-column label="支付时间" align="center" prop="payTime" width="180">
+          </el-table-column>
+          <el-table-column label="支付方式" align="center" prop="payType" >
+              <template slot-scope="scope">
+                  <span prop="payType" v-for="(item, index) in payTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</span>
+              </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>
+          <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>
+          <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>
+          <el-table-column label="操作" fixed="right" width="100px" align="center" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                @click="handleDetails(scope.row)"
+                v-hasPermi="['store:storeOrder:query']"
+              >查看</el-button>
+              <!-- <el-button
+                size="mini"
+                type="text"
+                @click="handleGenPayUrl(scope.row)"
+                v-hasPermi="['store:storeOrder:genPayUrl']"
+              >生成付款链接</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-drawer
+     size="75%"
+      :title="show.title" :visible.sync="show.open"
+      >
+      <product-order  ref="order" />
+    </el-drawer>
+
+  </div>
+</template>
+
+<script>
+import {exportStoreOrderItems, createUserOrder,listAllStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder } from "@/api/hisStore/storeOrder";
+import { getUserList } from "@/api/users/user";
+import { getAddressList } from "@/api/users/userAddress";
+import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import productOrder from "../components/productOrder";
+import productSelect from "../components/productSelect";
+import addUser from "../components/addUser";
+import addUserAddress from "../components/addUserAddress";
+import config from "@/utils/config";
+import QRCode from 'qrcodejs2'
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import { getCompanyList } from "@/api/company/company";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  components: { Treeselect,productOrder,productSelect,addUser,addUserAddress },
+  name: "StoreOrder",
+  data() {
+    return {
+      customerUserStatusOptions:[],
+      // 部门树选项
+      companys:[],
+      deptOptions:[],
+      companyId:undefined,
+      deptId:undefined,
+      // 是否显示弹出层
+      open: false,
+      // 部门名称
+      deptName: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      deliveryPayStatusOptions:[],
+      deliveryStatusOptions:[],
+      dateRange: [],
+      orderTypeOptions:[],
+      payTypeOptions:[],
+      payQr:{
+        open:false,
+        title:"付款二维码"
+      },
+      user:{
+        open:false,
+        title:"创建会员"
+      },
+      userAddress:{
+        open:false,
+        title:"创建收货地址"
+      },
+      tablekey:false,
+      totalMoney:0.00,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      userStatusOptions:[],
+      phone:null,
+      address:[],
+      addressloading: false,
+      userloading: false,
+      users:[],
+      userStatusOptions:[],
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      activeName:"00",
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单表格数据
+      storeOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      createTimeRange:[],
+      payTimeRange:[],
+      deliveryImportTimeRange:[],
+      scheduleOptions:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        extendOrderId: null,
+        userId: null,
+        realName: null,
+        userPhone: null,
+        userAddress: null,
+        cartId: null,
+        freightPrice: null,
+        totalNum: null,
+        totalPrice: null,
+        totalPostage: null,
+        payPrice: null,
+        payPostage: null,
+        deductionPrice: null,
+        couponId: null,
+        couponPrice: null,
+        paid: null,
+        payTime: null,
+        payType: null,
+        status: null,
+        refundStatus: null,
+        refundReasonWapImg: null,
+        refundReasonWapExplain: null,
+        refundReasonTime: null,
+        refundReasonWap: null,
+        refundReason: null,
+        refundPrice: null,
+        deliverySn: null,
+        deliveryName: null,
+        deliveryType: null,
+        deliveryId: null,
+        gainIntegral: null,
+        useIntegral: null,
+        payIntegral: null,
+        backIntegral: null,
+        mark: null,
+        isDel: null,
+        cost: null,
+        verifyCode: null,
+        storeId: null,
+        shippingType: null,
+        isChannel: null,
+        isRemind: null,
+        isSysDel: null
+      },
+      // 表单参数
+      form: {
+        addressId:null,
+        userId:null,
+        products:[],
+      },
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "会员信息不能为空" }
+        ],
+        addressId: [
+          { required: true, message: "收货信息不能为空" }
+        ],
+        products: [
+          { required: true, message: "商品不能为空" }
+        ],
+
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    watch: {
+    // 监听deptId
+    'deptId': 'currDeptChange'
+    }
+  },
+  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("crm_customer_user_status").then((response) => {
+        this.customerUserStatusOptions = response.data;
+    });
+    this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("user_status").then((response) => {
+      this.userStatusOptions = 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;
+    });
+    getTcmScheduleList().then(response => {
+      this.scheduleOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+     /** 查询部门下拉树结构 */
+    getTreeselect() {
+      var that=this;
+      var param={companyId:this.companyId}
+      treeselect(param).then((response) => {
+        this.deptOptions = response.data;
+        if(response.data!=null&&response.data.length>0){
+          //this.queryParams.deptId=response.data[0].id;
+        }
+      });
+    },
+     companyChange(val){
+      this.companyId=val;
+      this.getTreeselect();
+    },
+     currDeptChange(val){
+      this.queryParams.deptId=val;
+      this.getList();
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.getList();
+    },
+    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
+        })
+      }, 200);
+
+
+    },
+    handleAddUser(){
+      this.user.open=true;
+    },
+    handleAddUserAddress(){
+      if(this.form.userId==null){
+        this.msgError("请选择会员");
+        return;
+      }
+      this.userAddress.open=true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    addUser(){
+      this.user.open=false;
+    },
+    addUserAddress(){
+      this.userAddress.open=false;
+      //获取地址
+      this.getAddressList(this.form.userId);
+    },
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+    },
+    handleProductCountChange(row){
+      this.tablekey = !this.tablekey
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+    selectProduct(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();
+    },
+    handleAddProduct(){
+      this.product.open=true;
+    },
+    searchUser(){
+      if(this.phone==null||this.phone==""){
+        return;
+      }
+      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.getAddressList(this.form.userId)
+        }
+      });
+    },
+    getAddressList(userId){
+      var data={userId:userId}
+      this.addressloading = true;
+      this.address=[];
+      getAddressList(data).then(response => {
+        this.address = response.data;
+        this.addressloading = false;
+      });
+    },
+    handleDetails(row){
+      this.show.open=true;
+      const orderId = row.id ;
+      setTimeout(() => {
+        this.$refs.order.getOrder(orderId);
+      }, 500);
+    },
+    handleClick(tab, event) {
+       if(tab.name=="all"){
+        this.queryParams.status==null;
+      }
+      else{
+         this.queryParams.status=tab.name;
+      }
+      this.getList();
+    },
+    /** 查询订单列表 */
+    getList() {
+      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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      this.loading = true;
+      listAllStoreOrder(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.storeOrderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        addressId:null,
+        userId:null,
+        products: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
+      getStoreOrder(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if(this.products.length==0){
+          this.msgError("请选择商品");
+          return;
+        }
+        this.form.products=this.products;
+        if (valid) {
+          createUserOrder(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.open = false;
+              this.getList();
+            }
+          });
+
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+       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]
+      }
+      else{
+        this.queryParams.payTimeRange=null;
+      }
+      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrder(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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单明细数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrderItems(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+</style>

+ 1000 - 0
src/views/hisStore/storeOrder/list.vue

@@ -0,0 +1,1000 @@
+<template>
+  <div class="app-container">
+      <!--用户数据-->
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="所属部门" prop="deptId">
+              <treeselect style="width:220px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
+          </el-form-item>
+          <el-form-item label="订单号" prop="orderCode">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.orderCode"
+              placeholder="请输入订单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="运单号" prop="deliveryId">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.deliveryId"
+              placeholder="请输入运单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="收件人" prop="realName">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.realName"
+              placeholder="请输入收件人"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="产品" prop="productName">
+        <el-input
+
+          v-model="queryParams.productName"
+          placeholder="请输入产品名"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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-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="userPhone">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.userPhone"
+              placeholder="请输入收件人手机号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="员工姓名" prop="companyUserNickName">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.companyUserNickName"
+              placeholder="请输入员工姓名"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="订单类型" prop="orderType">
+            <el-select style="width:220px" 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="deliveryStatus">
+            <el-select  style="width:220px" 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>
+          </el-form-item>
+          <el-form-item label="结算状态" prop="deliveryPayStatus">
+            <el-select style="width:220px" 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>
+          </el-form-item>
+          <el-form-item label="下单时间" prop="createTimeRange">
+            <el-date-picker
+            style="width:220px"
+              clearable size="small"
+              v-model="createTimeRange"
+              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:220px"
+              clearable size="small"
+              v-model="payTimeRange"
+              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:220px"
+              clearable size="small"
+              v-model="deliveryImportTimeRange"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+          <el-form-item label="档期归属" prop="scheduleId"  >
+            <el-select filterable style="width: 200px" v-model="queryParams.scheduleId" placeholder="请选择档期" clearable size="small" >
+              <el-option
+                      v-for="item in scheduleOptions"
+                      :key="item.id"
+                      :label="item.name"
+                      :value="item.id"
+                    />
+            </el-select>
+        </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:storeOrder:add']"
+            >创建订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+            >导出订单</el-button>
+          </el-col>
+          <el-col :span="1.5">
+            <el-button
+              type="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExportItems"
+              v-hasPermi="['store:storeOrder:exportItems']"
+            >导出订单明细</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-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>
+          <el-tab-pane label="待收货" name="2"></el-tab-pane>
+          <el-tab-pane label="交易完成" name="3"></el-tab-pane>
+          <el-tab-pane label="退款中" name="-1"></el-tab-pane>
+          <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" />
+          <el-table-column label="所属公司" align="center" prop="companyName" />
+          <el-table-column label="所属员工" align="center" prop="companyUserNickName" />
+          <el-table-column label="用户昵称" align="center" 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>
+          <!-- <el-table-column label="商品" align="center" width="300px" >
+              <template slot-scope="scope">
+                  <div  v-for="(item, index) in scope.row.items" class="items"  >
+                    <img class="pic" :src="JSON.parse(item.jsonInfo).image" />
+                    <div class="goods-content">
+                      <div class="goods-title">{{ JSON.parse(item.jsonInfo).productName}}</div>
+                      <div class="sku">{{ JSON.parse(item.jsonInfo).sku}}</div>
+                      <div class="price">¥{{JSON.parse(item.jsonInfo).price}}×{{item.num}}</div>
+                    </div>
+
+                  </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>
+          <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>
+          <el-table-column label="下单时间" align="center" prop="createTime" />
+          <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
+          <el-table-column label="支付时间" align="center" prop="payTime" width="180">
+          </el-table-column>
+          <el-table-column label="支付方式" align="center" prop="payType" >
+              <template slot-scope="scope">
+                  <span prop="payType" v-for="(item, index) in payTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</span>
+              </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="orderMedium" >
+          <template slot-scope="scope">
+              <el-tag prop="orderMedium" v-for="(item, index) in orderMediumOptions"    v-if="scope.row.orderMedium==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+          </el-table-column>
+          <el-table-column label="订单产品" align="center" width="200px">
+            <template slot-scope="scope">
+              <div v-if="scope.row.items && scope.row.items.length > 0">
+                <el-tag
+                  v-for="(item, index) in scope.row.items"
+                  :key="index"
+                  size="mini"
+                  class="product-tag"
+                >
+                  {{ JSON.parse(item.jsonInfo).productName }} × {{ item.num }}
+                </el-tag>
+              </div>
+              <span v-else class="no-products">暂无商品</span>
+            </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" prop="deliveryId" >
+          </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>
+          <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>
+          <el-table-column label="操作" fixed="right" width="100px" align="center" class-name="small-padding fixed-width">
+            <template slot-scope="scope">
+              <el-button
+                size="mini"
+                type="text"
+                @click="handleDetails(scope.row)"
+                v-hasPermi="['store:storeOrder:query']"
+              >查看</el-button>
+           <!--    <el-button
+                size="mini"
+                type="text"
+                @click="handleGenPayUrl(scope.row)"
+                v-hasPermi="['store:storeOrder:genPayUrl']"
+              >生成付款链接</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-drawer
+     size="75%"
+      :title="show.title" :visible.sync="show.open"
+      >
+      <product-order  ref="order" />
+    </el-drawer>
+    <el-dialog :title="title" v-if="open" :visible.sync="open" width="1000px" append-to-body :close-on-click-modal ="false">
+        <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+           <el-form-item label="会员信息" >
+                <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="payType">
+              <el-select   v-model="form.payType" placeholder="请选择支付方式" clearable size="small" >
+              <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="payPrice">
+              <el-input-number  v-model="form.payPrice" placeholder="修改商品总价" size="medium" :precision="2" min=0.01 :step="0.1" />
+            </el-form-item>
+            <el-form-item label="物流代收" prop="amount" v-if="form.payType == '3'">
+              <el-input-number  v-model="form.amount" placeholder="平台支付价格" size="medium" :precision="2" min=0.01 :step="0.1" />
+            </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>
+      <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>
+    <el-dialog :title="user.title" v-if="user.open"  :visible.sync="user.open" width="500px" append-to-body>
+        <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>
+    <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>
+
+  </div>
+</template>
+
+<script>
+import {exportStoreOrderItems, createUserOrder,listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder } from "@/api/hisStore/storeOrder";
+import { getUserList } from "@/api/users/user";
+import { getAddressList } from "@/api/users/userAddress";
+import { getTcmScheduleList } from "@/api/company/tcmScheduleReport";
+import productOrder from "../components/productOrder";
+import productSelect from "../components/productSelect";
+import addUser from "../components/addUser";
+import addUserAddress from "../components/addUserAddress";
+import config from "@/utils/config";
+import QRCode from 'qrcodejs2'
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  components: { Treeselect,productOrder,productSelect,addUser,addUserAddress },
+  name: "StoreOrder",
+  data() {
+    return {
+      // 部门树选项
+      deptOptions: undefined,
+      // 是否显示弹出层
+      // 部门名称
+      deptName: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+      deliveryPayStatusOptions:[],
+      deliveryStatusOptions:[],
+      dateRange: [],
+      orderMediumOptions:[],
+      orderTypeOptions:[],
+      payTypeOptions:[],
+      payQr:{
+        open:false,
+        title:"付款二维码"
+      },
+      user:{
+        open:false,
+        title:"创建会员"
+      },
+      userAddress:{
+        open:false,
+        title:"创建收货地址"
+      },
+      tablekey:false,
+      totalMoney:0.00,
+      phone:null,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+
+      address:[],
+      addressloading: false,
+      userloading: false,
+      users:[],
+      userStatusOptions:[],
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      activeName:"00",
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单表格数据
+      storeOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      createTimeRange:[],
+      payTimeRange:[],
+      deliveryImportTimeRange:[],
+      scheduleOptions:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        extendOrderId: null,
+        userId: null,
+        realName: null,
+        userPhone: null,
+        userAddress: null,
+        cartId: null,
+        freightPrice: null,
+        totalNum: null,
+        totalPrice: null,
+        totalPostage: null,
+        payPrice: null,
+        payPostage: null,
+        deductionPrice: null,
+        couponId: null,
+        couponPrice: null,
+        paid: null,
+        payTime: null,
+        payType: null,
+        status: null,
+        refundStatus: null,
+        refundReasonWapImg: null,
+        refundReasonWapExplain: null,
+        refundReasonTime: null,
+        refundReasonWap: null,
+        refundReason: null,
+        refundPrice: null,
+        deliverySn: null,
+        deliveryName: null,
+        deliveryType: null,
+        deliveryId: null,
+        gainIntegral: null,
+        useIntegral: null,
+        payIntegral: null,
+        backIntegral: null,
+        mark: null,
+        isDel: null,
+        cost: null,
+        verifyCode: null,
+        storeId: null,
+        shippingType: null,
+        isChannel: null,
+        isRemind: null,
+        isSysDel: null
+      },
+      // 表单参数
+      form: {
+        addressId:null,
+        userId:null,
+        products:[],
+      },
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "会员信息不能为空" }
+        ],
+        addressId: [
+          { required: true, message: "收货信息不能为空" }
+        ],
+        products: [
+          { required: true, message: "商品不能为空" }
+        ],
+
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+        this.$refs.tree.filter(val);
+      },
+  },
+  created() {
+    this.getTreeselect();
+    this.getDicts("crm_customer_source").then((response) => {
+      this.orderMediumOptions = response.data;
+    });
+    this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("user_status").then((response) => {
+      this.userStatusOptions = 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;
+    });
+    getTcmScheduleList().then(response => {
+      this.scheduleOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+     /** 查询部门下拉树结构 */
+     getTreeselect() {
+      treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.getList();
+    },
+    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
+        })
+      }, 200);
+
+
+    },
+    handleAddUser(){
+      this.user.open=true;
+    },
+    handleAddUserAddress(){
+      if(this.form.userId==null){
+        this.msgError("请选择会员");
+        return;
+      }
+      this.userAddress.open=true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    addUserAddress(){
+      this.userAddress.open=false;
+      //获取地址
+      this.getAddressList(this.form.userId);
+    },
+    addUser(){
+      this.user.open=false;
+    },
+
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+    },
+    handleProductCountChange(row){
+      this.tablekey = !this.tablekey
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+    selectProduct(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.$message.success("商品"+ row.productName + "添加成功")
+      this.compute();
+    },
+    handleAddProduct(){
+      this.product.open=true;
+    },
+    searchUser(){
+      if(this.phone==null||this.phone==""){
+        return;
+      }
+      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.getAddressList(this.form.userId)
+        }
+      });
+    },
+    getAddressList(userId){
+      var data={userId:userId}
+      this.addressloading = true;
+      this.address=[];
+      getAddressList(data).then(response => {
+        this.address = response.data;
+        this.addressloading = false;
+      });
+    },
+    handleDetails(row){
+      this.show.open=true;
+      const orderId = row.id ;
+      setTimeout(() => {
+        this.$refs.order.getOrder(orderId);
+      }, 500);
+    },
+    handleClick(tab, event) {
+       if(tab.name=="all"){
+        this.queryParams.status==null;
+      }
+      else{
+         this.queryParams.status=tab.name;
+      }
+      this.getList();
+    },
+    /** 查询订单列表 */
+    getList() {
+      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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      this.loading = true;
+      listStoreOrder(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.storeOrderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        addressId:null,
+        userId:null,
+        products: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
+      getStoreOrder(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if(this.products.length==0){
+          this.msgError("请选择商品");
+          return;
+        }
+        this.form.products=this.products;
+        if (valid) {
+          createUserOrder(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.open = false;
+              this.getList();
+            }
+          });
+
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+       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]
+      }
+      else{
+        this.queryParams.payTimeRange=null;
+      }
+      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrder(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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单明细数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrderItems(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+.el-message-box__message p{
+  max-height: 400px;
+  overflow:scroll;
+}
+.import-msg{
+  height: 500px;
+  overflow: auto;
+}
+</style>
+<style>
+  .el-descriptions-item__label.is-bordered-label{
+    font-weight: normal;
+  }
+
+</style>

+ 722 - 0
src/views/hisStore/storeOrder/myList.vue

@@ -0,0 +1,722 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单号" prop="orderCode">
+        <el-input
+        style="width:220px"
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+       <el-form-item label="运单号" prop="deliveryId">
+        <el-input
+        style="width:220px"
+          v-model="queryParams.deliveryId"
+          placeholder="请输入运单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="收件人" prop="realName">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.realName"
+              placeholder="请输入收件人"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="手机号" prop="userPhone">
+            <el-input
+            style="width:220px"
+              v-model="queryParams.userPhone"
+              placeholder="请输入收件人手机号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+       <el-form-item label="订单类型" prop="orderType">
+         <el-select style="width:220px"  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 style="width:220px" 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>
+      </el-form-item>
+      <el-form-item label="结算状态" prop="deliveryPayStatus">
+         <el-select style="width:220px" 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>
+      </el-form-item>
+      <el-form-item label="下单时间" prop="createTimeRange">
+        <el-date-picker
+        style="width:220px"
+          clearable size="small"
+          v-model="createTimeRange"
+          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:220px"
+          clearable size="small"
+          v-model="payTimeRange"
+          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:220px"
+          clearable size="small"
+          v-model="deliveryImportTimeRange"
+          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-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="warning"
+          icon="el-icon-download"
+          size="mini"
+            @click="handleExport"
+          v-hasPermi="['store:storeOrder:export']"
+        >导出订单</el-button>
+      </el-col>
+       <el-col :span="1.5">
+        <el-button
+            type="warning"
+          icon="el-icon-download"
+          size="mini"
+            @click="handleExportItems"
+          v-hasPermi="['store:storeOrder:exportItems']"
+        >导出订单明细</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-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>
+      <el-tab-pane label="待收货" name="2"></el-tab-pane>
+      <el-tab-pane label="交易完成" name="3"></el-tab-pane>
+      <el-tab-pane label="退款中" name="-1"></el-tab-pane>
+      <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" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="所属员工" align="center" prop="companyUserNickName" />
+      <el-table-column label="用户昵称" align="center" 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>
+      <!-- <el-table-column label="商品" align="center" width="300px" >
+          <template slot-scope="scope">
+              <div  v-for="(item, index) in scope.row.items" class="items"  >
+                <img class="pic" :src="JSON.parse(item.jsonInfo).image" />
+                <div class="goods-content">
+                  <div class="goods-title">{{ JSON.parse(item.jsonInfo).productName}}</div>
+                  <div class="sku">{{ JSON.parse(item.jsonInfo).sku}}</div>
+                  <div class="price">¥{{JSON.parse(item.jsonInfo).price}}×{{item.num}}</div>
+                </div>
+
+              </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>
+       <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>
+      <el-table-column label="下单时间" align="center" prop="createTime" />
+      <!-- <el-table-column label="支付状态" align="center" prop="paid" /> -->
+      <el-table-column label="支付时间" align="center" prop="payTime" width="180">
+      </el-table-column>
+      <el-table-column label="支付方式" align="center" prop="payType" >
+          <template slot-scope="scope">
+              <span prop="payType" v-for="(item, index) in payTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</span>
+          </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>
+      <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>
+      <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>
+      <el-table-column label="操作" fixed="right" width="100px" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleDetails(scope.row)"
+            v-hasPermi="['store:storeOrder:query']"
+          >查看</el-button>
+          <!-- <el-button
+            size="mini"
+            type="text"
+            @click="handleGenPayUrl(scope.row)"
+            v-hasPermi="['store:storeOrder:genPayUrl']"
+          >生成付款链接</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-drawer
+     size="75%"
+      :title="show.title" :visible.sync="show.open"
+      >
+      <product-order  ref="order" />
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import {myListStoreOrder,exportStoreOrderItems, createUserOrder,listStoreOrder, getStoreOrder, delStoreOrder, addStoreOrder, updateStoreOrder, exportStoreOrder } from "@/api/hisStore/storeOrder";
+import { getUserList } from "@/api/users/user";
+import { getAddressList } from "@/api/users/userAddress";
+
+import productOrder from "../components/productOrder";
+import productSelect from "../components/productSelect";
+import addUser from "../components/addUser";
+import addUserAddress from "../components/addUserAddress";
+import config from "@/utils/config";
+import QRCode from 'qrcodejs2'
+export default {
+  components: { productOrder,productSelect,addUser,addUserAddress },
+  name: "StoreOrder",
+  data() {
+    return {
+      deliveryPayStatusOptions:[],
+      deliveryStatusOptions:[],
+      dateRange: [],
+      orderTypeOptions:[],
+      payTypeOptions:[],
+      payQr:{
+        open:false,
+        title:"付款二维码"
+      },
+      user:{
+        open:false,
+        title:"创建会员"
+      },
+      userAddress:{
+        open:false,
+        title:"创建收货地址"
+      },
+      tablekey:false,
+      totalMoney:0.00,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      userStatusOptions:[],
+      phone:null,
+      address:[],
+      addressloading: false,
+      userloading: false,
+      users:[],
+      userStatusOptions:[],
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      activeName:"00",
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 订单表格数据
+      storeOrderList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      createTimeRange:[],
+      payTimeRange:[],
+      deliveryImportTimeRange:[],
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        orderCode: null,
+        extendOrderId: null,
+        userId: null,
+        realName: null,
+        userPhone: null,
+        userAddress: null,
+        cartId: null,
+        freightPrice: null,
+        totalNum: null,
+        totalPrice: null,
+        totalPostage: null,
+        payPrice: null,
+        payPostage: null,
+        deductionPrice: null,
+        couponId: null,
+        couponPrice: null,
+        paid: null,
+        payTime: null,
+        payType: null,
+        status: null,
+        refundStatus: null,
+        refundReasonWapImg: null,
+        refundReasonWapExplain: null,
+        refundReasonTime: null,
+        refundReasonWap: null,
+        refundReason: null,
+        refundPrice: null,
+        deliverySn: null,
+        deliveryName: null,
+        deliveryType: null,
+        deliveryId: null,
+        gainIntegral: null,
+        useIntegral: null,
+        payIntegral: null,
+        backIntegral: null,
+        mark: null,
+        isDel: null,
+        cost: null,
+        verifyCode: null,
+        storeId: null,
+        shippingType: null,
+        isChannel: null,
+        isRemind: null,
+        isSysDel: null
+      },
+      // 表单参数
+      form: {
+        addressId:null,
+        userId:null,
+        products:[],
+      },
+      // 表单校验
+      rules: {
+        userId: [
+          { required: true, message: "会员信息不能为空" }
+        ],
+        addressId: [
+          { required: true, message: "收货信息不能为空" }
+        ],
+        products: [
+          { required: true, message: "商品不能为空" }
+        ],
+
+      }
+    };
+  },
+  created() {
+     this.getDicts("store_order_type").then((response) => {
+      this.orderTypeOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.payTypeOptions = response.data;
+    });
+    this.getDicts("user_status").then((response) => {
+      this.userStatusOptions = 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();
+  },
+  methods: {
+    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
+        })
+      }, 200);
+
+
+    },
+    handleAddUser(){
+      this.user.open=true;
+    },
+    handleAddUserAddress(){
+      if(this.form.userId==null){
+        this.msgError("请选择会员");
+        return;
+      }
+      this.userAddress.open=true;
+      setTimeout(() => {
+        this.$refs.addUserAddress.init(this.form.userId);
+      }, 500);
+    },
+    addUser(){
+      this.user.open=false;
+    },
+    addUserAddress(){
+      this.userAddress.open=false;
+      //获取地址
+      this.getAddressList(this.form.userId);
+    },
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+    },
+    handleProductCountChange(row){
+      this.tablekey = !this.tablekey
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+    selectProduct(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();
+    },
+    handleAddProduct(){
+      this.product.open=true;
+    },
+    searchUser(){
+      if(this.phone==null||this.phone==""){
+        return;
+      }
+      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.getAddressList(this.form.userId)
+        }
+      });
+    },
+    getAddressList(userId){
+      var data={userId:userId}
+      this.addressloading = true;
+      this.address=[];
+      getAddressList(data).then(response => {
+        this.address = response.data;
+        this.addressloading = false;
+      });
+    },
+    handleDetails(row){
+      this.show.open=true;
+      const orderId = row.id ;
+      setTimeout(() => {
+        this.$refs.order.getOrder(orderId);
+      }, 500);
+    },
+    handleClick(tab, event) {
+       if(tab.name=="all"){
+        this.queryParams.status==null;
+      }
+      else{
+         this.queryParams.status=tab.name;
+      }
+      this.getList();
+    },
+    /** 查询订单列表 */
+    getList() {
+      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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      this.loading = true;
+      myListStoreOrder(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.storeOrderList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        addressId:null,
+        userId:null,
+        products: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
+      getStoreOrder(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if(this.products.length==0){
+          this.msgError("请选择商品");
+          return;
+        }
+        this.form.products=this.products;
+        if (valid) {
+          createUserOrder(this.form).then(response => {
+            if (response.code === 200) {
+              this.msgSuccess("创建成功");
+              this.open = false;
+              this.getList();
+            }
+          });
+
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+       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]
+      }
+      else{
+        this.queryParams.payTimeRange=null;
+      }
+      if(this.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrder(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.deliveryImportTimeRange!=null&&this.deliveryImportTimeRange.length==2){
+        this.queryParams.deliveryImportTimeRange=this.deliveryImportTimeRange[0]+"--"+this.deliveryImportTimeRange[1]
+      }
+      else{
+        this.queryParams.deliveryImportTimeRange=null;
+      }
+      const queryParams = this.addDateRange(this.queryParams, this.dateRange);
+      this.$confirm('是否确认导出所有订单明细数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrderItems(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+</style>

+ 240 - 0
src/views/hisStore/storeOrderAudit/index.vue

@@ -0,0 +1,240 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="所属员工" prop="companyUserName">
+        <el-input
+          v-model="queryParams.companyUserName"
+          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-tabs type="card" v-model="activeName" @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>
+      <el-tab-pane label="待总后台审核" name="2"></el-tab-pane>
+      <el-tab-pane label="总后台审核拒绝" name="3"></el-tab-pane>
+      <el-tab-pane label="审核通过" name="4"></el-tab-pane>
+    </el-tabs>
+    <el-table height="500" border v-loading="loading" :data="storeOrderAuditList" :key="tableKey">
+      <el-table-column label="订单号" align="center" prop="orderCode" width="200" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="所属员工" align="center" prop="companyUserName" />
+      <el-table-column label="审核状态" align="center" prop="status" >
+        <template slot-scope="scope">
+          <el-tag prop="status" v-for="item in statusOptions"
+                  :type="item.type"
+                  v-if="scope.row.auditStatus === item.dictValue">
+            {{item.dictLabel}}
+          </el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="销售审核时间" align="center" prop="companyAuditTime" />
+      <el-table-column label="销售审核人" align="center" prop="companyAuditUserName" />
+      <el-table-column label="总后台审核时间" align="center" prop="adminAuditTime" />
+      <el-table-column label="总后台审核人" align="center" prop="adminAuditUserName" />
+      <el-table-column label="被拒原因" align="center" prop="reason" show-overflow-tooltip />
+      <el-table-column label="提交时间" align="center" prop="createTime" />
+      <el-table-column label="操作" fixed="right" align="center" width="80" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-popover
+            v-if="scope.row.auditStatus === 0"
+            placement="right"
+            trigger="click"
+            :ref="'popover_' + scope.row.id">
+            <el-button size="mini" type="success" @click="handlePass(scope.row)">通过</el-button>
+            <el-button size="mini" type="danger" @click="handleAudit(scope.row)">拒绝</el-button>
+            <el-button
+              slot="reference"
+              size="mini"
+              type="text"
+              v-hasPermi="['store:storeOrderAudit:audit']"
+            >审核订单</el-button>
+          </el-popover>
+        </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="show.title" :visible.sync="show.open" width="500px" append-to-body>
+      <el-form ref="auditForm" :model="auditForm" :rules="auditRules" label-width="80px">
+        <el-form-item label="拒绝原因" prop="reviewContent">
+          <el-input
+            type="textarea"
+            v-model="auditForm.reviewContent"
+            placeholder="请输入拒绝原因"
+          />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="handleReject">确定</el-button>
+        <el-button @click="cancelAudit">关闭</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getCompanyList } from "@/api/company/company";
+import {list, audit} from "@/api/hisStore/storeOrderAudit";
+
+export default {
+  name: "StoreOrderAudit",
+  data() {
+    const statusOptions = [
+      {
+        dictLabel: "待销售审批",
+        dictValue: 0,
+        type: ''
+      },
+      {
+        dictLabel: "销售审批拒绝",
+        dictValue: 1,
+        type: 'danger'
+      },
+      {
+        dictLabel: "待总后台审核",
+        dictValue: 2,
+        type: ''
+      },
+      {
+        dictLabel: "总后台审核拒绝",
+        dictValue: 3,
+        type: 'danger'
+      },
+      {
+        dictLabel: "审核通过",
+        dictValue: 4,
+        type: 'success'
+      }
+    ]
+
+    return {
+      tableKey: 0,
+      showSearch: true,
+      companys: [],
+      total: 0,
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        companyUserName: null,
+        auditStatus: null
+      },
+      activeName: '00',
+      loading: false,
+      storeOrderAuditList: [],
+      statusOptions: statusOptions,
+      show: {
+        open: false,
+        title: "审核订单"
+      },
+      auditForm: {
+        auditId: null,
+        reviewType: null,
+        reviewContent: ''
+      },
+      auditRules: {
+        reviewContent: [
+          { required: true, message: "请输入拒绝原因", trigger: "blur" }
+        ]
+      },
+      currentRowId: null,
+    }
+  },
+  created() {
+    this.getCompanyOptions()
+    this.handleQuery()
+  },
+  activated() {
+    this.tableKey = Date.now()
+  },
+  methods: {
+    getCompanyOptions() {
+      getCompanyList().then(response => {
+        this.companys = response.data
+      })
+    },
+    handleQuery() {
+      this.queryParams.pageNum = 1
+      this.getList()
+    },
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    getList() {
+      this.loading = true
+      list(this.queryParams).then(response => {
+        const {rows, total} = response
+        this.storeOrderAuditList = rows
+        this.total = total
+        this.loading = false
+      })
+    },
+    handleClick(tab) {
+      this.queryParams.auditStatus = tab.name === '00' ? null : tab.name
+      this.handleQuery()
+    },
+    handleAudit(row) {
+      this.currentRowId = row.id
+      this.auditForm.auditId = row.id;
+      this.auditForm.reviewType = 0;
+      this.show.open = true;
+    },
+    handlePass(row) {
+      this.currentRowId = row.id
+      this.auditForm.auditId = row.id;
+      this.auditForm.reviewType = 1;
+      this.submitAudit();
+    },
+    handleReject() {
+      this.$refs["auditForm"].validate(valid => {
+        if (valid) {
+          this.submitAudit();
+        }
+      });
+    },
+    submitAudit() {
+      audit(this.auditForm).then(response => {
+        const {msg} = response
+        this.msgSuccess(msg);
+        this.show.open = false;
+        this.$refs['popover_' + this.currentRowId].doClose();
+        this.getList();
+        this.resetAuditForm();
+      });
+    },
+    cancelAudit() {
+      this.show.open = false;
+      this.resetAuditForm();
+    },
+    resetAuditForm() {
+      this.auditForm = {
+        auditId: null,
+        reviewType: null,
+        reviewContent: ''
+      };
+      this.$refs["auditForm"]?.resetFields();
+    }
+  }
+}
+</script>
+
+<style scoped>
+
+</style>

+ 283 - 0
src/views/hisStore/storeOrderOffline/index.vue

@@ -0,0 +1,283 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单号" prop="orderCode">
+        <el-input
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="上传时间" prop="uploadTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+          v-model="queryParams.uploadTime"
+          type="date"
+          value-format="yyyy-MM-dd"
+          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-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="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['store:storeOrderOffline:export']"
+        >导出</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-tab-pane label="全部订单" name="00"></el-tab-pane>
+      <el-tab-pane v-for="(item,index) in statusOptions" :label="item.dictLabel" :name="item.dictValue"></el-tab-pane>
+    </el-tabs>
+    <el-table border v-loading="loading" :data="storeOrderOfflineList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="订单ID" align="center" prop="orderId" />
+      <el-table-column label="订单号" align="center" prop="orderCode" />
+      <el-table-column label="客户名称" align="center" prop="customerName" />
+      <el-table-column label="客户电话" align="center" prop="mobile" />
+      <el-table-column label="状态" align="center" prop="status">
+        <template slot-scope="scope">
+          <dict-tag :options="statusOptions" :value="scope.row.status"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="所属客服" align="center" prop="companyUserName" />
+      <el-table-column label="所属部门" align="center" prop="companyName" />
+      <el-table-column label="业务员" align="center" prop="uploadUserName" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleDetails(scope.row)"
+          >查看</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-drawer
+      size="75%"
+      :title="show.title" :visible.sync="show.open" append-to-body
+    >
+      <offline-order  ref="offlineOrder" />
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import { listStoreOrderOffline, getStoreOrderOffline, delStoreOrderOffline, addStoreOrderOffline, updateStoreOrderOffline, exportStoreOrderOffline } from "@/api/hisStore/storeOrderOffline";
+import offlineOrder from "../components/offlineOrder.vue";
+
+
+export default {
+  name: "StoreOrderOffline",
+  components: {offlineOrder},
+  data() {
+    return {
+      show:{
+        open:false,
+        title:"订单详情"
+      },
+      statusOptions:[],
+      activeName:"00",
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 线下订单表格数据
+      storeOrderOfflineList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        crmId: null,
+        orderCode: null,
+        status: null,
+        payPrice: null,
+        payMoney: null,
+        certificates: null,
+        uploadTime: null,
+        companyUserId: null,
+        uploadUserId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        crmId: [
+          { required: true, message: "订单id不能为空", trigger: "blur" }
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getDicts("sys_order_offline_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+  },
+  methods: {
+    handleDetails(row){
+      this.show.open=true;
+      const orderId = row.orderId ;
+      setTimeout(() => {
+        this.$refs.offlineOrder.getOfflineOrder(orderId);
+      }, 200);
+    },
+    handleClick(tab, event) {
+      if(tab.name==="00"){
+        this.queryParams.status=null;
+      }
+      else{
+        this.queryParams.status=tab.name;
+      }
+      this.getList();
+    },
+    /** 查询线下订单列表 */
+    getList() {
+      this.loading = true;
+      listStoreOrderOffline(this.queryParams).then(response => {
+        this.storeOrderOfflineList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        orderId: null,
+        crmId: null,
+        orderCode: null,
+        status: 0,
+        payPrice: null,
+        payMoney: null,
+        createTime: null,
+        certificates: null,
+        uploadTime: null,
+        companyUserId: null,
+        uploadUserId: 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.orderId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加线下订单";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const orderId = row.orderId || this.ids
+      getStoreOrderOffline(orderId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改线下订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.orderId != null) {
+            updateStoreOrderOffline(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addStoreOrderOffline(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const orderIds = row.orderId || this.ids;
+      this.$confirm('是否确认删除线下订单编号为"' + orderIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delStoreOrderOffline(orderIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有线下订单数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreOrderOffline(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 245 - 0
src/views/hisStore/storeOrderOffline/myList.vue

@@ -0,0 +1,245 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单号" prop="orderCode">
+        <el-input
+          v-model="queryParams.orderCode"
+          placeholder="请输入订单号"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="上传时间" prop="uploadTime">
+        <el-date-picker clearable size="small" style="width: 200px"
+                        v-model="queryParams.uploadTime"
+                        type="date"
+                        value-format="yyyy-MM-dd"
+                        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-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="warning"
+          icon="el-icon-download"
+          size="mini"
+          @click="handleExport"
+          v-hasPermi="['store:storeOrderOffline:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="storeOrderOfflineList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="订单ID" align="center" prop="orderId" />
+      <el-table-column label="订单号" align="center" prop="orderCode" />
+      <el-table-column label="客户名称" align="center" prop="customerName" />
+      <el-table-column label="客户电话" align="center" prop="mobile" />
+      <el-table-column label="状态" align="center" prop="status" />
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="所属客服" align="center" prop="companyUserName" />
+      <el-table-column label="所属部门" align="center" prop="companyName" />
+      <el-table-column label="业务员" align="center" prop="uploadUserName" />
+      <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)"
+          >查看</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"
+    />
+
+  </div>
+</template>
+
+<script>
+import { listStoreOrderOffline, getStoreOrderOffline, delStoreOrderOffline, addStoreOrderOffline, updateStoreOrderOffline, exportStoreOrderOffline } from "@/api/hisStore/storeOrderOffline";
+
+export default {
+  name: "StoreOrderOffline",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 线下订单表格数据
+      storeOrderOfflineList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        crmId: null,
+        orderCode: null,
+        status: null,
+        payPrice: null,
+        payMoney: null,
+        certificates: null,
+        uploadTime: null,
+        companyUserId: null,
+        uploadUserId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        crmId: [
+          {required: true, message: "订单id不能为空", trigger: "blur"}
+        ],
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询线下订单列表 */
+    getList() {
+      this.loading = true;
+      listStoreOrderOffline(this.queryParams).then(response => {
+        this.storeOrderOfflineList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        orderId: null,
+        crmId: null,
+        orderCode: null,
+        status: 0,
+        payPrice: null,
+        payMoney: null,
+        createTime: null,
+        certificates: null,
+        uploadTime: null,
+        companyUserId: null,
+        uploadUserId: 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.orderId)
+      this.single = selection.length !== 1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加线下订单";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const orderId = row.orderId || this.ids
+      getStoreOrderOffline(orderId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改线下订单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.orderId != null) {
+            updateStoreOrderOffline(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addStoreOrderOffline(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const orderIds = row.orderId || this.ids;
+      this.$confirm('是否确认删除线下订单编号为"' + orderIds + '"的数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function () {
+        return delStoreOrderOffline(orderIds);
+      }).then(() => {
+        this.getList();
+        this.msgSuccess("删除成功");
+      }).catch(function () {
+      });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有线下订单数据项?', "警告", {
+        confirmButtonText: "确定",
+        cancelButtonText: "取消",
+        type: "warning"
+      }).then(function () {
+        return exportStoreOrderOffline(queryParams);
+      }).then(response => {
+        this.download(response.msg);
+      }).catch(function () {
+      });
+    }
+  }
+};
+</script>

+ 409 - 0
src/views/hisStore/storePayment/index.vue

@@ -0,0 +1,409 @@
+<template>
+  <div class="app-container">
+
+        <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+          <el-form-item label="所属部门" prop="deptId">
+              <treeselect style="width:205.4px" v-model="queryParams.deptId" :options="deptOptions" :show-count="true" placeholder="请选择所属部门" />
+          </el-form-item>
+          <el-form-item label="付款单号" prop="payCode">
+            <el-input
+              v-model="queryParams.payCode"
+              placeholder="请输入付款单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="手机号" prop="mobile">
+            <el-input
+              v-model="queryParams.mobile"
+              placeholder="请输入手机号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="交易单号" prop="bankTransactionId">
+            <el-input
+              v-model="queryParams.bankTransactionId"
+              placeholder="请输入交易单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="银行单号" prop="bankSerialNo">
+            <el-input
+              v-model="queryParams.bankSerialNo"
+              placeholder="请输入银行单号"
+              clearable
+              size="small"
+              @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+
+
+      <el-form-item label="员工姓名" prop="companyUserNickName">
+          <el-input
+            v-model="queryParams.companyUserNickName"
+            placeholder="请输入员工姓名"
+            clearable
+            size="small"
+            @keyup.enter.native="handleQuery"
+          />
+      </el-form-item>
+
+          <el-form-item label="提交时间" prop="createTime">
+            <el-date-picker clearable size="small" style="width: 205.4px"
+              v-model="queryParams.createTime"
+              type="date"
+              value-format="yyyy-MM-dd"
+              placeholder="选择提交时间">
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="支付时间" prop="payTime">
+            <el-date-picker
+            style="width: 215.4px"
+              clearable size="small"
+              v-model="dateRange"
+              type="daterange"
+              value-format="yyyy-MM-dd"
+              start-placeholder="开始日期"
+              end-placeholder="结束日期">
+            </el-date-picker>
+          </el-form-item>
+
+          <el-form-item label="退款时间" prop="refundTime">
+              <el-date-picker
+                style="width: 215.4px"
+                clearable size="small"
+                v-model="refundDateRange"
+                type="daterange"
+                value-format="yyyy-MM-dd"
+                start-placeholder="开始日期"
+                end-placeholder="结束日期">
+              </el-date-picker>
+            </el-form-item>
+
+
+          <el-form-item label="状态" prop="status">
+            <el-select   v-model="queryParams.status" placeholder="请选择状态" clearable size="small" >
+            <el-option
+                    v-for="item in statusOptions"
+                    :key="item.dictValue"
+                    :label="item.dictLabel"
+                    :value="item.dictValue"
+                  />
+            </el-select>
+          </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="warning"
+              icon="el-icon-download"
+              size="mini"
+              @click="handleExport"
+              v-hasPermi="['store:storePayment:export']"
+            >导出</el-button>
+          </el-col>
+
+        </el-row>
+
+        <el-table height="500" border v-loading="loading" :data="storePaymentList" @selection-change="handleSelectionChange">
+          <el-table-column type="selection" width="55" align="center" />
+          <el-table-column label="ID" align="center" prop="paymentId" />
+          <el-table-column label="付款单号" align="center" prop="payCode" width="120px" />
+          <el-table-column label="会员手机号" align="center" prop="userPhone"  width="120px" />
+          <el-table-column label="支付类型" align="center" prop="payTypeCode" />
+          <el-table-column label="支付金额" align="center" prop="payMoney" />
+          <el-table-column label="退款金额" align="center" prop="refundMoney" />
+          <el-table-column label="交易单号" align="center" prop="bankTransactionId" />
+          <el-table-column label="银行单号" align="center" prop="bankSerialNo" />
+          <el-table-column label="所属公司" align="center" prop="companyName" />
+          <el-table-column label="所属部门" align="center" prop="deptName" />
+          <el-table-column label="员工" align="center" prop="companyUserNickName" />
+          <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" prop="createTime" width="180">
+          </el-table-column>
+          <el-table-column label="支付时间" align="center" prop="payTime" width="180">
+          </el-table-column>
+          <el-table-column label="退款时间" align="center" prop="refundTime" width="180">
+          </el-table-column>
+          <el-table-column label="备注" align="center" prop="remark" />
+          <el-table-column label="操作" fixed="right" 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:storePayment:edit']"
+              >修改</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="100px">
+        <el-form-item label="支付订单号" prop="payCode">
+          <el-input v-model="form.payCode" disabled placeholder="请输入支付订单号" />
+        </el-form-item>
+        <el-form-item label="支付类型" prop="payTypeCode">
+          <el-input v-model="form.payTypeCode" disabled placeholder="请输入支付类型" />
+        </el-form-item>
+        <el-form-item label="支付金额" prop="payMoney">
+          <el-input v-model="form.payMoney" disabled placeholder="请输入支付金额" />
+        </el-form-item>
+          <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark"  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 { listStorePayment, getStorePayment, delStorePayment, addStorePayment, updateStorePayment, exportStorePayment } from "@/api/hisStore/storePayment";
+import { treeselect } from "@/api/company/companyDept";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "StorePayment",
+  components: { Treeselect },
+  data() {
+    return {
+      // 部门树选项
+      deptOptions: undefined,
+      // 是否显示弹出层
+      open: false,
+      // 部门名称
+      deptName: undefined,
+      defaultProps: {
+        children: "children",
+        label: "label",
+      },
+
+      statusOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      dateRange:[],
+      refundDateRange:[],
+      // 总条数
+      total: 0,
+      // 支付明细表格数据
+      storePaymentList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        payCode: null,
+        payTypeCode: null,
+        payMoney: null,
+        payTime: null,
+        tradeNo: null,
+        userId: null,
+        openId: null,
+        businessType: null,
+        businessOrderId: null,
+        status: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  watch: {
+    // 根据名称筛选部门树
+    deptName(val) {
+        this.$refs.tree.filter(val);
+      },
+  },
+  created() {
+    this.getTreeselect();
+    this.getDicts("store_payment_status").then((response) => {
+      this.statusOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+    /** 查询部门下拉树结构 */
+    getTreeselect() {
+      treeselect().then((response) => {
+        this.deptOptions = response.data;
+      });
+    },
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true;
+      return data.label.indexOf(value) !== -1;
+    },
+    // 节点单击事件
+    handleNodeClick(data) {
+      this.queryParams.deptId = data.id;
+      this.getList();
+    },
+    /** 查询支付明细列表 */
+    getList() {
+      this.loading = true;
+      if(this.refundDateRange!=null&&this.refundDateRange.length==2){
+        this.queryParams.refundBeginTime=this.refundDateRange[0];
+        this.queryParams.refundEndTime=this.refundDateRange[1];
+      }
+      else{
+        this.queryParams.refundBeginTime=null;
+        this.queryParams.refundEndTime=null;
+      }
+      listStorePayment(this.addDateRange(this.queryParams, this.dateRange)).then(response => {
+        this.storePaymentList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        paymentId: null,
+        payCode: null,
+        payTypeCode: null,
+        payMoney: null,
+        payTime: null,
+        createTime: null,
+        tradeNo: null,
+        userId: null,
+        openId: null,
+        businessType: null,
+        businessOrderId: null,
+        status: 0
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.paymentId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加支付明细";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const paymentId = row.paymentId || this.ids
+      getStorePayment(paymentId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改支付明细";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.paymentId != null) {
+            updateStorePayment(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addStorePayment(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const paymentIds = row.paymentId || this.ids;
+      this.$confirm('是否确认删除支付明细编号为"' + paymentIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delStorePayment(paymentIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有支付明细数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStorePayment(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+</script>

+ 216 - 0
src/views/hisStore/storeProduct/index.vue

@@ -0,0 +1,216 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+
+      <el-form-item label="商品分类" prop="cateId">
+         <treeselect style="width:205.4px"  v-model="queryParams.cateId"   :options="categoryOptions" :normalizer="normalizer" placeholder="请选择分类" />
+      </el-form-item>
+      <el-form-item label="商品名称" prop="productName">
+        <el-input
+
+          v-model="queryParams.productName"
+          placeholder="请输入商品名称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="商品类型" prop="productType">
+        <el-select  v-model="queryParams.productType" placeholder="请选择商品类型" clearable size="small" >
+         <el-option
+                v-for="item in productTypeOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </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-tabs type="card" v-model="activeName" @tab-click="handleClick">
+      <el-tab-pane label="出售中" name="1"></el-tab-pane>
+      <el-tab-pane label="待上架" name="0"></el-tab-pane>
+    </el-tabs>
+    <el-table height="500" border  v-loading="loading" :data="storeProductList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="ID" align="center" prop="productId" />
+      <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.image" width="100">
+            <img :src="scope.row.image" style="max-width: 150px;">
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品名称" show-overflow-tooltip align="center" prop="productName" />
+      <el-table-column label="分类" align="center" prop="cateName" />
+      <el-table-column label="售价" align="center" prop="price" >
+          <template slot-scope="scope" >
+              <span v-if="scope.row.price!=null">{{scope.row.price.toFixed(2)}}</span>
+          </template>
+      </el-table-column>
+      <el-table-column label="原价" align="center" prop="otPrice" >
+          <template slot-scope="scope" >
+              <span v-if="scope.row.otPrice!=null">{{scope.row.otPrice.toFixed(2)}}</span>
+          </template>
+      </el-table-column>
+      <el-table-column label="销量" align="center" prop="sales" />
+      <el-table-column label="库存" align="center" prop="stock" />
+      <el-table-column label="类型" align="center" prop="productType" >
+          <template slot-scope="scope">
+              <el-tag prop="productType" v-for="(item, index) in productTypeOptions"    v-if="scope.row.productType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column label="状态" align="center" prop="isShow" >
+          <template slot-scope="scope">
+              <el-tag prop="status" v-for="(item, index) in isShowOptions"    v-if="scope.row.isShow==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" fixed="right" width="120px" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleDetails(scope.row)"
+            v-hasPermi="['store:storeProduct:query']"
+          >查看</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-drawer
+     size="50%"
+      :title="title" :visible.sync="open"
+      >
+      <product-details  ref="productDetails" />
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import {  listStoreProduct  } from "@/api/hisStore/storeProduct";
+import { getAllStoreProductCategory } from "@/api/hisStore/storeProductCategory";
+import productDetails from "../components/productDetails";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+export default {
+  name: "StoreProduct",
+  components: {
+    Treeselect,
+    productDetails
+  },
+  data() {
+    return {
+      activeName:"1",
+      isShowOptions:[],
+      productTypeOptions:[],
+      categoryOptions:[],
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品表格数据
+      storeProductList: [],
+      // 弹出层标题
+      title: "商品详情",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        productName: null,
+        productType: null,
+        isShow: "1",
+
+      },
+    };
+  },
+  created() {
+    this.getDicts("store_product_type").then((response) => {
+      this.productTypeOptions = response.data;
+    });
+    this.getDicts("store_product_is_show").then((response) => {
+      this.isShowOptions = response.data;
+    });
+    this.getTreeselect();
+    this.getList();
+  },
+  methods: {
+    handleDetails(row){
+      this.open=true;
+      setTimeout(() => {
+        this.$refs.productDetails.getStoreProduct(row.productId );
+      }, 500);
+    },
+    handleClick(tab, event) {
+      this.queryParams.isShow=tab.name;
+      this.getList();
+    },
+    /** 转换商品分类数据结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.cateId,
+        label: node.cateName,
+        children: node.children
+      };
+    },
+    getTreeselect() {
+      getAllStoreProductCategory().then(response => {
+        this.categoryOptions = [];
+        const data = this.handleTree(response.data, "cateId", "pid");
+        this.categoryOptions=data;
+      });
+    },
+    /** 查询商品列表 */
+    getList() {
+      this.loading = true;
+      listStoreProduct(this.queryParams).then(response => {
+        this.storeProductList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.productId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+  }
+};
+</script>

+ 603 - 0
src/views/hisStore/storeProductPackage/index.vue

@@ -0,0 +1,603 @@
+<template>
+  <div class="app-container">
+     <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+     <el-form-item label="套餐分类" prop="cateId">
+        <el-select  v-model="queryParams.cateId" placeholder="请选择分类" clearable size="small" >
+         <el-option
+                v-for="item in cateOptions"
+                :key="item.dictValue"
+                :label="item.dictLabel"
+                :value="item.dictValue"
+              />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="套餐名称" prop="title">
+        <el-input
+          v-model="queryParams.title"
+          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:storeProductPackage: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:storeProductPackage: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:storeProductPackage: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="storeProductPackageList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="20" align="center" prop="packageId" />
+      <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.imgUrl" width="100">
+            <img :src="scope.row.imgUrl" style="max-width: 150px;">
+          </el-popover>
+        </template>
+      </el-table-column>
+      <el-table-column label="所属分类" align="center" prop="cateId" width="150px" >
+          <template slot-scope="scope">
+              <el-tag prop="cateId" v-for="(item, index) in cateOptions"    v-if="scope.row.cateId==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column label="标题" align="center" prop="title" show-overflow-tooltip />
+      <el-table-column label="描述" align="center" prop="descs" show-overflow-tooltip />
+      <el-table-column label="原价" align="center"  >
+          <template slot-scope="scope">
+              <div  v-if="scope.row.money!=null"  >
+                {{scope.row.money.toFixed(2)}}
+              </div>
+          </template>
+      </el-table-column>
+      <el-table-column label="套餐价格" align="center"  >
+          <template slot-scope="scope">
+              <div  v-if="scope.row.payMoney!=null"  >
+                {{scope.row.payMoney.toFixed(2)}}
+              </div>
+          </template>
+      </el-table-column>
+      <el-table-column label="支付类型" align="center" prop="payType" width="150px" >
+          <template slot-scope="scope">
+              <el-tag prop="payType" v-for="(item, index) in storePayTypeOptions"    v-if="scope.row.payType==item.dictValue">{{item.dictLabel}}</el-tag>
+          </template>
+      </el-table-column>
+      <el-table-column label="限购次数" align="center" prop="limitCount" />
+      <!-- <el-table-column label="所属公司" align="center" prop="companyName" /> -->
+      <!-- <el-table-column label="所属部门" align="center" prop="deptName" /> -->
+      <el-table-column label="操作" fixed="right" width="120px"  align="center" class-name="small-padding fixed-width">
+        <template slot-scope="scope">
+          <el-button
+            size="mini"
+            type="text"
+            @click="handleDetails(scope.row)"
+            v-hasPermi="['store:storeProductPackage:query']"
+          >查看</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="80px">
+        <el-form-item label="套餐封面" prop="imgUrl">
+          <Material v-model="imageArr" type="image" :num="1" :width="150" :height="150" />
+        </el-form-item>
+        <el-form-item label="套餐组图" prop="images">
+           <Material v-model="photoArr" type="image" :num="5" :width="150" :height="150" />
+        </el-form-item>
+        <el-form-item label="套餐标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入套餐标题" />
+        </el-form-item>
+        <el-form-item label="所属分类" props="cateId">
+            <el-select style="width: 200px" v-model="form.cateId" placeholder="请选择分类" clearable size="small" >
+              <el-option
+                      v-for="item in cateOptions"
+                      :key="item.dictValue"
+                      :label="item.dictLabel"
+                      :value="item.dictValue"
+                    />
+            </el-select>
+        </el-form-item>
+        <el-form-item label="套餐描述" prop="descs">
+          <el-input type="textarea" v-model="form.descs" placeholder="请输入描述" />
+        </el-form-item>
+        <el-form-item label="套餐详情" prop="content">
+          <Editor ref="myeditor"   :min-height="192" @on-text-change="updateText" />
+        </el-form-item>
+        <el-form-item label="套餐商品" prop="productList"  >
+              <el-row  >
+                <el-col >
+                      <el-button plain  type="primary" icon="el-icon-plus" @click="handleAddProduct">添加商品</el-button>
+                </el-col>
+              </el-row>
+              <el-table border 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"  >
+                   <template slot-scope="scope">
+                    <div v-if="scope.row.price!=null">
+                         {{scope.row.price.toFixed(2)}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <!-- <el-table-column label="代理价" align="center" prop="agentPrice" /> -->
+                <el-table-column label="数量" align="center"  prop="count" width="200px" >
+                   <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"  >
+                   <template slot-scope="scope">
+                    <div v-if="scope.row.money!=null">
+                         {{scope.row.money.toFixed(2)}}
+                    </div>
+                  </template>
+                </el-table-column>
+                <el-table-column label="操作" align="center" width="100px" >
+                  <template slot-scope="scope">
+                    <el-button
+                      size="mini"
+                      type="text"
+                      icon="el-icon-delete"
+                      @click="handleProductDelete(scope.row)"
+                    >删除</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+              <el-row  >
+                <el-col  >
+                      <span style="margin-left:10px;" v-if="totalMoney!=null">商品总价:{{totalMoney}}</span>
+                </el-col>
+              </el-row>
+        </el-form-item>
+        <el-form-item label="原价" prop="money">
+          <el-input-number v-model="form.money" :precision="2"  :min="0.00" placeholder="请输入原价" />
+        </el-form-item>
+        <el-form-item label="套餐价格" prop="payMoney">
+          <el-input-number v-model="form.payMoney" :precision="2"  :min="0.00" placeholder="请输入套餐价格" />
+        </el-form-item>
+        <el-form-item label="支付类型" props="payType">
+              <el-radio-group v-model="form.payType">
+                <el-radio  v-if="item.dictValue!=3" :label="item.dictValue" v-for="item in storePayTypeOptions" >{{item.dictLabel}}</el-radio>
+              </el-radio-group>
+        </el-form-item>
+         <el-form-item label="限购次数" prop="limitCount">
+              <el-input-number v-model="form.limitCount" :min="0" :step="1" 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="product.title" v-if="product.open"  :visible.sync="product.open" width="1000px" append-to-body>
+        <product-select  ref="product"  @selectProduct="selectProduct" />
+    </el-dialog>
+    <el-drawer
+     size="50%"
+      :title="show.title" :visible.sync="show.open"
+      >
+      <product-package-details  ref="productPackageDetails" />
+    </el-drawer>
+  </div>
+</template>
+
+<script>
+import { listStoreProductPackage, getStoreProductPackage, delStoreProductPackage, addStoreProductPackage, updateStoreProductPackage, exportStoreProductPackage } from "@/api/hisStore/storeProductPackage";
+import Editor from '@/components/Editor/wang';
+import productSelect from "../components/productSelect";
+import Material from '@/components/Material'
+import singleImg from '@/components/Material/single'
+import productPackageDetails from "../components/productPackageDetails";
+export default {
+  name: "StoreProductPackage",
+  components: {
+    Editor,
+    productSelect,
+    Material,
+    singleImg,
+    productPackageDetails
+  },
+  watch: {
+    imageArr: function(val) {
+      this.form.imgUrl = val.join(',')
+    },
+    photoArr: function(val) {
+      this.form.images = val.join(',')
+    }
+  },
+  data() {
+    return {
+      show:{
+        open:false,
+        title:"商品套餐信息"
+      },
+      photoArr:[],
+      imageArr:[],
+      cateOptions:[],
+      storePayTypeOptions:[],
+      totalMoney:0.00,
+      products:[],
+      product:{
+        open:false,
+        title:"商品选择"
+      },
+      // 遮罩层
+      loading: true,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品组合套餐表格数据
+      storeProductPackageList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        title: null,
+        descs: null,
+        content: null,
+        imgUrl: null,
+        productIds: null,
+        productAttrValueIds: null,
+        money: null,
+        payMoney: null,
+        companyId: null,
+        companyUserId: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        title: [
+          { required: true, message: "标题不能为空" }
+        ],
+        descs: [
+          { required: true, message: "描述不能为空" }
+        ],
+        content: [
+          { required: true, message: "详情不能为空" }
+        ],
+        imgUrl: [
+          { required: true, message: "封面不能为空" }
+        ],
+        images: [
+          { required: true, message: "组图不能为空" }
+        ],
+        productList: [
+          { required: true, message: "商品不能为空" }
+        ],
+        payMoney: [
+          { required: true, message: "套餐价格不能为空" }
+        ],
+        payType: [
+          { required: true, message: "支付类型不能为空" }
+        ],
+        limitCount: [
+          { required: true, message: "限购次数不能为空" }
+        ],
+
+      }
+    };
+  },
+  created() {
+    this.getDicts("store_product_package_cate").then((response) => {
+      this.cateOptions = response.data;
+    });
+    this.getDicts("store_pay_type").then((response) => {
+      this.storePayTypeOptions = response.data;
+    });
+    this.getList();
+  },
+  methods: {
+    handleDetails(row){
+      this.show.open=true;
+      setTimeout(() => {
+        this.$refs.productPackageDetails.getStoreProductPackage(row.packageId );
+      }, 500);
+    },
+    handleProductCountChange(row){
+      row.money=row.count*row.price;
+      this.$forceUpdate();
+      this.compute();
+    },
+    handleProductDelete(row){
+       this.products.splice(this.products.findIndex(item => item.id === row.id), 1)
+       this.compute();
+    },
+    compute(){
+      this.totalMoney=0;
+      var that=this;
+      this.products.forEach (function (value) {
+          that.totalMoney += value.money;
+      });
+      that.totalMoney=that.totalMoney.toFixed(2);
+    },
+    selectProduct(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();
+    },
+    handleAddProduct(){
+      this.product.open=true;
+      // setTimeout(() => {
+      //   this.$refs.product.getData(1);
+      // }, 200);
+
+    },
+    handleAvatarSuccess(res, file) {
+        if(res.code==200){
+          this.form.imgUrl=res.url;
+        }
+        else{
+          this.msgError(res.msg);
+        }
+    },
+    beforeAvatarUpload(file) {
+      const isLt1M = file.size / 1024 / 1024 < 1;
+      if (!isLt1M) {
+        this.$message.error('上传图片大小不能超过 1MB!');
+      }
+      return   isLt1M;
+    },
+    updateText(text){
+      this.form.content=text;
+    },
+    /** 查询商品组合套餐列表 */
+    getList() {
+      this.loading = true;
+      listStoreProductPackage(this.queryParams).then(response => {
+        this.storeProductPackageList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+       // 表单重置
+       reset() {
+      this.form = {
+        packageId: null,
+        title: null,
+        descs: null,
+        content: null,
+        imgUrl: null,
+        images: null,
+        money: null,
+        payMoney: null,
+        companyId: null,
+        companyUserId: null,
+        payType:"1",
+        limitCount:0,
+        cateId:"0",
+        productList:null,
+      };
+      this.products=[];
+      this.photoArr=[];
+      this.imageArr=[];
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNum = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    // 多选框选中数据
+    handleSelectionChange(selection) {
+      this.ids = selection.map(item => item.packageId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加商品组合套餐";
+      setTimeout(() => {
+        this.$refs.myeditor.setText("");
+      }, 200);
+
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const packageId = row.packageId || this.ids
+      getStoreProductPackage(packageId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改商品组合套餐";
+        this.products=this.form.productList;
+        for(var i=0;i<this.products.length;i++){
+          this.products[i].money=this.products[i].count*this.products[i].price;
+        }
+        this.compute();
+        setTimeout(() => {
+          if(this.form.content==null){
+            this.$refs.myeditor.setText("");
+          }
+          else{
+            this.$refs.myeditor.setText(this.form.content);
+          }
+        }, 200);
+        this.form.payType = response.data.payType.toString();
+        if(this.form.imgUrl!=null){
+          this.imageArr=this.form.imgUrl.split(",");
+        }
+        if(this.form.images!=null){
+          this.photoArr=this.form.images.split(",");
+        }
+         if(this.form.cateId!=null){
+          this.form.cateId = response.data.cateId.toString();
+        }
+        this.$forceUpdate();
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.form.productList=[];
+      this.products.forEach((item) => {
+        var data={id:item.id,count:item.count}
+        this.form.productList.push(data)
+      })
+      // return;
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.packageId != null) {
+            updateStoreProductPackage(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("修改成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          } else {
+            addStoreProductPackage(this.form).then(response => {
+              if (response.code === 200) {
+                this.msgSuccess("新增成功");
+                this.open = false;
+                this.getList();
+              }
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const packageIds = row.packageId || this.ids;
+      this.$confirm('是否确认删除商品组合套餐编号为"' + packageIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delStoreProductPackage(packageIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(function() {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有商品组合套餐数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return exportStoreProductPackage(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+        }).catch(function() {});
+    }
+  }
+};
+
+</script>
+<style scoped lang="scss">
+.items{
+  margin: 5px 0px;
+  display: flex;
+  flex-direction: row;
+  align-items: center;
+  justify-content: flex-start;
+  .pic{
+    width:60px;
+    height:60px;
+  }
+  .goods-content{
+    margin-left: 10px;
+    max-width: 200px;
+    text-align: left;
+    .goods-title{
+
+      overflow:hidden;
+      white-space: nowrap;
+      text-overflow: ellipsis;
+      -o-text-overflow:ellipsis;
+    }
+  }
+}
+</style>

+ 393 - 0
src/views/hisStore/userOnlineState/index.vue

@@ -0,0 +1,393 @@
+<template>
+  <div class="app-container">
+    <el-form :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="用户昵称" prop="nickname">
+        <el-input
+          v-model="queryParams.nickname"
+          placeholder="请输入用户昵称"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="手机号码" prop="phone">
+        <el-input
+          v-model="queryParams.phone"
+          placeholder="请输入手机号码"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="所属公司" prop="companyName">
+        <el-input
+          v-model="queryParams.companyName"
+          placeholder="请输入所属公司"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="所属销售" prop="companyUserNickName">
+        <el-input
+          v-model="queryParams.companyUserName"
+          placeholder="请输入所属销售"
+          clearable
+          size="small"
+          @keyup.enter.native="handleQuery"
+        />
+      </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:userOnlineState: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:userOnlineState: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:userOnlineState:remove']"-->
+<!--        >删除</el-button>-->
+<!--      </el-col>-->
+      <el-col :span="1.5">
+        <el-button
+          type="warning"
+          plain
+          icon="el-icon-download"
+          size="mini"
+          :loading="exportLoading"
+          @click="handleExport"
+          v-hasPermi="['store:userOnlineState:export']"
+        >导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <el-table border v-loading="loading" :data="userOnlineStateList" @selection-change="handleSelectionChange">
+      <el-table-column type="selection" width="55" align="center" />
+      <el-table-column label="用户id" align="center" prop="userId" />
+      <el-table-column label="用户昵称" align="center" prop="nickname" />
+      <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="phone" />
+      <el-table-column label="所属公司" align="center" prop="companyName" />
+      <el-table-column label="所属销售" align="center" prop="companyUserName" />
+      <el-table-column label="上线状态" align="center" prop="onlineStatus">
+      <template slot-scope="scope">
+        <el-tag prop="onlineStatus"  v-if="scope.row.onlineStatus === 1" type="success">已上线</el-tag>
+        <el-tag prop="onlineStatus"  v-if="scope.row.onlineStatus === 2" type="primary">未上线</el-tag>
+      </template>
+      </el-table-column>
+<!--      <el-table-column label="上线时间" align="center" prop="onlineTime" width="180">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.onlineTime, '{y}-{m}-{d}') }}</span>-->
+<!--        </template>-->
+<!--      </el-table-column>-->
+<!--      <el-table-column label="看课数量" align="center" prop="watchCourseCount" />-->
+<!--      <el-table-column label="参与营期数量" align="center" prop="partCourseCount" />-->
+<!--      <el-table-column label="最后一次看课时间" align="center" prop="lastWatchDate" width="180">-->
+<!--        <template slot-scope="scope">-->
+<!--          <span>{{ parseTime(scope.row.lastWatchDate, '{y}-{m}-{d}') }}</span>-->
+<!--        </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:userOnlineState:edit']"-->
+<!--          >修改</el-button>-->
+<!--          <el-button-->
+<!--            size="mini"-->
+<!--            type="text"-->
+<!--            icon="el-icon-delete"-->
+<!--            @click="handleDelete(scope.row)"-->
+<!--            v-hasPermi="['store:userOnlineState: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"
+    />
+
+<!--    &lt;!&ndash; 添加或修改用户上线情况对话框 &ndash;&gt;-->
+<!--    <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="用户昵称" prop="nickname">-->
+<!--          <el-input v-model="form.nickname" placeholder="请输入用户昵称" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="用户头像" prop="avatar">-->
+<!--          <el-input v-model="form.avatar" placeholder="请输入用户头像" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="微信小程序OPENID" prop="maOpenId">-->
+<!--          <el-input v-model="form.maOpenId" placeholder="请输入微信小程序OPENID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="微信公众号OPENID" prop="mpOpenId">-->
+<!--          <el-input v-model="form.mpOpenId" placeholder="请输入微信公众号OPENID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="关联ID" prop="unionId">-->
+<!--          <el-input v-model="form.unionId" placeholder="请输入关联ID" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="公司id" prop="companyId">-->
+<!--          <el-input v-model="form.companyId" placeholder="请输入公司id" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="销售id" prop="companyUserId">-->
+<!--          <el-input v-model="form.companyUserId" placeholder="请输入销售id" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="上线状态,1-已上线;2-未上线">-->
+<!--          <el-radio-group v-model="form.onlineStatus">-->
+<!--            <el-radio label="1">请选择字典生成</el-radio>-->
+<!--          </el-radio-group>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="上线时间" prop="onlineTime">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.onlineTime"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择上线时间">-->
+<!--          </el-date-picker>-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="看课数量" prop="watchCourseCount">-->
+<!--          <el-input v-model="form.watchCourseCount" placeholder="请输入看课数量" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="参与营期数量" prop="partCourseCount">-->
+<!--          <el-input v-model="form.partCourseCount" placeholder="请输入参与营期数量" />-->
+<!--        </el-form-item>-->
+<!--        <el-form-item label="最后一次看课时间" prop="lastWatchDate">-->
+<!--          <el-date-picker clearable size="small"-->
+<!--            v-model="form.lastWatchDate"-->
+<!--            type="date"-->
+<!--            value-format="yyyy-MM-dd"-->
+<!--            placeholder="选择最后一次看课时间">-->
+<!--          </el-date-picker>-->
+<!--        </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 { listUserOnlineState, getUserOnlineState, delUserOnlineState, addUserOnlineState, updateUserOnlineState, exportUserOnlineState } from "@/api/hisStore/userOnlineState";
+
+export default {
+  name: "UserOnlineState",
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 选中数组
+      ids: [],
+      // 非单个禁用
+      single: true,
+      // 非多个禁用
+      multiple: true,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 用户上线情况表格数据
+      userOnlineStateList: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNum: 1,
+        pageSize: 10,
+        nickname: null,
+        avatar: null,
+        phone: null,
+        maOpenId: null,
+        mpOpenId: null,
+        unionId: null,
+        companyId: null,
+        companyUserId: null,
+        onlineStatus: null,
+        onlineTime: null,
+        watchCourseCount: null,
+        partCourseCount: null,
+        lastWatchDate: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询用户上线情况列表 */
+    getList() {
+      this.loading = true;
+      listUserOnlineState(this.queryParams).then(response => {
+        this.userOnlineStateList = response.rows;
+        this.total = response.total;
+        this.loading = false;
+      });
+    },
+    // 取消按钮
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    // 表单重置
+    reset() {
+      this.form = {
+        userId: null,
+        nickname: null,
+        avatar: null,
+        phone: null,
+        createTime: null,
+        maOpenId: null,
+        mpOpenId: null,
+        unionId: null,
+        companyId: null,
+        companyUserId: null,
+        onlineStatus: 0,
+        onlineTime: null,
+        watchCourseCount: null,
+        partCourseCount: null,
+        lastWatchDate: 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.userId)
+      this.single = selection.length!==1
+      this.multiple = !selection.length
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加用户上线情况";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const userId = row.userId || this.ids
+      getUserOnlineState(userId).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改用户上线情况";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (valid) {
+          if (this.form.userId != null) {
+            updateUserOnlineState(this.form).then(response => {
+              this.msgSuccess("修改成功");
+              this.open = false;
+              this.getList();
+            });
+          } else {
+            addUserOnlineState(this.form).then(response => {
+              this.msgSuccess("新增成功");
+              this.open = false;
+              this.getList();
+            });
+          }
+        }
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const userIds = row.userId || this.ids;
+      this.$confirm('是否确认删除用户上线情况编号为"' + userIds + '"的数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(function() {
+          return delUserOnlineState(userIds);
+        }).then(() => {
+          this.getList();
+          this.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      const queryParams = this.queryParams;
+      this.$confirm('是否确认导出所有用户上线情况数据项?', "警告", {
+          confirmButtonText: "确定",
+          cancelButtonText: "取消",
+          type: "warning"
+        }).then(() => {
+          this.exportLoading = true;
+          return exportUserOnlineState(queryParams);
+        }).then(response => {
+          this.download(response.msg);
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>