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

Merge branch 'develop_szhj' of http://git.chelingzhu.com/jianguan-web/qpls-md-html into develop_szhj

# Conflicts:
#	package-lock.json
#	src/components/MultiTab/MultiTab.vue
#	src/layouts/PageView.vue
#	src/store/getters.js
#	src/store/modules/app.js
#	src/utils/request.js
#	src/views/reportData/stockIncomeReport/list.vue
#	vue.config.js
性能优化
lilei преди 3 години
родител
ревизия
a4b39a4dba
променени са 35 файла, в които са добавени 2861 реда и са изтрити 444 реда
  1. 2 1
      public/version.json
  2. 25 0
      src/api/data.js
  3. 64 0
      src/api/reportData.js
  4. 1 1
      src/components/Charts/RankList.vue
  5. 1 1
      src/components/DescriptionList/DescriptionList.vue
  6. 1 1
      src/components/GlobalFooter/GlobalFooter.vue
  7. 1 1
      src/components/PageHeader/PageHeader.vue
  8. 1 1
      src/components/Result/Result.vue
  9. 1 1
      src/components/SettingDrawer/SettingItem.vue
  10. 65 17
      src/components/Table/index.js
  11. 2 2
      src/components/global.less
  12. 12 2
      src/components/index.less
  13. 1 1
      src/components/tools/HeadInfo.vue
  14. 2 0
      src/components/tools/UserMenu.vue
  15. 206 131
      src/config/router.config.js
  16. 5 7
      src/layouts/PageView.vue
  17. 1 1
      src/layouts/UserLayout.vue
  18. 2 2
      src/libs/JGPrint.js
  19. 8 0
      src/libs/tools.js
  20. 9 9
      src/libs/versionUpdate.js
  21. 1 1
      src/permission.js
  22. 2 2
      src/store/modules/user.js
  23. 567 121
      src/views/Home.vue
  24. 91 0
      src/views/numsGoodsShelves/accountManagement/applyWithdrawal.vue
  25. 167 1
      src/views/numsGoodsShelves/accountManagement/list.vue
  26. 123 0
      src/views/numsGoodsShelves/recallManagement/confirmModal.vue
  27. 250 1
      src/views/numsGoodsShelves/recallManagement/list.vue
  28. 73 104
      src/views/numsGoodsShelves/shelfMonitoring/list.vue
  29. 213 0
      src/views/reportData/chainSalesDetailsCountReport/list.vue
  30. 212 0
      src/views/reportData/customerSalesDetailsReport/list.vue
  31. 302 0
      src/views/reportData/storeReceivedSendStorageReport/list.vue
  32. 1 1
      src/views/result/Error.vue
  33. 4 4
      src/views/result/Success.vue
  34. 4 0
      src/views/salesManagement/salesQuery/edit.vue
  35. 441 30
      yarn.lock

+ 2 - 1
public/version.json

@@ -1,3 +1,4 @@
 {
-    "version": "1.0.4"
+    "version": "1.0.5",
+    "message": "发现有新版本发布,确定更新系统?"
 }

+ 25 - 0
src/api/data.js

@@ -112,3 +112,28 @@ export const getArea = (params) => {
     method: 'post'
   })
 }
+
+// 首页 导航指引合计
+export const bizStateCount = (params) => {
+  return axios({
+    url: `/home/queryBizStateCount`,
+    data: params,
+    method: 'post'
+  })
+}
+// 首页  数据看板信息
+export const bizData = (params) => {
+  return axios({
+    url: `/home/queryBizData`,
+    data: params,
+    method: 'post'
+  })
+}
+// 首页  商户信息
+export const dealerData = (params) => {
+  return axios({
+    url: `/dealer/findCurrentDealer`,
+    data: params,
+    method: 'get'
+  })
+}

+ 64 - 0
src/api/reportData.js

@@ -335,3 +335,67 @@ export const reportChainReceivingBillDetailCount = (params) => {
     method: 'post'
   })
 }
+// 客户销售明细报表  列表 分页
+export const reportCustomerSalesBillDetailList = (params) => {
+  const url = `/report/reportCustomerSalesBillDetail/reportPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 客户销售明细报表 合计
+export const reportCustomerSalesBillDetailCount = (params) => {
+  return axios({
+    url: '/report/reportCustomerSalesBillDetail/reportCount',
+    data: params,
+    method: 'post'
+  })
+}
+// 客户销售明细报表  导出
+export const reportCustomerSalesBillDetailExport = params => {
+  return axios.request({
+    url: `/report/reportCustomerSalesBillDetail/export`,
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 连锁销售明细合计报表  列表 不分页
+export const reportSalesBillDetailTotalList = (params) => {
+  const url = `/report/reportSalesBillDetailTotal/report`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 连锁销售明细合计报表  导出
+export const reportSalesBillDetailTotalExport = params => {
+  return axios.request({
+    url: `/report/reportSalesBillDetailTotal/export`,
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 门店收发存汇总报表  列表 不分页
+export const reportStockPutOutMonthList = (params) => {
+  const url = `/report/reportStockPutOutMonth/report`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 门店收发存汇总报表  导出
+export const reportStockPutOutMonthExport = params => {
+  return axios.request({
+    url: `/report/reportStockPutOutMonth/export`,
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}

+ 1 - 1
src/components/Charts/RankList.vue

@@ -42,7 +42,7 @@ export default {
         margin-top: 16px;
 
         span {
-          color: rgba(0, 0, 0, .65);
+          color: rgba(0, 0, 0);
           font-size: 14px;
           line-height: 22px;
 

+ 1 - 1
src/components/DescriptionList/DescriptionList.vue

@@ -122,7 +122,7 @@ export default {
 
       .title {
         font-size: 14px;
-        color: rgba(0, 0, 0, .65);
+        color: rgba(0, 0, 0);
         font-weight: normal;
         margin-bottom: 12px;
       }

+ 1 - 1
src/components/GlobalFooter/GlobalFooter.vue

@@ -45,7 +45,7 @@ export default {
       color: rgba(0, 0, 0, 0.45);
 
       &:hover {
-        color: rgba(0, 0, 0, 0.65);
+        color: rgba(0, 0, 0);
       }
 
       &:not(:last-child) {

+ 1 - 1
src/components/PageHeader/PageHeader.vue

@@ -107,7 +107,7 @@ export default {
         font-size: 20px;
         line-height: 28px;
         font-weight: 500;
-        color: rgba(0, 0, 0, 0.85);
+        color: rgba(0, 0, 0);
         margin-bottom: 16px;
         flex: auto;
       }

+ 1 - 1
src/components/Result/Result.vue

@@ -77,7 +77,7 @@ export default {
     }
     .title {
       font-size: 24px;
-      color: rgba(0, 0, 0, .85);
+      color: rgba(0, 0, 0);
       font-weight: 500;
       line-height: 32px;
       margin-bottom: 16px;

+ 1 - 1
src/components/SettingDrawer/SettingItem.vue

@@ -29,7 +29,7 @@ export default {
 
     .setting-drawer-index-title {
       font-size: 14px;
-      color: rgba(0, 0, 0, .85);
+      color: rgba(0, 0, 0);
       line-height: 22px;
       margin-bottom: 12px;
     }

+ 65 - 17
src/components/Table/index.js

@@ -9,7 +9,8 @@ export default {
       selectedRowKeys: [],
       localLoading: false,
       localDataSource: [],
-      localPagination: Object.assign({}, this.pagination)
+      localPagination: Object.assign({}, this.pagination),
+      isSucceed: true //  是否请求成功
     }
   },
   props: Object.assign({}, T.props, {
@@ -17,6 +18,10 @@ export default {
       type: [String, Function],
       default: 'key'
     },
+    rowKeyName: { // 多选时,唯一标识键名
+      type: String,
+      default: 'id'
+    },
     rowClassName: {
       type: [String, Function],
       default: ''
@@ -55,11 +60,6 @@ export default {
       type: Object,
       default: null
     },
-    /** @Deprecated */
-    showAlertInfo: {
-      type: Boolean,
-      default: false
-    },
     showPagination: {
       type: String | Boolean,
       default: 'auto'
@@ -123,7 +123,7 @@ export default {
     this.localPagination = ['auto', true].includes(this.showPagination) && Object.assign({}, this.localPagination, {
       current: localPageNum,
       pageSize: this.pageSize,
-      pageSizeOptions:['5','10', '20', '30', '40'],
+      pageSizeOptions: ['5', '10', '20', '30', '40'],
       showTotal: total => `共 ${total} 条记录`,
       showSizeChanger: this.showSizeChanger
     }) || false
@@ -184,8 +184,13 @@ export default {
       // eslint-disable-next-line
       if ((typeof result === 'object' || typeof result === 'function') && typeof result.then === 'function') {
         result.then(r => {
-          const list = r.list || r.data || r
+          // const list = r.list || r.data || r
+          let list = []
+          if (r) {
+            list = r.list || r.data || r
+          }
           // console.log(r,'rrrrrrrrrr')
+          this.isSucceed = !!r
           this.localPagination = this.showPagination && Object.assign({}, this.localPagination, {
             current: r.pageNo, // 返回结果中的当前分页数
             total: Number(r.count), // 返回结果中的总记录数
@@ -234,18 +239,55 @@ export default {
      * @param selectedRows
      */
     updateSelect (selectedRowKeys, selectedRows) {
-      this.selectedRows = selectedRows
-      this.selectedRowKeys = selectedRowKeys
       const list = this.needTotalList
       this.needTotalList = list.map(item => {
         return {
           ...item,
-          total: selectedRows.reduce((sum, val) => {
+          total: this.selectedRows.reduce((sum, val) => {
             const total = sum + parseInt(get(val, item.dataIndex))
             return isNaN(total) ? 0 : total
           }, 0)
         }
       })
+      const obj = {
+        selectedRowKeys: this.selectedRowKeys,
+        selectedRows: this.selectedRows
+      }
+      this.$emit('rowSelection', obj)
+    },
+    onSelectChange (record, selected, selectedRows, nativeEvent) {
+      if (selected) { //  选择
+        this.selectedRows.push(record)
+      } else { //  取消
+        const selectedRowsArr = []
+        this.selectedRows.map(item => {
+          if (this.selectedRowKeys.indexOf(item[this.rowKeyName]) != -1) {
+            selectedRowsArr.push(item)
+          }
+        })
+        this.selectedRows = selectedRowsArr
+      }
+      this.updateSelect()
+    },
+    // 本页全选/取消全选
+    onSelectAllChange (selected, selectedRows, changeRows) {
+      const _this = this
+      if (selected) { //  选择
+        this.selectedRows = [...this.selectedRows, ...changeRows]
+      } else { //  取消
+        const arrId = []
+        this.selectedRows.map((item, index) => {
+          this.selectedRows.map((subItem, ind) => {
+            if (item[this.rowKeyName] == subItem[this.rowKeyName]) {
+              arrId.push(index)
+            }
+          })
+        })
+        arrId.map((item, index) => {
+          _this.selectedRows = _this.selectedRows.slice(item, item + 1)
+        })
+      }
+      this.updateSelect()
     },
     /**
      * 清空 table 已选中项
@@ -302,7 +344,6 @@ export default {
     const props = {}
     const localKeys = Object.keys(this.$data)
     const showAlert = (typeof this.alert === 'object' && this.alert !== null && this.alert.show) && typeof this.rowSelection.selectedRowKeys !== 'undefined' || this.alert
-
     Object.keys(T.props).forEach(k => {
       const localKey = `local${k.substring(0, 1).toUpperCase()}${k.substring(1)}`
       if (localKeys.includes(localKey)) {
@@ -310,16 +351,19 @@ export default {
         return props[k]
       }
       if (k === 'rowSelection') {
-        if (showAlert && this.rowSelection) {
+        if (this.rowSelection) {
           // 如果需要使用alert,则重新绑定 rowSelection 事件
-          // console.log('this.rowSelection', this.rowSelection)
           props[k] = {
             ...this.rowSelection,
-            selectedRows: this.selectedRows,
             selectedRowKeys: this.selectedRowKeys,
             onChange: (selectedRowKeys, selectedRows) => {
-              this.updateSelect(selectedRowKeys, selectedRows)
-              typeof this[k].onChange !== 'undefined' && this[k].onChange(selectedRowKeys, selectedRows)
+              this.selectedRowKeys = selectedRowKeys
+            },
+            onSelect: (record, selected, selectedRows, nativeEvent) => {
+              this.onSelectChange(record, selected, selectedRows, nativeEvent)
+            },
+            onSelectAll: (selected, selectedRows, changeRows) => {
+              this.onSelectAllChange(selected, selectedRows, changeRows)
             }
           }
           return props[k]
@@ -332,6 +376,10 @@ export default {
       this[k] && (props[k] = this[k])
       return props[k]
     })
+    if (!this.isSucceed) { // 请求失败
+      props['locale'] = { emptyText: '网络异常,请点击按钮刷新' }
+    }
+    // isSucceed
     const table = (
       <a-table {...{ props, scopedSlots: { ...this.$scopedSlots } }} onChange={this.loadData}>
         { Object.keys(this.$slots).map(name => (<template slot={name}>{this.$slots[name]}</template>)) }

+ 2 - 2
src/components/global.less

@@ -183,7 +183,7 @@ body {
         display: inline-block;
         transition: all 0.3s;
         height: 100%;
-        color: rgba(0, 0, 0, 0.65);
+        color: rgba(0, 0, 0);
 
         &:hover {
           background: rgba(0, 0, 0, 0.025);
@@ -244,7 +244,7 @@ body {
         .header-index-wide {
           .header-index-left {
             .trigger {
-              color: rgba(0, 0, 0, 0.65);
+              color: rgba(0, 0, 0);
             }
           }
         }

+ 12 - 2
src/components/index.less

@@ -17,7 +17,9 @@
     -webkit-line-clamp: 3;    
     overflow: hidden;
 }
-
+.ant-input-number-handler-wrap{
+  display: none;
+}
 /* 扩展ant design pro按钮组件颜色 */
 .ant-btn-primary.button-primary {
   background-color: #39f;
@@ -397,4 +399,12 @@
       padding-bottom: 8px!important;
     }
   }
-}
+}
+.ant-form-item-label{
+  label{
+    color: #000000!important;
+  }
+}
+.ant-alert-message, .ant-card-head{
+  color: #000000!important;
+}

+ 1 - 1
src/components/tools/HeadInfo.vue

@@ -50,7 +50,7 @@ export default {
       margin-bottom: 4px;
     }
     p {
-      color: rgba(0, 0, 0, .85);
+      color: rgba(0, 0, 0);
       font-size: 24px;
       line-height: 32px;
       margin: 0;

+ 2 - 0
src/components/tools/UserMenu.vue

@@ -44,6 +44,7 @@ import NoticeIcon from '@/components/NoticeIcon'
 import { mapActions, mapGetters } from 'vuex'
 import defaultAvatar from '@/assets/avatar2.jpg'
 import store from '../../store'
+import Vue from 'vue'
 export default {
   name: 'UserMenu',
   components: {
@@ -120,6 +121,7 @@ export default {
         // 重新登录
         const params = { username: '', password: '' }
         return this.Login(params).then(() => {
+          store.commit('SET_ROLES', Vue.ls.get('rolesAccess-qpls-md'))
           this.$router.push({ path: '/home' })
           setTimeout(() => {
             window.location.reload() //  刷新页面

+ 206 - 131
src/config/router.config.js

@@ -1603,31 +1603,6 @@ export const asyncRouterMap = [
           permission: 'M_reportData'
         },
         children: [
-          {
-            path: '/reportData/chainStockReport',
-            redirect: '/reportData/chainStockReport/list',
-            name: 'chainStockReport',
-            component: BlankLayout,
-            meta: {
-              title: '连锁库存总表',
-              icon: 'profile',
-              permission: 'M_chainStockReportList'
-            },
-            hideChildrenInMenu: true,
-            children: [
-              {
-                path: 'list',
-                name: 'chainStockReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainStockReport/list.vue'),
-                meta: {
-                  title: '连锁库存总表列表',
-                  icon: 'profile',
-                  hidden: true,
-                  permission: 'M_chainStockReportList'
-                }
-              }
-            ]
-          },
           {
             path: '/reportData/salesReport',
             redirect: '/reportData/salesReport/list',
@@ -1679,176 +1654,301 @@ export const asyncRouterMap = [
             ]
           },
           {
-            path: '/reportData/chainSalesReport',
-            redirect: '/reportData/chainSalesReport/list',
-            name: 'chainSalesReport',
+            path: '/reportData/customerReport',
+            redirect: '/reportData/customerReport/list',
+            name: 'customerReport',
             component: BlankLayout,
             meta: {
-              title: '连锁销售报表',
+              title: '大客户报表',
               icon: 'profile',
-              permission: 'M_chainSalesReportList'
+              permission: 'M_customerReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'chainSalesReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainSalesReport/list.vue'),
+                name: 'customerReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/customerReport/list.vue'),
                 meta: {
-                  title: '连锁销售报表列表',
+                  title: '大客户报表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_chainSalesReportList'
+                  permission: 'M_customerReportList'
                 }
               }
             ]
           },
           {
-            path: '/reportData/chainSalesDetailReport',
-            redirect: '/reportData/chainSalesDetailReport/list',
-            name: 'chainSalesDetailReport',
+            path: '/reportData/customerSalesDetailsReport',
+            redirect: '/reportData/customerSalesDetailsReport/list',
+            name: 'customerSalesDetailsReport',
             component: BlankLayout,
             meta: {
-              title: '连锁销售明细报表',
+              title: '客户销售明细报表',
               icon: 'profile',
-              permission: 'M_chainSalesDetailReportList'
+              permission: 'M_customerSalesDetailsReport_list'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'chainSalesDetailReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainSalesDetailReport/list.vue'),
+                name: 'customerSalesDetailsReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/customerSalesDetailsReport/list.vue'),
                 meta: {
-                  title: '连锁销售明细报表列表',
+                  title: '客户销售明细列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_chainSalesDetailReportList'
+                  permission: 'M_customerSalesDetailsReport_list'
                 }
               }
             ]
           },
           {
-            path: '/reportData/chainReceivedSendStorageReport',
-            redirect: '/reportData/chainReceivedSendStorageReport/list',
-            name: 'chainReceivedSendStorageReport',
+            path: '/reportData/stockIncomeReport',
+            redirect: '/reportData/stockIncomeReport/list',
+            name: 'stockIncomeReport',
             component: BlankLayout,
             meta: {
-              title: '连锁收发存报表',
+              title: '库存总入报表',
               icon: 'profile',
-              permission: 'M_chainReceivedSendStorageReportList'
+              permission: 'M_stockIncomeReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'chainReceivedSendStorageReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainReceivedSendStorageReport/list.vue'),
+                name: 'stockIncomeReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/stockIncomeReport/list.vue'),
                 meta: {
-                  title: '连锁收发存报表列表',
+                  title: '库存总入报表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_chainReceivedSendStorageReportList'
+                  permission: 'M_stockIncomeReportList'
                 }
               }
             ]
           },
           {
-            path: '/reportData/customerReport',
-            redirect: '/reportData/customerReport/list',
-            name: 'customerReport',
+            path: '/reportData/stockExpenditureReport',
+            redirect: '/reportData/stockExpenditureReport/list',
+            name: 'stockExpenditureReport',
             component: BlankLayout,
             meta: {
-              title: '大客户报表',
+              title: '库存总出报表',
               icon: 'profile',
-              permission: 'M_customerReportList'
+              permission: 'M_stockExpenditureReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'customerReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/customerReport/list.vue'),
+                name: 'stockExpenditureReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/stockExpenditureReport/list.vue'),
                 meta: {
-                  title: '大客户报表列表',
+                  title: '库存总出报表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_customerReportList'
+                  permission: 'M_stockExpenditureReportList'
                 }
               }
             ]
           },
           {
-            path: '/reportData/chainCustomerReport',
-            redirect: '/reportData/chainCustomerReport/list',
-            name: 'chainCustomerReport',
+            path: '/reportData/purchaseReceiptReport',
+            redirect: '/reportData/purchaseReceiptReport/list',
+            name: 'purchaseReceiptReport',
             component: BlankLayout,
             meta: {
-              title: '连锁大客户报表',
+              title: '采购入库报表',
               icon: 'profile',
-              permission: 'M_chainCustomerReportList'
+              permission: 'M_purchaseReceiptReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'chainCustomerReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainCustomerReport/list.vue'),
+                name: 'purchaseReceiptReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/purchaseReceiptReport/list.vue'),
                 meta: {
-                  title: '连锁大客户报表列表',
+                  title: '采购入库报表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_chainCustomerReportList'
+                  permission: 'M_purchaseReceiptReportList'
                 }
               }
             ]
           },
           {
-            path: '/reportData/stockIncomeReport',
-            redirect: '/reportData/stockIncomeReport/list',
-            name: 'stockIncomeReport',
+            path: '/reportData/receivedSendStorageReport',
+            redirect: '/reportData/receivedSendStorageReport/list',
+            name: 'receivedSendStorageReport',
             component: BlankLayout,
             meta: {
-              title: '库存总入报表',
+              title: '收发存报表',
               icon: 'profile',
-              permission: 'M_stockIncomeReportList'
+              permission: 'M_receivedSendStorageReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'stockIncomeReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/stockIncomeReport/list.vue'),
+                name: 'receivedSendStorageReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/receivedSendStorageReport/list.vue'),
                 meta: {
-                  title: '库存总入报表列表',
+                  title: '收发存报表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_stockIncomeReportList'
+                  permission: 'M_receivedSendStorageReportList'
                 }
               }
             ]
           },
           {
-            path: '/reportData/stockExpenditureReport',
-            redirect: '/reportData/stockExpenditureReport/list',
-            name: 'stockExpenditureReport',
+            path: '/reportData/storeReceivedSendStorageReport',
+            redirect: '/reportData/storeReceivedSendStorageReport/list',
+            name: 'storeReceivedSendStorageReport',
             component: BlankLayout,
             meta: {
-              title: '库存总出报表',
+              title: '门店收发存汇总报表',
               icon: 'profile',
-              permission: 'M_stockExpenditureReportList'
+              permission: 'M_storeReceivedSendStorageReport_list'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'stockExpenditureReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/stockExpenditureReport/list.vue'),
+                name: 'storeReceivedSendStorageReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/storeReceivedSendStorageReport/list.vue'),
                 meta: {
-                  title: '库存总出报表列表',
+                  title: '门店收发存汇总列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_stockExpenditureReportList'
+                  permission: 'M_storeReceivedSendStorageReport_list'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/inventoryReport',
+            redirect: '/reportData/inventoryReport/list',
+            name: 'inventoryReport',
+            component: BlankLayout,
+            meta: {
+              title: '盘点报表',
+              icon: 'profile',
+              permission: 'M_inventoryReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'inventoryReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/inventoryReport/list.vue'),
+                meta: {
+                  title: '盘点报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_inventoryReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/chainSalesReport',
+            redirect: '/reportData/chainSalesReport/list',
+            name: 'chainSalesReport',
+            component: BlankLayout,
+            meta: {
+              title: '连锁销售报表',
+              icon: 'profile',
+              permission: 'M_chainSalesReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'chainSalesReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainSalesReport/list.vue'),
+                meta: {
+                  title: '连锁销售报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_chainSalesReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/chainSalesDetailReport',
+            redirect: '/reportData/chainSalesDetailReport/list',
+            name: 'chainSalesDetailReport',
+            component: BlankLayout,
+            meta: {
+              title: '连锁销售明细报表',
+              icon: 'profile',
+              permission: 'M_chainSalesDetailReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'chainSalesDetailReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainSalesDetailReport/list.vue'),
+                meta: {
+                  title: '连锁销售明细报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_chainSalesDetailReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/chainSalesDetailsCountReport',
+            redirect: '/reportData/chainSalesDetailsCountReport/list',
+            name: 'chainSalesDetailsCountReport',
+            component: BlankLayout,
+            meta: {
+              title: '连锁销售明细合计报表',
+              icon: 'profile',
+              permission: 'M_chainSalesDetailsCountReport_list'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'chainSalesDetailsCountReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainSalesDetailsCountReport/list.vue'),
+                meta: {
+                  title: '连锁销售明细合计列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_chainSalesDetailsCountReport_list'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/chainCustomerReport',
+            redirect: '/reportData/chainCustomerReport/list',
+            name: 'chainCustomerReport',
+            component: BlankLayout,
+            meta: {
+              title: '连锁大客户报表',
+              icon: 'profile',
+              permission: 'M_chainCustomerReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'chainCustomerReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainCustomerReport/list.vue'),
+                meta: {
+                  title: '连锁大客户报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_chainCustomerReportList'
                 }
               }
             ]
@@ -1904,26 +2004,26 @@ export const asyncRouterMap = [
             ]
           },
           {
-            path: '/reportData/purchaseReceiptReport',
-            redirect: '/reportData/purchaseReceiptReport/list',
-            name: 'purchaseReceiptReport',
+            path: '/reportData/chainStockReport',
+            redirect: '/reportData/chainStockReport/list',
+            name: 'chainStockReport',
             component: BlankLayout,
             meta: {
-              title: '采购入库报表',
+              title: '连锁库存总表',
               icon: 'profile',
-              permission: 'M_purchaseReceiptReportList'
+              permission: 'M_chainStockReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'purchaseReceiptReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/purchaseReceiptReport/list.vue'),
+                name: 'chainStockReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainStockReport/list.vue'),
                 meta: {
-                  title: '采购入库报表列表',
+                  title: '连锁库存总表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_purchaseReceiptReportList'
+                  permission: 'M_chainStockReportList'
                 }
               }
             ]
@@ -1954,51 +2054,26 @@ export const asyncRouterMap = [
             ]
           },
           {
-            path: '/reportData/receivedSendStorageReport',
-            redirect: '/reportData/receivedSendStorageReport/list',
-            name: 'receivedSendStorageReport',
-            component: BlankLayout,
-            meta: {
-              title: '收发存报表',
-              icon: 'profile',
-              permission: 'M_receivedSendStorageReportList'
-            },
-            hideChildrenInMenu: true,
-            children: [
-              {
-                path: 'list',
-                name: 'receivedSendStorageReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/receivedSendStorageReport/list.vue'),
-                meta: {
-                  title: '收发存报表列表',
-                  icon: 'profile',
-                  hidden: true,
-                  permission: 'M_receivedSendStorageReportList'
-                }
-              }
-            ]
-          },
-          {
-            path: '/reportData/inventoryReport',
-            redirect: '/reportData/inventoryReport/list',
-            name: 'inventoryReport',
+            path: '/reportData/chainReceivedSendStorageReport',
+            redirect: '/reportData/chainReceivedSendStorageReport/list',
+            name: 'chainReceivedSendStorageReport',
             component: BlankLayout,
             meta: {
-              title: '盘点报表',
+              title: '连锁收发存报表',
               icon: 'profile',
-              permission: 'M_inventoryReportList'
+              permission: 'M_chainReceivedSendStorageReportList'
             },
             hideChildrenInMenu: true,
             children: [
               {
                 path: 'list',
-                name: 'inventoryReportList',
-                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/inventoryReport/list.vue'),
+                name: 'chainReceivedSendStorageReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/chainReceivedSendStorageReport/list.vue'),
                 meta: {
-                  title: '盘点报表列表',
+                  title: '连锁收发存报表列表',
                   icon: 'profile',
                   hidden: true,
-                  permission: 'M_inventoryReportList'
+                  permission: 'M_chainReceivedSendStorageReportList'
                 }
               }
             ]

+ 5 - 7
src/layouts/PageView.vue

@@ -12,7 +12,7 @@
 
 <script>
 import { mapState } from 'vuex'
-
+import { on, off } from '@/libs/tools'
 export default {
   name: 'PageView',
   components: {
@@ -55,12 +55,10 @@ export default {
   mounted () {
     this.tabs = this.directTabs
     this.setpageH()
-    const _this = this
-    window.onresize = () => {
-      return (() => {
-        _this.setpageH()
-      })()
-    }
+    on(window, 'resize', this.setpageH)
+  },
+  beforeDestroy () {
+    off(window, 'resize', this.setpageH)
   },
   activated () {
     this.setpageH()

+ 1 - 1
src/layouts/UserLayout.vue

@@ -106,7 +106,7 @@ export default {
 
 				.title {
 					font-size: 33px;
-					color: rgba(0, 0, 0, 0.85);
+					color: rgba(0, 0, 0);
 					font-family: Avenir, 'Helvetica Neue', Arial, Helvetica, sans-serif;
 					font-weight: 600;
 					position: relative;

+ 2 - 2
src/libs/JGPrint.js

@@ -10,7 +10,7 @@ export const JGPrint = function (data, type, printerType) {
   // 针式打印
   if (printerType == 'NEEDLE') {
     const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
-    console.log(LODOP,'LODOP')
+    console.log(LODOP, 'LODOP')
     if (!LODOP) {
       confirm({
         title: '提示?',
@@ -25,7 +25,7 @@ export const JGPrint = function (data, type, printerType) {
       return
     }
     LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
-    LODOP.SET_PRINT_MODE("POS_BASEON_PAPER",true) // 可使输出以纸张边缘为基点
+    LODOP.SET_PRINT_MODE('POS_BASEON_PAPER', true) // 可使输出以纸张边缘为基点
     LODOP.ADD_PRINT_HTM('0', '0', 'RightMargin:0cm', 'BottomMargin:0cm', data)
     LODOP.SET_PRINT_PAGESIZE(3, 2090, 45, '') // 这里3表示纵向打印且纸高“按内容的高度”;2140表示纸宽214.0mm;60表示页底空白6.0mm
     // LODOP.SET_PRINT_PAGESIZE(1, 2090, 1000, '')

+ 8 - 0
src/libs/tools.js

@@ -225,6 +225,14 @@ export const formatDecimal = function (num, decimal) {
   }
   return parseFloat(num).toFixed(decimal)
 }
+// 处理数字千位分隔符
+export const toThousands = (num) => {
+  return num.toString().replace(/\d+/, function (n) { // 先提取整数部分
+    return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) {
+      return $1 + ','
+    })
+  })
+}
 // 只能输入数字
 export const justNumber = function (val) {
   let _value = val + ''

+ 9 - 9
src/libs/versionUpdate.js

@@ -1,28 +1,28 @@
 import axios from 'axios'
 import modal from 'ant-design-vue/es/modal'
 const isNewVersion = () => {
-  let url = `//${window.location.host}/version.json?t=${new Date().getTime()}`;
+  const url = `//${window.location.host}/version.json?t=${new Date().getTime()}`
   axios.get(url).then(res => {
     if (res.status === 200) {
-      let vueVersion = res.data.version;
-      let localVueVersion = localStorage.getItem('vueVersion');
+      const vueVersion = res.data.version
+      const message = res.data.message
+      const localVueVersion = localStorage.getItem('vueVersion-iscm')
       if (localVueVersion && localVueVersion != vueVersion) {
-        localStorage.setItem('vueVersion', vueVersion);
+        localStorage.setItem('vueVersion-iscm', vueVersion)
         modal.info({
           title: '提示',
-          content: '发现有新版本发布,将会强制刷新页面!',
+          content: message,
           onOk () {
             window.location.reload()
           }
         })
-        return;
       } else {
-        localStorage.setItem('vueVersion', vueVersion);
+        localStorage.setItem('vueVersion-iscm', vueVersion)
       }
     }
-  });
+  })
 }
- 
+
 export default {
   isNewVersion
 }

+ 1 - 1
src/permission.js

@@ -15,7 +15,7 @@ const defaultRoutePath = '/home'
 
 router.beforeEach((to, from, next) => {
   //判断当前代码版本是否与服务器中代码版本一致,如不一致则刷新页面获取最新
-  // versionTood.isNewVersion()
+  versionTood.isNewVersion()
 	store.commit('TOGGLE_NOW_ROUTER',to.fullPath)
   NProgress.start() // start progress bar
   to.meta && (typeof to.meta.title !== 'undefined' && setDocumentTitle(`${to.meta.title} - ${domTitle}`))

+ 2 - 2
src/store/modules/user.js

@@ -63,7 +63,7 @@ const user = {
               commit('SET_AUTHORGS', res.auth_orgs || [])
               commit('SET_NAME', { name: users.userNameCN, welcome: welcome() })
               commit('SET_MUSTCHANGEPWD', users.mustChangePwd)
-              Vue.ls.set('rolesAccess', { permissionList: users.permCodes }, 7 * 24 * 60 * 60 * 1000)
+              Vue.ls.set('rolesAccess-qpls-md', { permissionList: users.permCodes }, 7 * 24 * 60 * 60 * 1000)
               commit('SET_AVATAR', res.avatar ? res.avatar : '')
               // 记住密码
               if (userInfo.rememberMe) {
@@ -87,7 +87,7 @@ const user = {
     },
     // 获取用户信息
     GetInfo ({ commit, state }) {
-      const roles = Vue.ls.get('rolesAccess')
+      const roles = Vue.ls.get('rolesAccess-qpls-md')
       commit('SET_ROLES', roles)
       // commit('SET_TOKEN', sessionStorage.getItem(ACCESS_TOKEN) || state.token)
       commit('SET_NAME', { name: Vue.ls.get('userName'), welcome: '' })

+ 567 - 121
src/views/Home.vue

@@ -1,29 +1,30 @@
 <template>
   <div class="home">
-    <a-alert :message="message" type="info" />
-    <!-- <a-card size="small" :bordered="false" class="page-cont" :bodyStyle="{padding: '17px 30px 20px'}">
+    <!-- <a-alert :message="message" type="info" /> -->
+    <a-card size="small" :bordered="false" class="page-cont" :bodyStyle="{padding: '17px 30px 20px'}">
       <h3 class="page-tit">客户信息</h3>
       <ul class="page-list">
-        <li>商户名称:广州生产经销商</li>
-        <li>商户别名:广州生产经销商</li>
-        <li>登录账号:admin</li>
-        <li>所属角色:升级经销商</li>
+        <li>商户名称:{{ $store.getters.userInfo.orgName || '--' }}</li>
+        <li>商户别名:{{ dealerData&&dealerData.dealerAlias || '--' }}</li>
+        <li>登录账号:{{ $store.getters.userInfo.username || '--' }}</li>
+        <li>所属角色:{{ dealerData&&dealerData.dealerLevelDictValue || '--' }}</li>
       </ul>
     </a-card>
-    <a-card size="small" :bordered="false" class="page-cont" :bodyStyle="{padding: '0px'}">
+    <!-- 数据看板 -->
+    <a-card v-if="$hasPermissions('M_homePage_data')" size="small" :bordered="false" class="page-cont" :bodyStyle="{padding: '0px'}">
       <a-row>
         <a-col :span="6">
           <div class="page-data-module">
             <div class="page-data-con">
-              <p class="page-data-tit">今日总单量(个)/总销售额(元)</p>
-              <h3 class="page-data-num main-color">100/26,56.00</h3>
+              <p class="page-data-tit">今日总单量(个)/总销售额(元)</p>
+              <h3 class="page-data-num main-color">{{ bizData&&bizData.sales&&(bizData.sales.dayTotalQty || bizData.sales.dayTotalQty==0) ? bizData.sales.dayTotalQty : 0 }}/{{ bizData&&bizData.sales&&(bizData.sales.dayTotalAmount || bizData.sales.dayTotalAmount==0) ? bizData.sales.dayTotalAmount : 0 }}</h3>
               <p class="page-data-item">
                 <span class="page-data-itemText">本周</span>
-                <span class="page-data-itemText">10/1128.00</span>
+                <span class="page-data-itemText">{{ bizData&&bizData.sales&&(bizData.sales.weekSalesQty || bizData.sales.weekSalesQty==0) ? bizData.sales.weekSalesQty : 0 }}/{{ bizData&&bizData.sales&&(bizData.sales.weekSalesAmount || bizData.sales.weekSalesAmount==0) ? bizData.sales.weekSalesAmount : 0 }}</span>
               </p>
               <p class="page-data-item">
                 <span class="page-data-itemText">本月</span>
-                <span class="page-data-itemText">20/11248.00</span>
+                <span class="page-data-itemText">{{ bizData&&bizData.sales&&(bizData.sales.monthSalesQty || bizData.sales.monthSalesQty==0) ? bizData.sales.monthSalesQty : 0 }}/{{ bizData&&bizData.sales&&(bizData.sales.monthSalesAmount || bizData.sales.monthSalesAmount==0) ? bizData.sales.monthSalesAmount : 0 }}</span>
               </p>
             </div>
             <span class="page-data-line"></span>
@@ -32,15 +33,15 @@
         <a-col :span="6">
           <div class="page-data-module">
             <div class="page-data-con">
-              <p class="page-data-tit">今日总采购单量(个)/总采购额(元)</p>
-              <h3 class="page-data-num">100/26,56.00</h3>
+              <p class="page-data-tit">今日总采购单量(个)/总采购额(元)</p>
+              <h3 class="page-data-num">{{ bizData&&bizData.purchaseBill&&(bizData.purchaseBill.dayTotalQty || bizData.purchaseBill.dayTotalQty==0) ? bizData.purchaseBill.dayTotalQty : 0 }}/{{ bizData&&bizData.purchaseBill&&(bizData.purchaseBill.dayDiscountedAmount || bizData.purchaseBill.dayDiscountedAmount==0) ? bizData.purchaseBill.dayDiscountedAmount : 0 }}</h3>
               <p class="page-data-item">
                 <span class="page-data-itemText">本周</span>
-                <span class="page-data-itemText">10/1128.00</span>
+                <span class="page-data-itemText">{{ bizData&&bizData.purchaseBill&&(bizData.purchaseBill.weekPurchaseQty || bizData.purchaseBill.weekPurchaseQty==0) ? bizData.purchaseBill.weekPurchaseQty : 0 }}/{{ bizData&&bizData.purchaseBill&&(bizData.purchaseBill.weekDiscountedAmount || bizData.purchaseBill.weekDiscountedAmount==0) ? bizData.purchaseBill.weekDiscountedAmount : 0 }}</span>
               </p>
               <p class="page-data-item">
                 <span class="page-data-itemText">本月</span>
-                <span class="page-data-itemText">20/11248.00</span>
+                <span class="page-data-itemText">{{ bizData&&bizData.purchaseBill&&(bizData.purchaseBill.monthPurchaseQty || bizData.purchaseBill.monthPurchaseQty==0) ? bizData.purchaseBill.monthPurchaseQty : 0 }}/{{ bizData&&bizData.purchaseBill&&(bizData.purchaseBill.monthDiscountedAmount || bizData.purchaseBill.monthDiscountedAmount==0) ? bizData.purchaseBill.monthDiscountedAmount : 0 }}</span>
               </p>
             </div>
             <span class="page-data-line"></span>
@@ -50,14 +51,14 @@
           <div class="page-data-module">
             <div class="page-data-con">
               <p class="page-data-tit">客户总数(个)</p>
-              <h3 class="page-data-num">100/26,56.00</h3>
+              <h3 class="page-data-num">{{ bizData&&bizData.customer&&(bizData.customer.custCount || bizData.customer.custCount==0) ? bizData.customer.custCount : 0 }}</h3>
               <p class="page-data-item">
                 <span class="page-data-itemText">本周新增</span>
-                <span class="page-data-itemText">2000</span>
+                <span class="page-data-itemText">{{ bizData&&bizData.customer&&(bizData.customer.addCurrentWeekCustCount || bizData.customer.addCurrentWeekCustCount==0) ? bizData.customer.addCurrentWeekCustCount : 0 }}</span>
               </p>
               <p class="page-data-item">
-                <span class="page-data-itemText">本月内采购客户</span>
-                <span class="page-data-itemText">1200</span>
+                <span class="page-data-itemText">30天内采购客户</span>
+                <span class="page-data-itemText">{{ bizData&&bizData.customer&&(bizData.customer.salesThirtyDayCustCount || bizData.customer.salesThirtyDayCustCount==0) ? bizData.customer.salesThirtyDayCustCount : 0 }}</span>
               </p>
             </div>
             <span class="page-data-line"></span>
@@ -67,9 +68,9 @@
           <div class="page-data-module">
             <div class="page-data-con">
               <p class="page-data-tit">总库存(个)</p>
-              <h3 class="page-data-num" style="line-height: 36px;">101</h3>
+              <h3 class="page-data-num" style="line-height: 36px;">{{ bizData&&bizData.stock&&(bizData.stock.totalCurrentStockQty || bizData.stock.totalCurrentStockQty==0) ? bizData.stock.totalCurrentStockQty : 0 }}</h3>
               <p class="page-data-tit">库存总金额(元)</p>
-              <h3 class="page-data-num" style="line-height: 36px;margin: 0;">101.25</h3>
+              <h3 class="page-data-num" style="line-height: 36px;margin: 0;">{{ bizData&&bizData.stock&&(bizData.stock.totalCurrentStockCost || bizData.stock.totalCurrentStockCost==0) ? bizData.stock.totalCurrentStockCost : 0 }}</h3>
             </div>
           </div>
         </a-col>
@@ -81,51 +82,70 @@
           <a-card size="small" :bordered="false" class="page-cont" :bodyStyle="{padding: '17px 30px 20px'}">
             <h3 class="page-tit">销售/采购/调拨指引</h3>
             <div class="page-nav-main">
-
-              <div class="page-nav-con">
-                <div class="page-nav-box">
-                  <a-badge count="5" class="page-nav-badge">
-                    <div class="page-nav-item blue-color">
-                      <div class="page-nav-n">
-                        <img src="@/assets/home-icon/home_icon_customer.png" width="16" height="16" />
-                        <span>客户</span>
-                      </div>
-                      <a-icon type="caret-right" style="color: #BBBBBB;" />
-                    </div>
-                  </a-badge>
-                </div>
-                <div class="page-nav-box">
-                  <a-badge count="5" class="page-nav-badge">
-                    <div class="page-nav-item red-color">
-                      <div class="page-nav-n">
-                        <img src="@/assets/home-icon/home_icon_customer.png" width="16" height="16" />
-                        <span>销售开单</span>
-                      </div>
-                      <a-icon type="caret-right" style="color: #BBBBBB;" />
-                    </div>
-                  </a-badge>
-                  <a-badge count="5" class="page-nav-badge">
-                    <div class="page-nav-item blue-color">
+              <!-- 导航指引  start -->
+              <div class="page-nav-con" v-for="(item, index) in navList" :key="index">
+                <div class="page-nav-box" v-for="(subItem, subInd) in item" :key="subInd">
+                  <a-badge
+                    :count="countData&&unitItem.permission&&unitItem.orderNum&&$hasPermissions(unitItem.permission) ? countData[unitItem.orderNum] : 0"
+                    class="page-nav-badge"
+                    v-for="(unitItem, unitInd) in subItem"
+                    :key="unitInd"
+                    @click="unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission) ? goPage(unitItem) : null"
+                    :style="{cursor: unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission)?'pointer': 'initial'}">
+                    <div :class="['page-nav-item', unitItem.styleC]">
                       <div class="page-nav-n">
-                        <img src="@/assets/home-icon/home_icon_customer.png" width="16" height="16" />
-                        <span>客户</span>
+                        <img v-show="unitItem.icon" :src="unitItem.icon" width="16" height="16" />
+                        <span>{{ unitItem.name }}</span>
                       </div>
-                      <a-icon type="caret-right" style="color: #BBBBBB;" />
+                      <a-icon type="caret-right" v-show="unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission)" style="color: #BBBBBB;" />
                     </div>
                   </a-badge>
                 </div>
               </div>
-
+              <!-- 导航指引  end -->
             </div>
           </a-card>
         </a-col>
         <a-col :span="8">
           <a-card size="small" :bordered="false" class="page-cont right-con" :bodyStyle="{padding: '17px 30px 20px'}">
             <h3 class="page-tit">财务指引</h3>
+            <!-- 财务指引  start -->
+            <div class="page-nav-con" v-for="(item, index) in navFinancialList" :key="index">
+              <div class="page-nav-box" v-for="(subItem, subInd) in item" :key="subInd" style="width: 50%;">
+                <div class="page-nav-badge" v-for="(unitItem, unitInd) in subItem" :key="unitInd" @click="unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission) ? goPage(unitItem) : null" :style="{cursor: unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission)?'pointer': 'initial'}">
+                  <div :class="['page-nav-item', unitItem.styleC]">
+                    <div class="page-nav-n">
+                      <img v-show="unitItem.icon" :src="unitItem.icon" width="16" height="16" />
+                      <span>{{ unitItem.name }}</span>
+                    </div>
+                    <a-icon type="caret-right" v-show="unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission)" style="color: #BBBBBB;" />
+                  </div>
+                </div>
+              </div>
+            </div>
+            <!-- 财务指引  end -->
+          </a-card>
+          <a-card size="small" :bordered="false" class="page-cont right-con" :bodyStyle="{padding: '17px 30px 20px'}">
+            <h3 class="page-tit">其他指引</h3>
+            <!-- 其他指引  start -->
+            <div class="page-nav-con" v-for="(item, index) in navOtherList" :key="index">
+              <div class="page-nav-box" v-for="(subItem, subInd) in item" :key="subInd" style="width: 50%;">
+                <div class="page-nav-badge" v-for="(unitItem, unitInd) in subItem" :key="unitInd" @click="unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission) ? goPage(unitItem):null" :style="{cursor: unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission)?'pointer': 'initial'}">
+                  <div :class="['page-nav-item', unitItem.styleC]">
+                    <div class="page-nav-n">
+                      <img v-show="unitItem.icon" :src="unitItem.icon" width="16" height="16" />
+                      <span>{{ unitItem.name }}</span>
+                    </div>
+                    <a-icon type="caret-right" v-show="unitItem.permission&&unitItem.url&&$hasPermissions(unitItem.permission)" style="color: #BBBBBB;" />
+                  </div>
+                </div>
+              </div>
+            </div>
+            <!-- 其他指引  end -->
           </a-card>
         </a-col>
       </a-row>
-    </div> -->
+    </div>
     <!-- 重置密码 -->
     <a-modal
       class="resetPwdModal"
@@ -161,6 +181,7 @@ import { mapGetters } from 'vuex'
 import ResetPwd from '@/views/user/ResetPwd.vue'
 import newProduct from '@/views/productManagement/newProduct/modal.vue'
 import { queryNewProductPage } from '@/api/product'
+import { bizStateCount, bizData, dealerData } from '@/api/data'
 export default {
   name: 'Home',
   components: { ResetPwd, newProduct },
@@ -169,45 +190,409 @@ export default {
       message: '欢迎登录' + process.env.VUE_APP_PRO_NAME,
       openResetPwd: false, //  重置密码是否显示
       openNewProduct: false,
-      onlineFalg: '1' // 上下线标识  1为上线,0为下线
-      // navCList: [
-      //   {
-      //     icon: require('@/assets/home-icon/home_icon_customer.png'),
-      //     name: '客户',
-      //     styleC: 'blue-color',
-      //     url: '/customerManagement/customerInfo/list',
-      //     orderNum: '',
-      //     children: [
-      //       {
-      //         icon: require('@/assets/home-icon/home_icon_billing.png'),
-      //         name: '销售开单',
-      //         styleC: 'red-color',
-      //         url: '/customerManagement/customerInfo/list',
-      //         orderNum: '',
-      //         children: [
-
-      //         ]
-      //       },
-      //       {
-      //         icon: require('@/assets/home-icon/home_icon_return.png'),
-      //         name: '销售退货',
-      //         styleC: 'red-color',
-      //         url: '/customerManagement/customerInfo/list',
-      //         orderNum: '',
-      //         children: [
+      onlineFalg: '1', // 上下线标识  1为上线,0为下线
+      navList: [
+        [ // 客户
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_customer.png'),
+              name: '客户',
+              styleC: 'blue-color',
+              url: '/customerManagement/customerInfo/list',
+              permission: 'M_customerInfoList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_billing.png'),
+              name: '销售开单',
+              styleC: 'red-color',
+              url: '/salesManagement/salesQuery/list',
+              permission: 'M_salesQueryList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_return.png'),
+              name: '销售退货',
+              styleC: 'red-color',
+              url: '/salesManagement/salesReturn/list',
+              permission: 'M_salesReturnList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_verify.png'),
+              name: '销售审核',
+              styleC: 'blue-color',
+              url: '/salesManagement/salesQuery/list',
+              params: { billStatus: 'WAIT_AUDIT' },
+              permission: 'M_salesQueryList',
+              orderNum: 'salesWaitAuditCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_verify.png'),
+              name: '退货审核',
+              styleC: 'blue-color',
+              url: '/salesManagement/salesReturn/list',
+              params: { state: 'WAIT_AUDIT' },
+              permission: 'M_salesReturnList',
+              orderNum: 'salesReturnWaitAuditCount'
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_stock.png'),
+              name: '销售出库',
+              styleC: 'red-color',
+              url: '/outboundOrderManagement/outboundOrder/list',
+              params: JSON.stringify({ state: 'WAIT', outBizType: 'SALES' }),
+              permission: 'M_outboundList',
+              orderNum: 'salesWaitOutWarehouseCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_finance_pay.png'),
+              name: '财务付款',
+              styleC: 'red-color',
+              url: '/financialManagement/financialPayment/list',
+              params: JSON.stringify({ bizType: 'SELL_REFUND', billState: 'UNSETTLE' }),
+              permission: 'M_financialPaymentList',
+              orderNum: 'salesReturnFinancialWaitCount'
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_finance_payment.png'),
+              name: '财务收款',
+              styleC: 'blue-color',
+              url: '/financialManagement/financialCollection/list',
+              params: JSON.stringify({ bizType: 'SELL', billState: 'UNSETTLE' }),
+              permission: 'M_financialCollectionList',
+              orderNum: 'salesFinancialWaitCount'
+            },
+            {}
+          ]
+        ],
+        [ // 供应商(箭冠)
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_supplier.png'),
+              name: '供应商(箭冠)',
+              styleC: 'blue-color',
+              url: '',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_purchase_billing.png'),
+              name: '采购开单',
+              styleC: 'red-color',
+              url: '/purchasingManagement/purchaseOrder/list',
+              permission: 'M_purchasingList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_purchase_return.png'),
+              name: '采购退货',
+              styleC: 'red-color',
+              url: '/purchasingManagement/purchaseReturn/list',
+              permission: 'M_purchaseReturnList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_verify_return.png'),
+              name: '入库审核',
+              styleC: 'blue-color',
+              url: '/financialManagement/warehousingAudit/list',
+              params: { auditState: 'WAIT_PUT_WAREHOUSE_AUDIT' },
+              permission: 'M_warehousingAuditList',
+              orderNum: 'purchaseWaitAuditCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_verify_return.png'),
+              name: '退货审核',
+              styleC: 'blue-color',
+              url: '/purchasingManagement/purchaseReturn/list',
+              params: { state: 'WAIT_AUDIT' },
+              permission: 'M_purchaseReturnList',
+              orderNum: 'purchaseReturnWaitAuditCount'
+            }
+          ],
+          [
+            {},
+            {
+              icon: require('@/assets/home-icon/home_icon_finance_pay.png'),
+              name: '财务收款',
+              styleC: 'red-color',
+              url: '/financialManagement/financialCollection/list',
+              params: JSON.stringify({ bizType: 'PURCHASE_RETURN', billState: 'UNSETTLE' }),
+              permission: 'M_financialCollectionList',
+              orderNum: 'purchaseReturnFinancialWaitCount'
+            }
+          ]
+        ],
+        [ // 供应商(其他)
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_supplier.png'),
+              name: '供应商(其他)',
+              styleC: 'blue-color',
+              url: '/supplierManagement/supplierInfo/list',
+              permission: 'M_supplierInfoList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_scatter_warehousing.png'),
+              name: '散件入库',
+              styleC: 'red-color',
+              url: '/bulkManagement/bulkWarehousingOrder/list',
+              permission: 'M_bulkWarehousingOrderList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_scatter_return.png'),
+              name: '散件退货',
+              styleC: 'red-color',
+              url: '/bulkManagement/bulkReturnGoods/list',
+              permission: 'M_bulkReturnGoodsList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_verify_return.png'),
+              name: '待入库',
+              styleC: 'blue-color',
+              url: '/bulkManagement/bulkWarehousingOrder/list',
+              params: { state: 'WAIT_PUT_WAREHOUSE' },
+              permission: 'M_bulkWarehousingOrderList',
+              orderNum: 'sparePartsPurchaseWaitAuditCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_verify_return.png'),
+              name: '退货审核',
+              styleC: 'blue-color',
+              url: '/bulkManagement/bulkReturnGoods/list',
+              params: { state: 'WAIT_AUDIT' },
+              permission: 'M_bulkReturnGoodsList',
+              orderNum: 'sparePartsReturnWaitAuditCount'
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_finance_pay.png'),
+              name: '财务付款',
+              styleC: 'red-color',
+              url: '/financialManagement/financialPayment/list',
+              params: JSON.stringify({ bizType: 'PARTS_INPUT', billState: 'UNSETTLE' }),
+              permission: 'M_financialPaymentList',
+              orderNum: 'sparePartsPurchaseFinancialWaitCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_stock.png'),
+              name: '待出库',
+              styleC: 'red-color',
+              url: '/bulkManagement/bulkReturnGoods/list',
+              params: { state: 'WAIT_OUT_WAREHOUSE' },
+              permission: 'M_bulkReturnGoodsList',
+              orderNum: 'sparePartsReturnWaitOutWarehouseCount'
+            }
+          ],
+          [
+            {},
+            {
+              icon: require('@/assets/home-icon/home_icon_finance_payment.png'),
+              name: '财务收款',
+              styleC: 'blue-color',
+              url: '/financialManagement/financialCollection/list',
+              params: JSON.stringify({ bizType: 'SPARE_PARTS_RETURN', billState: 'UNSETTLE' }),
+              permission: 'M_financialCollectionList',
+              orderNum: 'sparePartsReturnFinancialWaitCount'
+            }
+          ]
+        ],
+        [ // 调拨
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_transfer.png'),
+              name: '调拨',
+              styleC: 'blue-color',
+              url: '',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_stor_out.png'),
+              name: '店内调出',
+              styleC: 'red-color',
+              url: '/allocationManagement/storeTransferOut/list',
+              permission: 'M_storeTransferOutList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_billing.png'),
+              name: '仓库调拨',
+              styleC: 'red-color',
+              url: '/allocationManagement/warehouseAllocation/list',
+              permission: 'M_warehouseAllocationList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_billing.png'),
+              name: '连锁调出',
+              styleC: 'red-color',
+              url: '/allocationManagement/chainTransferOut/list',
+              permission: 'M_chainTransferOutList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_verify.png'),
+              name: '调出审核',
+              styleC: 'blue-color',
+              url: '/allocationManagement/storeTransferOut/list',
+              params: { state: 'WAIT_AUDIT' },
+              permission: 'M_storeTransferOutList',
+              orderNum: 'storeCallOutWaitAuditCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_verify.png'),
+              name: '调拨审核',
+              styleC: 'blue-color',
+              url: '/allocationManagement/warehouseAllocation/list',
+              params: { state: 'WAIT_AUDIT' },
+              permission: 'M_warehouseAllocationList',
+              orderNum: 'alloWarehouseWaitAuditCount'
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_verify.png'),
+              name: '调出审核',
+              styleC: 'blue-color',
+              url: '/allocationManagement/chainTransferOut/list',
+              params: { state: 'WAIT_AUDIT' },
+              permission: 'M_chainTransferOutList',
+              orderNum: 'alloLinkageOutWaitAuditCount'
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_stock.png'),
+              name: '出库审核',
+              styleC: 'red-color',
+              url: '/outboundOrderManagement/outboundOrder/list',
+              params: JSON.stringify({ state: 'WAIT', outBizType: 'SHOP_CALL_OUT' }),
+              permission: 'M_outboundList',
+              orderNum: 'storeCallOutWaitOutWarehouseCount'
+            },
+            {},
+            {
+              icon: require('@/assets/home-icon/home_icon_stock.png'),
+              name: '出库审核',
+              styleC: 'red-color',
+              url: '/outboundOrderManagement/outboundOrder/list',
+              params: JSON.stringify({ state: 'WAIT', outBizType: 'LINKAGE_CALL_OUT' }),
+              permission: 'M_outboundList',
+              orderNum: 'alloLinkageOutWaitOutWarehouseCount'
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_finance_payment.png'),
+              name: '财务收款',
+              styleC: 'blue-color',
+              url: '/financialManagement/financialCollection/list',
+              params: JSON.stringify({ bizType: 'STORE_CALL_OUT', billState: 'UNSETTLE' }),
+              permission: 'M_financialCollectionList',
+              orderNum: 'storeCallOutFinancialWaitCount'
+            },
+            {},
+            {}
+          ]
+        ]
 
-      //         ]
-      //       }
-      //     ]
-      //   }
-      // ]
+      ],
+      countData: null,
+      bizData: null,
+      dealerData: null,
+      navFinancialList: [ // 财务指引
+        [
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_receivable.png'),
+              name: '应收应付',
+              styleC: 'blue-color',
+              url: '/financialManagement/companyReceivablePayable/list',
+              permission: 'M_companyReceivablePayableList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_finance.png'),
+              name: '财务收款',
+              styleC: 'blue-color',
+              url: '/financialManagement/financialCollection/list',
+              params: JSON.stringify({ bizType: 'ALL' }),
+              permission: 'M_financialCollectionList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_unit.png'),
+              name: '收付款记录',
+              styleC: 'blue-color',
+              url: '/financialManagement/companyCollectionPayment/list',
+              permission: 'M_companyCollectionPaymentList',
+              orderNum: ''
+            },
+            {
+              icon: require('@/assets/home-icon/home_icon_pay.png'),
+              name: '财务付款',
+              styleC: 'blue-color',
+              url: '/financialManagement/financialPayment/list',
+              params: JSON.stringify({ bizType: 'ALL' }),
+              permission: 'M_financialPaymentList',
+              orderNum: ''
+            }
+          ]
+        ]
+      ],
+      navOtherList: [ // 其他指引
+        [
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_stock s.png'),
+              name: '实时库存',
+              styleC: 'blue-color',
+              url: '/inventoryManagement/inventoryQuery/list',
+              permission: 'M_inventoryInventoryQueryList',
+              orderNum: ''
+            }
+          ],
+          [
+            {
+              icon: require('@/assets/home-icon/home_icon_inventory.png'),
+              name: '库存盘点',
+              styleC: 'blue-color',
+              url: '/inventoryManagement/inventoryChecking/list',
+              permission: 'M_inventoryCheckingList',
+              orderNum: ''
+            }
+          ]
+        ]
+      ]
     }
   },
   computed: {
     ...mapGetters(['mustChangePwd'])
   },
-  created () {
-  },
   methods: {
     hasNewProduct () {
       queryNewProductPage({ pageNo: 1, pageSize: 20, onlineFalg: this.onlineFalg }).then(res => {
@@ -227,7 +612,7 @@ export default {
     seeMore () {
       this.openNewProduct = false
       if (this.onlineFalg == '1') { // 上线
-        this.$router.push({ path: '/productManagement/productOnlineInfo/list', query: { closeLastOldTab: true } })
+        this.$router.push({ path: '/productManagement/productOnlineInfo/list' })
       } else { // 下线
         this.$router.push({ name: 'newProductList', params: { onlineFalg: this.onlineFalg } })
       }
@@ -240,10 +625,66 @@ export default {
         this.onlineFalg = '0'
         setTimeout(() => { _this.hasNewProduct() }, 100)
       }
+    },
+    // 导航指引合计
+    getNavCount () {
+      bizStateCount({}).then(res => {
+        if (res.status == 200) {
+          this.countData = res.data
+        } else {
+          this.countData = null
+        }
+      })
+    },
+    // 导航跳转
+    goPage (data) {
+      if (data) {
+        // 有待办数据,则跳转带有条件的;若无待办数据,则跳转全部数据
+        if (data.orderNum && this.countData[data.orderNum]) {
+          this.$router.push({ path: data.url, query: { pageParams: data.params ? data.params : null } })
+        } else {
+          if (data.url == '/outboundOrderManagement/outboundOrder/list') { // 出库
+            const params = data.params ? JSON.parse(data.params) : null
+            this.$router.push({ path: data.url, query: { pageParams: JSON.stringify({ outBizType: params && params.outBizType ? params.outBizType : null }) } })
+          } else if (data.url == '/financialManagement/financialPayment/list') { // 财务付款
+            const params = data.params ? JSON.parse(data.params) : null
+            this.$router.push({ path: data.url, query: { pageParams: JSON.stringify({ bizType: params && params.bizType ? params.bizType : null }) } })
+          } else if (data.url == '/financialManagement/financialCollection/list') { // 财务收款
+            const params = data.params ? JSON.parse(data.params) : null
+            this.$router.push({ path: data.url, query: { pageParams: JSON.stringify({ bizType: params && params.bizType ? params.bizType : null }) } })
+          } else {
+            this.$router.push({ path: data.url, query: { pageParams: null } })
+          }
+        }
+      }
+    },
+    // 数据看板信息
+    getBizData () {
+      bizData({}).then(res => {
+        if (res.status == 200) {
+          this.bizData = res.data
+        } else {
+          this.bizData = null
+        }
+      })
+    },
+    // 商户信息
+    getMerchantData () {
+      dealerData({}).then(res => {
+        if (res.status == 200) {
+          this.dealerData = res.data
+        } else {
+          this.dealerData = null
+        }
+      })
     }
   },
   beforeRouteEnter (to, from, next) {
     next(vm => {
+      // 请求导航指引合计
+      vm.getNavCount()
+      vm.getBizData()
+      vm.getMerchantData()
       //  判断登录用户是否重置过密码(首次登陆需强制重置密码)
       if (vm.mustChangePwd == 0) {
         vm.openResetPwd = false
@@ -280,7 +721,8 @@ export default {
           display: inline-block;
           width: 25%;
           font-size: 14px;
-          color: rgba(0, 0, 0, 0.65);
+          color: rgba(0, 0, 0);
+          vertical-align: top;
         }
       }
       // 数据看板
@@ -293,7 +735,7 @@ export default {
           flex-grow: 1;
           .page-data-tit{
             font-size: 14px;
-            color: rgba(0, 0, 0, 0.65);
+            color: rgba(0, 0, 0);
             margin: 0;
           }
           .page-data-num{
@@ -312,7 +754,7 @@ export default {
             margin-bottom: 3px;
             .page-data-itemText{
               font-size: 14px;
-              color: rgba(0, 0, 0, 0.65);
+              color: rgba(0, 0, 0);
             }
           }
         }
@@ -324,41 +766,45 @@ export default {
         }
       }
       // 操作导航引导
-      .page-nav-main{
-        .page-nav-con{
-          display: flex;
-          align-items: center;
-          .page-nav-box{
-            display: inline-block;
-            width: 20%;
-            .page-nav-badge{
-              width: 80%;
-              &:first-child{
-                margin-bottom: 10px;
-              }
-              .page-nav-item{
-                border-radius: 8px;
-                display: flex;
-                justify-content: space-between;
-                align-items: center;
-                padding: 13px 10px;
-                .page-nav-n{
-                  img{
-                    vertical-align: sub;
-                  }
-                  span{
-                    color: rgba(0, 0, 0, 0.65);
-                    font-size: 14px;
-                    padding-left: 5px;
-                  }
+      .page-nav-con{
+        display: flex;
+        align-items: center;
+        margin-bottom: 20px;
+        padding-bottom: 20px;
+        border-bottom: 1px solid #e8e8e8;
+        &:last-child{
+          margin-bottom: 0px;
+          padding-bottom: 0px;
+          border-bottom: none;
+        }
+        .page-nav-box{
+          display: inline-block;
+          width: 20%;
+          .page-nav-badge{
+            width: 94%;
+            margin: 5px 0;
+            .page-nav-item{
+              border-radius: 8px;
+              display: flex;
+              justify-content: space-between;
+              align-items: center;
+              padding: 13px 10px;
+              .page-nav-n{
+                img{
+                  vertical-align: sub;
+                }
+                span{
+                  color: rgba(0, 0, 0);
+                  font-size: 14px;
+                  padding-left: 5px;
                 }
               }
-              .blue-color{
-                background-color: #EDF0F9;
-              }
-              .red-color{
-                background-color: #F8F1EF;
-              }
+            }
+            .blue-color{
+              background-color: #EDF0F9;
+            }
+            .red-color{
+              background-color: #F8F1EF;
             }
           }
         }

+ 91 - 0
src/views/numsGoodsShelves/accountManagement/applyWithdrawal.vue

@@ -0,0 +1,91 @@
+<template>
+  <a-modal
+    v-model="opened"
+    :title="title"
+    centered
+    :maskClosable="false"
+    :confirmLoading="confirmLoading"
+    :width="560"
+    :footer="null"
+    @cancel="cancel"
+  >
+    <a-spin :spinning="spinning" tip="Loading...">
+      <a-form-model
+        id="applyWithdrawal-form"
+        ref="ruleForm"
+        :model="form"
+        :rules="rules"
+        :label-col="formItemLayout.labelCol"
+        :wrapper-col="formItemLayout.wrapperCol"
+      >
+        <a-form-model-item label="申请提现金额" prop="consigneeName">
+          <a-input
+            id="applyWithdrawal"
+            placeholder="请输入正数(最多两位小数)"
+            allowClear />
+        </a-form-model-item>
+        <a-form-model-item label="提现手续费">
+          <span>{{}}</span>
+        </a-form-model-item>
+        <a-form-model-item label="实际到账">
+          <span>{{}}(申请提现金额-提现手续费)</span>
+        </a-form-model-item>
+        <a-form-model-item label="提现账户">
+          <span>{{}}</span>
+        </a-form-model-item>
+        <a-form-model-item :wrapper-col="{ span: 12, offset: 6 }" style="text-align: center;">
+          <a-button type="primary" :loading="confirmLoading" @click="handleSubmit" id="applyWithdrawal-btn-submit">保存</a-button>
+          <a-button @click="cancel" style="margin-left: 15px" id="applyWithdrawal-btn-back">取消</a-button>
+        </a-form-model-item>
+      </a-form-model>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+export default {
+  props: {
+    isOpenModal: {
+      type: Boolean,
+      default: false
+    },
+    currentData: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      formItemLayout: {
+        labelCol: { span: 6 },
+        wrapperCol: { span: 15 }
+      },
+      opened: this.isOpenModal,
+      title: '申请提现',
+      confirmLoading: false,
+      spinning: false,
+      rules: []
+    }
+  },
+  methods: {
+    // 保存
+    handleSubmit () {
+      this.$emit('close')
+    },
+    // 取消
+    cancel () {
+      this.$emit('close')
+    }
+  },
+  watch: {
+    isOpenModal (nVal, oVal) {
+      this.opened = nVal
+    }
+  }
+}
+</script>
+
+<style>
+</style>

+ 167 - 1
src/views/numsGoodsShelves/accountManagement/list.vue

@@ -1,8 +1,174 @@
 <template>
+  <a-card size="small" :bordered="false" class="accountManagementList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :xl="6" :lg="6" :md="12" :sm="24">
+              <a-form-item label="交易时间">
+                <a-range-picker v-model="time" :format="dateFormat" allowClear :disabledDate="disabledDate" format="YYYY-MM-DD"/>
+              </a-form-item>
+            </a-col>
+            <a-col :xl="6" :lg="6" :md="6" :sm="6" style="padding-top: 4px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="outboundOrderList-refresh" >查询</a-button>
+              <a-button style="margin-left: 8px" @click="resetSearchForm" :disabled="disabled" id="outboundOrderList-reset">重置</a-button>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <a-alert type="info" style="margin:10px 0">
+        <div slot="message" style="display: flex;align-items: center;padding: 2px 0;">
+          <div>
+            账户余额:<strong>{{ totalData&&(totalData.totalAmount || totalData.totalAmount==0) ? totalData.totalAmount : '--' }}</strong>元;
+            可提现金额:<strong>{{ totalData&&(totalData.totalRecord || totalData.totalRecord==0) ? totalData.totalRecord : '--' }}</strong>;
+          </div>
+          <div>
+            <a-button size="small" type="primary" class="button-primary" @click="handleTX">申请提现</a-button>
+          </div>
+        </div>
+      </a-alert>
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+77+'px' }"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y:tableHeight }"
+        :defaultLoadData="true"
+        bordered>
+      </s-table>
+    </a-spin>
+    <!-- 申请提现 -->
+    <applyWithdrawal :isOpenModal="showModal" :currentData="currentData" @close="showModal=false" @refresh="$refs.table.refresh(true)"></applyWithdrawal>
+  </a-card>
 </template>
 
 <script>
+import moment from 'moment'
+import { STable } from '@/components'
+import applyWithdrawal from './applyWithdrawal.vue'
+export default {
+  components: { STable, applyWithdrawal },
+  data () {
+    return {
+      spinning: false,
+      disabled: false,
+      tableHeight: 0,
+      showModal: false,
+      currentData: null,
+      time: [],
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '交易时间', dataIndex: 'createDate', width: '15%', align: 'center' },
+        { title: '调回单号', dataIndex: 'name', width: '30%', align: 'center' },
+        { title: '货架名称', dataIndex: 'remarks', width: '10%', align: 'center' },
+        { title: '状态', dataIndex: 'remarks', width: '10%', align: 'center' },
+        { title: '调回总量', dataIndex: 'remarks', width: '10%', align: 'center' },
+        { title: '操作', width: '10%', align: 'center', scopedSlots: { customRender: 'action' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        const _this = this
+        _this.disabled = true
+        _this.spinning = true
+        return new Promise(function (resolve, reject) {
+          const data = {
+            list: [{ id: 1, createDate: '2020-08-09' }]
+          }
+          for (var i = 0; i < data.list.length; i++) {
+            data.list[i].no = i + 1
+          }
+          _this.spinning = false
+          _this.disabled = false
+          resolve(data)
+        })
+
+        // const paramsPage = Object.assign(this.queryParam) //  有分页
+        // return reportSalesReturnThjdReportList(paramsPage).then(res => {
+        //   let data
+        //   if (res.status == 200) {
+        //     data = res.data
+        //     // this.getCount(paramsPage)
+        //     const no = (data.pageNo - 1) * data.pageSize
+        //     for (var i = 0; i < data.list.length; i++) {
+        //       data.list[i].no = no + i + 1
+        //     }
+        //     this.disabled = false
+        //   }
+        //   this.spinning = false
+        //   return data
+        // })
+      }
+    }
+  },
+  methods: {
+    // 时间改变
+    dateChange (date) {
+
+    },
+    // 禁止选择今天之后的日期
+    disabledDate (current) {
+      return current && current > moment().endOf('day')
+    },
+    // 重置
+    resetSearchForm () {
+      this.time = []
+    },
+    // 申请提现
+    handleTX () {
+      this.showModal = true
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 265
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      setTimeout(() => {
+        _this.setTableH()
+      }, 400)
+    },
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+    // 仅刷新列表,不重置页面
+    if (this.$store.state.app.updateList) {
+      this.pageInit()
+      this.$refs.table.refresh()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
 </script>
 
-<style>
+<style lang="less">
+  .accountManagementList-wrap{
+
+  }
 </style>

+ 123 - 0
src/views/numsGoodsShelves/recallManagement/confirmModal.vue

@@ -0,0 +1,123 @@
+<template>
+  <a-modal
+    v-model="opened"
+    :title="title"
+    centered
+    :maskClosable="false"
+    :confirmLoading="confirmLoading"
+    :width="960"
+    :footer="null"
+    @cancel="cancel"
+  >
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div style="margin-bottom: 10px;">调回单号:{{ currentData.createDate||'--' }}</div>
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y:500 }"
+        :showPagination="false"
+        :defaultLoadData="true"
+        bordered>
+        <template slot="action" slot-scope="text, record">
+          <a-input-number id="inputNumber" v-model="value" :min="1" :max="10" @change="onChange" />
+        </template>
+      </s-table>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { STable } from '@/components'
+export default {
+  components: { STable },
+  props: {
+    isOpenModal: {
+      type: Boolean,
+      default: false
+    },
+    currentData: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      formItemLayout: {
+        labelCol: { span: 6 },
+        wrapperCol: { span: 15 }
+      },
+      opened: this.isOpenModal,
+      confirmLoading: false,
+      spinning: false,
+      rules: [],
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '产品编码', dataIndex: 'createDate', width: '15%', align: 'center' },
+        { title: '产品名称', dataIndex: 'name', width: '30%', align: 'center' },
+        { title: '调回数量', width: '10%', align: 'center' },
+        { title: '实际退库数量', width: '10%', align: 'center', scopedSlots: { customRender: 'action' } },
+        { title: '单位', width: '10%', align: 'center' }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        // this.disabled = true
+        // this.spinning = true
+        return new Promise(function (resolve, reject) {
+          const data = {
+            list: [{ id: 1, createDate: '2020-08-09' }]
+          }
+          for (var i = 0; i < data.list.length; i++) {
+            data.list[i].no = i + 1
+          }
+          // this.spinning = false
+          // this.disabled = false
+          resolve(data)
+        })
+        // return employeeList(Object.assign(parameter, this.queryParam)).then(res => {
+        //   let data
+        //   if (res.status == 200) {
+        //     data = res.data
+        //     const no = (data.pageNo - 1) * data.pageSize
+        //     for (var i = 0; i < data.list.length; i++) {
+        //       data.list[i].no = no + i + 1
+        //     }
+        //     this.disabled = false
+        //   }
+        //   this.spinning = false
+        //   return data
+        // })
+      }
+    }
+  },
+  computed: {
+    title () {
+      return '调回单退库' + ' —— ' + (this.currentData && this.currentData.createDate ? this.currentData.createDate : '')
+    }
+  },
+
+  methods: {
+    // 保存
+    handleSubmit () {
+      this.$emit('close')
+    },
+    // 取消
+    cancel () {
+      this.$emit('close')
+    }
+  },
+  watch: {
+    isOpenModal (nVal, oVal) {
+      this.opened = nVal
+    }
+  }
+}
+</script>
+
+<style>
+</style>

+ 250 - 1
src/views/numsGoodsShelves/recallManagement/list.vue

@@ -1,8 +1,257 @@
 <template>
+  <a-card size="small" :bordered="false" class="accountManagementList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="36">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="创建时间">
+                <a-range-picker v-model="time" allowClear :disabledDate="disabledDate" format="YYYY-MM-DD" style="width: 100%;"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="调拨单号">
+                <a-input allowClear placeholder="请输入调拨单号" v-model.tirm="queryParam.danhao"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="货架名称">
+                <a-select placeholder="请搜索货架名称" allowClear style="width: 100%;">
+                  <a-select-option v-for="item in goodsShelveList">
+                    {{ }}
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+            </a-col>
+            <template v-if="advanced">
+              <a-col :md="6" :sm="24">
+                <a-form-item label="产品编码">
+                  <a-input allowClear placeholder="请输入产品编码" v-model.tirm="queryParam.code"/>
+                </a-form-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-item label="产品名称">
+                  <a-input allowClear placeholder="请输入产品名称" v-model.tirm="queryParam.name"/>
+                </a-form-item>
+              </a-col>
+            </template>
+            <a-col :md="6" :sm="24" style="padding-top: 4px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="outboundOrderList-refresh" >查询</a-button>
+              <a-button style="margin-left: 8px" @click="resetSearchForm" :disabled="disabled" id="outboundOrderList-reset">重置</a-button>
+              <a @click="advanced=!advanced" style="margin-left: 5px" v-if="activeKey==0">
+                {{ advanced ? '收起' : '展开' }}
+                <a-icon :type="advanced ? 'up' : 'down'"/>
+              </a>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <a-tabs v-model="activeKey" type="card" size="small" @change="callback">
+        <a-tab-pane :key="0" tab="全部">
+        </a-tab-pane>
+        <a-tab-pane :key="1">
+          <span slot="tab">
+            待退库
+            <a-badge count="5" :offset="[0,-20]"/>
+          </span>
+        </a-tab-pane>
+        <a-tab-pane :key="2" tab="已完成">
+        </a-tab-pane>
+        <a-tab-pane :key="3" tab="已取消">
+        </a-tab-pane>
+      </a-tabs>
+      <!-- <a-tabs v-model="activeKey" type="card" @change="callback" size="small">
+        <a-tab-pane :key="item.code" :tab="item.name" v-for="item in tabsList">
+          <span slot="tab">
+            <a-badge count="5" :offset="[0,-20]"/>
+          </span>
+        </a-tab-pane>
+      </a-tabs> -->
+
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+77+'px' }"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y:tableHeight }"
+        :showPagination="false"
+        :defaultLoadData="false"
+        bordered>
+        <template slot="action" slot-scope="text, record">
+          <a-button
+            size="small"
+            type="link"
+            class="button-primary"
+            @click="handleEdit(record)"
+            id="shelfMonitoringList-warehousing-btn">退库</a-button>
+          <a-button
+            size="small"
+            type="link"
+            class="button-primary"
+            @click="handleCancel(record)"
+            id="shelfMonitoringList-warehousing-btn">取消调回单</a-button>
+        </template>
+      </s-table>
+    </a-spin>
+    <!-- 申请提现 -->
+    <confirmModal :isOpenModal="showModal" :currentData="currentData" @close="showModal=false" @refresh="$refs.table.refresh(true)"></confirmModal>
+  </a-card>
 </template>
 
 <script>
+import moment from 'moment'
+import { STable } from '@/components'
+import confirmModal from './confirmModal.vue'
+export default {
+  components: { STable, confirmModal },
+  data () {
+    return {
+      spinning: false,
+      disabled: false,
+      tableHeight: 0,
+      showModal: false,
+      advanced: false,
+      currentData: null,
+      activeKey: 0, // 默认的tab
+      tabsList: [{ code: 0, name: '全部' }, { code: 1, name: '待退库' }, { code: 2, name: '已完成' }, { code: 3, name: '已取消' }],
+      time: [],
+      goodsShelveList: [], // 货架数据
+      queryParam: {
+        danhao: '',
+        name: '',
+        code: ''
+      },
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '15%', align: 'center' },
+        { title: '调回单号', dataIndex: 'name', width: '30%', align: 'center' },
+        { title: '货架名称', dataIndex: 'remarks', width: '10%', align: 'center', scopedSlots: { customRender: 'remarks' } },
+        { title: '状态', width: '10%', align: 'center' },
+        { title: '调回总量', width: '10%', align: 'center' },
+        { title: '实退总量', width: '10%', align: 'center' },
+        { title: '操作', width: '10%', align: 'center', scopedSlots: { customRender: 'action' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        // this.disabled = true
+        // this.spinning = true
+        return new Promise(function (resolve, reject) {
+          const data = {
+            list: [{ id: 1, createDate: '2020-08-09' }]
+          }
+          for (var i = 0; i < data.list.length; i++) {
+            data.list[i].no = i + 1
+          }
+          // this.spinning = false
+          // this.disabled = false
+          resolve(data)
+        })
+        // return employeeList(Object.assign(parameter, this.queryParam)).then(res => {
+        //   let data
+        //   if (res.status == 200) {
+        //     data = res.data
+        //     const no = (data.pageNo - 1) * data.pageSize
+        //     for (var i = 0; i < data.list.length; i++) {
+        //       data.list[i].no = no + i + 1
+        //     }
+        //     this.disabled = false
+        //   }
+        //   this.spinning = false
+        //   return data
+        // })
+      }
+    }
+  },
+  methods: {
+    // 时间改变
+    dateChange (date) {
+
+    },
+    // 禁止选择今天之后的日期
+    disabledDate (current) {
+      return current && current > moment().endOf('day')
+    },
+    // 切换tab
+    callback (key) {
+      console.log(key)
+      this.activeKey = key
+    },
+    // 重置
+    resetSearchForm () {
+      this.time = []
+    },
+    // 申请提现
+    handleTX () {
+      this.showModal = true
+    },
+    // 退库
+    handleEdit (row) {
+      this.showModal = true
+      this.currentData = row
+    },
+    // 取消掉回单
+    handleCancel (row) {
+      this.$confirm({
+        title: '提示',
+        content: '确定取消调回单吗?',
+        centered: true,
+        onOk: () => {
+          //
+        }
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 265
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      setTimeout(() => {
+        _this.setTableH()
+      }, 400)
+    },
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+    // 仅刷新列表,不重置页面
+    if (this.$store.state.app.updateList) {
+      this.pageInit()
+      this.$refs.table.refresh()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
 </script>
 
-<style>
+<style lang="less">
+  .accountManagementList-wrap{
+
+  }
 </style>

+ 73 - 104
src/views/numsGoodsShelves/shelfMonitoring/list.vue

@@ -16,7 +16,7 @@
           <a-row :gutter="15">
             <a-col :md="6" :sm="24">
               <a-form-model-item label="货架名称" prop="hjName">
-                <a-select
+                <!-- <a-select
                   placeholder="请选择货架名称"
                   allowClear
                   id="shelfMonitoringList-hjName"
@@ -25,7 +25,14 @@
                   option-filter-prop="children"
                   :filter-option="filterOption">
                   <a-select-option v-for="item in hjNameData" :key="item.sn" :value="item.sn">{{ item.name }}</a-select-option>
-                </a-select>
+                </a-select> -->
+                <v-select
+                  v-model="queryParam.hjName"
+                  ref="settleState"
+                  id="shelfMonitoringList-settleState"
+                  code="FINANCIAL_PAY_STATUS"
+                  placeholder="请选择货位产品状态"
+                  allowClear></v-select>
               </a-form-model-item>
             </a-col>
             <a-col :md="6" :sm="24">
@@ -67,37 +74,46 @@
           </a-row>
         </a-form-model>
       </div>
-      <div style="margin-bottom: 10px">
-        <a-button type="primary" id="shelfMonitoringList-export" @click="handleAddBack">新增调回单</a-button>
-        <span style="margin-left: 5px">
-          <template v-if="hasSelected">
-            {{ `已选 ${selectedRowKeys.length} 项` }}
+      <!-- 未选择合作商 -->
+      <div class="unChoose" v-show="!isSearch">
+        <a-icon type="exclamation-circle" theme="filled" :style="{ fontSize: '18px', color: '#ff9900', verticalAlign: 'sub', marginRight: '5px' }" />
+        <span>请选择一个货架后点击查询按钮</span>
+      </div>
+      <div v-show="isSearch">
+        <div style="margin-bottom: 10px">
+          <a-button type="primary" id="shelfMonitoringList-export" @click="handleAddBack">新增调回单</a-button>
+          <span style="margin-left: 5px">
+            <template v-if="rowSelectionInfo&&rowSelectionInfo.selectedRowKeys.length > 0">
+              {{ `已选 ${rowSelectionInfo.selectedRowKeys.length} 项` }}
+            </template>
+          </span>
+        </div>
+        <!-- 列表 -->
+        <s-table
+          class="sTable fixPagination"
+          ref="table"
+          :style="{ height: tableHeight+84.5+'px' }"
+          size="small"
+          :rowKey="(record) => record.storeCallOutSn"
+          :columns="columns"
+          :data="loadData"
+          rowKeyName="storeCallOutSn"
+          :rowSelection="{ columnWidth: 40 }"
+          @rowSelection="rowSelectionFun"
+          :scroll="{ y: tableHeight }"
+          :defaultLoadData="false"
+          bordered>
+          <!-- 操作 -->
+          <template slot="action" slot-scope="text, record">
+            <a-button
+              size="small"
+              type="link"
+              class="button-warning"
+              @click="handleEdit(record)"
+              id="shelfMonitoringList-warehousing-btn">出入库明细</a-button>
           </template>
-        </span>
+        </s-table>
       </div>
-      <!-- 列表 -->
-      <s-table
-        class="sTable fixPagination"
-        ref="table"
-        :style="{ height: tableHeight+84.5+'px' }"
-        size="small"
-        :rowKey="(record) => record.id"
-        :columns="columns"
-        :data="loadData"
-        :rowSelection="{columnWidth: 40}"
-        :scroll="{ y: tableHeight }"
-        :defaultLoadData="false"
-        bordered>
-        <!-- 操作 -->
-        <template slot="action" slot-scope="text, record">
-          <a-button
-            size="small"
-            type="link"
-            class="button-warning"
-            @click="handleEdit(record)"
-            id="shelfMonitoringList-warehousing-btn">出入库明细</a-button>
-        </template>
-      </s-table>
     </a-spin>
   </a-card>
 </template>
@@ -124,22 +140,18 @@ export default {
         settleState: undefined
       },
       rules: {
-        // 'hjName': [{ required: true, message: '请输入货架名称', trigger: 'change' }]
+        'hjName': [{ required: true, message: '请输入货架名称', trigger: 'change' }]
       },
       disabled: false, //  查询、重置按钮是否可操作
       columns: [
-        { title: '序号', dataIndex: 'no', width: '4%', align: 'center' },
-        { title: '创建时间', dataIndex: 'createDate', width: '11%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '连锁调入单号', scopedSlots: { customRender: 'allocationLinkagePutNo' }, width: '16%', align: 'center' },
-        { title: '调出对象', dataIndex: 'outTenantName', width: '12%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '总款数', dataIndex: 'productTotalCategory', width: '5%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '总数量', dataIndex: 'productTotalQty', width: '5%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '总成本', dataIndex: 'productTotalCost', width: '6%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '入库时间', dataIndex: 'putWarehouseTime', width: '11%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '调拨产品类型', dataIndex: 'allocationTypeDictValue', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '业务状态', dataIndex: 'stateDictValue', width: '6%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '财务状态', dataIndex: 'settleStateDictValue', width: '6%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '操作', scopedSlots: { customRender: 'action' }, width: '10%', align: 'center' }
+        { title: '货位号', dataIndex: 'createDate', width: '13%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '绑定产品编码', dataIndex: 'allocationLinkagePutNo', width: '13%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '绑定产品名称', dataIndex: 'outTenantName', width: '18%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '货位产品状态', dataIndex: 'allocationTypeDictValue', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '当前库存', dataIndex: 'productTotalCategory', width: '8%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '最大库容', dataIndex: 'productTotalQty', width: '8%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '滞销天数', dataIndex: 'productTotalCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '15%', align: 'center' }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -160,44 +172,21 @@ export default {
         })
       },
       hjNameData: [],
-      selectedRowKeys: [], // Check here to configure the default column
-      selectedRows: []
-    }
-  },
-  computed: {
-    hasSelected () {
-      return this.selectedRowKeys.length > 0
-    },
-    rowSelection () {
-      if (this.$hasPermissions('B_financialCollectionPl')) {
-        return {
-          selectedRowKeys: this.selectedRowKeys,
-          onChange: (selectedRowKeys, selectedRows) => {
-            this.selectedRowKeys = selectedRowKeys
-          },
-          onSelect: (record, selected, selectedRows, nativeEvent) => {
-            this.onSelectChange(record, selected, selectedRows, nativeEvent)
-          },
-          onSelectAll: (selected, selectedRows, changeRows) => {
-            this.onSelectAllChange(selected, selectedRows, changeRows)
-          },
-          getCheckboxProps: record => ({
-            props: {
-              disabled: record.settleState == 'SETTLED'
-            }
-          })
-        }
-      } else {
-        return null
-      }
+      rowSelectionInfo: null,
+      isSearch: false
     }
   },
   methods: {
+    rowSelectionFun (obj) {
+      console.log('rowSelection', obj)
+      this.rowSelectionInfo = obj || null
+    },
     //  查询
     handleSearch () {
       this.$refs.ruleForm.validate(valid => {
         if (valid) {
           this.$refs.table.refresh(true)
+          this.isSearch = true
         } else {
           console.log('error submit!!')
           return false
@@ -206,6 +195,7 @@ export default {
     },
     //  重置
     resetSearchForm () {
+      this.isSearch = false
       this.queryParam.beginDate = ''
       this.queryParam.endDate = ''
       this.queryParam.outTenantSn = undefined
@@ -221,34 +211,6 @@ export default {
     handleDetail (row) {
       this.$router.push({ path: `/allocationManagement/chainTransferIn/detail/${row.allocationLinkagePutSn}` })
     },
-    onSelectChange (record, selected, selectedRows, nativeEvent) {
-      console.log('onSelectChange-------', record, selected, selectedRows, nativeEvent)
-      // if (selected) { //  选择
-      //   this.selectedRows.push(record)
-      // } else { //  取消
-      //   this.selectedRows = selectedRows
-      // }
-    },
-    // 本页全选/取消全选
-    onSelectAllChange (selected, selectedRows, changeRows) {
-      console.log('onSelectAllChange--------', selected, selectedRows, changeRows)
-      // const _this = this
-      // if (selected) { //  选择
-      //   this.selectedRows = [...this.selectedRows, ...changeRows]
-      // } else { //  取消
-      //   const arrId = []
-      //   this.selectedRows.map((item, index) => {
-      //     this.selectedRows.map((subItem, ind) => {
-      //       if (item.id == subItem.id) {
-      //         arrId.push(index)
-      //       }
-      //     })
-      //   })
-      //   arrId.map((item, index) => {
-      //     _this.selectedRows = _this.selectedRows.slice(item, item + 1)
-      //   })
-      // }
-    },
     filterOption (input, option) {
       return (
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
@@ -262,7 +224,7 @@ export default {
     },
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
-      this.tableHeight = window.innerHeight - tableSearchH - 197
+      this.tableHeight = window.innerHeight - tableSearchH - 245
     }
   },
   watch: {
@@ -295,5 +257,12 @@ export default {
 }
 </script>
 
-<style>
+<style lang="less">
+  .shelfMonitoringList-wrap{
+    .unChoose {
+      text-align: center;
+      margin: 240px 0 300px;
+      font-size: 16px;
+    }
+  }
 </style>

+ 213 - 0
src/views/reportData/chainSalesDetailsCountReport/list.vue

@@ -0,0 +1,213 @@
+<template>
+  <a-card size="small" :bordered="false" class="chainSalesDetailsCountReportList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper">
+        <a-form-model
+          id="chainSalesDetailsCountReportList-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam"
+          :rules="rules"
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          @keyup.enter.native="handleSearch" >
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="审核日期" prop="time">
+                <rangeDate ref="rangeDate" @change="dateChange" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="连锁店" prop="tenantId">
+                <a-select
+                  placeholder="请选择连锁店"
+                  id="chainSalesDetailsCountReportList-tenantId"
+                  allowClear
+                  v-model="queryParam.tenantId"
+                  :showSearch="true"
+                  option-filter-prop="children"
+                  :filter-option="filterOption">
+                  <a-select-option v-for="item in linkageGroupData" :key="item.dealerSn" :value="item.dealerSn">{{ item.dealerName }}</a-select-option>
+                </a-select>
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="handleSearch" :disabled="disabled" id="chainSalesDetailsCountReportList-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="chainSalesDetailsCountReportList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 5px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_chainSalesDetailsCountReport_export')"
+                id="chainSalesDetailsCountReportList-export">导出</a-button>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :defaultLoadData="false"
+        :showPagination="false"
+        bordered>
+      </s-table>
+    </a-spin>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import rangeDate from '@/views/common/rangeDate.vue'
+import { downloadExcel } from '@/libs/JGPrint.js'
+import { reportSalesBillDetailTotalList, reportSalesBillDetailTotalExport, linkageGroupList } from '@/api/reportData'
+export default {
+  components: { STable, VSelect, rangeDate },
+  data () {
+    return {
+      spinning: false,
+      labelCol: { span: 8 },
+      wrapperCol: { span: 16 },
+      tableHeight: 0,
+      queryParam: { //  查询条件
+        tenantId: undefined,
+        time: [],
+        beginDate: '',
+        endDate: ''
+      },
+      rules: {
+        'time': [{ required: true, message: '请选择审核日期', trigger: 'change' }]
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      exportLoading: false,
+      columns: [
+        { title: '门店', dataIndex: 'salesTargetName', width: '16%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '滤清器', dataIndex: 'lqqAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '雨刮片', dataIndex: 'ygpAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '刹车片', dataIndex: 'scpAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '蓄电池', dataIndex: 'xdcAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '润滑油', dataIndex: 'rhyAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '火花塞', dataIndex: 'hhsAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '点火线圈', dataIndex: 'dhxqAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: 'LED灯', dataIndex: 'ledAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '其他', dataIndex: 'otherAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '合计', dataIndex: 'totalAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        const params = Object.assign(parameter, this.queryParam)
+        this.spinning = true
+        delete params.time
+        return reportSalesBillDetailTotalList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      linkageGroupData: [],
+      totalData: null
+    }
+  },
+  methods: {
+    //  创建时间  change
+    dateChange (date) {
+      this.queryParam.time = date
+      this.queryParam.beginDate = date[0] || ''
+      this.queryParam.endDate = date[1] || ''
+    },
+    //  查询
+    handleSearch () {
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          this.$refs.table.refresh(true)
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.tenantId = undefined
+      this.$refs.rangeDate.resetDate()
+      this.queryParam.time = []
+      this.queryParam.beginDate = ''
+      this.queryParam.endDate = ''
+      this.totalData = null
+      this.$refs.ruleForm.resetFields()
+      this.$refs.table.clearTable()
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = _this.queryParam
+          _this.exportLoading = true
+          _this.spinning = true
+          reportSalesBillDetailTotalExport(params).then(res => {
+            downloadExcel(res, '连锁门店销售明细合计报表')
+            _this.exportLoading = false
+            _this.spinning = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    // 连锁店
+    getLinkageGroup () {
+      linkageGroupList({}).then(res => {
+        if (res.status == 200) {
+          const data = res.data || []
+          if (data.length > 0) {
+            this.linkageGroupData = data
+          } else {
+            this.linkageGroupData = []
+          }
+        } else {
+          this.linkageGroupData = []
+        }
+      })
+    },
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      )
+    },
+    pageInit () {
+      this.getLinkageGroup()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 212 - 0
src/views/reportData/customerSalesDetailsReport/list.vue

@@ -0,0 +1,212 @@
+<template>
+  <a-card size="small" :bordered="false" class="customerSalesDetailsReportList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper">
+        <a-form-model
+          id="customerSalesDetailsReportList-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam"
+          :rules="rules"
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          @keyup.enter.native="handleSearch" >
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="审核日期" prop="time">
+                <rangeDate ref="rangeDate" @change="dateChange" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="客户名称">
+                <a-input id="customerSalesDetailsReportList-salesTargetName" v-model.trim="queryParam.salesTargetName" allowClear placeholder="请输入客户名称"/>
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="handleSearch" :disabled="disabled" id="customerSalesDetailsReportList-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="customerSalesDetailsReportList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 5px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_customerSalesDetailsReport_export')"
+                id="customerSalesDetailsReportList-export">导出</a-button>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.targetSn"
+        :columns="columns"
+        :data="loadData"
+        :defaultLoadData="false"
+        bordered>
+        <template slot="footer">
+          <a-row>
+            <a-col span="2">合计:</a-col>
+            <a-col span="22">
+              <a-row>
+                <a-col span="4">滤清器:{{ (totalData && (totalData.lqqAmount || totalData.lqqAmount==0)) ? totalData.lqqAmount : '--' }}</a-col>
+                <a-col span="4">雨刮片:{{ (totalData && (totalData.ygpAmount || totalData.ygpAmount==0)) ? totalData.ygpAmount : '--' }}</a-col>
+                <a-col span="4">刹车片:{{ (totalData && (totalData.scpAmount || totalData.scpAmount==0)) ? totalData.scpAmount : '--' }}</a-col>
+                <a-col span="4">蓄电池:{{ (totalData && (totalData.xdcAmount || totalData.xdcAmount==0)) ? totalData.xdcAmount : '--' }}</a-col>
+                <a-col span="4">润滑油:{{ (totalData && (totalData.rhyAmount || totalData.rhyAmount==0)) ? totalData.rhyAmount : '--' }}</a-col>
+                <a-col span="4">火花塞:{{ (totalData && (totalData.hhsAmount || totalData.hhsAmount==0)) ? totalData.hhsAmount : '--' }}</a-col>
+                <a-col span="4">点火线圈:{{ (totalData && (totalData.dhxqAmount || totalData.dhxqAmount==0)) ? totalData.dhxqAmount : '--' }}</a-col>
+                <a-col span="4">LED灯:{{ (totalData && (totalData.ledAmount || totalData.ledAmount==0)) ? totalData.ledAmount : '--' }}</a-col>
+                <a-col span="4">其他:{{ (totalData && (totalData.otherAmount || totalData.otherAmount==0)) ? totalData.otherAmount : '--' }}</a-col>
+                <a-col span="4">合计:{{ (totalData && (totalData.totalAmount || totalData.totalAmount==0)) ? totalData.totalAmount : '--' }}</a-col>
+              </a-row>
+            </a-col>
+          </a-row>
+        </template>
+      </s-table>
+    </a-spin>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import rangeDate from '@/views/common/rangeDate.vue'
+import { downloadExcel } from '@/libs/JGPrint.js'
+import { reportCustomerSalesBillDetailList, reportCustomerSalesBillDetailCount, reportCustomerSalesBillDetailExport } from '@/api/reportData'
+export default {
+  components: { STable, VSelect, rangeDate },
+  data () {
+    return {
+      spinning: false,
+      labelCol: { span: 8 },
+      wrapperCol: { span: 16 },
+      tableHeight: 0,
+      queryParam: { //  查询条件
+        salesTargetName: '',
+        time: [],
+        beginDate: '',
+        endDate: ''
+      },
+      rules: {
+        'time': [{ required: true, message: '请选择审核日期', trigger: 'change' }]
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      exportLoading: false,
+      columns: [
+        { title: '客户名称', dataIndex: 'salesTargetName', width: '16%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '滤清器', dataIndex: 'lqqAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '雨刮片', dataIndex: 'ygpAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '刹车片', dataIndex: 'scpAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '蓄电池', dataIndex: 'xdcAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '润滑油', dataIndex: 'rhyAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '火花塞', dataIndex: 'hhsAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '点火线圈', dataIndex: 'dhxqAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: 'LED灯', dataIndex: 'ledAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '其他', dataIndex: 'otherAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '合计', dataIndex: 'totalAmount', width: '8.4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        const params = Object.assign(parameter, this.queryParam)
+        this.spinning = true
+        delete params.time
+        return reportCustomerSalesBillDetailList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            // 总计
+            this.getCount(params)
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      linkageGroupData: [],
+      totalData: null // 合计
+    }
+  },
+  methods: {
+    //  创建时间  change
+    dateChange (date) {
+      this.queryParam.time = date
+      this.queryParam.beginDate = date[0] || ''
+      this.queryParam.endDate = date[1] || ''
+    },
+    //  查询
+    handleSearch () {
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          this.$refs.table.refresh(true)
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    // 查询总计
+    getCount (params) {
+      reportCustomerSalesBillDetailCount(params).then(res => {
+        if (res.status == 200 && res.data) {
+          this.totalData = res.data
+        } else {
+          this.totalData = null
+        }
+      })
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.salesTargetName = ''
+      this.$refs.rangeDate.resetDate()
+      this.queryParam.time = []
+      this.queryParam.beginDate = ''
+      this.queryParam.endDate = ''
+      this.totalData = null
+      this.$refs.ruleForm.resetFields()
+      this.$refs.table.clearTable()
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = _this.queryParam
+          _this.exportLoading = true
+          _this.spinning = true
+          reportCustomerSalesBillDetailExport(params).then(res => {
+            downloadExcel(res, '客户销售明细报表')
+            _this.exportLoading = false
+            _this.spinning = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    pageInit () {}
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 302 - 0
src/views/reportData/storeReceivedSendStorageReport/list.vue

@@ -0,0 +1,302 @@
+<template>
+  <a-card size="small" :bordered="false" class="storeReceivedSendStorageReportList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper">
+        <a-form-model
+          id="storeReceivedSendStorageReportList-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam"
+          :rules="rules"
+          :labelCol="labelCol"
+          :wrapperCol="wrapperCol"
+          @keyup.enter.native="handleSearch" >
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="日期" prop="billDate">
+                <a-month-picker
+                  v-model="queryParam.billDate"
+                  :defaultValue="moment().subtract(1, 'month')"
+                  :disabled-date="disabledDate"
+                  :allowClear="false"
+                  @change="onChange"
+                  style="width: 100%;" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="handleSearch" :disabled="disabled" id="storeReceivedSendStorageReportList-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="storeReceivedSendStorageReportList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 5px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_storeReceivedSendStorageReport_export')"
+                id="storeReceivedSendStorageReportList-export">导出</a-button>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.no"
+        :columns="columns"
+        :data="loadData"
+        :showPagination="false"
+        :defaultLoadData="false"
+        bordered>
+        <!-- 结存余额-成本 -->
+        <template slot="endAmount" slot-scope="text, record">
+          <span v-if="record.endDetail" :style="{background: text ? 'chartreuse':'', display: 'block'}">{{ text ? '¥' + text : '--' }}</span>
+        </template>
+      </s-table>
+    </a-spin>
+  </a-card>
+</template>
+
+<script>
+import moment from 'moment'
+import { STable, VSelect } from '@/components'
+import rangeDate from '@/views/common/rangeDate.vue'
+import { downloadExcel } from '@/libs/JGPrint.js'
+import { reportStockPutOutMonthList, reportStockPutOutMonthExport } from '@/api/reportData'
+export default {
+  components: { STable, VSelect, rangeDate },
+  data () {
+    return {
+      moment,
+      spinning: false,
+      labelCol: { span: 8 },
+      wrapperCol: { span: 16 },
+      tableHeight: 0,
+      queryParam: { //  查询条件
+        billDate: moment().subtract(1, 'month')
+      },
+      rules: {
+        'billDate': [{ required: true, message: '请选择月份', trigger: 'change' }]
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      exportLoading: false,
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '期初余额',
+          align: 'center',
+          children: [
+            {
+              title: '明细',
+              dataIndex: 'beginDetail',
+              align: 'center',
+              width: '9%'
+            },
+            {
+              title: '成本',
+              dataIndex: 'beginAmount',
+              align: 'center',
+              width: '14%',
+              customRender: function (text, record) {
+                let str
+                if (record.beginDetail) {
+                  if (text) {
+                    str = '¥' + text
+                  } else {
+                    str = '--'
+                  }
+                } else {
+                  str = ''
+                }
+                return str
+              }
+            }
+          ]
+        },
+        { title: '入库',
+          align: 'center',
+          children: [
+            {
+              title: '明细',
+              dataIndex: 'putDetail',
+              align: 'center',
+              width: '9%'
+            },
+            {
+              title: '成本',
+              dataIndex: 'putAmount',
+              align: 'center',
+              width: '14%',
+              customRender: function (text, record) {
+                let str
+                if (record.putDetail) {
+                  if (text) {
+                    str = '¥' + text
+                  } else {
+                    str = '--'
+                  }
+                } else {
+                  str = ''
+                }
+                return str
+              }
+            }
+          ]
+        },
+        { title: '出库',
+          align: 'center',
+          children: [
+            {
+              title: '明细',
+              dataIndex: 'outDetail',
+              align: 'center',
+              width: '9%'
+            },
+            {
+              title: '成本',
+              dataIndex: 'outAmount',
+              align: 'center',
+              width: '14%',
+              customRender: function (text, record) {
+                let str
+                if (record.outDetail) {
+                  if (text) {
+                    str = '¥' + text
+                  } else {
+                    str = '--'
+                  }
+                } else {
+                  str = ''
+                }
+                return str
+              }
+            }
+          ]
+        },
+        { title: '结存余额',
+          align: 'center',
+          children: [
+            {
+              title: '明细',
+              dataIndex: 'endDetail',
+              align: 'center',
+              width: '9%'
+            },
+            {
+              title: '成本',
+              dataIndex: 'endAmount',
+              align: 'center',
+              width: '14%',
+              scopedSlots: { customRender: 'endAmount' }
+            }
+          ]
+        }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        const params = JSON.parse(JSON.stringify(this.queryParam))
+        params.billDate = params.billDate + '-01'
+        this.spinning = true
+        return reportStockPutOutMonthList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            if (res.data) {
+              if (res.data.beginAmountHide) { // 是否隐藏期初金额
+                res.data.beginAmount = null
+              }
+              if (res.data.endAmountHide) { // 是否隐藏结存金额
+                res.data.endAmount = null
+              }
+              // 组装数据
+              data = [
+                { no: 1, beginDetail: '期初金额', beginAmount: res.data.beginAmount, putDetail: '采购入库', putAmount: res.data.putPurchaseAmount, outDetail: '采购退货', outAmount: res.data.outPurchaseReturnAmount, endDetail: null, endAmount: null },
+                { no: 2, beginDetail: null, beginAmount: null, putDetail: '散件入库', putAmount: res.data.putSparePartsAmount, outDetail: '散件退货', outAmount: res.data.outSparePartsReturnAmount, endDetail: null, endAmount: null },
+                { no: 3, beginDetail: null, beginAmount: null, putDetail: '销售退货', putAmount: res.data.putSalesReturnAmount, outDetail: '销售', outAmount: res.data.outSalesAmount, endDetail: null, endAmount: null },
+                { no: 4, beginDetail: null, beginAmount: null, putDetail: '仓库调入', putAmount: res.data.putWarehouseCallInAmount, outDetail: '仓库调出', outAmount: res.data.outWarehouseCallOutAmount, endDetail: null, endAmount: null },
+                { no: 5, beginDetail: null, beginAmount: null, putDetail: '库存盘点盘盈', putAmount: res.data.putStockCheckInAmount, outDetail: '库存盘点盘亏', outAmount: res.data.outCheckOrderOutAmount, endDetail: null, endAmount: null },
+                { no: 6, beginDetail: null, beginAmount: null, putDetail: '连锁调入', putAmount: res.data.putLinkageCallInAmount, outDetail: '连锁调出', outAmount: res.data.outLinkageCallOutAmount, endDetail: null, endAmount: null },
+                { no: 7, beginDetail: null, beginAmount: null, putDetail: '库存导入', putAmount: res.data.putStockImportAmount, outDetail: null, outAmount: null, endDetail: null, endAmount: null },
+                { no: 8, beginDetail: null, beginAmount: null, putDetail: '散件导入', putAmount: res.data.putSparePartsImportAmount, outDetail: null, outAmount: null, endDetail: null, endAmount: null },
+                { no: 9, beginDetail: null, beginAmount: null, putDetail: null, putAmount: null, outDetail: '店内调出', outAmount: res.data.outShopCallOutAmount, endDetail: null, endAmount: null },
+                { no: 10, beginDetail: null, beginAmount: null, putDetail: null, putAmount: null, outDetail: '急件冲减', outAmount: res.data.outDispatchDeductAmount, endDetail: null, endAmount: null },
+                { no: '成本合计', beginDetail: ' ', beginAmount: res.data.beginAmount, putDetail: ' ', putAmount: res.data.putAmount, outDetail: ' ', outAmount: res.data.outAmount, endDetail: '月末余额', endAmount: res.data.endAmount }
+              ]
+            } else {
+              data = []
+            }
+          }
+          this.disabled = false
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  methods: {
+    disabledDate (current) {
+      return current && current > moment().subtract(1, 'month')
+    },
+    // 月份  change
+    onChange (date, dateString) {
+      this.queryParam.billDate = dateString || null
+    },
+    //  查询
+    handleSearch () {
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          this.$refs.table.refresh(true)
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.billDate = moment().subtract(1, 'month')
+      this.$refs.ruleForm.resetFields()
+      this.$refs.table.clearTable()
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = JSON.parse(JSON.stringify(this.queryParam))
+          params.billDate = params.billDate + '-01'
+          _this.exportLoading = true
+          _this.spinning = true
+          reportStockPutOutMonthExport(params).then(res => {
+            downloadExcel(res, '门店收发存汇总报表')
+            _this.exportLoading = false
+            _this.spinning = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    pageInit () {}
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 1 - 1
src/views/result/Error.vue

@@ -5,7 +5,7 @@
         <a-button type="primary" >返回修改</a-button>
       </template>
       <div>
-        <div style="font-size: 16px; color: rgba(0, 0, 0, 0.85); font-weight: 500; margin-bottom: 16px">
+        <div style="font-size: 16px; color: rgba(0, 0, 0); font-weight: 500; margin-bottom: 16px">
           您提交的内容有如下错误:
         </div>
         <div style="margin-bottom: 16px">

+ 4 - 4
src/views/result/Success.vue

@@ -7,18 +7,18 @@
         <a-button style="margin-left: 8px">打印</a-button>
       </template>
       <div>
-        <div style="font-size: 16px; color: rgba(0, 0, 0, 0.85); font-weight: 500; margin-bottom: 20px;">项目名称</div>
+        <div style="font-size: 16px; color: rgba(0, 0, 0); font-weight: 500; margin-bottom: 20px;">项目名称</div>
         <a-row style="margin-bottom: 16px">
           <a-col :xs="24" :sm="12" :md="12" :lg="12" :xl="6">
-            <span style="color: rgba(0, 0, 0, 0.85)">项目 ID:</span>
+            <span style="color: rgba(0, 0, 0)">项目 ID:</span>
             20180724089
           </a-col>
           <a-col :xs="24" :sm="12" :md="12" :lg="12" :xl="6">
-            <span style="color: rgba(0, 0, 0, 0.85)">负责人:</span>
+            <span style="color: rgba(0, 0, 0)">负责人:</span>
             曲丽丽是谁?
           </a-col>
           <a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="12">
-            <span style="color: rgba(0, 0, 0, 0.85)">生效时间:</span>
+            <span style="color: rgba(0, 0, 0)">生效时间:</span>
             2016-12-12 ~ 2017-12-12
           </a-col>
         </a-row>

+ 4 - 0
src/views/salesManagement/salesQuery/edit.vue

@@ -573,6 +573,10 @@ export default {
       this.pageInit()
     }
   },
+  deactivated () {
+    // this.dataSource = []
+    // this.showPage = false
+  },
   beforeRouteEnter (to, from, next) {
     next(vm => {})
   }

+ 441 - 30
yarn.lock

@@ -792,6 +792,13 @@
   dependencies:
     regenerator-runtime "^0.13.2"
 
+"@babel/runtime@^7.11.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.5.5":
+  version "7.16.3"
+  resolved "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.16.3.tgz#b86f0db02a04187a3c17caa77de69840165d42d5"
+  integrity sha512-WBwekcqacdY2e9AF/Q7WLFUWmdJGJTkbjqTjoMDgXkVZ3ZRUvOPsLb5KdwISoQVsbP+DQzVZW4Zhci0DvpbNTQ==
+  dependencies:
+    regenerator-runtime "^0.13.4"
+
 "@babel/template@^7.1.0", "@babel/template@^7.4.4":
   version "7.4.4"
   resolved "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz#f4b88d1225689a08f5bc3a17483545be9e4ed237"
@@ -888,6 +895,14 @@
   resolved "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz#2b5a3ab3f918cca48a8c754c08168e3f03eba61b"
   integrity sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==
 
+"@simonwep/pickr@~1.7.0":
+  version "1.7.4"
+  resolved "https://registry.yarnpkg.com/@simonwep/pickr/-/pickr-1.7.4.tgz#b14fcd945890388b870cd6db4d6c78d531f25141"
+  integrity sha512-fq7jgKJT21uWGC1mARBHvvd1JYlEf93o7SuVOB4Lr0x/2UPuNC9Oe9n/GzVeg4oVtqMDfh1wIEJpsdOJEZb+3g==
+  dependencies:
+    core-js "^3.6.5"
+    nanopop "^2.1.0"
+
 "@soda/friendly-errors-webpack-plugin@^1.7.1":
   version "1.7.1"
   resolved "https://registry.npmjs.org/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz#706f64bcb4a8b9642b48ae3ace444c70334d615d"
@@ -997,6 +1012,38 @@
     "@types/uglify-js" "*"
     source-map "^0.6.0"
 
+"@videojs/http-streaming@2.12.0":
+  version "2.12.0"
+  resolved "https://registry.yarnpkg.com/@videojs/http-streaming/-/http-streaming-2.12.0.tgz#850069e063e26cf2fa5ed9bb3addfc92fa899f78"
+  integrity sha512-vdQA0lDYBXGJqV2T02AGqg1w4dcgyRoN+bYG+G8uF4DpCEMhEtUI0BA4tRu4/Njar8w/9D5k0a1KX40pcvM3fA==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "3.0.4"
+    aes-decrypter "3.1.2"
+    global "^4.4.0"
+    m3u8-parser "4.7.0"
+    mpd-parser "0.19.2"
+    mux.js "5.14.1"
+    video.js "^6 || ^7"
+
+"@videojs/vhs-utils@3.0.4", "@videojs/vhs-utils@^3.0.0", "@videojs/vhs-utils@^3.0.2", "@videojs/vhs-utils@^3.0.3":
+  version "3.0.4"
+  resolved "https://registry.yarnpkg.com/@videojs/vhs-utils/-/vhs-utils-3.0.4.tgz#e253eecd8e9318f767e752010d213587f94bb03a"
+  integrity sha512-hui4zOj2I1kLzDgf8QDVxD3IzrwjS/43KiS8IHQO0OeeSsb4pB/lgNt1NG7Dv0wMQfCccUpMVLGcK618s890Yg==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    global "^4.4.0"
+    url-toolkit "^2.2.1"
+
+"@videojs/xhr@2.6.0":
+  version "2.6.0"
+  resolved "https://registry.yarnpkg.com/@videojs/xhr/-/xhr-2.6.0.tgz#cd897e0ad54faf497961bcce3fa16dc15a26bb80"
+  integrity sha512-7J361GiN1tXpm+gd0xz2QWr3xNWBE+rytvo8J3KuggFaLg+U37gZQ2BuPLcnkfGffy2e+ozY70RHC8jt7zjA6Q==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+    global "~4.4.0"
+    is-function "^1.0.1"
+
 "@vue/babel-helper-vue-jsx-merge-props@^1.0.0":
   version "1.0.0"
   resolved "https://registry.npmjs.org/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz#048fe579958da408fb7a8b2a3ec050b50a661040"
@@ -1410,6 +1457,11 @@
     "@webassemblyjs/wast-parser" "1.8.5"
     "@xtuc/long" "4.2.2"
 
+"@xmldom/xmldom@^0.7.2":
+  version "0.7.5"
+  resolved "https://registry.yarnpkg.com/@xmldom/xmldom/-/xmldom-0.7.5.tgz#09fa51e356d07d0be200642b0e4f91d8e6dd408d"
+  integrity sha512-V3BIhmY36fXZ1OtVcI9W+FxQqxVLsPKcNjWigIaa81dLC9IolJl5Mt4Cvhmr0flUnjSpTdrbMTSbXqYqV5dT6A==
+
 "@xtuc/ieee754@^1.2.0":
   version "1.2.0"
   resolved "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz#eef014a3145ae477a1cbc00cd1e552336dceb790"
@@ -1500,6 +1552,23 @@ address@^1.0.3:
   resolved "https://registry.npmjs.org/address/-/address-1.1.0.tgz#ef8e047847fcd2c5b6f50c16965f924fd99fe709"
   integrity sha512-4diPfzWbLEIElVG4AnqP+00SULlPzNuyJFNnmMrLgyaxG6tZXJ1sn7mjBu4fHrJE+Yp/jgylOweJn2xsLMFggQ==
 
+aes-decrypter@1.0.3:
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-1.0.3.tgz#9c06b8a5435a5ad09db933f8a014afcf184cc34e"
+  integrity sha1-nAa4pUNaWtCduTP4oBSvzxhMw04=
+  dependencies:
+    pkcs7 "^0.2.3"
+
+aes-decrypter@3.1.2:
+  version "3.1.2"
+  resolved "https://registry.yarnpkg.com/aes-decrypter/-/aes-decrypter-3.1.2.tgz#3545546f8e9f6b878640339a242efe221ba7a7cb"
+  integrity sha512-42nRwfQuPRj9R1zqZBdoxnaAmnIFyDi0MNyTVhjdFOd8fifXKKRfwIHIZ6AMn1or4x5WONzjwRTbTWcsIQ0O4A==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "^3.0.0"
+    global "^4.4.0"
+    pkcs7 "^1.0.4"
+
 ajv-errors@^1.0.0:
   version "1.0.1"
   resolved "https://registry.npmjs.org/ajv-errors/-/ajv-errors-1.0.1.tgz#f35986aceb91afadec4102fbd85014950cefa64d"
@@ -1626,13 +1695,14 @@ ansi-styles@^3.2.0, ansi-styles@^3.2.1:
   dependencies:
     color-convert "^1.9.0"
 
-ant-design-vue@1.4.0-beta.0:
-  version "1.4.0-beta.0"
-  resolved "https://registry.yarnpkg.com/ant-design-vue/-/ant-design-vue-1.4.0-beta.0.tgz#a2c7d9683804101691bcb3c518e0114dc67efe6f"
-  integrity sha512-MZnb5Pwr4mlYoE2pHB5XMeL22pmPlKF7WkQszS18t7VygS9Q/gF8nJl94nebv6EHJRrKg0i/6Axh1gR0vXb6Hg==
+ant-design-vue@^1.7.1:
+  version "1.7.8"
+  resolved "https://registry.yarnpkg.com/ant-design-vue/-/ant-design-vue-1.7.8.tgz#1abbf86b68a4f5b1000bea0487b8031dc0001661"
+  integrity sha512-F1hmiS9vwbyfuFvlamdW5l9bHKqRlj9wHaGDIE41NZMWXyWy8qL0UFa/+I0Wl8gQWZCqODW5pN6Yfoyn85At3A==
   dependencies:
     "@ant-design/icons" "^2.1.1"
     "@ant-design/icons-vue" "^2.0.0"
+    "@simonwep/pickr" "~1.7.0"
     add-dom-event-listener "^1.0.2"
     array-tree-filter "^2.1.0"
     async-validator "^3.0.3"
@@ -1640,13 +1710,14 @@ ant-design-vue@1.4.0-beta.0:
     babel-runtime "6.x"
     classnames "^2.2.5"
     component-classes "^1.2.6"
-    dom-align "^1.7.0"
+    dom-align "^1.10.4"
     dom-closest "^0.2.0"
-    dom-scroll-into-view "^1.2.1"
+    dom-scroll-into-view "^2.0.0"
     enquire.js "^2.1.6"
     intersperse "^1.0.0"
+    is-mobile "^2.2.1"
     is-negative-zero "^2.0.0"
-    ismobilejs "^0.5.1"
+    ismobilejs "^1.0.0"
     json2mq "^0.2.0"
     lodash "^4.17.5"
     moment "^2.21.0"
@@ -1657,8 +1728,8 @@ ant-design-vue@1.4.0-beta.0:
     resize-observer-polyfill "^1.5.1"
     shallow-equal "^1.0.0"
     shallowequal "^1.0.2"
-    vue-ref "^1.0.4"
-    warning "^3.0.0"
+    vue-ref "^2.0.0"
+    warning "^4.0.0"
 
 any-promise@^1.0.0:
   version "1.3.0"
@@ -2114,7 +2185,7 @@ babel-register@^6.26.0:
     mkdirp "^0.5.1"
     source-map-support "^0.4.15"
 
-babel-runtime@6.x, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0:
+babel-runtime@6.x, babel-runtime@^6.22.0, babel-runtime@^6.23.0, babel-runtime@^6.26.0, babel-runtime@^6.9.2:
   version "6.26.0"
   resolved "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz#965c7058668e82b55d7bfe04ff2337bc8b5647fe"
   integrity sha1-llxwWGaOgrVde/4E/yM3vItWR/4=
@@ -3088,6 +3159,11 @@ core-js@^2.6.5:
   resolved "https://registry.yarnpkg.com/core-js/-/core-js-2.6.5.tgz#44bc8d249e7fb2ff5d00e0341a7ffb94fbf67895"
   integrity sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A==
 
+core-js@^3.6.5:
+  version "3.19.1"
+  resolved "https://registry.yarnpkg.com/core-js/-/core-js-3.19.1.tgz#f6f173cae23e73a7d88fa23b6e9da329276c6641"
+  integrity sha512-Tnc7E9iKd/b/ff7GFbhwPVzJzPztGrChB8X8GLqoYGdEOG8IpLnK1xPyo3ZoO3HsK6TodJS58VGPOxA+hLHQMg==
+
 core-util-is@1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
@@ -3836,10 +3912,10 @@ doctrine@^3.0.0:
   dependencies:
     esutils "^2.0.2"
 
-dom-align@^1.7.0:
-  version "1.8.0"
-  resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.8.0.tgz#c0e89b5b674c6e836cd248c52c2992135f093654"
-  integrity sha512-B85D4ef2Gj5lw0rK0KM2+D5/pH7yqNxg2mB+E8uzFaolpm7RQmsxEfjyEuNiF8UBBkffumYDeKRzTzc3LePP+w==
+dom-align@^1.10.4:
+  version "1.12.2"
+  resolved "https://registry.yarnpkg.com/dom-align/-/dom-align-1.12.2.tgz#0f8164ebd0c9c21b0c790310493cd855892acd4b"
+  integrity sha512-pHuazgqrsTFrGU2WLDdXxCFabkdQDx72ddkraZNih1KsMcN5qsRSTR9O4VJRlwTPCPb5COYg3LOfiMHHcPInHg==
 
 dom-closest@^0.2.0:
   version "0.2.0"
@@ -3865,10 +3941,10 @@ dom-matches@>=1.0.1:
   resolved "https://registry.yarnpkg.com/dom-matches/-/dom-matches-2.0.0.tgz#d2728b416a87533980eb089b848d253cf23a758c"
   integrity sha1-0nKLQWqHUzmA6wibhI0lPPI6dYw=
 
-dom-scroll-into-view@^1.2.1:
-  version "1.2.1"
-  resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-1.2.1.tgz#e8f36732dd089b0201a88d7815dc3f88e6d66c7e"
-  integrity sha1-6PNnMt0ImwIBqI14Fdw/iObWbH4=
+dom-scroll-into-view@^2.0.0:
+  version "2.0.1"
+  resolved "https://registry.yarnpkg.com/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz#0decc8522801fd8d3f1c6ba355a74d382c5f989b"
+  integrity sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==
 
 dom-serializer@0:
   version "0.1.1"
@@ -3878,6 +3954,11 @@ dom-serializer@0:
     domelementtype "^1.3.0"
     entities "^1.1.1"
 
+dom-walk@^0.1.0:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.2.tgz#0c548bef048f4d1f2a97249002236060daa3fd84"
+  integrity sha512-6QvTW9mrGeIegrFXdtQi9pk7O/nSK6lSdXW2eqUspN5LWD7UTji2Fqw5V2YLjBpHEoU9Xl/eUWNpDeZvoyOv2w==
+
 domain-browser@^1.1.1:
   version "1.2.0"
   resolved "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda"
@@ -3963,6 +4044,13 @@ ecc-jsbn@~0.1.1:
     jsbn "~0.1.0"
     safer-buffer "^2.1.0"
 
+echarts@^4.9.0:
+  version "4.9.0"
+  resolved "https://registry.yarnpkg.com/echarts/-/echarts-4.9.0.tgz#a9b9baa03f03a2a731e6340c55befb57a9e1347d"
+  integrity sha512-+ugizgtJ+KmsJyyDPxaw2Br5FqzuBnyOWwcxPKO6y0gc5caYcfnEUIlNStx02necw8jmKmTafmpHhGo4XDtEIA==
+  dependencies:
+    zrender "4.3.2"
+
 editorconfig@^0.15.3:
   version "0.15.3"
   resolved "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz#bef84c4e75fb8dcb0ce5cee8efd51c15999befc5"
@@ -4091,6 +4179,11 @@ es-to-primitive@^1.2.0:
     is-date-object "^1.0.1"
     is-symbol "^1.0.2"
 
+es5-shim@^4.5.1:
+  version "4.6.2"
+  resolved "https://registry.yarnpkg.com/es5-shim/-/es5-shim-4.6.2.tgz#827cdd0c6fb5beb26fd368d65430e8b5eaeba942"
+  integrity sha512-n0XTVMGps+Deyr38jtqKPR5F5hb9owYeRQcKJW39eFvzUk/u/9Ww315werRzbiNMnHCUw/YHDPBphTlEnzdi+A==
+
 escape-html@~1.0.3:
   version "1.0.3"
   resolved "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988"
@@ -5134,6 +5227,22 @@ glob@~7.1.3:
     once "^1.3.0"
     path-is-absolute "^1.0.0"
 
+global@4.3.2, global@~4.3.0:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f"
+  integrity sha1-52mJJopsdMOJCLEwWxD8DjlOnQ8=
+  dependencies:
+    min-document "^2.19.0"
+    process "~0.5.1"
+
+global@^4.3.0, global@^4.3.1, global@^4.4.0, global@~4.4.0:
+  version "4.4.0"
+  resolved "https://registry.yarnpkg.com/global/-/global-4.4.0.tgz#3e7b105179006a323ed71aafca3e9c57a5cc6406"
+  integrity sha512-wv/LAoHdRE3BeTGz53FAamhGlPLhlssK45usmGFThIi4XqnBmjKQ16u+RNbP7WvigRZDxUsM0J3gcQ5yicaL0w==
+  dependencies:
+    min-document "^2.19.0"
+    process "^0.11.10"
+
 globals@^11.0.1, globals@^11.1.0:
   version "11.12.0"
   resolved "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz#ab8795338868a0babd8525758018c2a7eb95c42e"
@@ -5631,6 +5740,11 @@ indexes-of@^1.0.1:
   resolved "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz#f30f716c8e2bd346c7b67d3df3915566a7c05607"
   integrity sha1-8w9xbI4r00bHtn0985FVZqfAVgc=
 
+individual@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/individual/-/individual-2.0.0.tgz#833b097dad23294e76117a98fb38e0d9ad61bb97"
+  integrity sha1-gzsJfa0jKU52EXqY+zjg2a1hu5c=
+
 infer-owner@^1.0.3:
   version "1.0.4"
   resolved "https://registry.npm.taobao.org/infer-owner/download/infer-owner-1.0.4.tgz#c4cefcaa8e51051c2a40ba2ce8a3d27295af9467"
@@ -5927,6 +6041,11 @@ is-fullwidth-code-point@^2.0.0:
   resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f"
   integrity sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=
 
+is-function@^1.0.1:
+  version "1.0.2"
+  resolved "https://registry.yarnpkg.com/is-function/-/is-function-1.0.2.tgz#4f097f30abf6efadac9833b17ca5dc03f8144e08"
+  integrity sha512-lw7DUp0aWXYg+CBCN+JKkcE0Q2RayZnSvnZBlwgxHBQhqt5pZNVy4Ri7H9GmmXkdu7LUthszM+Tor1u/2iBcpQ==
+
 is-generator-fn@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-1.0.0.tgz#969d49e1bb3329f6bb7f09089be26578b2ddd46a"
@@ -5953,6 +6072,11 @@ is-glob@^4.0.0:
   dependencies:
     is-extglob "^2.1.1"
 
+is-mobile@^2.2.1:
+  version "2.2.2"
+  resolved "https://registry.yarnpkg.com/is-mobile/-/is-mobile-2.2.2.tgz#f6c9c5d50ee01254ce05e739bdd835f1ed4e9954"
+  integrity sha512-wW/SXnYJkTjs++tVK5b6kVITZpAZPtUrt9SF80vvxGiF/Oywal+COk1jlRkiVq15RFNEQKQY31TkV24/1T5cVg==
+
 is-negative-zero@^2.0.0:
   version "2.0.0"
   resolved "https://registry.yarnpkg.com/is-negative-zero/-/is-negative-zero-2.0.0.tgz#9553b121b0fac28869da9ed459e20c7543788461"
@@ -6104,10 +6228,10 @@ isexe@^2.0.0:
   resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
-ismobilejs@^0.5.1:
-  version "0.5.1"
-  resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-0.5.1.tgz#0e3f825e29e32f84ad5ddbb60e9e04a894046488"
-  integrity sha512-QX4STsOcBYqlTjVGuAdP1MiRVxtiUbRHOKH0v7Gn1EvfUVIQnrSdgCM4zB4VCZuIejnb2NUMUx0Bwd3EIG6yyA==
+ismobilejs@^1.0.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/ismobilejs/-/ismobilejs-1.1.1.tgz#c56ca0ae8e52b24ca0f22ba5ef3215a2ddbbaa0e"
+  integrity sha512-VaFW53yt8QO61k2WJui0dHf4SlL8lxBofUuUmwBo0ljPk0Drz2TiuDW4jo3wDcv41qy/SxrJ+VAzJ/qYqsmzRw==
 
 isobject@^2.0.0:
   version "2.1.0"
@@ -6730,6 +6854,11 @@ jsprim@^1.2.2:
     json-schema "0.2.3"
     verror "1.10.0"
 
+keycode@^2.2.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/keycode/-/keycode-2.2.1.tgz#09c23b2be0611d26117ea2501c2c391a01f39eff"
+  integrity sha512-Rdgz9Hl9Iv4QKi8b0OlCRQEzp4AgVxyCtz5S/+VIHezDmrDhkp2N2TqBWOLz0/gbeREXOOiI9/4b8BY9uw2vFg==
+
 killable@^1.0.1:
   version "1.0.1"
   resolved "https://registry.npmjs.org/killable/-/killable-1.0.1.tgz#4c8ce441187a061c7474fb87ca08e2a638194892"
@@ -7018,6 +7147,20 @@ lru-cache@^5.1.1:
   dependencies:
     yallist "^3.0.2"
 
+m3u8-parser@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-2.1.0.tgz#c8170329ec1cd515d0d58bb8b762da9896cb0368"
+  integrity sha1-yBcDKewc1RXQ1Yu4t2LamJbLA2g=
+
+m3u8-parser@4.7.0:
+  version "4.7.0"
+  resolved "https://registry.yarnpkg.com/m3u8-parser/-/m3u8-parser-4.7.0.tgz#e01e8ce136098ade1b14ee691ea20fc4dc60abf6"
+  integrity sha512-48l/OwRyjBm+QhNNigEEcRcgbRvnUjL7rxs597HmW9QSNbyNvt+RcZ9T/d9vxi9A9z7EZrB1POtZYhdRlwYQkQ==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "^3.0.0"
+    global "^4.4.0"
+
 make-dir@^1.0.0:
   version "1.3.0"
   resolved "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz#79c1033b80515bd6d24ec9933e860ca75ee27f0c"
@@ -7238,6 +7381,13 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
   resolved "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
   integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==
 
+min-document@^2.19.0:
+  version "2.19.0"
+  resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685"
+  integrity sha1-e9KC4/WELtKVu3SM3Z8f+iyCRoU=
+  dependencies:
+    dom-walk "^0.1.0"
+
 mini-css-extract-plugin@^0.6.0:
   version "0.6.0"
   resolved "https://registry.npmjs.org/mini-css-extract-plugin/-/mini-css-extract-plugin-0.6.0.tgz#a3f13372d6fcde912f3ee4cd039665704801e3b9"
@@ -7366,6 +7516,16 @@ move-concurrently@^1.0.1:
     rimraf "^2.5.4"
     run-queue "^1.0.3"
 
+mpd-parser@0.19.2:
+  version "0.19.2"
+  resolved "https://registry.yarnpkg.com/mpd-parser/-/mpd-parser-0.19.2.tgz#68611e653cdf2cc1e90688825c4a129b7f9007e0"
+  integrity sha512-M5tAIdtBM2TN+OSTz/37T7V+h9ZLvhyNqq4TNIdtjAQ/Hg8UnMRf5nJQDjffcXag3POXi31yUJQEKOXdcAM/nw==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/vhs-utils" "^3.0.2"
+    "@xmldom/xmldom" "^0.7.2"
+    global "^4.4.0"
+
 ms@2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz#5608aeadfc00be6c2901df5f9861788de0d597c8"
@@ -7399,6 +7559,18 @@ mute-stream@0.0.7:
   resolved "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz#3075ce93bc21b8fab43e1bc4da7e8115ed1e7bab"
   integrity sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=
 
+mux.js@4.3.2:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-4.3.2.tgz#576d537df037dc5ec35ec1316b948d815d35c210"
+  integrity sha512-g0q6DPdvb3yYcoK7ElBGobdSSrhY/RjPt19U7uUc733aqvc5bCS/aCvL9z+448y+IoCZnYDwyZfQBBXMSmGOaQ==
+
+mux.js@5.14.1:
+  version "5.14.1"
+  resolved "https://registry.yarnpkg.com/mux.js/-/mux.js-5.14.1.tgz#209583f454255d9ba2ff1bb61ad5a6867cf61878"
+  integrity sha512-38kA/xjWRDzMbcpHQfhKbJAME8eTZVsb9U2Puk890oGvGqnyu8B/AkKdICKPHkigfqYX9MY20vje88TP14nhog==
+  dependencies:
+    "@babel/runtime" "^7.11.2"
+
 mz@^2.4.0:
   version "2.7.0"
   resolved "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz#95008057a56cafadc2bc63dde7f9ff6955948e32"
@@ -7430,6 +7602,11 @@ nanomatch@^1.2.9:
     snapdragon "^0.8.1"
     to-regex "^3.0.1"
 
+nanopop@^2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/nanopop/-/nanopop-2.1.0.tgz#23476513cee2405888afd2e8a4b54066b70b9e60"
+  integrity sha512-jGTwpFRexSH+fxappnGQtN9dspgE2ipa1aOjtR24igG0pv6JCxImIAmrLRHX+zUF5+1wtsFVbKyfP51kIGAVNw==
+
 natural-compare@^1.4.0:
   version "1.4.0"
   resolved "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz#4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7"
@@ -8060,6 +8237,11 @@ parse-glob@^3.0.4:
     is-extglob "^1.0.0"
     is-glob "^2.0.0"
 
+parse-headers@^2.0.0:
+  version "2.0.4"
+  resolved "https://registry.yarnpkg.com/parse-headers/-/parse-headers-2.0.4.tgz#9eaf2d02bed2d1eff494331ce3df36d7924760bf"
+  integrity sha512-psZ9iZoCNFLrgRjZ1d8mn0h9WRqJwFxM9q3x7iUjN/YT2OksthDJ5TiPCu2F38kS4zutqfW+YdVVkBZZx3/1aw==
+
 parse-json@^2.2.0:
   version "2.2.0"
   resolved "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9"
@@ -8213,6 +8395,18 @@ pinkie@^2.0.0:
   resolved "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870"
   integrity sha1-clVrgM+g1IqXToDnckjoDtT3+HA=
 
+pkcs7@^0.2.3:
+  version "0.2.3"
+  resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-0.2.3.tgz#22d60666d01065c5f24439098e4a4830452273be"
+  integrity sha1-ItYGZtAQZcXyRDkJjkpIMEUic74=
+
+pkcs7@^1.0.4:
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/pkcs7/-/pkcs7-1.0.4.tgz#6090b9e71160dabf69209d719cbafa538b00a1cb"
+  integrity sha512-afRERtHn54AlwaF2/+LFszyAANTCggGilmcmILUzEjvs3XgFZT+xE6+QWQcAGmu4xajy+Xtj7acLOPdx5/eXWQ==
+  dependencies:
+    "@babel/runtime" "^7.5.5"
+
 pkg-dir@^1.0.0:
   version "1.0.0"
   resolved "https://registry.npmjs.org/pkg-dir/-/pkg-dir-1.0.0.tgz#7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4"
@@ -8672,6 +8866,11 @@ process@^0.11.10:
   resolved "https://registry.npmjs.org/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182"
   integrity sha1-czIwDoQBYb2j5podHZGn1LwW8YI=
 
+process@~0.5.1:
+  version "0.5.2"
+  resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf"
+  integrity sha1-FjjYqONML0QKkduVq5rrZ3/Bhc8=
+
 progress@^2.0.0:
   version "2.0.3"
   resolved "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz#7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8"
@@ -9007,6 +9206,11 @@ regenerator-runtime@^0.13.2:
   resolved "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz#32e59c9a6fb9b1a4aff09b4930ca2d4477343447"
   integrity sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA==
 
+regenerator-runtime@^0.13.4:
+  version "0.13.9"
+  resolved "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.9.tgz#8925742a98ffd90814988d7566ad30ca3b263b52"
+  integrity sha512-p3VT+cOEgxFsRRA9X4lkI1E+k2/CtnKtU4gcxyaCUreilL/vqI6CdZ3wxVUx3UOUg+gnUOQQcRI7BmSI656MYA==
+
 regenerator-transform@^0.14.0:
   version "0.14.0"
   resolved "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.0.tgz#2ca9aaf7a2c239dd32e4761218425b8c7a86ecaf"
@@ -9350,6 +9554,13 @@ run-queue@^1.0.0, run-queue@^1.0.3:
   dependencies:
     aproba "^1.1.1"
 
+rust-result@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/rust-result/-/rust-result-1.0.0.tgz#34c75b2e6dc39fe5875e5bdec85b5e0f91536f72"
+  integrity sha1-NMdbLm3Dn+WHXlveyFteD5FTb3I=
+  dependencies:
+    individual "^2.0.0"
+
 rw@1, rw@^1.3.2:
   version "1.3.3"
   resolved "https://registry.yarnpkg.com/rw/-/rw-1.3.3.tgz#3f862dfa91ab766b14885ef4d01124bfda074fb4"
@@ -9384,6 +9595,13 @@ safe-buffer@5.1.2, safe-buffer@^5.0.1, safe-buffer@^5.1.0, safe-buffer@^5.1.1, s
   resolved "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz#991ec69d296e0313747d59bdfd2b745c35f8828d"
   integrity sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==
 
+safe-json-parse@4.0.0:
+  version "4.0.0"
+  resolved "https://registry.yarnpkg.com/safe-json-parse/-/safe-json-parse-4.0.0.tgz#7c0f578cfccd12d33a71c0e05413e2eca171eaac"
+  integrity sha1-fA9XjPzNEtM6ccDgVBPi7KFx6qw=
+  dependencies:
+    rust-result "^1.0.0"
+
 safe-regex@^1.1.0:
   version "1.1.0"
   resolved "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz#40a3669f3b077d1e943d44629e157dd48023bf2e"
@@ -9426,6 +9644,11 @@ schema-utils@^1.0.0:
     ajv-errors "^1.0.0"
     ajv-keywords "^3.1.0"
 
+screenfull@^5.1.0:
+  version "5.2.0"
+  resolved "https://registry.yarnpkg.com/screenfull/-/screenfull-5.2.0.tgz#6533d524d30621fc1283b9692146f3f13a93d1ba"
+  integrity sha512-9BakfsO2aUQN2K9Fdbj87RJIEZ82Q9IGim7FqM5OsebfoFC6ZHXgDq/KvniuLTPdeM8wY2o6Dj3WQ7KeQCj3cA==
+
 select-hose@^2.0.0:
   version "2.0.0"
   resolved "https://registry.npmjs.org/select-hose/-/select-hose-2.0.0.tgz#625d8658f865af43ec962bfc376a37359a4994ca"
@@ -10281,6 +10504,11 @@ throat@^4.0.0:
   resolved "https://registry.npmjs.org/throat/-/throat-4.1.0.tgz#89037cbc92c56ab18926e6ba4cbb200e15672a6a"
   integrity sha1-iQN8vJLFarGJJua6TLsgDhVnKmo=
 
+throttle-debounce@^2.0.1:
+  version "2.3.0"
+  resolved "https://registry.yarnpkg.com/throttle-debounce/-/throttle-debounce-2.3.0.tgz#fd31865e66502071e411817e241465b3e9c372e2"
+  integrity sha512-H7oLPV0P7+jgvrk+6mwwwBDmxTaxnu9HMXmloNLXwnNO0ZxZ31Orah2n8lU1eMPvsaowP2CX+USCgyovXfdOFQ==
+
 through2@^2.0.0:
   version "2.0.5"
   resolved "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz#01c1e39eb31d07cb7d03a96a70823260b23132cd"
@@ -10438,6 +10666,11 @@ tslib@^1.9.0:
   resolved "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz#d7e4dd79245d85428c4d7e4822a79917954ca286"
   integrity sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==
 
+tsml@1.0.1:
+  version "1.0.1"
+  resolved "https://registry.yarnpkg.com/tsml/-/tsml-1.0.1.tgz#89f8218b9d9e257f47d7f6b56d01c5a4d2c68fc3"
+  integrity sha1-ifghi52eJX9H1/a1bQHFpNLGj8M=
+
 tty-browserify@0.0.0:
   version "0.0.0"
   resolved "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz#a157ba402da24e9bf957f9aa69d524eed42901a6"
@@ -10630,6 +10863,11 @@ url-parse@^1.4.3:
     querystringify "^2.1.1"
     requires-port "^1.0.0"
 
+url-toolkit@^2.1.3, url-toolkit@^2.2.1:
+  version "2.2.3"
+  resolved "https://registry.yarnpkg.com/url-toolkit/-/url-toolkit-2.2.3.tgz#78fa901215abbac34182066932220279b804522b"
+  integrity sha512-Da75SQoxsZ+2wXS56CZBrj2nukQ4nlGUZUP/dqUBG5E1su5GKThgT94Q00x81eVII7AyS1Pn+CtTTZ4Z0pLUtQ==
+
 url@^0.11.0:
   version "0.11.0"
   resolved "https://registry.npmjs.org/url/-/url-0.11.0.tgz#3838e97cfc60521eb73c525a8e55bfdd9e2e28f1"
@@ -10685,6 +10923,19 @@ uuid@^3.0.1, uuid@^3.3.2:
   resolved "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz#1b4af4955eb3077c501c23872fc6513811587131"
   integrity sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==
 
+v-runtime-template@^1.10.0:
+  version "1.10.0"
+  resolved "https://registry.yarnpkg.com/v-runtime-template/-/v-runtime-template-1.10.0.tgz#8ea7066c37cf4be5c701a06ca247e1afda89c4be"
+  integrity sha512-WLlq9jUepSfUrMEenw3mn7FDXX6hhbl11JjC1OKhwLzifHzVrY5a696TUHDPyj9jke3GGnR7b+2T3od/RL5cww==
+
+v-viewer@^1.6.4:
+  version "1.6.4"
+  resolved "https://registry.yarnpkg.com/v-viewer/-/v-viewer-1.6.4.tgz#39e36b534baab34076fb816704c6a734de0dc72f"
+  integrity sha512-LVkiUHpmsbsZXebeNXnu8krRCi5i2n07FeLFxoIVGhw8lVvTBO0ffpbDC6mLEuacCjrIh09HjIqpciwUtWE8lQ==
+  dependencies:
+    throttle-debounce "^2.0.1"
+    viewerjs "^1.5.0"
+
 validate-npm-package-license@^3.0.1:
   version "3.0.4"
   resolved "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz#fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a"
@@ -10721,6 +10972,118 @@ verror@1.10.0:
     core-util-is "1.0.2"
     extsprintf "^1.2.0"
 
+"video.js@^5.17.0 || ^6.2.0", "video.js@^5.19.1 || ^6.2.0", video.js@^6.6.0:
+  version "6.13.0"
+  resolved "https://registry.yarnpkg.com/video.js/-/video.js-6.13.0.tgz#f9487d46327340fa48ecd51372a2981dbb6cde4c"
+  integrity sha512-36/JR/GhPQSZj0o+GNbhcEYv/b0SkV9SQsjlodAnzMQYN0TA7VhmqrKPYMCi1NGRYu7S9W3OaFCFoUxkYfSVlg==
+  dependencies:
+    babel-runtime "^6.9.2"
+    global "4.3.2"
+    safe-json-parse "4.0.0"
+    tsml "1.0.1"
+    videojs-font "2.1.0"
+    videojs-ie8 "1.1.2"
+    videojs-vtt.js "0.12.6"
+    xhr "2.4.0"
+
+"video.js@^6 || ^7":
+  version "7.17.0"
+  resolved "https://registry.yarnpkg.com/video.js/-/video.js-7.17.0.tgz#35918cc03748a5680f5d5f1da410e06eeea7786e"
+  integrity sha512-8RbLu9+Pdpep9OTPncUHIvZXFgn/7hKdPnSTE/lGSnlFSucXtTUBp41R7NDwncscMLQ0WgazUbmFlvr4MNWMbA==
+  dependencies:
+    "@babel/runtime" "^7.12.5"
+    "@videojs/http-streaming" "2.12.0"
+    "@videojs/vhs-utils" "^3.0.3"
+    "@videojs/xhr" "2.6.0"
+    aes-decrypter "3.1.2"
+    global "^4.4.0"
+    keycode "^2.2.0"
+    m3u8-parser "4.7.0"
+    mpd-parser "0.19.2"
+    mux.js "5.14.1"
+    safe-json-parse "4.0.0"
+    videojs-font "3.2.0"
+    videojs-vtt.js "^0.15.3"
+
+videojs-contrib-hls@^5.12.2:
+  version "5.15.0"
+  resolved "https://registry.yarnpkg.com/videojs-contrib-hls/-/videojs-contrib-hls-5.15.0.tgz#fe4957367e5d68b7d23f78ed32e37a9dd892a0a8"
+  integrity sha512-18zbMYZ0XRBKTPEayA9bFTWWrqhT9b4G8+zf0czJLD7Epe5PcK1I/3dflTHQeQ5rwlWir+/XnFU3sMg/B2MMcw==
+  dependencies:
+    aes-decrypter "1.0.3"
+    global "^4.3.0"
+    m3u8-parser "2.1.0"
+    mux.js "4.3.2"
+    url-toolkit "^2.1.3"
+    video.js "^5.19.1 || ^6.2.0"
+    videojs-contrib-media-sources "4.7.2"
+    webwackify "0.1.6"
+
+videojs-contrib-media-sources@4.7.2:
+  version "4.7.2"
+  resolved "https://registry.yarnpkg.com/videojs-contrib-media-sources/-/videojs-contrib-media-sources-4.7.2.tgz#0adf929107d5b74cf2c8abb2824c82177e43858e"
+  integrity sha512-e6iCHWBFuV05EGo7v+pS9iepObXnJ9joms467gzi8ZjpKVb3ifha9M0Ja24Rd8JfvYpzjltsgDVtGFDvIg4hQQ==
+  dependencies:
+    global "^4.3.0"
+    mux.js "4.3.2"
+    video.js "^5.17.0 || ^6.2.0"
+    webwackify "0.1.6"
+
+videojs-flash@^2.1.0:
+  version "2.2.1"
+  resolved "https://registry.yarnpkg.com/videojs-flash/-/videojs-flash-2.2.1.tgz#1a225dbb1ced200ae9bbf15e01fe4a61086d90f1"
+  integrity sha512-mHu6TD12EKkxMvr8tg4AcfV/DuVLff427nneoZom3N9Dd2bv0sJOWwdLPQH1v5BCuAuXAVuAOba56ovTl+G3tQ==
+  dependencies:
+    global "^4.4.0"
+    video.js "^6 || ^7"
+    videojs-swf "5.4.2"
+
+videojs-font@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-2.1.0.tgz#a25930a67f6c9cfbf2bb88dacb8c6b451f093379"
+  integrity sha1-olkwpn9snPvyu4jay4xrRR8JM3k=
+
+videojs-font@3.2.0:
+  version "3.2.0"
+  resolved "https://registry.yarnpkg.com/videojs-font/-/videojs-font-3.2.0.tgz#212c9d3f4e4ec3fa7345167d64316add35e92232"
+  integrity sha512-g8vHMKK2/JGorSfqAZQUmYYNnXmfec4MLhwtEFS+mMs2IDY398GLysy6BH6K+aS1KMNu/xWZ8Sue/X/mdQPliA==
+
+videojs-hotkeys@^0.2.20:
+  version "0.2.27"
+  resolved "https://registry.yarnpkg.com/videojs-hotkeys/-/videojs-hotkeys-0.2.27.tgz#0df97952b9dff0e6cc1cf8a439fed7eac9c73f01"
+  integrity sha512-pwtm1QocRmzJy1PWQsmFVHyeldYHHpLdeATK3FsFHVMmNpz6CROkAn8TFy2UILr8Ghgq134K8jEKNue8HWpudQ==
+
+videojs-ie8@1.1.2:
+  version "1.1.2"
+  resolved "https://registry.yarnpkg.com/videojs-ie8/-/videojs-ie8-1.1.2.tgz#a23d3d8608ad7192b69c6077fc4eb848998d35d9"
+  integrity sha1-oj09hgitcZK2nGB3/E64SJmNNdk=
+  dependencies:
+    es5-shim "^4.5.1"
+
+videojs-swf@5.4.2:
+  version "5.4.2"
+  resolved "https://registry.yarnpkg.com/videojs-swf/-/videojs-swf-5.4.2.tgz#6964a9bff903b732f3e465314ae478a02a17e8ab"
+  integrity sha512-FGg+Csioa8/A/EacvFefBdb9Z0rSiMlheHDunZnN3xXfUF43jvjawcWFQnZvrv1Cs1nE1LBrHyUZjF7j2mKOLw==
+
+videojs-vtt.js@0.12.6:
+  version "0.12.6"
+  resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.12.6.tgz#e078600bda899eaa6f9c3307134cd0c811947b8e"
+  integrity sha512-XFXeGBQiljnElMhwCcZst0RDbZn2n8LU7ZScXryd3a00OaZsHAjdZu/7/RdSr7Z1jHphd45FnOvOQkGK4YrWCQ==
+  dependencies:
+    global "^4.3.1"
+
+videojs-vtt.js@^0.15.3:
+  version "0.15.3"
+  resolved "https://registry.yarnpkg.com/videojs-vtt.js/-/videojs-vtt.js-0.15.3.tgz#84260393b79487fcf195d9372f812d7fab83a993"
+  integrity sha512-5FvVsICuMRx6Hd7H/Y9s9GDeEtYcXQWzGMS+sl4UX3t/zoHp3y+isSfIPRochnTH7h+Bh1ILyC639xy9Z6kPag==
+  dependencies:
+    global "^4.3.1"
+
+viewerjs@^1.5.0:
+  version "1.10.2"
+  resolved "https://registry.yarnpkg.com/viewerjs/-/viewerjs-1.10.2.tgz#de16fa10668e4da6325969836a3264a046e3ef9a"
+  integrity sha512-v/4+OUF/71JthlvYuqfse+WGkMJO0LxvWiOLsAoxWw+RWjMdEBWn0ZQ5Mc+OhNIFd9uLhG62GzfFIplvix8odg==
+
 viser-vue@^2.4.6:
   version "2.4.6"
   resolved "https://registry.npm.taobao.org/viser-vue/download/viser-vue-2.4.6.tgz#4ee2731313f3d7c2b8091fb6aeebe9db61b84c4a"
@@ -10756,6 +11119,11 @@ vue-clipboard2@^0.2.1:
   dependencies:
     clipboard "^2.0.0"
 
+vue-cookies@^1.6.1:
+  version "1.7.4"
+  resolved "https://registry.yarnpkg.com/vue-cookies/-/vue-cookies-1.7.4.tgz#d241d0a0431da0795837651d10b4d73e7c8d3e8d"
+  integrity sha512-mOS5Btr8V9zvAtkmQ7/TfqJIropOx7etDAgBywPCmHjvfJl2gFbH2XgoMghleLoyyMTi5eaJss0mPN7arMoslA==
+
 vue-cropper@0.4.9:
   version "0.4.9"
   resolved "https://registry.npm.taobao.org/vue-cropper/download/vue-cropper-0.4.9.tgz#fe650f32516ecf29014bbd4a9079191c8dc5a5ae"
@@ -10830,10 +11198,10 @@ vue-quill-editor@^3.0.6:
     object-assign "^4.1.1"
     quill "^1.3.4"
 
-vue-ref@^1.0.4:
-  version "1.0.4"
-  resolved "https://registry.yarnpkg.com/vue-ref/-/vue-ref-1.0.4.tgz#c27862b15a2720cff6b792566d824d1c3ac53320"
-  integrity sha512-DDyR/HlHeeNSkEi4Uj/F/7rER9ma0lnqqx8j9uEhdh0UyBWUCI1HJnX01OjTpLMB4F4TZHlK/6H2I6lqq3QC3Q==
+vue-ref@^2.0.0:
+  version "2.0.0"
+  resolved "https://registry.yarnpkg.com/vue-ref/-/vue-ref-2.0.0.tgz#483084d732abed11da796778a8266a3af0ea1a9c"
+  integrity sha512-uKNKpFOVeWNqS2mrBZqnpLyXJo5Q+vnkex6JvpENvhXHFNBW/SJTP8vJywLuVT3DpxwXcF9N0dyIiZ4/NpTexQ==
 
 vue-router@^3.1.2:
   version "3.1.2"
@@ -10881,6 +11249,29 @@ vue-template-es2015-compiler@^1.6.0, vue-template-es2015-compiler@^1.9.0:
   resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825"
   integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw==
 
+vue-video-player@^5.0.2:
+  version "5.0.2"
+  resolved "https://registry.yarnpkg.com/vue-video-player/-/vue-video-player-5.0.2.tgz#34a42239ff304efc7698da20a4165051d766c1e6"
+  integrity sha512-IZXeRGGSX4YIp54G0Q5cB7iqh6Ok6Dpa2jRkjdyvMWw7MShJuh54/d5QNb1CZ+CvZUzX/TH7osnpir7mBNcFvQ==
+  dependencies:
+    object-assign "^4.1.1"
+    video.js "^6.6.0"
+    videojs-contrib-hls "^5.12.2"
+    videojs-flash "^2.1.0"
+    videojs-hotkeys "^0.2.20"
+
+vue2.0-zoom@^2.1.1:
+  version "2.1.1"
+  resolved "https://registry.yarnpkg.com/vue2.0-zoom/-/vue2.0-zoom-2.1.1.tgz#1dc03696355c6f88d9fe71ac805ba75f1a679436"
+  integrity sha512-6j1WFwjpRxnfHNSjBV5RwPQONCVhA7hydp3pZvVQYbwxaKCKxQfuHkuJK4qsQ4kfozSzV4zTSEJGOyMzZ59Zgw==
+  dependencies:
+    vue "^2.0"
+
+vue@^2.0:
+  version "2.6.14"
+  resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.14.tgz#e51aa5250250d569a3fbad3a8a5a687d6036e235"
+  integrity sha512-x2284lgYvjOMj3Za7kqzRcUSxBboHqtgRE2zlos1qWaOye5yUmHn42LB1250NJBLRwEcdrB0JRwyPTEPhfQjiQ==
+
 vue@^2.5.3:
   version "2.6.7"
   resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.7.tgz#254f188e7621d2d19ee28d0c0442c6d21b53ae2d"
@@ -10915,10 +11306,10 @@ wangeditor@^3.1.1:
   resolved "https://registry.npm.taobao.org/wangeditor/download/wangeditor-3.1.1.tgz#fbd3c1d4976923c9edebb85b29d30b35512ad039"
   integrity sha1-+9PB1JdpI8nt67hbKdMLNVEq0Dk=
 
-warning@^3.0.0:
-  version "3.0.0"
-  resolved "https://registry.yarnpkg.com/warning/-/warning-3.0.0.tgz#32e5377cb572de4ab04753bdf8821c01ed605b7c"
-  integrity sha1-MuU3fLVy3kqwR1O9+IIcAe1gW3w=
+warning@^4.0.0:
+  version "4.0.3"
+  resolved "https://registry.yarnpkg.com/warning/-/warning-4.0.3.tgz#16e9e077eb8a86d6af7d64aa1e05fd85b4678ca3"
+  integrity sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==
   dependencies:
     loose-envify "^1.0.0"
 
@@ -11109,6 +11500,11 @@ websocket-extensions@>=0.1.1:
   resolved "https://registry.npmjs.org/websocket-extensions/-/websocket-extensions-0.1.3.tgz#5d2ff22977003ec687a4b87073dfbbac146ccf29"
   integrity sha512-nqHUnMXmBzT0w570r2JpJxfiSD1IzoI+HGVdd3aZ0yNi3ngvQ4jv1dtHt5VGxfI2yj5yqImPhOK4vmIh2xMbGg==
 
+webwackify@0.1.6:
+  version "0.1.6"
+  resolved "https://registry.yarnpkg.com/webwackify/-/webwackify-0.1.6.tgz#1d42a12ac61823d7e345abde084eaaa62a4a95eb"
+  integrity sha512-pGcw1T3HpNnM/UTRQqqRkkkzythSLts05mB+7Gr00B+0VbL0m39dFL5g20rSIEUt9Wrpw+/8k+snxRlUFHhcqA==
+
 whatwg-encoding@^1.0.1, whatwg-encoding@^1.0.3:
   version "1.0.5"
   resolved "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz#5abacf777c32166a51d085d6b4f3e7d27113ddb0"
@@ -11249,6 +11645,16 @@ ws@^6.0.0:
   dependencies:
     async-limiter "~1.0.0"
 
+xhr@2.4.0:
+  version "2.4.0"
+  resolved "https://registry.yarnpkg.com/xhr/-/xhr-2.4.0.tgz#e16e66a45f869861eeefab416d5eff722dc40993"
+  integrity sha1-4W5mpF+GmGHu76tBbV7/ci3ECZM=
+  dependencies:
+    global "~4.3.0"
+    is-function "^1.0.1"
+    parse-headers "^2.0.0"
+    xtend "^4.0.0"
+
 xml-name-validator@^3.0.0:
   version "3.0.0"
   resolved "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz#6ae73e06de4d8c6e47f9fb181f78d648ad457c6a"
@@ -11374,3 +11780,8 @@ yorkie@^2.0.0:
     is-ci "^1.0.10"
     normalize-path "^1.0.0"
     strip-indent "^2.0.0"
+
+zrender@4.3.2:
+  version "4.3.2"
+  resolved "https://registry.yarnpkg.com/zrender/-/zrender-4.3.2.tgz#ec7432f9415c82c73584b6b7b8c47e1b016209c6"
+  integrity sha512-bIusJLS8c4DkIcdiK+s13HiQ/zjQQVgpNohtd8d94Y2DnJqgM1yjh/jpDb8DoL6hd7r8Awagw8e3qK/oLaWr3g==