Просмотр исходного кода

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

lilei 3 лет назад
Родитель
Сommit
6d1ffc1f06
100 измененных файлов с 1983 добавлено и 806 удалено
  1. 2 0
      package.json
  2. 99 0
      src/api/merchant.js
  3. 107 0
      src/api/shelf.js
  4. 113 0
      src/api/shelfRecall.js
  5. 104 0
      src/api/shelfReplenish.js
  6. BIN
      src/assets/lightMaxLogo.png
  7. BIN
      src/assets/lightMiniLogo.png
  8. BIN
      src/assets/logo1.png
  9. 36 8
      src/components/Menu/SideMenu.vue
  10. 2 2
      src/components/MultiTab/MultiTab.vue
  11. 3 111
      src/components/PageHeader/PageHeader.vue
  12. 1 0
      src/components/Select/index.js
  13. 1 1
      src/components/SettingDrawer/SettingDrawer.vue
  14. 72 18
      src/components/Table/index.js
  15. 10 1
      src/components/global.less
  16. 1 1
      src/components/index.less
  17. 5 2
      src/components/tools/Logo.vue
  18. 417 105
      src/config/router.config.js
  19. 27 19
      src/layouts/BasicLayout.vue
  20. 3 1
      src/layouts/BlankLayout.vue
  21. 6 70
      src/layouts/PageView.vue
  22. 27 0
      src/libs/JGPrint.js
  23. 9 3
      src/libs/tools.js
  24. 8 1
      src/main.js
  25. 2 1
      src/store/getters.js
  26. 6 2
      src/store/modules/app.js
  27. 76 2
      src/utils/mixin.js
  28. 60 19
      src/utils/request.js
  29. 58 16
      src/views/Home.vue
  30. 3 0
      src/views/allocationManagement/chainTransferIn/detail.vue
  31. 5 2
      src/views/allocationManagement/chainTransferIn/edit.vue
  32. 7 0
      src/views/allocationManagement/chainTransferIn/list.vue
  33. 2 0
      src/views/allocationManagement/chainTransferOut/basicInfoModal.vue
  34. 3 0
      src/views/allocationManagement/chainTransferOut/detail.vue
  35. 8 5
      src/views/allocationManagement/chainTransferOut/edit.vue
  36. 3 0
      src/views/allocationManagement/chainTransferOut/list.vue
  37. 3 1
      src/views/allocationManagement/storeTransferOut/basicInfoModal.vue
  38. 3 0
      src/views/allocationManagement/storeTransferOut/detail.vue
  39. 7 4
      src/views/allocationManagement/storeTransferOut/edit.vue
  40. 3 0
      src/views/allocationManagement/storeTransferOut/list.vue
  41. 3 1
      src/views/allocationManagement/warehouseAllocation/basicInfoModal.vue
  42. 3 0
      src/views/allocationManagement/warehouseAllocation/detail.vue
  43. 8 5
      src/views/allocationManagement/warehouseAllocation/edit.vue
  44. 3 0
      src/views/allocationManagement/warehouseAllocation/list.vue
  45. 2 0
      src/views/basicData/bulkPartsTypeManagement/editModal.vue
  46. 3 0
      src/views/basicData/bulkPartsTypeManagement/list.vue
  47. 2 0
      src/views/basicData/customerTypeManagement/editModal.vue
  48. 3 0
      src/views/basicData/customerTypeManagement/list.vue
  49. 2 0
      src/views/basicData/expenseType/editModal.vue
  50. 3 0
      src/views/basicData/expenseType/list.vue
  51. 2 0
      src/views/basicData/storeTransferOutTypeManagement/editModal.vue
  52. 3 0
      src/views/basicData/storeTransferOutTypeManagement/list.vue
  53. 3 0
      src/views/bulkManagement/bulkImport/list.vue
  54. 2 0
      src/views/bulkManagement/bulkReturnGoods/basicInfoModal.vue
  55. 2 0
      src/views/bulkManagement/bulkReturnGoods/detailModal.vue
  56. 7 4
      src/views/bulkManagement/bulkReturnGoods/edit.vue
  57. 8 5
      src/views/bulkManagement/bulkReturnGoods/grabEdit.vue
  58. 3 0
      src/views/bulkManagement/bulkReturnGoods/list.vue
  59. 23 21
      src/views/bulkManagement/bulkWarehousingOrder/basicInfoModal.vue
  60. 3 0
      src/views/bulkManagement/bulkWarehousingOrder/detail.vue
  61. 3 0
      src/views/bulkManagement/bulkWarehousingOrder/edit.vue
  62. 3 0
      src/views/bulkManagement/bulkWarehousingOrder/list.vue
  63. 111 0
      src/views/common/commonModal.vue
  64. 11 0
      src/views/common/custList.vue
  65. 98 0
      src/views/common/productJqList.vue
  66. 88 0
      src/views/common/shelfList.vue
  67. 59 0
      src/views/common/shelfSettleType.js
  68. 2 0
      src/views/customerManagement/customerInfo/edit.vue
  69. 3 0
      src/views/customerManagement/customerInfo/list.vue
  70. 3 0
      src/views/financialManagement/companyCollectionPayment/detail.vue
  71. 3 0
      src/views/financialManagement/companyCollectionPayment/list.vue
  72. 23 51
      src/views/financialManagement/companyReceivablePayable/chooseBillModal.vue
  73. 3 0
      src/views/financialManagement/companyReceivablePayable/collectionPayment.vue
  74. 4 1
      src/views/financialManagement/companyReceivablePayable/detail.vue
  75. 3 0
      src/views/financialManagement/companyReceivablePayable/list.vue
  76. 3 1
      src/views/financialManagement/expenseManagement/edit.vue
  77. 3 0
      src/views/financialManagement/expenseManagement/list.vue
  78. 18 67
      src/views/financialManagement/financialCollection/list.vue
  79. 18 67
      src/views/financialManagement/financialPayment/list.vue
  80. 3 0
      src/views/financialManagement/inventoryCheckAudit/list.vue
  81. 3 0
      src/views/financialManagement/ledgerRecord/list.vue
  82. 3 0
      src/views/financialManagement/warehousingAudit/detail.vue
  83. 3 0
      src/views/financialManagement/warehousingAudit/list.vue
  84. 2 0
      src/views/financialManagement/withdrawalManagement/cashOutModal.vue
  85. 3 0
      src/views/financialManagement/withdrawalManagement/list.vue
  86. 2 0
      src/views/inventoryManagement/inventoryChecking/basicInfoModal.vue
  87. 4 2
      src/views/inventoryManagement/inventoryChecking/detailModal.vue
  88. 4 1
      src/views/inventoryManagement/inventoryChecking/list.vue
  89. 5 2
      src/views/inventoryManagement/inventoryChecking/makeInventory.vue
  90. 5 2
      src/views/inventoryManagement/inventoryChecking/overall.vue
  91. 2 0
      src/views/inventoryManagement/inventoryChecking/printModal.vue
  92. 29 97
      src/views/inventoryManagement/inventoryChecking/selfDisk.vue
  93. 3 0
      src/views/inventoryManagement/inventoryImport/list.vue
  94. 2 0
      src/views/inventoryManagement/inventoryQuery/detailModal.vue
  95. 4 1
      src/views/inventoryManagement/inventoryQuery/list.vue
  96. 3 0
      src/views/inventoryManagement/inventoryQuery/warehouseDetail.vue
  97. 47 83
      src/views/inventoryManagement/inventoryWarning/list.vue
  98. 2 0
      src/views/inventoryManagement/satelliteWarehouseInventory/addModal.vue
  99. 3 0
      src/views/inventoryManagement/satelliteWarehouseInventory/list.vue
  100. 2 0
      src/views/inventoryManagement/warehouse/editModal.vue

+ 2 - 0
package.json

@@ -35,11 +35,13 @@
     "vue-cookies": "^1.6.1",
     "vue-cropper": "0.4.9",
     "vue-ls": "^3.2.1",
+    "vue-qr": "^3.2.2",
     "vue-quill-editor": "^3.0.6",
     "vue-router": "^3.1.2",
     "vue-svg-component-runtime": "^1.0.1",
     "vue-video-player": "^5.0.2",
     "vue2.0-zoom": "^2.1.1",
+    "vuescroll": "^4.17.3",
     "vuex": "^3.1.1",
     "wangeditor": "^3.1.1"
   },

+ 99 - 0
src/api/merchant.js

@@ -0,0 +1,99 @@
+import { axios } from '@/utils/request'
+
+//  提现列表  有分页
+export const queryMerchantCashOutPage = (params) => {
+  const url = `/merchant/queryMerchantCashOutPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  申请提现
+export const saveMerchantCashOut = (params) => {
+  return axios({
+    url: '/merchant/saveMerchantCashOut',
+    data: params,
+    method: 'post'
+  })
+}
+// 账户明细
+export const queryTradeFlowPage = (params) => {
+  const url = `/merchant/queryTradeFlowPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+export const merchantCashOut = params => {
+  return axios({
+    url: `/shelf/findShelfSettleRuleByShelfSn/${params.shelfSn}`,
+    method: 'get'
+  })
+}
+export const merchantCashOutDetail = (params) => {
+  return axios({
+    url: '/merchant/queryMerchantAccount',
+    data: {},
+    method: 'get'
+  })
+}
+
+// 结算管理列表
+export const queryShelfSettleRulePage = (params) => {
+  const url = `/merchant/queryShelfSettleRulePage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 结算管理合计
+export const queryShelfSettleRuleCount = (params) => {
+  const url = `/merchant/queryShelfSettleRuleCount`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 结算历史列表
+export const querySettleBillPage = (params) => {
+  const url = `/merchant/querySettleBillPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 待结明细列表
+export const queryOrderBillDetailPage = (params) => {
+  const url = `/merchant/queryOrderBillDetailPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 待结明细合计
+export const queryOrderBillDetailCount = (params) => {
+  const url = `/merchant/queryOrderBillDetailCount`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 107 - 0
src/api/shelf.js

@@ -0,0 +1,107 @@
+import { axios } from '@/utils/request'
+
+// 货架 列表  分页
+export const shelfList = (params) => {
+  const url = `/shelf/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  货架  详情
+export const shelfDetail = (params) => {
+  return axios({
+    url: `/shelf/queryBySn/${params.sn}`,
+    data: params,
+    method: 'post'
+  })
+}
+//  货架  保存
+export const shelfSave = (params) => {
+  return axios({
+    url: `/shelf/save`,
+    data: params,
+    method: 'post'
+  })
+}
+//  货架  货位产品 列表 不分页
+export const shelfProductList = (params) => {
+  return axios({
+    url: `/shelf/placeProduct/queryList`,
+    data: params,
+    method: 'post'
+  })
+}
+//  货架  货位产品 详情
+export const shelfProductDetail = (params) => {
+  return axios({
+    url: `/shelf/placeProduct/queryByPlaceSn/${params.shelfPlaceSn}`,
+    data: params,
+    method: 'get'
+  })
+}
+//  货架  货位产品 保存
+export const shelfProductSave = (params) => {
+  return axios({
+    url: `/shelf/placeProduct/save`,
+    data: params,
+    method: 'post'
+  })
+}
+// 货架  货位产品 下载模板
+export const shelfProductDownload = params => {
+  return axios.request({
+    url: `/shelf/placeProduct/downloadExcel/${params.shelfSn}`,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 货架  货位产品  解析导入的文件
+export const shelfProductParseProducts = params => {
+  return axios({
+    url: '/shelf/placeProduct/readExcel',
+    data: params,
+    method: 'post'
+  })
+}
+// 货架  货位产品  批量插入
+export const shelfProductBatchInsert = params => {
+  return axios({
+    url: '/shelf/placeProduct/saveBatchExcel',
+    data: params,
+    method: 'post'
+  })
+}
+// 货架 箭冠产品  分页
+export const shelfDealerProductList = (params) => {
+  const url = `/product/queryPageForXPRH/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  货架监控 列表 不分页
+export const shelfControlList = (params) => {
+  return axios({
+    url: `/shelf/control/queryList`,
+    data: params,
+    method: 'post'
+  })
+}
+// 货架监控 出入库明细  分页
+export const shelfPutOutDetailList = (params) => {
+  const url = `/shelf/placeProduct/queryStockPutOutDetailPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 113 - 0
src/api/shelfRecall.js

@@ -0,0 +1,113 @@
+import { axios } from '@/utils/request'
+
+// 调回单列表
+export const shelfRecallList = (params) => {
+  const url = `/shelfRecall/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  调回单详情列表
+export const shelfRecallDetailList = (params) => {
+  const url = 'shelfRecall/detail/queryList'
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  确认退库
+export const warehouseCascadeList = (params) => {
+  const url = '/shelfRecall/confirm'
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 取消调回单
+export const shelfRecallCancel = params => {
+  return axios({
+    url: '/shelfRecall/cancel',
+    data: params,
+    method: 'post'
+  })
+}
+// 保存 调回单
+export const shelfRecallSave = params => {
+  return axios({
+    url: '/shelfRecall/insert',
+    data: params,
+    method: 'post'
+  })
+}
+// 查询不同状态的数据条数
+export const shelfRecallStateCount = (params) => {
+  return axios({
+    url: '/shelfRecall/queryStateCount',
+    data: params,
+    method: 'post'
+  })
+}
+// 获取调回单详情
+export const shelfRecallDetail = params => {
+  return axios({
+    url: `/shelfRecall/findBySn/${params.recallSn}`,
+    method: 'get'
+  })
+}
+
+// 调回入库列表
+export const recallStockList = (params) => {
+  const url = `/shelfRecall/queryStockPutPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 调回入库信息
+export const recallrStockDetail = params => {
+  return axios({
+    url: `/stockPut/findBySn/${params.stockPutSn}`,
+    method: 'get'
+  })
+}
+// 调回单入库明细列表
+export const recallrStockDetailList = params => {
+  return axios({
+    url: `/stockPut/detail/query`,
+    data: params,
+    method: 'post'
+  })
+}
+// 修改仓库仓位
+export const updateSelective = (params) => {
+  return axios({
+    url: '/stockPut/detail/updateSelective',
+    data: params,
+    method: 'post'
+  })
+}
+// 确认入库
+export const confirmPutStock = (params) => {
+  return axios({
+    url: '/shelfRecall/confirmPutStock',
+    data: params,
+    method: 'post'
+  })
+}
+// 待入库数量
+export const stockPutCount = params => {
+  return axios({
+    url: '/shelfRecall/queryStockPutCount',
+    data: params,
+    method: 'post'
+  })
+}

+ 104 - 0
src/api/shelfReplenish.js

@@ -0,0 +1,104 @@
+import { axios } from '@/utils/request'
+
+//  补货单列表  有分页
+export const shelfReplenishList = (params) => {
+  const url = `/shelfReplenish/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 明细列表 不分页
+export const shelfReplenishDetailList = (params) => {
+  return axios({
+    url: '/shelfReplenish/detail/queryList',
+    data: params,
+    method: 'post'
+  })
+}
+// 出库单详情列表
+export const queryListForOutStock = (params) => {
+  return axios({
+    url: '/shelfReplenish/detail/queryListForOutStock',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 取消补货单
+export const shelfReplenishCancel = (params) => {
+  return axios({
+    url: '/shelfReplenish/cancel',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 查询每个状态的数据条数
+export const shelfReplenishStateCount = (params) => {
+  return axios({
+    url: '/shelfReplenish/queryStateCount',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 确认补货
+export const shelfReplenishConfirm = (params) => {
+  return axios({
+    url: '/shelfReplenish/confirm',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 检查补货单库存数量
+export const shelfReplenishDetailStock = (params) => {
+  return axios({
+    url: '/shelfReplenish/detail/checkDetailStockQty',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单  详情
+export const shelfReplenishDetail = (params) => {
+  const url = `/shelfReplenish/findBySn/${params.sn}`
+  delete params.sn
+  return axios({
+    url: url,
+    data: params,
+    method: 'get'
+  })
+}
+//  补货单 入库
+export const shelfReplenishPutStock = (params) => {
+  return axios({
+    url: '/shelfReplenish/putStock',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 出库
+export const shelfReplenishOutStock = (params) => {
+  return axios({
+    url: '/shelfReplenish/outStock',
+    data: params,
+    method: 'post'
+  })
+}
+//  补货单 打印贴签
+export const shelfReplenishPrintSign = (params) => {
+  return axios({
+    url: '/shelfReplenish/detail/printSign',
+    data: params,
+    method: 'post'
+  })
+}
+
+// 定时任务
+export const shelfReplenishTaskInsertBill = (params) => {
+  return axios({
+    url: '/shelfReplenish/taskInsertBill',
+    data: params,
+    method: 'post'
+  })
+}

BIN
src/assets/lightMaxLogo.png


BIN
src/assets/lightMiniLogo.png


BIN
src/assets/logo1.png


+ 36 - 8
src/components/Menu/SideMenu.vue

@@ -5,14 +5,16 @@
     :collapsible="collapsible"
     v-model="collapsed"
     :trigger="null">
-    <logo />
-    <s-menu
-      :collapsed="collapsed"
-      :menu="menus"
-      :theme="theme"
-      :mode="mode"
-      @select="onSelect"
-      style="padding: 10px 0px;"></s-menu>
+    <vue-scroll :ops="ops" style="width:100%;height:100%">
+      <logo />
+      <s-menu
+        :collapsed="collapsed"
+        :menu="menus"
+        :theme="theme"
+        :mode="mode"
+        @select="onSelect"
+        style="padding: 10px 0px;"></s-menu>
+    </vue-scroll>
   </a-layout-sider>
 
 </template>
@@ -52,6 +54,24 @@ export default {
       required: true
     }
   },
+  data () {
+    return {
+      ops: {
+        vuescroll: {},
+        scrollPanel: {},
+        rail: {
+          keepShow: true
+        },
+        bar: {
+          hoverStyle: true,
+          onlyShowBarOnScroll: false, // 是否只有滚动的时候才显示滚动条
+          background: this.navTheme == 'dark' ? '#00557f' : '#9d9d9d', // 滚动条颜色
+          opacity: 0.5, // 滚动条透明度
+          'overflow-x': 'hidden'
+        }
+      }
+    }
+  },
   methods: {
     onSelect (obj) {
       this.$emit('menuSelect', obj)
@@ -59,3 +79,11 @@ export default {
   }
 }
 </script>
+<style lang="less">
+  /deep/.__bar-is-vertical {
+    right: -1px !important;
+  }
+  /deep/.__bar-is-horizontal {
+    display: none !important;
+  }
+</style>

+ 2 - 2
src/components/MultiTab/MultiTab.vue

@@ -65,7 +65,7 @@ export default {
       if (!this.tabsList.includes(this.activeKey)) {
         this.selectedLastPath()
       }
-      this.$store.state.app.isCloseTab = true
+      this.$store.state.app.closeTabPages.push(targetKey)
     },
     selectedLastPath () {
       this.activeKey = this.tabsList[this.tabsList.length - 1]
@@ -203,6 +203,7 @@ export default {
           } else {
             // this.$message.info('您当前打开窗口太多,请关闭一些,窗口不能超过' + this.maxTabNums + '个')
             const _this = this
+            this.$store.state.app.closeTabPages.push(newVal.name)
             this.$warning({
               title: '提示',
               content: '您当前打开窗口太多,请关闭一些,窗口不能超过' + this.maxTabNums + '个',
@@ -221,7 +222,6 @@ export default {
         }
         this.activeKey = newVal.name
       }
-      this.$store.state.app.isCloseTab = false
     },
     activeKey: function (newPathKey) {
       const pages = this.pages.find(item => item.name == newPathKey)

+ 3 - 111
src/components/PageHeader/PageHeader.vue

@@ -1,32 +1,7 @@
 <template>
   <div class="page-header">
     <div class="page-header-index-wide">
-      <!-- <s-breadcrumb /> -->
-      <div class="detail">
-        <div class="main" v-if="!$route.meta.hiddenHeaderContent">
-          <!-- <div class="row">
-            <img v-if="logo" :src="logo" class="logo"/>
-            <h1 v-if="title" class="title">{{ title }}</h1>
-            <div class="action">
-              <slot name="action"></slot>
-            </div>
-          </div> -->
-          <div class="row">
-            <div v-if="avatar" class="avatar">
-              <a-avatar :src="avatar" />
-            </div>
-            <div v-if="this.$slots.content" class="headerContent">
-              <slot name="content"></slot>
-            </div>
-            <div v-if="this.$slots.extra" class="extra">
-              <slot name="extra"></slot>
-            </div>
-          </div>
-          <div>
-            <slot name="pageMenu"></slot>
-          </div>
-        </div>
-      </div>
+      <s-breadcrumb />
     </div>
   </div>
 </template>
@@ -63,92 +38,9 @@ export default {
 
 <style lang="less" scoped>
 .page-header {
-  background: #fff;
-  padding: 16px 32px 0;
-  border-bottom: 1px solid #e8e8e8;
-
+  padding: 0 15px 0;
   .breadcrumb {
-    margin-bottom: 16px;
-  }
-
-  .detail {
-    display: flex;
-    /*margin-bottom: 16px;*/
-
-    .avatar {
-      flex: 0 1 72px;
-      margin: 0 24px 8px 0;
-
-      & > span {
-        border-radius: 72px;
-        display: block;
-        width: 72px;
-        height: 72px;
-      }
-    }
-
-    .main {
-      width: 100%;
-      flex: 0 1 auto;
-
-      .row {
-        display: flex;
-        width: 100%;
-
-        .avatar {
-          margin-bottom: 16px;
-        }
-      }
-
-      .title {
-        font-size: 20px;
-        font-weight: 500;
-
-        font-size: 20px;
-        line-height: 28px;
-        font-weight: 500;
-        color: rgba(0, 0, 0);
-        margin-bottom: 16px;
-        flex: auto;
-      }
-      .logo {
-        width: 28px;
-        height: 28px;
-        border-radius: 4px;
-        margin-right: 16px;
-      }
-      .content,
-      .headerContent {
-        flex: auto;
-        color: rgba(0, 0, 0, 0.45);
-        line-height: 22px;
-
-        .link {
-          margin-top: 16px;
-          line-height: 24px;
-
-          a {
-            font-size: 14px;
-            margin-right: 32px;
-          }
-        }
-      }
-      .extra {
-        flex: 0 1 auto;
-        margin-left: 88px;
-        min-width: 242px;
-        text-align: right;
-      }
-      .action {
-        margin-left: 56px;
-        min-width: 266px;
-        flex: 0 1 auto;
-        text-align: right;
-        &:empty {
-          display: none;
-        }
-      }
-    }
+    margin-bottom: 0;
   }
 }
 

+ 1 - 0
src/components/Select/index.js

@@ -43,6 +43,7 @@ export default {
       if (res.status == 200) {
         _this.dataList = res.data.list
       }
+      _this.$emit("loadDataFinish",_this.dataList)
     })
   },
   methods: {

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

@@ -1,5 +1,5 @@
 <template>
-  <div class="setting-drawer" ref="settingDrawer">
+  <div class="setting-drawer" v-if="false" ref="settingDrawer">
     <a-drawer
       width="300"
       placement="right"

+ 72 - 18
src/components/Table/index.js

@@ -18,6 +18,10 @@ export default {
       type: [String, Function],
       default: 'key'
     },
+    rowKeyName: { // 多选时,唯一标识键名
+      type: String,
+      default: 'id'
+    },
     rowClassName: {
       type: [String, Function],
       default: ''
@@ -56,11 +60,6 @@ export default {
       type: Object,
       default: null
     },
-    /** @Deprecated */
-    showAlertInfo: {
-      type: Boolean,
-      default: false
-    },
     showPagination: {
       type: String | Boolean,
       default: 'auto'
@@ -148,6 +147,7 @@ export default {
     },
     // 重置表格为空
     clearTable () {
+      this.localLoading = false
       this.localDataSource = []
       this.localPagination = Object.assign({}, {
         current: 1, pageSize: this.pageSize, total: 0
@@ -216,6 +216,8 @@ export default {
           }
           this.localDataSource = list // 返回结果中的数组数据
           this.localLoading = false
+        }).catch(err => {
+          this.clearTable()
         })
       }
     },
@@ -237,26 +239,73 @@ 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
+      }
+      console.log(obj)
+      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 arrIds = []
+        changeRows.map((item, index) => {
+          arrIds.push(item[this.rowKeyName])
+        })
+        const arrs = []
+        this.selectedRows.map((item, index) => {
+          if (arrIds.indexOf(item[this.rowKeyName]) == -1) {
+            arrs.push(item)
+          }
+        })
+        this.selectedRows = arrs
+      }
+      this.updateSelect()
+    },
+    // 设置 table 已选中项
+    setTableSelected (selectedRowKeys, selectedRows) {
+      this.selectedRows = selectedRows
+      this.selectedRowKeys = selectedRowKeys
+      this.updateSelect()
     },
     /**
      * 清空 table 已选中项
      */
     clearSelected () {
       if (this.rowSelection) {
-        this.rowSelection.onChange([], [])
-        this.updateSelect([], [])
+        // this.rowSelection.onChange([], [])
+        // this.updateSelect([], [])
+        this.selectedRows = []
+        this.selectedRowKeys = []
+        this.updateSelect()
       }
     },
     /**
@@ -298,6 +347,9 @@ export default {
           </template>
         </a-alert>
       )
+    },
+    expandFun (expanded, record) {
+      this.$emit('expand', expanded, record)
     }
   },
 
@@ -305,7 +357,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)) {
@@ -313,16 +364,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]
@@ -336,11 +390,11 @@ export default {
       return props[k]
     })
     if (!this.isSucceed) { // 请求失败
-      props['locale'] = { emptyText: '网络异常,请点击按钮刷新' }
+      props['locale'] = { emptyText: '暂时无法获取数据,请刷新页面重试' }
     }
     // isSucceed
     const table = (
-      <a-table {...{ props, scopedSlots: { ...this.$scopedSlots } }} onChange={this.loadData}>
+      <a-table {...{ props, scopedSlots: { ...this.$scopedSlots } }} onChange={this.loadData} onExpand={this.expandFun}>
         { Object.keys(this.$slots).map(name => (<template slot={name}>{this.$slots[name]}</template>)) }
       </a-table>
     )

+ 10 - 1
src/components/global.less

@@ -450,7 +450,14 @@ body {
     .logo{
       // padding-left: 20px;
     }
+    .ant-menu-inline-collapsed > .ant-menu-item .anticon,
+    .ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-item .anticon, 
+    .ant-menu-inline-collapsed > .ant-menu-item-group > .ant-menu-item-group-list > .ant-menu-submenu > .ant-menu-submenu-title .anticon, 
+    .ant-menu-inline-collapsed > .ant-menu-submenu > .ant-menu-submenu-title .anticon{
+      font-size: 18px;
+    }
   }
+  
   &.light {
     background-color: #fff;
     box-shadow: 2px 0px 8px 0px rgba(29, 35, 41, 0.05);
@@ -463,7 +470,9 @@ body {
         color: unset;
       }
     }
-
+    .ant-menu:not(.ant-menu-horizontal) .ant-menu-item-selected{
+      background-color: #eef5ff;
+    }
     .ant-menu-light {
       border-right-color: transparent;
     }

+ 1 - 1
src/components/index.less

@@ -394,7 +394,7 @@
     padding: 3px 0 5px 38px!important;
   }
   .ant-collapse-content-box{
-    padding: 10px 10px 0!important;
+    padding: 10px 10px 5px!important;
     .ant-descriptions-item{
       padding-bottom: 8px!important;
     }

+ 5 - 2
src/components/tools/Logo.vue

@@ -12,6 +12,8 @@
 <script>
 import LogoMax from '@/assets/normalbtn_login.png'
 import LogoMin from '@/assets/selectedbtn_login.png'
+import LogoLightMax from '@/assets/lightMaxLogo.png'
+import LogoLightMin from '@/assets/lightMiniLogo.png'
 import { mapState } from 'vuex'
 export default {
   name: 'Logo',
@@ -38,10 +40,11 @@ export default {
   },
   computed: {
 	  ...mapState({
-		  sidebar: state => state.app.sidebar
+		  sidebar: state => state.app.sidebar,
+      navTheme: state => state.app.theme
 	  }),
 	 logo () {
-      return this.sidebar ? LogoMax : LogoMin
+      return this.sidebar ? (this.navTheme == 'light' ? LogoLightMax : LogoMax) : (this.navTheme == 'light' ? LogoLightMin : LogoMin)
 	 }
   }
 }

+ 417 - 105
src/config/router.config.js

@@ -29,48 +29,50 @@ export const asyncRouterMap = [
           {
             path: '/home',
             name: 'home',
-            component: () => import(/* webpackChunkName: "home" */ '@/views/Home'),
+            redirect: '/home',
+            component: BlankLayout,
             meta: {
               title: '首页',
               icon: 'home',
-              hide: true
-            }
+              hidden: true
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: '/home',
+                name: 'home',
+                component: () => import(/* webpackChunkName: "home" */ '@/views/Home'),
+                meta: {
+                  title: '首页',
+                  icon: 'home',
+                  hidden: true
+                }
+              },
+              {
+                path: '/changePwd',
+                name: 'changePwd',
+                component: () => import(/* webpackChunkName: "home" */ '@/views/user/ChangePwd'),
+                meta: {
+                  title: '修改密码',
+                  icon: 'home'
+                },
+                hidden: true
+              },
+              // 公告
+              {
+                path: '/notice',
+                name: 'notice',
+                component: () => import(/* webpackChunkName: "home" */ '@/views/notice/list'),
+                meta: {
+                  title: '公告',
+                  icon: 'bell',
+                  hidden: true
+                }
+              }
+            ]
           }
         ]
       },
-      {
-        path: '/changePwd',
-        name: 'changePwd',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/user/ChangePwd'),
-        meta: {
-          title: '修改密码',
-          icon: 'home'
-        },
-        hidden: true
-      },
-      // 新品列表-下线产品
-      {
-        path: '/newProduct/list/:onlineFalg',
-        name: 'newProductList',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/productManagement/newProduct/list'),
-        meta: {
-          title: '新品信息',
-          icon: 'home'
-        },
-        hidden: true
-      },
-      // 产品详情
-      {
-        path: '/viewProduct/:sn',
-        name: 'viewProduct',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/productManagement/newProduct/detail'),
-        meta: {
-          title: '产品详情',
-          icon: 'home',
-          replaceTab: true
-        },
-        hidden: true
-      },
       // 销售管理
       {
         path: '/salesManagement',
@@ -88,7 +90,7 @@ export const asyncRouterMap = [
             name: 'salesQuery',
             component: BlankLayout,
             meta: {
-              title: '销售单查询',
+              title: '销售单',
               icon: 'monitor',
               permission: 'M_salesQueryList'
             },
@@ -311,6 +313,279 @@ export const asyncRouterMap = [
           }
         ]
       },
+      // 数字货架
+      {
+        path: '/numsGoodsShelves',
+        redirect: '/numsGoodsShelves/settlementManagement',
+        component: PageView,
+        meta: {
+          title: '数字货架',
+          icon: 'hdd',
+          permission: 'M_numsGoodsShelves'
+        },
+        children: [
+          {
+            path: '/numsGoodsShelves/shelfSet',
+            redirect: '/numsGoodsShelves/shelfSet/list',
+            name: 'shelfSet',
+            component: BlankLayout,
+            meta: {
+              title: '货架设置',
+              icon: 'monitor',
+              permission: 'M_shelfSet'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'shelfSetList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/shelfSet/list.vue'),
+                meta: {
+                  title: '货架设置列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'set/:sn',
+                name: 'shelfSetting',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/shelfSet/set.vue'),
+                meta: {
+                  title: '货架设置',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/shelfMonitoring',
+            redirect: '/numsGoodsShelves/shelfMonitoring/list',
+            name: 'shelfMonitoring',
+            component: BlankLayout,
+            meta: {
+              title: '货架监控',
+              icon: 'monitor',
+              permission: 'M_shelfMonitoring'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'shelfMonitoringList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/shelfMonitoring/list.vue'),
+                meta: {
+                  title: '货架监控列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'warehouseDetail/:shelfPlaceSn/:productSn',
+                name: 'shelfMonitoringWarehouseDetail',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/shelfMonitoring/warehouseDetail.vue'),
+                meta: {
+                  title: '货架监控出入库明细',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/replenishmentManagement',
+            redirect: '/numsGoodsShelves/replenishmentManagement/list',
+            name: 'replenishmentManagement',
+            component: BlankLayout,
+            meta: {
+              title: '补货管理',
+              icon: 'monitor',
+              permission: 'M_replenishmentManagement'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'replenishmentManagementList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/replenishmentManagement/list.vue'),
+                meta: {
+                  title: '补货管理列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/recallManagement',
+            redirect: '/numsGoodsShelves/recallManagement/list',
+            name: 'recallManagement',
+            component: BlankLayout,
+            meta: {
+              title: '调回管理',
+              icon: 'monitor',
+              permission: 'M_recallManagement'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'recallManagementList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/recallManagement/list.vue'),
+                meta: {
+                  title: '调回管理列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/settlementManagement',
+            redirect: '/numsGoodsShelves/settlementManagement/list',
+            name: 'settlementManagement',
+            component: BlankLayout,
+            meta: {
+              title: '结算管理',
+              icon: 'monitor',
+              permission: 'M_settlementManagement'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'settlementManagementList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/settlementManagement/list.vue'),
+                meta: {
+                  title: '结算管理列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'unDetail/:shelfSn/:settleType/:shelfName',
+                name: 'unSettlementDetail',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/numsGoodsShelves/settlementManagement/unSettlementDetail.vue'),
+                meta: {
+                  title: '待结算明细',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true
+                  // permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'detail/:shelfSn/:shelfName',
+                name: 'settlementDetail',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/numsGoodsShelves/settlementManagement/settlementDetail.vue'),
+                meta: {
+                  title: '结算历史',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/withdrawalManagement',
+            redirect: '/numsGoodsShelves/withdrawalManagement/list',
+            name: 'withdrawalManagement',
+            component: BlankLayout,
+            meta: {
+              title: '提现管理',
+              icon: 'monitor',
+              permission: 'M_withdrawalManagement'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'withdrawalManagementList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/withdrawalManagement/list.vue'),
+                meta: {
+                  title: '提现管理列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/recallStockManagement',
+            redirect: '/numsGoodsShelves/recallStockManagement/list',
+            name: 'recallStockManagement',
+            component: BlankLayout,
+            meta: {
+              title: '调回入库',
+              icon: 'monitor',
+              permission: 'M_recallStockManagement'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'recallStockManagementList',
+                component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/recallStockManagement/list.vue'),
+                meta: {
+                  title: '调回入库列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'editStock/:stockPutSn',
+                name: 'editStock',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/numsGoodsShelves/recallStockManagement/editStock.vue'),
+                meta: {
+                  title: '编辑入库',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true
+                  // permission: 'M_salesQueryList'
+                }
+              }
+            ]
+          }
+          // {
+          //   path: '/numsGoodsShelves/accountManagement',
+          //   redirect: '/numsGoodsShelves/accountManagement/list',
+          //   name: 'accountManagement',
+          //   component: BlankLayout,
+          //   meta: {
+          //     title: '账户明细',
+          //     icon: 'monitor'
+          //     // permission: 'M_salesQueryList'
+          //   },
+          //   hideChildrenInMenu: true,
+          //   children: [
+          //     {
+          //       path: 'list',
+          //       name: 'accountManagementList',
+          //       component: () => import(/* webpackChunkName: "numsGoodsShelves" */ '@/views/numsGoodsShelves/accountManagement/list.vue'),
+          //       meta: {
+          //         title: '账户明细列表',
+          //         icon: 'monitor',
+          //         hidden: true
+          //         // permission: 'M_salesQueryList'
+          //       }
+          //     }
+          //   ]
+          // }
+        ]
+      },
       // 采购管理
       {
         path: '/purchasingManagement',
@@ -1128,23 +1403,51 @@ export const asyncRouterMap = [
           },
           {
             path: '/inventoryManagement/inventoryWarning',
-            name: 'inventoryWarningList',
-            component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/inventoryWarning/list.vue'),
+            name: 'inventoryWarning',
+            redirect: '/inventoryManagement/inventoryWarning/list',
+            component: BlankLayout,
             meta: {
               title: '库存预警',
               icon: 'alert',
               permission: 'M_inventoryWarningList'
-            }
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'inventoryWarningList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/inventoryWarning/list.vue'),
+                meta: {
+                  title: '库存预警',
+                  icon: 'alert',
+                  permission: 'M_inventoryWarningList'
+                }
+              }
+            ]
           },
           {
             path: '/inventoryManagement/satelliteWarehouseInventory',
-            name: 'satelliteWarehouseInventoryList',
-            component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/satelliteWarehouseInventory/list.vue'),
+            name: 'satelliteWarehouseInventory',
+            redirect: '/inventoryManagement/satelliteWarehouseInventory/list',
+            component: BlankLayout,
             meta: {
               title: '卫星仓库存',
               icon: 'flag',
               permission: 'M_satelliteWarehouseInventoryList'
-            }
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'satelliteWarehouseInventoryList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/satelliteWarehouseInventory/list.vue'),
+                meta: {
+                  title: '卫星仓库存',
+                  icon: 'flag',
+                  permission: 'M_satelliteWarehouseInventoryList'
+                }
+              }
+            ]
           },
           {
             path: '/inventoryManagement/inventoryChecking',
@@ -2068,6 +2371,43 @@ export const asyncRouterMap = [
               }
             ]
           },
+          {
+            path: '/productManagement/newProductList',
+            redirect: '/newProduct/list/:onlineFalg',
+            name: 'newProductList',
+            component: BlankLayout,
+            meta: {
+              title: '产品信息',
+              icon: 'sketch',
+              permission: 'M_newProductList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              // 新品列表-下线产品
+              {
+                path: '/newProduct/list/:onlineFalg',
+                name: 'newProductList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/newProduct/list'),
+                meta: {
+                  title: '新品信息',
+                  icon: 'file-text',
+                  hidden: true
+                }
+              },
+              // 产品详情
+              {
+                path: '/viewProduct/:sn',
+                name: 'viewProduct',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/newProduct/detail'),
+                meta: {
+                  title: '产品详情',
+                  icon: 'file-text',
+                  replaceTab: true,
+                  hidden: true
+                }
+              }
+            ]
+          },
           {
             path: '/productManagement/productBrand',
             redirect: '/productManagement/productBrand/list',
@@ -2397,81 +2737,53 @@ export const asyncRouterMap = [
         children: [
           {
             path: '/auth/userList',
-            name: 'powerUserList',
-            component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
+            name: 'powerUser',
+            redirect: '/auth/userList/list',
+            component: BlankLayout,
             meta: {
               title: '用户管理',
               icon: 'user',
               permission: 'M_powerMD_user_list'
-            }
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'powerUserList',
+                component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
+                meta: {
+                  title: '用户管理',
+                  icon: 'user',
+                  permission: 'M_powerMD_user_list'
+                }
+              }
+            ]
           },
           {
             path: '/auth/roleList',
-            name: 'powerRoleList',
-            component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
+            name: 'powerRole',
+            redirect: '/auth/roleList/list',
+            component: BlankLayout,
             meta: {
               title: '角色管理',
               icon: 'solution',
               permission: 'M_powerMD_role_list'
-            }
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'powerRoleList',
+                component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
+                meta: {
+                  title: '角色管理',
+                  icon: 'solution',
+                  permission: 'M_powerMD_role_list'
+                }
+              }
+            ]
           }
         ]
-      },
-      // 系统设置
-      // {
-      //   path: '/setting',
-      //   redirect: '/setting/userList',
-      //   component: PageView,
-      //   meta: {
-      //     title: '系统设置',
-      //     icon: 'setting'
-      //     // permission: 'M_setting_0'
-      //   },
-      //   children: [
-      //     {
-      //       path: '/setting/dataDictionary',
-      //       name: 'powerDD',
-      //       component: () => import(/* webpackChunkName: "setting" */
-      //         '@/views/power/dataDictionary/dataDictionary.vue'),
-      //       meta: {
-      //         title: '数据字典管理',
-      //         icon: 'database'
-      //         // permission: 'M_sys_dataDictionary'
-      //       }
-      //     },
-      //     // {
-      //     //   path: '/setting/register',
-      //     //   name: 'powerRegister',
-      //     //   component: () => import(/* webpackChunkName: "setting" */ '@/views/power/register/register.vue'),
-      //     //   meta: {
-      //     //     title: '参数管理',
-      //     //     icon: 'key',
-      //     //     permission: 'M_sys_register'
-      //     //   }
-      //     // },
-      //     {
-      //       path: '/setting/OperateJournal',
-      //       name: 'powerOperateJournal',
-      //       component: () => import(/* webpackChunkName: "setting" */
-      //         '@/views/power/OperateJournal/OperateJournal.vue'),
-      //       meta: {
-      //         title: '操作日志',
-      //         icon: 'read'
-      //         // permission: 'M_operateJournal'
-      //       }
-      //     }
-      //   ]
-      // }
-      // 公告
-      {
-        path: '/notice',
-        name: 'notice',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/notice/list'),
-        meta: {
-          title: '公告',
-          icon: 'bell'
-        },
-        hidden: true
       }
     ]
   },

+ 27 - 19
src/layouts/BasicLayout.vue

@@ -41,33 +41,36 @@
       <!-- layout content -->
       <a-layout-content :style="{ height: '100%', margin: '30px 20px 0', paddingTop: multiTab&&fixedHeader ? '66px' : (!multiTab&&fixedHeader?'45px':'0') }">
         <transition name="page-transition">
-          <route-view v-if="isRouterAlive"/>
+          <!-- <route-view v-if="isRouterAlive"/> -->
+          <router-view ></router-view>
         </transition>
       </a-layout-content>
       <!-- 视频播放弹窗 -->
-      <a-modal
-        v-model="isShowVideoVal"
-        wrapClassName="vidio_cont"
-        :footer="null"
-        centered
-        :maskClosable="false"
-        :destroyOnClose="true"
-        :width="1000"
-        @cancel="closeVido">
-        <video-player
-          class="video-player vjs-custom-skin"
-          ref="videoPlayer"
-          :playsinline="true"
-          :options="playerOptions"
-        ></video-player>
-      </a-modal>
+      <div v-if="isShowVideoVal">
+        <a-modal
+          v-model="isShowVideoVal"
+          wrapClassName="vidio_cont"
+          :footer="null"
+          centered
+          :maskClosable="false"
+          :destroyOnClose="true"
+          :width="1000"
+          @cancel="closeVido">
+          <video-player
+            class="video-player vjs-custom-skin"
+            ref="videoPlayer"
+            :playsinline="true"
+            :options="playerOptions"
+          ></video-player>
+        </a-modal>
+      </div>
       <!-- layout footer -->
       <a-layout-footer>
         <!-- <global-footer /> -->
       </a-layout-footer>
 
       <!-- Setting Drawer (show in development mode) -->
-      <!-- <setting-drawer v-if="!production"></setting-drawer> -->
+      <setting-drawer></setting-drawer>
     </a-layout>
   </a-layout>
 
@@ -193,7 +196,12 @@ export default {
     }
     this.collapsed = !this.sidebarOpened
     this.$store.dispatch('ToggleMultiTab', true)
-	  this.$store.dispatch('ToggleColor', '#1890FF')
+    // light
+	  // this.$store.dispatch('ToggleColor', '#2a86f4')
+    // this.$store.dispatch('ToggleTheme', 'light')
+    // dark
+    // this.$store.dispatch('ToggleColor', '#f30f30')
+    this.$store.dispatch('ToggleTheme', 'dark')
   },
   mounted () {
     const userAgent = navigator.userAgent

+ 3 - 1
src/layouts/BlankLayout.vue

@@ -1,6 +1,8 @@
 <template>
   <div>
-    <router-view />
+    <keep-alive>
+      <router-view :key="$route.name"></router-view>
+    </keep-alive>
   </div>
 </template>
 

+ 6 - 70
src/layouts/PageView.vue

@@ -1,51 +1,10 @@
 <template>
   <div :style="!$route.meta.hiddenHeaderContent ? 'margin: -24px -24px 0px;' : null">
-    <!-- pageHeader , route meta :true on hide -->
-    <!-- <page-header v-if="!$route.meta.hiddenHeaderContent" :title="pageTitle" :logo="logo" :avatar="avatar"> -->
-    <page-header v-if="false" :title="pageTitle" :logo="logo" :avatar="avatar">
-      <slot slot="action" name="action"></slot>
-      <slot slot="content" name="headerContent"></slot>
-      <div slot="content" v-if="!this.$slots.headerContent && description">
-        <p style="font-size: 14px;color: rgba(0,0,0,.65)">{{ description }}</p>
-        <div class="link">
-          <template v-for="(link, index) in linkList">
-            <a :key="index" :href="link.href">
-              <a-icon :type="link.icon" />
-              <span>{{ link.title }}</span>
-            </a>
-          </template>
-        </div>
-      </div>
-      <slot slot="extra" name="extra">
-        <div class="extra-img">
-          <img v-if="typeof extraImage !== 'undefined'" :src="extraImage"/>
-        </div>
-      </slot>
-      <div slot="pageMenu">
-        <div class="page-menu-search" v-if="search">
-          <a-input-search
-            style="width: 80%; max-width: 522px;"
-            placeholder="请输入..."
-            size="large"
-            enterButton="搜索"
-          />
-        </div>
-        <div class="page-menu-tabs" v-if="tabs && tabs.items">
-          <!-- @change="callback" :activeKey="activeKey" -->
-          <a-tabs :tabBarStyle="{margin: 0}" :activeKey="tabs.active()" @change="tabs.callback">
-            <a-tab-pane v-for="item in tabs.items" :tab="item.title" :key="item.key"></a-tab-pane>
-          </a-tabs>
-        </div>
-      </div>
-    </page-header>
+    <PageHeader v-if="!multiTab"></PageHeader>
     <div class="content" :style="{ height: pageHeight+'px' }">
       <div class="page-header-index-wide">
         <slot>
-          <!-- keep-alive  -->
-          <keep-alive v-if="multiTab">
-            <router-view ref="content" />
-          </keep-alive>
-          <router-view v-else ref="content" />
+          <router-view ref="content" />
         </slot>
       </div>
     </div>
@@ -53,8 +12,8 @@
 </template>
 
 <script>
+import PageHeader from '@/components/PageHeader/PageHeader.vue'
 import { mapState } from 'vuex'
-import PageHeader from '@/components/PageHeader'
 import { on, off } from '@/libs/tools'
 export default {
   name: 'PageView',
@@ -92,15 +51,12 @@ export default {
   },
   computed: {
     ...mapState({
-      multiTab: state => state.app.multiTab
+      multiTab: state => state.app.multiTab,
+      closeTabPages: state => state.app.closeTabPages
     })
-    // contHeight () {
-    //   return window.innerHeight - 80
-    // }
   },
   mounted () {
     this.tabs = this.directTabs
-    this.getPageMeta()
     this.setpageH()
     on(window, 'resize', this.setpageH)
   },
@@ -110,32 +66,12 @@ export default {
   activated () {
     this.setpageH()
   },
-  updated () {
-    this.getPageMeta()
-  },
   methods: {
     setpageH () {
       this.$nextTick(() => {
         this.$store.dispatch('SetWinHeight', window.innerHeight)
         this.pageHeight = window.innerHeight - 85
       })
-    },
-    getPageMeta () {
-      // eslint-disable-next-line
-      this.pageTitle = (typeof(this.title) === 'string' || !this.title) ? this.title : this.$route.meta.title
-
-      const content = this.$refs.content
-      if (content) {
-        if (content.pageMeta) {
-          Object.assign(this, content.pageMeta)
-        } else {
-          this.description = content.description
-          this.linkList = content.linkList
-          this.extraImage = content.extraImage
-          this.search = content.search === true
-          this.tabs = content.tabs
-        }
-      }
     }
   }
 }
@@ -143,7 +79,7 @@ export default {
 
 <style lang="less" scoped>
   .content {
-    margin: 12px 12px 0;
+    margin: 8px 12px 0;
     .page-header-index-wide{
       height: 100%;
       >div{

+ 27 - 0
src/libs/JGPrint.js

@@ -2,6 +2,33 @@ import confirm from 'ant-design-vue/es/modal/confirm'
 import notification from 'ant-design-vue/es/notification'
 import { getLodop } from '@/libs/LodopFuncs'
 import moment from 'moment'
+// 打印页签,支持批量打印
+export const JGPrintTag = function (html, width, height, data) {
+  const LODOP = getLodop(document.getElementById('LODOP_OB'), document.getElementById('LODOP_EM'))
+  if (!LODOP) {
+    confirm({
+      title: '提示?',
+      content: h => <div>打印控件未安装,请先下载并安装。安装完成后,刷新页面即可打印。</div>,
+      okText: '立即下载',
+      okType: 'danger',
+      cancelText: '暂不打印',
+      onOk () {
+        window.open('http://www.lodop.net/demolist/CLodop_Setup_for_Win32NT.zip')
+      }
+    })
+    return
+  }
+  LODOP.PRINT_INIT("")
+  LODOP.SET_SHOW_MODE('HIDE_PAPER_BOARD', 1) //  隐藏底图上有模拟走纸板的条纹线
+  LODOP.SET_PRINT_MODE('POS_BASEON_PAPER', true) // 可使输出以纸张边缘为基点
+  LODOP.ADD_PRINT_HTM(0, 0, '100%', '100%', html)
+  LODOP.ADD_PRINT_BARCODE('36%','65%',90,90,"QRCode",data.qrCodeContent)
+  // LODOP.SET_PRINT_STYLEA(0,"QRCodeVersion",10)
+  // LODOP.SET_PRINT_STYLEA(0,"QRCodeErrorLevel",'L')
+  LODOP.SET_PRINT_COPIES(data.printQty)// 指定份数
+  LODOP.SET_PRINT_PAGESIZE(1, width, height)
+  LODOP.PRINT()
+}
 // 打印控件
 export const JGPrint = function (data, type, printerType) {
   if (!data) {

+ 9 - 3
src/libs/tools.js

@@ -214,7 +214,7 @@ export const numberToFixed = function (val, num) {
 
   return _value
 }
-// 保留两位小数(不四舍五入)
+// 保留decimal位小数(不四舍五入)  num 数值,decimal要保留的小数位数
 export const formatDecimal = function (num, decimal) {
   num = num.toString()
   const index = num.indexOf('.')
@@ -225,8 +225,14 @@ export const formatDecimal = function (num, decimal) {
   }
   return parseFloat(num).toFixed(decimal)
 }
-// 处理数字千位分隔符
-export const toThousands = (num) => {
+// 处理数字千位分隔符  num 数值,decimal要保留的小数位数
+export const toThousands = (num, decimal) => {
+  if (num == undefined) {
+    return '--'
+  }
+  if (decimal) {
+    num = formatDecimal(num, decimal)
+  }
   return num.toString().replace(/\d+/, function (n) { // 先提取整数部分
     return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) {
       return $1 + ','

+ 8 - 1
src/main.js

@@ -1,6 +1,5 @@
 // ie polyfill
 import '@babel/polyfill'
-
 import Vue from 'vue'
 import App from './App.vue'
 import router from './router'
@@ -30,9 +29,17 @@ Vue.config.productionTip = false
 Vue.use(VueAxios)
 Vue.use(VueCookies)
 Vue.$cookies.config('7d')
+
+// 视频播放插件
 require('video.js/dist/video-js.css')
 require('vue-video-player/src/custom-theme.css')
 Vue.use(VideoPlayer)
+
+//引入vuescroll自定义滚动条
+import vuescroll from "vuescroll"
+import "vuescroll/dist/vuescroll.css"
+Vue.use(vuescroll)
+
 /**
  * 权限检查
  */

+ 2 - 1
src/store/getters.js

@@ -18,7 +18,8 @@ const getters = {
   isShowVideo: state => state.app.isShowVideo,
   isNewTab: state => state.app.isNewTab,
   isNewSubTab: state => state.app.isNewSubTab,
-  isCloseTab: state => state.app.isCloseTab
+  closeTabPages: state => state.app.closeTabPages,
+  loadingStatus: state => state.app.loadingStatus
 }
 
 export default getters

+ 6 - 2
src/store/modules/app.js

@@ -28,9 +28,10 @@ const app = {
     nowRoute: '', // 当前路由
     isShowVideo: false, // 是否显示视频弹窗
     isNewTab: false,
-    isCloseTab: false, // 是否关闭了当前页签
+    closeTabPages: [], // 已关闭的页面
     isNewSubTab: false,
     updateList: false,
+    loadingStatus: false,
     winHeight: 0 //  窗口高度
   },
   mutations: {
@@ -92,7 +93,10 @@ const app = {
     },
     SET_WIN_HEIGHT: (state, val) => {
       state.winHeight = val
-    }
+    },
+    SET_loadingStatus: (state, val) => {
+      state.loadingStatus = val
+    },
   },
   actions: {
     setSidebar ({

+ 76 - 2
src/utils/mixin.js

@@ -74,5 +74,79 @@ const AppDeviceEnquire = {
     })
   }
 }
-
-export { mixin, AppDeviceEnquire, mixinDevice }
+// 所有页
+const commonMixin = {
+  watch: {
+    '$store.state.app.loadingStatus': function (a, b) {
+      if (!a) {
+        if (this.disabled !== undefined) {
+          this.disabled = a
+        }
+        if (this.spinning !== undefined) {
+          this.spinning = a
+        }
+      }
+    }
+  },
+  methods: {
+    // 清除组件缓存
+    clearCompCache (cache, keys, key) {
+      if (cache[key] && cache[key].componentInstance) {
+        cache[key].componentInstance.$destroy()
+        if (keys.length) {
+          var index = keys.indexOf(key)
+          if (index > -1) {
+            keys.splice(index, 1)
+          }
+        }
+        delete cache[key]
+      }
+    }
+  },
+  beforeRouteLeave (to, from, next) {
+    const newVal = to
+    const oldVal = from
+    // 是否时同一个父级菜单下的页面
+    const mnlen = newVal.matched.length < 3
+    const newMatched = newVal.matched[mnlen ? 1 : 2]
+    const molen = oldVal.matched.length < 3
+    const oldMatched = oldVal.matched[molen ? 1 : 2]
+    const hasChildren = newMatched.name == oldMatched.name
+    // 判断是否是新增,编辑,详情页
+    const oa = oldVal.meta.title.indexOf('详情') >= 0
+    const ob = oldVal.meta.title.indexOf('新增') >= 0
+    const oc = oldVal.meta.title.indexOf('编辑') >= 0
+    const oxt = oldVal.meta.replaceTab
+    // console.log(hasChildren,oa||ob||oc||oxt)
+    const key = this.$vnode.key
+    const parentNode = this.$vnode.parent
+    const cache = parentNode && parentNode.componentInstance ? parentNode.componentInstance.cache : null
+    const keys = parentNode && parentNode.componentInstance ? parentNode.componentInstance.keys : null
+    const closeTabPages = this.$store.state.app.closeTabPages
+    const multiTab = this.$store.state.app.multiTab
+    // console.log(closeTabPages,key)
+    // 清空同级路由的组件缓存
+    if (hasChildren && (oa || ob || oc || oxt) && cache && keys) {
+      this.clearCompCache(cache, keys, key)
+      // 单页签模式
+      if (!multiTab) {
+        this.$store.state.app.isNewTab = false
+        this.$store.state.app.updateList = true
+      }
+    }
+    // 单页签模式,并且不是同级菜单的清空组件
+    if (!multiTab && !hasChildren) {
+      this.clearCompCache(cache, keys, key)
+    }
+    // 批量清空组件缓存
+    if (closeTabPages && closeTabPages.length && cache && keys) {
+      for (let i = 0; i < closeTabPages.length; i++) {
+        this.clearCompCache(cache, keys, closeTabPages[i])
+      }
+      this.$store.state.app.closeTabPages = []
+    }
+    // console.log(cache,keys)
+    next()
+  }
+}
+export { mixin, AppDeviceEnquire, mixinDevice, commonMixin }

+ 60 - 19
src/utils/request.js

@@ -1,38 +1,82 @@
-// import Vue from 'vue'
+import Vue from 'vue'
 import axios from 'axios'
 import store from '@/store'
 import notification from 'ant-design-vue/es/notification'
 import modal from 'ant-design-vue/es/modal'
 import { VueAxios } from './axios'
-// import { ACCESS_TOKEN } from '@/store/mutation-types'
-console.log(window.location.protocol)
+
 // 创建 axios 实例
 const service = axios.create({
   baseURL: process.env.VUE_APP_API_BASE_URL, // api base_url
-  timeout: 60000 // 请求超时时间
+  timeout: 1000000 // 请求超时时间
 })
 
 const err = (error) => {
-  console.log(error, 'error')
+  const config = error.config
+  // 网络连接出错
+  if (error.message.indexOf('Network Error') >= 0) {
+    notification.destroy()
+    notification.error({
+      message: '提示',
+      description: '无网络连接,请检查网络是否连接正常'
+    })
+    store.commit('SET_loadingStatus', false)
+    return Promise.reject(err)
+  }
+
+  // 业务错误提示
   if (error.response) {
     const status = error.response.status
-    if ((status == 503 || status == 500) && window.location.pathname != '/user/login') {
+    if ((status == 503 || status == 500)) {
       notification.destroy()
       notification.error({
         message: '提示',
         description: error.response.data.message
       })
     }
+    store.commit('SET_loadingStatus', false)
+    return Promise.reject(err)
   }
+
   // 超时无法访问服务
-  if (error.message.indexOf('timeout') >= 0 && window.location.pathname != '/user/login') {
+  if (error.message.indexOf('timeout') >= 0) {
     notification.destroy()
     notification.error({
       message: '提示',
-      description: '请求超时'
+      description: '网络连接超时,正在重连...'
+    })
+    // If config does not exist or the retry option is not set, reject
+    if (!config || !config.retry) return Promise.reject(err)
+    // Set the variable for keeping track of the retry count
+    config.__retryCount = Vue.ls.get(config.url + '__retryCount') || 0
+    // Check if we've maxed out the total number of retries
+    if (config.__retryCount >= config.retry) {
+      Vue.ls.remove(config.url + '__retryCount')
+      notification.destroy()
+      notification.error({
+        message: '提示',
+        description: '网络重连失败,请检测网络连接是否正常'
+      })
+      store.commit('SET_loadingStatus', false)
+      // Reject with the error
+      return Promise.reject(err)
+    }
+    // Increase the retry count
+    config.__retryCount += 1
+    Vue.ls.set(config.url + '__retryCount', config.__retryCount)
+    // Create new promise to handle exponential backoff
+    config.url = config.url.replace('/api', '')
+    const backoff = new Promise(function (resolve) {
+      setTimeout(function () {
+        resolve()
+      }, config.retryDelay || 1)
+    })
+
+    // Return the promise in which recalls axios to retry the request
+    return backoff.then(function () {
+      return service(config)
     })
   }
-  return Promise.reject(error)
 }
 
 // request interceptor
@@ -43,13 +87,16 @@ service.interceptors.request.use(config => {
     config.headers['access-token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
     config.headers['access-org'] = changeOrg // 当前要切换的账号 sn
   }
+  config.retry = 3
+  config.retryDelay = 1000
+  store.commit('SET_loadingStatus', true)
   return config
 }, err)
 
 // response interceptor
 service.interceptors.response.use((response) => {
-  // console.log(response, 'response.data.status')
   const et = sessionStorage.getItem('errorTips')
+  // 无权限或登录超时
   if ((response.data.status == '1001' || response.data.status == '1099') && !et) {
     sessionStorage.setItem('errorTips', 1)
     modal.destroyAll()
@@ -63,21 +110,15 @@ service.interceptors.response.use((response) => {
         })
       }
     })
-  }
-  if ((response.data.status == '401' || response.data.status == '500') && window.location.pathname != '/user/login') {
+  } else if (response.data.status != 200 && response.data.status && response.data.errCode != 'VALIDATE_STOCK_LACK') {
+    // 其它业务错误提示
     notification.destroy()
     notification.error({
       message: '提示',
       description: response.data.message
     })
   }
-  if (response.data.status == '900' && window.location.pathname != '/user/login') {
-    notification.destroy()
-    notification.error({
-      message: response.data.message,
-      description: response.data.code
-    })
-  }
+  store.commit('SET_loadingStatus', false)
   return response.data
 }, err)
 

+ 58 - 16
src/views/Home.vue

@@ -17,14 +17,26 @@
           <div class="page-data-module">
             <div class="page-data-con">
               <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>
+              <h3 class="page-data-num main-color">
+                <a-statistic :valueStyle="{fontSize:'30px',color:'#e70012'}" :value="bizData&&bizData.sales&&(bizData.sales.dayTotalQty || bizData.sales.dayTotalQty==0) ? bizData.sales.dayTotalQty : 0" />
+                /
+                <a-statistic :precision="2" :valueStyle="{fontSize:'30px',color:'#e70012'}" :value="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">{{ 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>
+                <span class="page-data-itemText">
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :value="bizData&&bizData.sales&&(bizData.sales.weekSalesQty || bizData.sales.weekSalesQty==0) ? bizData.sales.weekSalesQty : 0" />
+                  /
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :precision="2" :value="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">{{ 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>
+                <span class="page-data-itemText">
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :value="bizData&&bizData.sales&&(bizData.sales.monthSalesQty || bizData.sales.monthSalesQty==0) ? bizData.sales.monthSalesQty : 0" />
+                  /
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :precision="2" :value="bizData&&bizData.sales&&(bizData.sales.monthSalesAmount || bizData.sales.monthSalesAmount==0) ? bizData.sales.monthSalesAmount : 0" />
+                </span>
               </p>
             </div>
             <span class="page-data-line"></span>
@@ -34,14 +46,26 @@
           <div class="page-data-module">
             <div class="page-data-con">
               <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>
+              <h3 class="page-data-num">
+                <a-statistic :valueStyle="{fontSize:'30px'}" :value="bizData&&bizData.purchaseBill&&(bizData.purchaseBill.dayTotalQty || bizData.purchaseBill.dayTotalQty==0) ? bizData.purchaseBill.dayTotalQty : 0" />
+                /
+                <a-statistic :precision="2" :valueStyle="{fontSize:'30px'}" :value="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">{{ 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>
+                <span class="page-data-itemText">
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :value="bizData&&bizData.purchaseBill&&(bizData.purchaseBill.weekPurchaseQty || bizData.purchaseBill.weekPurchaseQty==0) ? bizData.purchaseBill.weekPurchaseQty : 0" />
+                  /
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :precision="2" :value="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">{{ 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>
+                <span class="page-data-itemText">
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :value="bizData&&bizData.purchaseBill&&(bizData.purchaseBill.monthPurchaseQty || bizData.purchaseBill.monthPurchaseQty==0) ? bizData.purchaseBill.monthPurchaseQty : 0" />
+                  /
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :precision="2" :value="bizData&&bizData.purchaseBill&&(bizData.purchaseBill.monthDiscountedAmount || bizData.purchaseBill.monthDiscountedAmount==0) ? bizData.purchaseBill.monthDiscountedAmount : 0" />
+                </span>
               </p>
             </div>
             <span class="page-data-line"></span>
@@ -51,14 +75,20 @@
           <div class="page-data-module">
             <div class="page-data-con">
               <p class="page-data-tit">客户总数(个)</p>
-              <h3 class="page-data-num">{{ bizData&&bizData.customer&&(bizData.customer.custCount || bizData.customer.custCount==0) ? bizData.customer.custCount : 0 }}</h3>
+              <h3 class="page-data-num">
+                <a-statistic :valueStyle="{fontSize:'30px'}" :value="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">{{ bizData&&bizData.customer&&(bizData.customer.addCurrentWeekCustCount || bizData.customer.addCurrentWeekCustCount==0) ? bizData.customer.addCurrentWeekCustCount : 0 }}</span>
+                <span class="page-data-itemText">
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :value="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">30天内采购客户</span>
-                <span class="page-data-itemText">{{ bizData&&bizData.customer&&(bizData.customer.salesThirtyDayCustCount || bizData.customer.salesThirtyDayCustCount==0) ? bizData.customer.salesThirtyDayCustCount : 0 }}</span>
+                <span class="page-data-itemText">
+                  <a-statistic :valueStyle="{fontSize:'14px'}" :value="bizData&&bizData.customer&&(bizData.customer.salesThirtyDayCustCount || bizData.customer.salesThirtyDayCustCount==0) ? bizData.customer.salesThirtyDayCustCount : 0" />
+                </span>
               </p>
             </div>
             <span class="page-data-line"></span>
@@ -68,9 +98,13 @@
           <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;">{{ bizData&&bizData.stock&&(bizData.stock.totalCurrentStockQty || bizData.stock.totalCurrentStockQty==0) ? bizData.stock.totalCurrentStockQty : 0 }}</h3>
+              <h3 class="page-data-num" style="line-height: 36px;">
+                <a-statistic :valueStyle="{fontSize:'30px'}" :value="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;">{{ bizData&&bizData.stock&&(bizData.stock.totalCurrentStockCost || bizData.stock.totalCurrentStockCost==0) ? bizData.stock.totalCurrentStockCost : 0 }}</h3>
+              <h3 class="page-data-num" style="line-height: 36px;margin: 0;">
+                <a-statistic :precision="2" :valueStyle="{fontSize:'30px'}" :value="bizData&&bizData.stock&&(bizData.stock.totalCurrentStockCost || bizData.stock.totalCurrentStockCost==0) ? bizData.stock.totalCurrentStockCost : 0" />
+              </h3>
             </div>
           </div>
         </a-col>
@@ -177,6 +211,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { mapGetters } from 'vuex'
 import ResetPwd from '@/views/user/ResetPwd.vue'
 import newProduct from '@/views/productManagement/newProduct/modal.vue'
@@ -185,6 +220,7 @@ import { bizStateCount, bizData, dealerData } from '@/api/data'
 export default {
   name: 'Home',
   components: { ResetPwd, newProduct },
+  mixins: [commonMixin],
   data () {
     return {
       message: '欢迎登录' + process.env.VUE_APP_PRO_NAME,
@@ -679,12 +715,14 @@ export default {
       })
     }
   },
+  activated () {
+    // 请求导航指引合计
+    this.getNavCount()
+    this.getBizData()
+    this.getMerchantData()
+  },
   beforeRouteEnter (to, from, next) {
     next(vm => {
-      // 请求导航指引合计
-      vm.getNavCount()
-      vm.getBizData()
-      vm.getMerchantData()
       //  判断登录用户是否重置过密码(首次登陆需强制重置密码)
       if (vm.mustChangePwd == 0) {
         vm.openResetPwd = false
@@ -739,10 +777,12 @@ export default {
             margin: 0;
           }
           .page-data-num{
-            font-size: 30px;
+            font-size: 28px;
             font-family: PingFang SC;
             color: #000000;
             margin-bottom: 5px;
+            display: flex;
+            align-items: center;
           }
           .main-color{
             color: rgba(231, 0, 18, 1);
@@ -755,6 +795,8 @@ export default {
             .page-data-itemText{
               font-size: 14px;
               color: rgba(0, 0, 0);
+              display: flex;
+              align-items: center;
             }
           }
         }

+ 3 - 0
src/views/allocationManagement/chainTransferIn/detail.vue

@@ -57,13 +57,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { allocLinkagePutDetailList, allocLinkagePutDetailSn, allocLinkagePutDetailCount, allocLinkagePutDetailPrint } from '@/api/allocLinkagePut'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'AllocLinkagePutDetail',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 5 - 2
src/views/allocationManagement/chainTransferIn/edit.vue

@@ -39,12 +39,12 @@
             <a-row :gutter="15">
               <a-col :md="6" :sm="24">
                 <a-form-item label="产品编码" prop="productCode">
-                  <a-input id="chainTransferInEdit-productCode" v-model="queryParam.productCode" placeholder="请输入产品编码" allowClear />
+                  <a-input id="chainTransferInEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24">
                 <a-form-item label="产品名称" prop="productName">
-                  <a-input id="chainTransferInEdit-productName" v-model="queryParam.productName" placeholder="请输入产品名称" allowClear />
+                  <a-input id="chainTransferInEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24">
@@ -109,6 +109,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { dealerProductTypeList } from '@/api/dealerProductType'
@@ -117,7 +118,9 @@ import { allocLinkagePutDetailSn, allocLinkagePutDetailList, allocLinkagePutDeta
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'AllocLinkagePutEdit',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 7 - 0
src/views/allocationManagement/chainTransferIn/list.vue

@@ -118,12 +118,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
+import { formatDecimal } from '@/libs/tools'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { allocLinkagePutList, allocLinkagePutAudit } from '@/api/allocLinkagePut'
 import { getTenantList } from '@/api/allocLinkageOut'
 export default {
+  name: 'AllocLinkagePutList',
   components: { STable, VSelect, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,
@@ -161,8 +165,11 @@ export default {
           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
+
+              data.list[i].productTotalCost = formatDecimal(data.list[i].productTotalCost, 2)
             }
             this.disabled = false
           }

+ 2 - 0
src/views/allocationManagement/chainTransferOut/basicInfoModal.vue

@@ -51,11 +51,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
 import { getTenantList, allocLinkageOutSave } from '@/api/allocLinkageOut'
 export default {
   name: 'ChainTransferOutBasicInfoModal',
   components: { VSelect },
+  mixins: [commonMixin],
   props: {
     openModal: {
       //  弹框显示状态

+ 3 - 0
src/views/allocationManagement/chainTransferOut/detail.vue

@@ -63,13 +63,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { allocLinkageOutDetailSn, allocLinkageOutDetailList, allocLinkageOutDetailCount, allocLinkageOutDetailPrint } from '@/api/allocLinkageOut'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'AllocLinkageOutDetail',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   props: {
     outBizSn: { //  有值则为弹框,无值则为页面
       type: [Number, String],

+ 8 - 5
src/views/allocationManagement/chainTransferOut/edit.vue

@@ -22,17 +22,17 @@
                 <a-row :gutter="15">
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="chainTransferOutEdit-productCode" v-model="queryParam.productCode" placeholder="请输入产品编码" allowClear />
+                      <a-input id="chainTransferOutEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="chainTransferOutEdit-productName" v-model="queryParam.productName" placeholder="请输入产品名称" allowClear />
+                      <a-input id="chainTransferOutEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="原厂编码" prop="productOrigCode">
-                      <a-input id="chainTransferOutEdit-productOrigCode" v-model="queryParam.productOrigCode" placeholder="请输入原厂编码" allowClear />
+                      <a-input id="chainTransferOutEdit-productOrigCode" v-model.trim="queryParam.productOrigCode" placeholder="请输入原厂编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <template v-if="advanced">
@@ -135,12 +135,12 @@
                     <a-row :gutter="15">
                       <a-col :md="9" :sm="24">
                         <a-form-item label="产品编码" prop="productCode">
-                          <a-input id="chainTransferOutEdit-productCode" v-model="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
+                          <a-input id="chainTransferOutEdit-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
                         </a-form-item>
                       </a-col>
                       <a-col :md="9" :sm="24">
                         <a-form-item label="产品名称" prop="productName">
-                          <a-input id="chainTransferOutEdit-productName" v-model="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
+                          <a-input id="chainTransferOutEdit-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
                         </a-form-item>
                       </a-col>
                       <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
@@ -190,6 +190,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { allocLinkageOutDetailSn, allocLinkageOutDetailList, allocLinkageOutDetailSave, allocLinkageOutDetailDel, allocLinkageOutDetailCount, allocLinkageOutSubmit, allocLinkageOutDetailDelAll, allocLinkageOutDetailPrint } from '@/api/allocLinkageOut'
@@ -200,7 +201,9 @@ import { warehouseAllList } from '@/api/warehouse'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'AllocLinkageOutEdit',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/allocationManagement/chainTransferOut/list.vue

@@ -131,13 +131,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import basicInfoModal from './basicInfoModal.vue'
 import getDate from '@/libs/getDate.js'
 import { allocLinkageOutList, allocLinkageAudit, allocLinkageOutDel, allocLinkageOutStock, getTenantList } from '@/api/allocLinkageOut'
 export default {
+  name: 'AllocLinkageOutList',
   components: { STable, VSelect, basicInfoModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 1
src/views/allocationManagement/storeTransferOut/basicInfoModal.vue

@@ -24,7 +24,7 @@
         </a-form-model-item>
         <a-form-model-item label="调往对象名称" :prop="isCustomer ? 'putPersonSn' : 'putPersonName'">
           <custList ref="custList" :isValidateEnabled="true" v-if="isCustomer" @change="custChange" v-model="form.putPersonSn"></custList>
-          <a-input v-if="!isCustomer" v-model="form.putPersonName" placeholder="请输入调往对象名称(最多30个字符)" allowClear :maxLength="30" />
+          <a-input v-if="!isCustomer" v-model.trim="form.putPersonName" placeholder="请输入调往对象名称(最多30个字符)" allowClear :maxLength="30" />
         </a-form-model-item>
         <a-form-model-item label="调拨类型" prop="callOutType">
           <a-select v-model="form.callOutType" placeholder="请选择调拨类型" allowClear >
@@ -44,6 +44,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
 import { storeCallOutSave } from '@/api/storeCallOut'
 import { getLookUpData } from '@/api/data'
@@ -52,6 +53,7 @@ import { storeCallOutTypeAllList } from '@/api/storeCallOutType'
 export default {
   name: 'StoreTransferOutBasicInfoModal',
   components: { VSelect, custList },
+  mixins: [commonMixin],
   props: {
     openModal: {
       //  弹框显示状态

+ 3 - 0
src/views/allocationManagement/storeTransferOut/detail.vue

@@ -59,13 +59,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { storeCallOutDetailList, storeCallOutDetailCount, storeCallOutDetailSn, storeCallOutDetailPrint } from '@/api/storeCallOut'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'StoreCallOutDetail',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   props: {
     outBizSn: { //  有值则为弹框,无值则为页面
       type: [Number, String],

+ 7 - 4
src/views/allocationManagement/storeTransferOut/edit.vue

@@ -23,12 +23,12 @@
                 <a-row :gutter="15">
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="storeTransferOutEdit-productCode" v-model="queryParam.productCode" placeholder="请输入产品编码" allowClear />
+                      <a-input id="storeTransferOutEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="storeTransferOutEdit-productName" v-model="queryParam.productName" placeholder="请输入产品名称" allowClear />
+                      <a-input id="storeTransferOutEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
@@ -125,12 +125,12 @@
                     <a-row :gutter="15">
                       <a-col :md="8" :sm="24">
                         <a-form-item label="产品编码" prop="productCode">
-                          <a-input id="storeTransferOutEdit-productCode" v-model="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
+                          <a-input id="storeTransferOutEdit-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
                         </a-form-item>
                       </a-col>
                       <a-col :md="8" :sm="24">
                         <a-form-item label="产品名称" prop="productName">
-                          <a-input id="storeTransferOutEdit-productName" v-model="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
+                          <a-input id="storeTransferOutEdit-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
                         </a-form-item>
                       </a-col>
                       <a-col :md="8" :sm="24" style="margin-bottom: 10px;">
@@ -192,6 +192,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { storeCallOutDetailList, storeCallOutDetail, storeCallOutDetailCount, storeCallOutDetailSave, storeCallOutDetailDel, storeCallOutSubmit, storeCallOutDetailPrint } from '@/api/storeCallOut'
@@ -202,7 +203,9 @@ import { productQuery } from '@/api/allocWarehouse'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'StoreCallOutEdit',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/allocationManagement/storeTransferOut/list.vue

@@ -120,6 +120,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import getDate from '@/libs/getDate.js'
@@ -127,7 +128,9 @@ import basicInfoModal from './basicInfoModal.vue'
 import { storeCallOutList, storeCallOutAudit, storeCallOutDel, storeCallOutOut } from '@/api/storeCallOut'
 import { storeCallOutTypeAllList } from '@/api/storeCallOutType'
 export default {
+  name: 'StoreCallOutList',
   components: { STable, VSelect, basicInfoModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 1
src/views/allocationManagement/warehouseAllocation/basicInfoModal.vue

@@ -31,7 +31,7 @@
           </a-select>
         </a-form-model-item>
         <a-form-model-item label="关联单号" prop="relevanceNo">
-          <a-input id="warehouseAllocation-basicInfo-relevanceNo" :maxLength="50" v-model="form.relevanceNo" placeholder="请输入关联单号(最多50个字符)" allowClear />
+          <a-input id="warehouseAllocation-basicInfo-relevanceNo" :maxLength="50" v-model.trim="form.relevanceNo" placeholder="请输入关联单号(最多50个字符)" allowClear />
         </a-form-model-item>
         <a-form-model-item label="备注" prop="remark">
           <a-textarea id="warehouseAllocation-basicInfo-remark" :maxLength="120" v-model="form.remark" placeholder="请输入备注(最多120个字符)" allowClear />
@@ -46,12 +46,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
 import { warehouseAllList } from '@/api/warehouse.js'
 import { allocWarehouseSave } from '@/api/allocWarehouse.js'
 export default {
   name: 'WarehouseAllocationBasicInfoModal',
   components: { VSelect },
+  mixins: [commonMixin],
   props: {
     openModal: {
       //  弹框显示状态

+ 3 - 0
src/views/allocationManagement/warehouseAllocation/detail.vue

@@ -69,10 +69,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { allocWarehouseDetailSn, allocWarehouseDetailCount, allocWarehouseDetailList } from '@/api/allocWarehouse.js'
 export default {
+  name: 'AllocWarehouseDetail',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   props: {
     outBizSn: { //  有值则为弹框,无值则为页面
       type: [Number, String],

+ 8 - 5
src/views/allocationManagement/warehouseAllocation/edit.vue

@@ -19,17 +19,17 @@
                 <a-row :gutter="15">
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="warehouseAllocationEdit-productCode" v-model="queryParam.productCode" placeholder="请输入产品编码" allowClear />
+                      <a-input id="warehouseAllocationEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="warehouseAllocationEdit-productName" v-model="queryParam.productName" placeholder="请输入产品名称" allowClear />
+                      <a-input id="warehouseAllocationEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="原厂编码" prop="productOrigCode">
-                      <a-input id="warehouseAllocationEdit-productOrigCode" v-model="queryParam.productOrigCode" placeholder="请输入原厂编码" allowClear />
+                      <a-input id="warehouseAllocationEdit-productOrigCode" v-model.trim="queryParam.productOrigCode" placeholder="请输入原厂编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <template v-if="advanced">
@@ -143,12 +143,12 @@
                     <a-row :gutter="15">
                       <a-col :md="9" :sm="24">
                         <a-form-item label="产品编码" prop="productCode">
-                          <a-input id="warehouseAllocationEdit-productCode" v-model="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
+                          <a-input id="warehouseAllocationEdit-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
                         </a-form-item>
                       </a-col>
                       <a-col :md="9" :sm="24">
                         <a-form-item label="产品名称" prop="productName">
-                          <a-input id="warehouseAllocationEdit-productName" v-model="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
+                          <a-input id="warehouseAllocationEdit-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
                         </a-form-item>
                       </a-col>
                       <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
@@ -230,13 +230,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { allocWarehouseDetailList, allocWarehouseDetail, productQuery, allocWarehouseDetailCount, allocWarehouseDetailSave, allocWarehouseDetailDel, allocWarehouseSubmit } from '@/api/allocWarehouse'
 import { dealerProductBrandQuery } from '@/api/dealerProductBrand'
 import { dealerProductTypeList } from '@/api/dealerProductType'
 import { warehouseLocAllList } from '@/api/warehouse'
 export default {
+  name: 'AllocWarehouseEdit',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/allocationManagement/warehouseAllocation/list.vue

@@ -107,6 +107,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { allocWarehouseList, allocWarehouseAudit, allocWarehouseDel } from '@/api/allocWarehouse'
 import { warehouseAllList } from '@/api/warehouse.js'
 import { STable, VSelect } from '@/components'
@@ -114,7 +115,9 @@ import basicInfoModal from './basicInfoModal.vue'
 import rangeDate from '@/views/common/rangeDate.vue'
 import getDate from '@/libs/getDate.js'
 export default {
+  name: 'AllocWarehouseList',
   components: { STable, VSelect, basicInfoModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/basicData/bulkPartsTypeManagement/editModal.vue

@@ -39,11 +39,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { sparePartsPutTypeSave } from '@/api/sparePartsPutType'
 export default {
   name: 'BulkPartsTypeEditModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 3 - 0
src/views/basicData/bulkPartsTypeManagement/list.vue

@@ -45,11 +45,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { sparePartsPutTypeList, sparePartsPutTypeDel } from '@/api/sparePartsPutType'
 import { STable, VSelect } from '@/components'
 import bulkPartsTypeEditModal from './editModal.vue'
 export default {
+  name: 'BulkPartsTypeList',
   components: { STable, VSelect, bulkPartsTypeEditModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/basicData/customerTypeManagement/editModal.vue

@@ -39,11 +39,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { custTypeSave } from '@/api/custType'
 export default {
   name: 'CustomerTypeEditModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 3 - 0
src/views/basicData/customerTypeManagement/list.vue

@@ -60,11 +60,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { custTypeList, custTypeDel } from '@/api/custType'
 import { STable, VSelect } from '@/components'
 import customerTypeEditModal from './editModal.vue'
 export default {
+  name: 'CustomerTypeList',
   components: { STable, VSelect, customerTypeEditModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/basicData/expenseType/editModal.vue

@@ -42,11 +42,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { costTypeSave } from '@/api/costType'
 export default {
   name: 'ExpenseTypeEditModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 3 - 0
src/views/basicData/expenseType/list.vue

@@ -56,11 +56,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { costTypeAllQuery, costTypeDel } from '@/api/costType'
 import { STable } from '@/components'
 import expenseTypeEditModal from './editModal.vue'
 export default {
+  name: 'ExpenseTypeList',
   components: { STable, expenseTypeEditModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/basicData/storeTransferOutTypeManagement/editModal.vue

@@ -39,11 +39,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { storeCallOutTypeSave } from '@/api/storeCallOutType'
 export default {
   name: 'StoreTransferOutTypeEditModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 3 - 0
src/views/basicData/storeTransferOutTypeManagement/list.vue

@@ -49,11 +49,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import storeTransferOutTypeEditModal from './editModal.vue'
 import { storeCallOutTypeList, storeCallOutTypeDel } from '@/api/storeCallOutType'
 export default {
+  name: 'StoreCallOutTypeList',
   components: { STable, VSelect, storeTransferOutTypeEditModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/bulkManagement/bulkImport/list.vue

@@ -69,11 +69,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, Upload } from '@/components'
 import { stockImportList, stockImportFinish, stockImportCancel, stockImportExportError } from '@/api/stockImport'
 import { downloadExcel } from '@/libs/JGPrint.js'
 export default {
+  name: 'StockImportList',
   components: { STable, Upload },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/bulkManagement/bulkReturnGoods/basicInfoModal.vue

@@ -50,6 +50,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
 import supplierInfoEditModal from '@/views/supplierManagement/supplierInfo/editModal.vue'
 import { supplierAllList } from '@/api/supplier'
@@ -57,6 +58,7 @@ import { sparePartsRetSave } from '@/api/sparePartsRet'
 export default {
   name: 'BulkReturnGoodsBasicInfoModal',
   components: { VSelect, supplierInfoEditModal },
+  mixins: [commonMixin],
   props: {
     openModal: {
       //  弹框显示状态

+ 2 - 0
src/views/bulkManagement/bulkReturnGoods/detailModal.vue

@@ -51,6 +51,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
@@ -58,6 +59,7 @@ import { sparePartsRetDetail, sparePartsRetDetailList, sparePartsRetDetailCount,
 export default {
   name: 'BulkReturnGoodsDetailModal',
   components: { STable, Print },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 7 - 4
src/views/bulkManagement/bulkReturnGoods/edit.vue

@@ -19,12 +19,12 @@
             <a-row :gutter="15">
               <a-col :md="6" :sm="24">
                 <a-form-item label="产品编码" prop="productCode">
-                  <a-input id="bulkReturnGoodsEdit-productCode" v-model="queryParam.productCode" placeholder="请输入产品编码" allowClear />
+                  <a-input id="bulkReturnGoodsEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24">
                 <a-form-item label="产品名称" prop="productName">
-                  <a-input id="bulkReturnGoodsEdit-productName" v-model="queryParam.productName" placeholder="请输入产品名称" allowClear />
+                  <a-input id="bulkReturnGoodsEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24">
@@ -108,12 +108,12 @@
                 <a-row :gutter="15">
                   <a-col :md="9" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="bulkReturnGoodsEdit-productCode" v-model="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
+                      <a-input id="bulkReturnGoodsEdit-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="9" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="bulkReturnGoodsEdit-productName" v-model="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
+                      <a-input id="bulkReturnGoodsEdit-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
@@ -184,6 +184,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
@@ -198,7 +199,9 @@ import {
   sparePartsRetDetailPrint,
   sparePartsRetDetailExport } from '@/api/sparePartsRet'
 export default {
+  name: 'BulkReturnGoodsEdit',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 8 - 5
src/views/bulkManagement/bulkReturnGoods/grabEdit.vue

@@ -19,17 +19,17 @@
             <a-row :gutter="15">
               <a-col :md="6" :sm="24">
                 <a-form-item label="散件入库单号" prop="sparePartsPurchaseNo">
-                  <a-input id="bulkReturnGoodsEdit-sparePartsPurchaseNo" v-model="queryParam.sparePartsPurchaseNo" placeholder="请输入散件入库单号" allowClear />
+                  <a-input id="bulkReturnGoodsEdit-sparePartsPurchaseNo" v-model.trim="queryParam.sparePartsPurchaseNo" placeholder="请输入散件入库单号" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24">
                 <a-form-item label="产品编码" prop="productCode">
-                  <a-input id="bulkReturnGoodsEdit-productCode" v-model="queryParam.productCode" placeholder="请输入产品编码" allowClear />
+                  <a-input id="bulkReturnGoodsEdit-productCode" v-model.trim="queryParam.productCode" placeholder="请输入产品编码" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24">
                 <a-form-item label="产品名称" prop="productName">
-                  <a-input id="bulkReturnGoodsEdit-productName" v-model="queryParam.productName" placeholder="请输入产品名称" allowClear />
+                  <a-input id="bulkReturnGoodsEdit-productName" v-model.trim="queryParam.productName" placeholder="请输入产品名称" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
@@ -99,12 +99,12 @@
                 <a-row :gutter="15">
                   <a-col :md="9" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="bulkReturnGoodsEdit-productCode" v-model="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
+                      <a-input id="bulkReturnGoodsEdit-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入产品编码" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="9" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="bulkReturnGoodsEdit-productName" v-model="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
+                      <a-input id="bulkReturnGoodsEdit-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入产品名称" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
@@ -175,6 +175,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
@@ -189,7 +190,9 @@ import {
   sparePartsRetDetailPrint,
   sparePartsRetDetailExport } from '@/api/sparePartsRet'
 export default {
+  name: 'BulkReturnGoodsgrabEdit',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/bulkManagement/bulkReturnGoods/list.vue

@@ -122,6 +122,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import basicInfoModal from './basicInfoModal.vue'
 import bulkReturnGoodsDetailModal from './detailModal.vue'
@@ -131,7 +132,9 @@ import auditModal from '@/views/common/auditModal.vue'
 import { supplierAllList } from '@/api/supplier'
 import { sparePartsRetList, sparePartsRetDel, sparePartsRetOutStock, sparePartsRetAudit } from '@/api/sparePartsRet'
 export default {
+  name: 'BulkReturnGoodsList',
   components: { STable, VSelect, basicInfoModal, rangeDate, bulkReturnGoodsDetailModal, auditModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 23 - 21
src/views/bulkManagement/bulkWarehousingOrder/basicInfoModal.vue

@@ -17,30 +17,30 @@
         :label-col="formItemLayout.labelCol"
         :wrapper-col="formItemLayout.wrapperCol" >
         <a-form-model-item label="供应商" prop="supplierSn">
-        <a-select
-          placeholder="请输入名称查询,如果没有请点击 '+' 新增"
-          allowClear
-          v-model="form.supplierSn"
-          :showSearch="true"
-          option-filter-prop="children"
-          :filter-option="filterOption"
-          style="width: 80%;">
-          <a-select-option v-for="item in supplierList" :key="item.supplierSn" :value="item.supplierSn" :disabled="item.enabledFlag==0">{{ item.supplierName }}</a-select-option>
-        </a-select>
-        <a-button icon="plus" size="small" @click="openSupplierModal=true" id="bulkWarehousingOrder-basicInfo-add-btn" style="margin-left: 10px;"></a-button>
+          <a-select
+            placeholder="请输入名称查询,如果没有请点击 '+' 新增"
+            allowClear
+            v-model="form.supplierSn"
+            :showSearch="true"
+            option-filter-prop="children"
+            :filter-option="filterOption"
+            style="width: 80%;">
+            <a-select-option v-for="item in supplierList" :key="item.supplierSn" :value="item.supplierSn" :disabled="item.enabledFlag==0">{{ item.supplierName }}</a-select-option>
+          </a-select>
+          <a-button icon="plus" size="small" @click="openSupplierModal=true" id="bulkWarehousingOrder-basicInfo-add-btn" style="margin-left: 10px;"></a-button>
         </a-form-model-item>
         <a-form-model-item label="散件入库类型" prop="sparePartsType">
-        <a-select id="bulkWarehousingOrder-basicInfo-sparePartsType" placeholder="请选择散件入库类型" allowClear v-model="form.sparePartsType">
-          <a-select-option v-for="item in sparePartsPutTypeList" :key="item.sparePartsPutTypeSn" :value="item.sparePartsPutTypeSn">{{ item.name }}</a-select-option>
-        </a-select>
+          <a-select id="bulkWarehousingOrder-basicInfo-sparePartsType" placeholder="请选择散件入库类型" allowClear v-model="form.sparePartsType">
+            <a-select-option v-for="item in sparePartsPutTypeList" :key="item.sparePartsPutTypeSn" :value="item.sparePartsPutTypeSn">{{ item.name }}</a-select-option>
+          </a-select>
         </a-form-model-item>
         <a-form-model-item label="备注" prop="remarks">
-        <a-textarea
-          id="bulkWarehousingOrder-remarks"
-          :maxLength="200"
-          v-model="form.remarks"
-          placeholder="请输入备注(最多200个字符)"
-          allowClear />
+          <a-textarea
+            id="bulkWarehousingOrder-remarks"
+            :maxLength="200"
+            v-model="form.remarks"
+            placeholder="请输入备注(最多200个字符)"
+            allowClear />
         </a-form-model-item>
       </a-form-model>
       <div class="btn-cont">
@@ -54,6 +54,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
 import supplierInfoEditModal from '@/views/supplierManagement/supplierInfo/editModal.vue'
 import { supplierAllList } from '@/api/supplier'
@@ -62,6 +63,7 @@ import { sparePartsPurSave } from '@/api/sparePartsPur'
 export default {
   name: 'BulkWarehousingOrderBasicInfoModal',
   components: { VSelect, supplierInfoEditModal },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,
@@ -110,7 +112,7 @@ export default {
                 _this.$emit('ok', res.data)
                 _this.spinning = false
               }, 1000)
-            }else{
+            } else {
               _this.spinning = false
             }
           })

+ 3 - 0
src/views/bulkManagement/bulkWarehousingOrder/detail.vue

@@ -96,13 +96,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getOperationalPrecision } from '@/libs/tools.js'
 import { sparePartsPurDetail, sparePartsPurDetailList, sparePartsPurDetailCount, sparePartsPurDetailPrint } from '@/api/sparePartsPur'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'BulkWarehousingDetail',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/bulkManagement/bulkWarehousingOrder/edit.vue

@@ -216,6 +216,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import basicInfoModal from './basicInfoModal.vue'
 import { getOperationalPrecision } from '@/libs/tools.js'
@@ -227,7 +228,9 @@ import ProductBrand from '../../common/productBrand.js'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'BulkWarehousingEdit',
   components: { STable, VSelect, basicInfoModal, Print, ProductType, ProductBrand },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/bulkManagement/bulkWarehousingOrder/list.vue

@@ -139,6 +139,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import getDate from '@/libs/getDate.js'
@@ -147,7 +148,9 @@ import { sparePartsPurList, sparePartsPurCount, sparePartsPurDel, sparePartsPurP
 import { supplierAllList } from '@/api/supplier'
 import { downloadExcel } from '@/libs/JGPrint.js'
 export default {
+  name: 'BulkWarehousingList',
   components: { STable, VSelect, basicInfoModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 111 - 0
src/views/common/commonModal.vue

@@ -0,0 +1,111 @@
+<template>
+  <a-modal
+    centered
+    class="common-modal"
+    :footer="null"
+    :maskClosable="false"
+    v-model="isShow"
+    :title="modalTit"
+    :bodyStyle="{padding: modalTit?'25px 32px 20px':'50px 32px 15px'}"
+    @cancle="isShow=false"
+    :width="416">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div class="common-main" v-html="modalHtml"></div>
+      <div class="btn-box">
+        <a-button type="primary" class="button-warning" @click="handleCommonCancel" v-if="isCancel">{{ cancelText }}</a-button>
+        <a-button type="primary" class="button-info" @click="handleCommonOk">{{ okText }}</a-button>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+export default {
+  name: 'CommonModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    modalTit: { // 弹框标题
+      type: String,
+      default: null
+    },
+    modalHtml: {
+      type: String,
+      default: ''
+    },
+    okText: { // 确定 按钮文字
+      type: String,
+      default: '确定'
+    },
+    cancelText: { // 取消 按钮文字
+      type: String,
+      default: '取消'
+    },
+    isCancel: { // 是否显示  取消 按钮
+      type: Boolean,
+      default: true
+    },
+    spinning: { // 加载中
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal //  是否打开弹框
+    }
+  },
+  methods: {
+    // 确定
+    handleCommonOk () {
+      this.$emit('ok')
+    },
+    // 取消
+    handleCommonCancel () {
+      this.$emit('cancel')
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .common-modal{
+    .common-main{
+      display: flex;
+      line-height: 20px;
+      .common-cont{
+        .common-tit{
+          color: rgba(0, 0, 0);
+          font-weight: 500;
+          font-size: 16px;
+          line-height: 1.4;
+          margin: 0;
+        }
+        .common-txt{
+          margin: 8px 0 0;
+          color: rgba(0, 0, 0);
+          font-size: 14px;
+          line-height: 1.5;
+        }
+      }
+    }
+    .btn-box{
+      text-align: right;
+      margin-top: 20px;
+    }
+  }
+</style>

+ 11 - 0
src/views/common/custList.vue

@@ -9,6 +9,7 @@
     :filter-option="false"
     :not-found-content="fetching ? undefined : null"
     :dropdownMatchSelectWidth="false"
+    @blur="blurSelect"
     @search="fetchUser"
     @change="handleChange"
     allowClear
@@ -36,6 +37,10 @@ export default {
     itemSn: {
       type: String || Number,
       default: undefined
+    },
+    isEnabled: { // 是否只查启用状态
+      type: Boolean,
+      default: false
     }
   },
   data () {
@@ -61,6 +66,9 @@ export default {
       } else {
         params.queryWord = dealerName
       }
+      if (this.isEnabled) {
+        params.enabledFlag = 1
+      }
       custList(params).then(res => {
         if (fetchId !== this.lastFetchId) {
           return
@@ -90,6 +98,9 @@ export default {
         data: [],
         fetching: false
       })
+    },
+    blurSelect () {
+      this.data = []
     }
   },
   mounted () {

+ 98 - 0
src/views/common/productJqList.vue

@@ -0,0 +1,98 @@
+<template>
+  <!-- 箭冠产品 -->
+  <a-select
+    show-search
+    label-in-value
+    :value="productCode"
+    placeholder="请输入产品编码搜索"
+    style="width: 100%"
+    :filter-option="false"
+    :dropdownMatchSelectWidth="false"
+    :not-found-content="fetching ? undefined : null"
+    @blur="blurSelect"
+    @search="fetchUser"
+    @change="handleChange"
+    allowClear>
+    <a-spin v-if="fetching" slot="notFoundContent" size="small" />
+    <a-select-option v-for="item in data" :key="item.productSn" :value="item.productSn">{{ item.code }}</a-select-option>
+  </a-select>
+</template>
+<script>
+import debounce from 'lodash/debounce'
+import { shelfDealerProductList } from '@/api/shelf'
+export default {
+  props: {
+    itemSn: {
+      type: String || Number,
+      default: undefined
+    },
+    params: {
+      type: Object,
+      default: ()=> {
+        return null
+      }
+    }
+  },
+  data () {
+    this.lastFetchId = 0
+    this.fetchUser = debounce(this.fetchUser, 800)
+    return {
+      data: [],
+      productCode: undefined,
+      fetching: false
+    }
+  },
+  methods: {
+    fetchUser (productCode) {
+      console.log('fetching user', productCode)
+      if (productCode == '') return
+      this.lastFetchId += 1
+      const fetchId = this.lastFetchId
+      this.data = []
+      this.fetching = true
+      let params = { code: productCode, pageNo: 1, pageSize: 20 }
+      if(this.params){
+        params = Object.assign(params, this.params)
+      }
+      shelfDealerProductList(params).then(res => {
+        if (fetchId !== this.lastFetchId) {
+          return
+        }
+        this.data = res.data && res.data.list ? res.data.list : []
+        this.fetching = false
+      })
+    },
+    handleChange (value) {
+      if (value && value.key) {
+        const ind = this.data.findIndex(item => item.productSn == value.key)
+        value.row = ind != -1 ? this.data[ind] : undefined
+      }
+      Object.assign(this, {
+        productCode: value,
+        data: [],
+        fetching: false
+      })
+      this.$emit('change', value || { key: undefined, label: '' })
+    },
+    resetForm () {
+      this.productCode = undefined
+    },
+    setData (value) {
+      Object.assign(this, {
+        productCode: value,
+        data: [],
+        fetching: false
+      })
+    },
+    blurSelect () {
+      this.data = []
+    }
+  },
+  mounted () {
+    if (this.itemSn) {
+      this.fetchUser(this.itemSn)
+      this.setData({ key: this.itemSn })
+    }
+  }
+}
+</script>

+ 88 - 0
src/views/common/shelfList.vue

@@ -0,0 +1,88 @@
+<template>
+  <!-- 货架 -->
+  <a-select
+    show-search
+    label-in-value
+    :value="shelfName"
+    placeholder="请输入名称搜索"
+    style="width: 100%"
+    :filter-option="false"
+    :dropdownMatchSelectWidth="false"
+    :not-found-content="fetching ? undefined : null"
+    @blur="blurSelect"
+    @search="fetchUser"
+    @change="handleChange"
+    allowClear>
+    <a-spin v-if="fetching" slot="notFoundContent" size="small" />
+    <a-select-option v-for="item in data" :key="item.shelfSn" :value="item.shelfSn">{{ item.shelfName }}</a-select-option>
+  </a-select>
+</template>
+<script>
+import debounce from 'lodash/debounce'
+import { shelfList } from '@/api/shelf'
+export default {
+  props: {
+    itemSn: {
+      type: String || Number,
+      default: undefined
+    }
+  },
+  data () {
+    this.lastFetchId = 0
+    this.fetchUser = debounce(this.fetchUser, 800)
+    return {
+      data: [],
+      shelfName: undefined,
+      fetching: false
+    }
+  },
+  methods: {
+    fetchUser (shelfName) {
+      console.log('fetching user', shelfName)
+      if (shelfName == '') return
+      this.lastFetchId += 1
+      const fetchId = this.lastFetchId
+      this.data = []
+      this.fetching = true
+      shelfList({ shelfName: shelfName, pageNo: 1, pageSize: 20 }).then(res => {
+        if (fetchId !== this.lastFetchId) {
+          return
+        }
+        this.data = res.data && res.data.list ? res.data.list : []
+        this.fetching = false
+      })
+    },
+    handleChange (value) {
+      if (value && value.key) {
+        const ind = this.data.findIndex(item => item.shelfSn == value.key)
+        value.row = ind != -1 ? this.data[ind] : undefined
+      }
+      Object.assign(this, {
+        shelfName: value,
+        data: [],
+        fetching: false
+      })
+      this.$emit('change', value || { key: undefined, label: '' })
+    },
+    resetForm () {
+      this.shelfName = undefined
+    },
+    setData (value) {
+      Object.assign(this, {
+        shelfName: value,
+        data: [],
+        fetching: false
+      })
+    },
+    blurSelect () {
+      this.data = []
+    }
+  },
+  mounted () {
+    if (this.itemSn) {
+      this.fetchUser(this.itemSn)
+      this.setData({ key: this.itemSn })
+    }
+  }
+}
+</script>

+ 59 - 0
src/views/common/shelfSettleType.js

@@ -0,0 +1,59 @@
+import { productTypeQuery } from '@/api/productType'
+const ProductType = {
+  template: `
+      <a-cascader
+        @change="handleChange"
+        change-on-select
+        :value="defaultVal"
+        expand-trigger="hover"
+        :options="productTypeList"
+        :fieldNames="{ label: 'productTypeName', value: 'productTypeSn', children: 'children' }"
+        :id="id"
+        placeholder="请选择结算方式"
+        allowClear />
+    `,
+  props: {
+    value: {
+      type: Array,
+      defatut: function () {
+        return []
+      }
+    },
+    id: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      defaultVal: this.value,
+      productTypeList: []
+    }
+  },
+  watch: {
+    value (newValue, oldValue) {
+      this.defaultVal = newValue
+    }
+  },
+  mounted () {
+    this.getProductType()
+  },
+  methods: {
+    handleChange (value) {
+      this.defaultVal = value
+      this.$emit('change', this.defaultVal)
+    },
+    //  产品分类列表
+    getProductType () {
+      productTypeQuery({}).then(res => {
+        if (res.status == 200) {
+          this.productTypeList = res.data
+        } else {
+          this.productTypeList = []
+        }
+      })
+    }
+  }
+}
+
+export default ProductType

+ 2 - 0
src/views/customerManagement/customerInfo/edit.vue

@@ -133,6 +133,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { getArea } from '@/api/data'
 import { custSave, custFindById, settleStyleFindAllList } from '@/api/customer'
@@ -140,6 +141,7 @@ import { custTypeFindAllList } from '@/api/custType'
 export default {
   name: 'CustomerManagementEdit',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   props: {
     model: {
       type: String,

+ 3 - 0
src/views/customerManagement/customerInfo/list.vue

@@ -120,6 +120,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { getArea } from '@/api/data'
 import { custList, custDel, updateEnableStatus } from '@/api/customer'
 import { custTypeFindAllList } from '@/api/custType'
@@ -127,7 +128,9 @@ import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import customerManagementDetailModal from './detailModal.vue'
 export default {
+  name: 'CustomerManagementList',
   components: { STable, VSelect, customerManagementDetailModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/financialManagement/companyCollectionPayment/detail.vue

@@ -57,10 +57,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { settleUnitDetailList, settleUnitDetail } from '@/api/settle'
 export default {
+  name: 'CompanyCollectionPaymentDetail',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/financialManagement/companyCollectionPayment/list.vue

@@ -96,12 +96,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { settleStyleQueryAll } from '@/api/settleStyle'
 import { settleUnitList, settleUnitQuerySum } from '@/api/settle'
 export default {
+  name: 'CompanyCollectionPaymentList',
   components: { STable, VSelect, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 23 - 51
src/views/financialManagement/companyReceivablePayable/chooseBillModal.vue

@@ -46,12 +46,13 @@
         class="sTable"
         ref="table"
         size="small"
-        :row-selection="{ selectedRowKeys: selectedRowKeys, onChange: onChange, onSelect: onSelectChange, onSelectAll: onSelectAllChange }"
         :rowKey="(record) => record.id"
+        :row-selection="{ columnWidth: 40 }"
+        @rowSelection="rowSelectionFun"
         :columns="columns"
         :data="loadData"
         :showPagination="false"
-        :scroll="{ x: '100%', y: 400 }"
+        :scroll="{ y: 400 }"
         :defaultLoadData="false"
         bordered>
       </s-table>
@@ -64,12 +65,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { settleInfoAllList } from '@/api/settle'
 export default {
   name: 'ChooseBillModal',
   components: { STable, VSelect, rangeDate },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,
@@ -99,12 +102,12 @@ export default {
       },
       // 表头
       columns: [
-        { title: '序号', dataIndex: 'no', width: 80, align: 'center' },
-        { title: '单据号', dataIndex: 'bizNo', width: 220, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '单据类型', dataIndex: 'bizTypeDictValue', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '审核时间', dataIndex: 'auditTime', width: 160, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '金额', dataIndex: 'totalAmount', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '余额', dataIndex: 'unsettleAmount', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+        { title: '序号', dataIndex: 'no', width: '6%', align: 'center' },
+        { title: '单据号', dataIndex: 'bizNo', width: '28%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '单据类型', dataIndex: 'bizTypeDictValue', width: '18%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '审核时间', dataIndex: 'auditTime', width: '18%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '金额', dataIndex: 'totalAmount', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '余额', dataIndex: 'unsettleAmount', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -114,33 +117,32 @@ export default {
           let data
           if (res.status == 200) {
             data = res.data
-            this.selectedRowKeys = []
-            this.selectedRows = []
+            const selectedRowKeys = []
+            const selectedRows = []
             for (var i = 0; i < data.length; i++) {
               data[i].no = i + 1
               data[i].settleAmount = data[i].unsettleAmount
               const ind = this.nowChoose.findIndex(item => item.id == data[i].id)
               if (ind != -1) {
-                this.selectedRowKeys.push(data[i].id)
-                this.selectedRows.push(data[i])
+                selectedRowKeys.push(data[i].id)
+                selectedRows.push(data[i])
               }
             }
+            this.$refs.table.setTableSelected(selectedRowKeys, selectedRows) // 设置表格选中项
             this.disabled = false
           }
           this.spinning = false
           return data
         })
       },
-      selectedRowKeys: [],
-      selectedRows: []
-    }
-  },
-  computed: {
-    hasSelected () {
-      return this.selectedRowKeys.length > 0
+      rowSelectionInfo: null
     }
   },
   methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
     //  时间  change
     dateChange (date) {
       this.queryParam.auditBeginDate = date[0]
@@ -148,7 +150,7 @@ export default {
     },
     // 确定
     handleSave () {
-      this.$emit('ok', this.selectedRows)
+      this.$emit('ok', this.rowSelectionInfo && this.rowSelectionInfo.selectedRows)
       this.isShow = false
     },
     // 重置
@@ -159,35 +161,6 @@ export default {
       this.queryParam.bizNo = ''
       this.queryParam.bizType = undefined
       this.$refs.table.refresh(true)
-    },
-    onChange (selectedRowKeys, selectedRows) {
-      this.selectedRowKeys = selectedRowKeys
-    },
-    onSelectChange (record, selected, selectedRows, nativeEvent) {
-      if (selected) { //  选择
-        this.selectedRows.push(record)
-      } else { //  取消
-        this.selectedRows = selectedRows
-      }
-    },
-    // 本页全选/取消全选
-    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)
-        })
-      }
     }
   },
   watch: {
@@ -200,8 +173,7 @@ export default {
       const _this = this
       if (!newValue) {
         _this.$emit('close')
-        _this.selectedRowKeys = []
-        _this.selectedRows = []
+        _this.$refs.table.clearSelected() // 清空表格选中项
         _this.resetSearchForm()
       } else {
         setTimeout(() => {

+ 3 - 0
src/views/financialManagement/companyReceivablePayable/collectionPayment.vue

@@ -147,12 +147,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import chooseBillModal from './chooseBillModal.vue'
 import { settleStyleQueryAll } from '@/api/settleStyle'
 import { settleUnitSave } from '@/api/settle'
 export default {
+  name: 'CollectionPaymentDetail',
   components: { STable, VSelect, chooseBillModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 4 - 1
src/views/financialManagement/companyReceivablePayable/detail.vue

@@ -72,12 +72,15 @@
 </template>
 
 <script>
-import { downloadExcel } from '@/libs/JGPrint.js'
+import { commonMixin } from '@/utils/mixin'
+// import { downloadExcel } from '@/libs/JGPrint.js'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { settleInfoList, settleInfoQueryReceiptOrPaySum } from '@/api/settle'
 export default {
+  name: 'CompanyReceivablePayableDetail',
   components: { STable, VSelect, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/financialManagement/companyReceivablePayable/list.vue

@@ -74,10 +74,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { settleUnitClientList, settleInfoQuerySum } from '@/api/settle'
 export default {
+  name: 'CollectionPaymentList',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 1
src/views/financialManagement/expenseManagement/edit.vue

@@ -51,7 +51,7 @@
             </a-select>
           </a-form-model-item>
           <a-form-model-item label="关联单号" prop="bizNo">
-            <a-input id="expenseManagementEdit-bizNo" :maxLength="30" v-model="form.bizNo" placeholder="请输入关联单号(最多30个字符)" allowClear />
+            <a-input id="expenseManagementEdit-bizNo" :maxLength="30" v-model.trim="form.bizNo" placeholder="请输入关联单号(最多30个字符)" allowClear />
           </a-form-model-item>
           <a-form-model-item label="备注" prop="remark">
             <a-textarea id="expenseManagementEdit-remarks" :maxLength="500" v-model="form.remark" placeholder="请输入备注(最多500个字符)" allowClear />
@@ -66,6 +66,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { settleExpenseSave, findExpenseDetail } from '@/api/settleExpense'
 import { costTypeAllQuery } from '@/api/costType'
@@ -73,6 +74,7 @@ import { settleStyleQueryAll } from '@/api/settleStyle'
 export default {
   name: 'ExpenseManagementEdit',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/financialManagement/expenseManagement/list.vue

@@ -119,13 +119,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { settleExpenseQuery, delExpense, settleExpenseQuerySum, auditExpense } from '@/api/settleExpense'
 import { costTypeAllQuery } from '@/api/costType'
 import expenseManagementDetailModal from './detailModal.vue'
 export default {
+  name: 'ExpenseManagementList',
   components: { STable, VSelect, expenseManagementDetailModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 18 - 67
src/views/financialManagement/financialCollection/list.vue

@@ -44,8 +44,8 @@
             <a-col :md="6" :sm="24">
               <span class="table-page-search-submitButtons">
                 <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="financialCollectionList-refresh">查询</a-button>
-                <a-button style="margin-left: 8px" @click="resetSearchForm()" :disabled="disabled" id="financialCollectionList-reset">重置</a-button>
-                <a @click="advanced = !advanced" style="margin-left: 8px">
+                <a-button style="margin-left: 5px" @click="resetSearchForm()" :disabled="disabled" id="financialCollectionList-reset">重置</a-button>
+                <a @click="advanced = !advanced" style="margin-left: 5px">
                   {{ advanced ? '收起' : '展开' }}
                   <a-icon :type="advanced ? 'up' : 'down'" />
                 </a>
@@ -70,9 +70,7 @@
       <div v-if="$hasPermissions('B_financialCollectionPl')" style="margin-bottom: 10px">
         <a-button type="primary" id="financialCollectionList-export" :loading="loading" @click="handleCollection">批量收款</a-button>
         <span style="margin-left: 8px" v-if="$hasPermissions('B_financialCollectionPl')">
-          <template v-if="hasSelected">
-            {{ `已选 ${selectedRowKeys.length} 项` }}
-          </template>
+          <template v-if="rowSelectionInfo&&rowSelectionInfo.selectedRowKeys.length>0">{{ `已选 ${rowSelectionInfo.selectedRowKeys.length} 项` }}</template>
         </span>
       </div>
       <!-- 列表 -->
@@ -81,8 +79,9 @@
         ref="table"
         :style="{ height: tableHeight+84.5+'px' }"
         size="small"
-        :row-selection="$hasPermissions('B_financialCollectionPl') ? rowSelection : null"
         :rowKey="record => record.id"
+        :row-selection="$hasPermissions('B_financialCollectionPl') ? { columnWidth: 40, getCheckboxProps: record => ({ props: { disabled: record.settleState == 'SETTLED' } }) } : null"
+        @rowSelection="rowSelectionFun"
         :columns="columns"
         :data="loadData"
         :scroll="{ y: tableHeight }"
@@ -117,12 +116,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import detailModal from './detailModal.vue'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { settleReceiptQuery, queryByTypeSum, settleReceiptMoney, settleReceiptQuerySum } from '@/api/settleReceipt'
 export default {
+  name: 'FinancialCollectionList',
   components: { STable, VSelect, detailModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,
@@ -163,8 +165,6 @@ export default {
         { title: '收款时间', dataIndex: 'settleTime', width: '7%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '操作', scopedSlots: { customRender: 'action' }, width: '5%', align: 'center' }
       ],
-      selectedRowKeys: [], // Check here to configure the default column
-      selectedRows: [],
       loading: false,
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -187,38 +187,15 @@ export default {
           return data
         })
       },
-      tabPaneData: []
-    }
-  },
-  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
-      }
+      tabPaneData: [],
+      rowSelectionInfo: null
     }
   },
   methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
     //  时间  change
     dateChange (date) {
       this.queryParam.auditBeginDate = date[0]
@@ -259,8 +236,8 @@ export default {
         this.loading = false
         if (res.status == 200) {
           this.$message.success(res.message)
-          this.selectedRowKeys = []
           this.$refs.table.refresh()
+          this.$refs.table.clearSelected() // 清空表格选中项
           this.spinning = false
         } else {
           this.spinning = false
@@ -275,18 +252,18 @@ export default {
     },
     // 批量收款
     handleCollection () {
-      if (this.selectedRowKeys.length < 1) {
+      if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length < 1)) {
         this.$message.warning('请在列表勾选后再进行批量操作!')
         return
       }
       this.loading = true
       this.spinning = true
-      settleReceiptMoney(this.selectedRowKeys).then(res => {
+      settleReceiptMoney(this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys).then(res => {
         this.loading = false
         if (res.status == 200) {
           this.$message.success(res.message)
-          this.selectedRowKeys = []
           this.$refs.table.refresh()
+          this.$refs.table.clearSelected() // 清空表格选中项
           this.spinning = false
         } else {
           this.spinning = false
@@ -313,32 +290,6 @@ export default {
         auditEndDate: ''
       }
     },
-    onSelectChange (record, selected, selectedRows, nativeEvent) {
-      if (selected) { //  选择
-        this.selectedRows.push(record)
-      } else { //  取消
-        this.selectedRows = selectedRows
-      }
-    },
-    // 本页全选/取消全选
-    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)
-        })
-      }
-    },
     pageInit () {
       const _this = this
       this.$nextTick(() => { // 页面渲染完成后的回调

+ 18 - 67
src/views/financialManagement/financialPayment/list.vue

@@ -43,8 +43,8 @@
             <a-col :md="6" :sm="24">
               <span class="table-page-search-submitButtons">
                 <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="finacialPay-refresh">查询</a-button>
-                <a-button style="margin-left: 8px" @click="resetSearchForm()" :disabled="disabled" id="finacialPay-reset">重置</a-button>
-                <a @click="advanced = !advanced" style="margin-left: 8px">
+                <a-button style="margin-left: 5px" @click="resetSearchForm()" :disabled="disabled" id="finacialPay-reset">重置</a-button>
+                <a @click="advanced = !advanced" style="margin-left: 5px">
                   {{ advanced ? '收起' : '展开' }}
                   <a-icon :type="advanced ? 'up' : 'down'" />
                 </a>
@@ -69,9 +69,7 @@
       <div v-if="$hasPermissions('B_financialPaymentPl')" style="margin-bottom: 10px">
         <a-button type="primary" id="finacialPay-export" :loading="loading" @click="handlePayment">批量付款</a-button>
         <span style="margin-left: 8px" v-if="$hasPermissions('B_financialPaymentPl')">
-          <template v-if="hasSelected">
-            {{ `已选 ${selectedRowKeys.length} 项` }}
-          </template>
+          <template v-if="rowSelectionInfo&&rowSelectionInfo.selectedRowKeys.length>0">{{ `已选 ${rowSelectionInfo.selectedRowKeys.length} 项` }}</template>
         </span>
       </div>
       <!-- 列表 -->
@@ -80,8 +78,9 @@
         ref="table"
         :style="{ height: tableHeight+84.5+'px' }"
         size="small"
-        :row-selection="$hasPermissions('B_financialPaymentPl') ? rowSelection : null"
         :rowKey="record => record.id"
+        :row-selection="$hasPermissions('B_financialPaymentPl') ? { columnWidth: 40, getCheckboxProps: record => ({ props: { disabled: record.settleState == 'SETTLED' } }) } : null"
+        @rowSelection="rowSelectionFun"
         :columns="columns"
         :data="loadData"
         :scroll="{ y: tableHeight }"
@@ -115,12 +114,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import detailModal from './detailModal.vue'
 import { settlePayQuery, queryByTypeSum, settlePayMoney, settlePayQuerySum } from '@/api/settlePay.js'
 import rangeDate from '@/views/common/rangeDate.vue'
 export default {
+  name: 'FinancialPaymentList',
   components: { STable, VSelect, detailModal, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,
@@ -161,8 +163,6 @@ export default {
         { title: '付款时间', dataIndex: 'settleTime', width: '11%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '操作', scopedSlots: { customRender: 'action' }, width: '5%', align: 'center' }
       ],
-      selectedRowKeys: [], // Check here to configure the default column
-      selectedRows: [],
       loading: false,
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -185,38 +185,15 @@ export default {
           return data
         })
       },
-      tabPaneData: []
-    }
-  },
-  computed: {
-    hasSelected () {
-      return this.selectedRowKeys.length > 0
-    },
-    rowSelection () {
-      if (this.$hasPermissions('B_financialPaymentPl')) {
-        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
-      }
+      tabPaneData: [],
+      rowSelectionInfo: null
     }
   },
   methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
     //  时间  change
     dateChange (date) {
       this.queryParam.auditBeginDate = date[0]
@@ -257,8 +234,8 @@ export default {
         this.loading = false
         if (res.status == 200) {
           this.$message.success(res.message)
-          this.selectedRowKeys = []
           this.$refs.table.refresh()
+          this.$refs.table.clearSelected() // 清空表格选中项
           this.spinning = false
         } else {
           this.spinning = false
@@ -273,17 +250,17 @@ export default {
     },
     // 批量付款
     handlePayment () {
-      if (this.selectedRowKeys.length < 1) {
+      if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length < 1)) {
         this.$message.warning('请在列表勾选后再进行批量操作!')
         return
       }
       this.loading = true
       this.spinning = true
-      settlePayMoney(this.selectedRowKeys).then(res => {
+      settlePayMoney(this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys).then(res => {
         this.loading = false
         if (res.status == 200) {
           this.$message.success(res.message)
-          this.selectedRowKeys = []
+          this.$refs.table.clearSelected() // 清空表格选中项
           this.$refs.table.refresh()
           this.spinning = false
         } else {
@@ -311,32 +288,6 @@ export default {
         auditEndDate: ''
       }
     },
-    onSelectChange (record, selected, selectedRows, nativeEvent) {
-      if (selected) { //  选择
-        this.selectedRows.push(record)
-      } else { //  取消
-        this.selectedRows = selectedRows
-      }
-    },
-    // 本页全选/取消全选
-    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)
-        })
-      }
-    },
     pageInit () {
       const _this = this
       this.$nextTick(() => { // 页面渲染完成后的回调

+ 3 - 0
src/views/financialManagement/inventoryCheckAudit/list.vue

@@ -71,12 +71,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import inventoryCheckingDetailModal from '@/views/inventoryManagement/inventoryChecking/detailModal.vue'
 import { checkWarehouseAuditList, checkWarehouseFinanceAudit, checkWarehouseReInventory } from '@/api/checkWarehouse'
 export default {
+  name: 'InventoryCheckingList',
   components: { STable, VSelect, rangeDate, inventoryCheckingDetailModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/financialManagement/ledgerRecord/list.vue

@@ -63,13 +63,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import getDate from '@/libs/getDate.js'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import custSatelliteList from '@/views/common/custSatelliteList.vue'
 import { satelliteWHSeparateList, satelliteWHSeparateTotal } from '@/api/satelliteWH'
 export default {
+  name: 'LedgerRecordList',
   components: { STable, VSelect, rangeDate, custSatelliteList },
+  mixins: [commonMixin],
   data () {
     return {
       advanced: true, //  高级搜索 展开/关闭

+ 3 - 0
src/views/financialManagement/warehousingAudit/detail.vue

@@ -55,12 +55,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { receivingDetailList, receivingDetailSn, receivingDetailPrint } from '@/api/receiving'
 import Print from '@/views/common/print.vue'
 import { hdPrint } from '@/libs/JGPrint'
 export default {
+  name: 'WarehousingAuditDetail',
   components: { STable, VSelect, Print },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/financialManagement/warehousingAudit/list.vue

@@ -94,13 +94,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import moment from 'moment'
 import getDate from '@/libs/getDate'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { receivingAuditList, receivingStockInAudit, receivingCount } from '@/api/receiving'
 export default {
+  name: 'WarehousingAuditList',
   components: { STable, VSelect, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/financialManagement/withdrawalManagement/cashOutModal.vue

@@ -47,9 +47,11 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { satelliteWHWithdrawalApply } from '@/api/satelliteWH'
 export default {
   name: 'ProductBrandEditModal',
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 3 - 0
src/views/financialManagement/withdrawalManagement/list.vue

@@ -54,12 +54,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDateTime from '@/views/common/rangeDateTime.vue'
 import cashOutModal from './cashOutModal.vue'
 import { satelliteWHWithdrawalList, satelliteWHWithdrawalAccount } from '@/api/satelliteWH'
 export default {
+  name: 'SatelliteWHWithdrawalList',
   components: { STable, VSelect, rangeDateTime, cashOutModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/inventoryManagement/inventoryChecking/basicInfoModal.vue

@@ -42,11 +42,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
 import { checkWarehouseSave, checkWarehouseWarehouse } from '@/api/checkWarehouse'
 export default {
   name: 'ChainTransferOutBasicInfoModal',
   components: { VSelect },
+  mixins: [commonMixin],
   props: {
     openModal: {
       //  弹框显示状态

+ 4 - 2
src/views/inventoryManagement/inventoryChecking/detailModal.vue

@@ -83,12 +83,12 @@
               <a-row :gutter="15">
                 <a-col :md="6" :sm="24">
                   <a-form-item label="产品编码" prop="productCode">
-                    <a-input id="inventoryCheckMakeInventoryList-productCode" v-model="queryParam.productCode" placeholder="请输入" allowClear />
+                    <a-input id="inventoryCheckMakeInventoryList-productCode" v-model.trim="queryParam.productCode" placeholder="请输入" allowClear />
                   </a-form-item>
                 </a-col>
                 <a-col :md="6" :sm="24">
                   <a-form-item label="产品名称" prop="productName">
-                    <a-input id="inventoryCheckMakeInventoryList-productName" v-model="queryParam.productName" placeholder="请输入" allowClear />
+                    <a-input id="inventoryCheckMakeInventoryList-productName" v-model.trim="queryParam.productName" placeholder="请输入" allowClear />
                   </a-form-item>
                 </a-col>
                 <a-col :md="6" :sm="24">
@@ -154,6 +154,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { downloadExcel } from '@/libs/JGPrint.js'
 import { STable } from '@/components'
 import printModal from './printModal.vue'
@@ -163,6 +164,7 @@ import { checkWarehouseDetailList, checkWarehouseDetail, checkWarehouseDetailCou
 export default {
   name: 'InventoryCheckingDetailModal',
   components: { STable, ProductType, printModal },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 4 - 1
src/views/inventoryManagement/inventoryChecking/list.vue

@@ -6,7 +6,7 @@
         <a-row :gutter="15">
           <a-col :md="6" :sm="24">
             <a-form-item label="盘点单号">
-              <a-input id="inventoryCheckingList-checkWarehouseNo" v-model="queryParam.checkWarehouseNo" allowClear placeholder="请输入盘点单号"/>
+              <a-input id="inventoryCheckingList-checkWarehouseNo" v-model.trim="queryParam.checkWarehouseNo" allowClear placeholder="请输入盘点单号"/>
             </a-form-item>
           </a-col>
           <a-col :md="6" :sm="24">
@@ -116,6 +116,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import auditModal from '@/views/common/auditModal.vue'
@@ -123,7 +124,9 @@ import basicInfoModal from './basicInfoModal.vue'
 import inventoryCheckingDetailModal from './detailModal.vue'
 import { checkWarehouseList, checkWarehouseDel, checkWarehouseAudit, checkWarehouseValidate, checkWarehouseReInventory } from '@/api/checkWarehouse'
 export default {
+  name: 'InventoryCheckingList',
   components: { STable, VSelect, rangeDate, auditModal, basicInfoModal, inventoryCheckingDetailModal },
+  mixins: [commonMixin],
   data () {
     return {
       queryParam: { //  查询条件

+ 5 - 2
src/views/inventoryManagement/inventoryChecking/makeInventory.vue

@@ -75,12 +75,12 @@
                 <a-row :gutter="15">
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="inventoryCheckMakeInventoryList-productCode" v-model="queryParam.productCode" placeholder="请输入" allowClear />
+                      <a-input id="inventoryCheckMakeInventoryList-productCode" v-model.trim="queryParam.productCode" placeholder="请输入" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="inventoryCheckMakeInventoryList-productName" v-model="queryParam.productName" placeholder="请输入" allowClear />
+                      <a-input id="inventoryCheckMakeInventoryList-productName" v-model.trim="queryParam.productName" placeholder="请输入" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
@@ -168,13 +168,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import ProductType from '@/views/common/productType.js'
 import printModal from './printModal.vue'
 import { downloadExcel } from '@/libs/JGPrint.js'
 import { checkWarehouseDetailList, checkWarehouseDetailCount, checkWarehouseInventory, checkWarehouseDetail, checkWarehouseDetailSave, checkWarehouseCheckZero, checkWarehouseWarehouse, checkWarehouseDetailExport, checkWarehouseDetailPrint } from '@/api/checkWarehouse'
 export default {
+  name: 'MakeInventory',
   components: { STable, VSelect, ProductType, printModal },
+  mixins: [commonMixin],
   props: {},
   data () {
     return {

+ 5 - 2
src/views/inventoryManagement/inventoryChecking/overall.vue

@@ -37,12 +37,12 @@
             <a-row :gutter="15">
               <a-col :md="8" :sm="24">
                 <a-form-item label="产品编码" prop="productCode">
-                  <a-input id="inventoryCheckOverallList-productCode" v-model="queryParam.productCode" placeholder="请输入" allowClear />
+                  <a-input id="inventoryCheckOverallList-productCode" v-model.trim="queryParam.productCode" placeholder="请输入" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="8" :sm="24">
                 <a-form-item label="产品名称" prop="productName">
-                  <a-input id="inventoryCheckOverallList-productName" v-model="queryParam.productName" placeholder="请输入" allowClear />
+                  <a-input id="inventoryCheckOverallList-productName" v-model.trim="queryParam.productName" placeholder="请输入" allowClear />
                 </a-form-item>
               </a-col>
               <a-col :md="8" :sm="24" style="margin-bottom: 10px;">
@@ -79,10 +79,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { checkWarehouseDetailList, checkWarehouseDetailCount, checkWarehouseSubmit, checkWarehouseDetail } from '@/api/checkWarehouse'
 export default {
+  name: 'CheckWarehouseOverall',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   props: {},
   data () {
     return {

+ 2 - 0
src/views/inventoryManagement/inventoryChecking/printModal.vue

@@ -49,7 +49,9 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 export default {
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 29 - 97
src/views/inventoryManagement/inventoryChecking/selfDisk.vue

@@ -33,12 +33,12 @@
                 <a-row :gutter="15">
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="inventoryCheckSelfDiskList-productCode" v-model="queryParam.productCode" placeholder="请输入" allowClear />
+                      <a-input id="inventoryCheckSelfDiskList-productCode" v-model.trim="queryParam.productCode" placeholder="请输入" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="inventoryCheckSelfDiskList-productName" v-model="queryParam.productName" placeholder="请输入" allowClear />
+                      <a-input id="inventoryCheckSelfDiskList-productName" v-model.trim="queryParam.productName" placeholder="请输入" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
@@ -88,13 +88,10 @@
           class="sTable"
           ref="table"
           size="small"
-          :row-selection="{
-            selectedRowKeys: selectedRowKeys,
-            onChange: onChange,
-            onSelect: onSelectChange,
-            onSelectAll: onSelectAllChange
-          }"
-          :rowKey="(record) => record.id"
+          :rowKey="(record) => record.productSn"
+          rowKeyName="productSn"
+          :row-selection="{ columnWidth: 40 }"
+          @rowSelection="rowSelectionFun"
           :columns="columns"
           :customRow="handleClickRow"
           :data="loadData"
@@ -129,12 +126,12 @@
                 <a-row :gutter="15">
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品编码" prop="productCode">
-                      <a-input id="inventoryCheckSelfDiskList-productCode" v-model="chooseQueryParam.productCode" placeholder="请输入" allowClear />
+                      <a-input id="inventoryCheckSelfDiskList-productCode" v-model.trim="chooseQueryParam.productCode" placeholder="请输入" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
                     <a-form-item label="产品名称" prop="productName">
-                      <a-input id="inventoryCheckSelfDiskList-productName" v-model="chooseQueryParam.productName" placeholder="请输入" allowClear />
+                      <a-input id="inventoryCheckSelfDiskList-productName" v-model.trim="chooseQueryParam.productName" placeholder="请输入" allowClear />
                     </a-form-item>
                   </a-col>
                   <a-col :md="6" :sm="24">
@@ -184,13 +181,9 @@
           class="sTable"
           ref="chooseTable"
           size="small"
-          :row-selection="{
-            selectedRowKeys: chooseSelectedRowKeys,
-            onChange: onChooseChange,
-            onSelect: onChooseSelectChange,
-            onSelectAll: onChooseSelectAllChange
-          }"
           :rowKey="(record) => record.id"
+          :row-selection="{ columnWidth: 40 }"
+          @rowSelection="rowChooseSelectionFun"
           :columns="chooseColumns"
           :data="chooseLoadData"
           :scroll="{ y: 300 }"
@@ -222,12 +215,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import ProductType from '@/views/common/productType.js'
 import ProductBrand from '@/views/common/productBrand.js'
 import { checkWarehouseDetail, checkWarehouseDetailStockList, checkWarehouseDetailList, checkWarehouseDetailCount, checkWarehouseDetailSave, checkWarehouseDetailSaveBatch, checkWarehouseDetailDel, checkWarehouseSubmit } from '@/api/checkWarehouse'
 export default {
+  name: 'CheckWarehouseSelfDisk',
   components: { STable, VSelect, ProductType, ProductBrand },
+  mixins: [commonMixin],
   props: {},
   data () {
     return {
@@ -289,11 +285,9 @@ export default {
       productType: [],
       chooseProductType: [],
       warehouseList: [], //  仓库  下拉数据
-      selectedRowKeys: [],
-      selectedRows: [],
-      chooseSelectedRowKeys: [],
-      chooseSelectedRows: [],
-      listData: []
+      listData: [],
+      rowSelectionInfo: null,
+      rowChooseSelectionInfo: null
     }
   },
   computed: {
@@ -333,6 +327,13 @@ export default {
     }
   },
   methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
+    rowChooseSelectionFun (obj) {
+      this.rowChooseSelectionInfo = obj || null
+    },
     //  重置
     resetSearchForm () {
       this.queryParam.productCode = ''
@@ -383,13 +384,13 @@ export default {
       const _this = this
       let params = {}
       if (type == 'batch') { //  批量添加
-        if (this.selectedRows.length == 0) {
+        if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRows.length == 0)) {
           this.$message.warning('请选择需要批量添加的选项值后再操作!')
           return
         }
         params.checkWarehouseSn = _this.$route.params.sn
         params.checkWarehouseDetailEntityList = []
-        this.selectedRows.map(item => {
+        this.rowSelectionInfo && this.rowSelectionInfo.selectedRows.map(item => {
           params.checkWarehouseDetailEntityList.push({
             checkWarehouseSn: _this.$route.params.sn,
             checkCost: item.putCost,
@@ -424,8 +425,7 @@ export default {
       this.spinning = true
       checkWarehouseDetailSaveBatch(params).then(res => {
         if (res.status == 200) {
-          this.selectedRowKeys = []
-          this.selectedRows = []
+          this.$refs.table.clearSelected() // 清空表格选中项
           this.$message.success(res.message)
           this.$refs.table.refresh()
           this.$refs.chooseTable.refresh()
@@ -440,7 +440,7 @@ export default {
       const _this = this
       let content
       if (isAll == 'batch') { // 批量
-        if (this.chooseSelectedRowKeys.length == 0) {
+        if (this.rowChooseSelectionInfo && this.rowChooseSelectionInfo.selectedRowKeys.length == 0) {
           this.$message.warning('请选择需要批量删除的选项值后再操作!')
           return
         }
@@ -458,7 +458,7 @@ export default {
           _this.spinning = true
           const params = { checkWarehouseSn: _this.$route.params.sn }
           if (isAll == 'batch') { // 批量
-            params.idList = _this.chooseSelectedRowKeys
+            params.idList = _this.rowChooseSelectionInfo && _this.rowChooseSelectionInfo.selectedRowKeys
           } else if (isAll == 'all') { // 全部
             params.allFlag = true
           } else { // 单个
@@ -470,8 +470,7 @@ export default {
               _this.$refs.table.refresh()
               _this.$refs.chooseTable.refresh()
               if (isAll == 'batch') { // 批量
-                _this.chooseSelectedRowKeys = []
-                _this.chooseSelectedRows = []
+                _this.$refs.chooseTable.clearSelected() // 清空表格选中项
               }
               _this.spinning = false
             } else {
@@ -555,73 +554,6 @@ export default {
           }
         }
       }
-    },
-    onChange (selectedRowKeys, selectedRows) {
-      this.selectedRowKeys = selectedRowKeys
-    },
-    onSelectChange (record, selected, selectedRows, nativeEvent) {
-      if (selected) { //  选择
-        this.selectedRows.push(record)
-      } else { //  取消
-        this.selectedRows = selectedRows
-      }
-    },
-    // 本页全选/取消全选
-    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)
-        })
-      }
-    },
-    onChooseChange (selectedRowKeys, selectedRows) {
-      this.chooseSelectedRowKeys = selectedRowKeys
-    },
-    onChooseSelectChange (record, selected, selectedRows, nativeEvent) {
-      const _this = this
-      if (selected) { //  选择
-        this.chooseSelectedRows.push(record)
-      } else { //  取消
-        const arrId = []
-        this.chooseSelectedRows.map((item, index) => {
-          if (item.id == record.id) {
-            arrId.push(index)
-          }
-        })
-        arrId.map((item, index) => {
-          _this.chooseSelectedRows = _this.chooseSelectedRows.slice(item, item + 1)
-        })
-      }
-    },
-    // 本页全选/取消全选
-    onChooseSelectAllChange (selected, selectedRows, changeRows) {
-      const _this = this
-      if (selected) { //  选择
-        this.chooseSelectedRows = [...this.chooseSelectedRows, ...changeRows]
-      } else { //  取消
-        const arrId = []
-        this.chooseSelectedRows.map((item, index) => {
-          this.chooseSelectedRows.map((subItem, ind) => {
-            if (item.id == subItem.id) {
-              arrId.push(index)
-            }
-          })
-        })
-        arrId.map((item, index) => {
-          _this.chooseSelectedRows = _this.chooseSelectedRows.slice(item, item + 1)
-        })
-      }
     }
   },
   mounted () {

+ 3 - 0
src/views/inventoryManagement/inventoryImport/list.vue

@@ -70,11 +70,14 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, Upload } from '@/components'
 import { stockImportList, stockImportFinish, stockImportCancel, stockImportKCExportError } from '@/api/stockImport'
 import { downloadExcel } from '@/libs/JGPrint.js'
 export default {
+  name: 'StockImportList',
   components: { STable, Upload },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/inventoryManagement/inventoryQuery/detailModal.vue

@@ -36,11 +36,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { stockDetailList, stockByProductSn } from '@/api/stock'
 export default {
   name: 'InventoryQueryDetailModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 4 - 1
src/views/inventoryManagement/inventoryQuery/list.vue

@@ -7,7 +7,7 @@
           <a-row :gutter="15">
             <a-col :md="6" :sm="24">
               <a-form-item label="产品编码">
-                <a-input id="inventoryQueryList-productCode" v-model="queryParam.productCode" allowClear placeholder="请输入产品编码"/>
+                <a-input id="inventoryQueryList-productCode" v-model.trim="queryParam.productCode" allowClear placeholder="请输入产品编码"/>
               </a-form-item>
             </a-col>
             <a-col :md="6" :sm="24">
@@ -123,6 +123,7 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { stockList, stockCount, stockExport } from '@/api/stock'
 import { dealerProductTypeList } from '@/api/dealerProductType'
 import { dealerProductBrandQuery } from '@/api/dealerProductBrand'
@@ -130,7 +131,9 @@ import { STable, VSelect } from '@/components'
 import inventoryQueryDetailModal from './detailModal.vue'
 import { downloadExcel } from '@/libs/JGPrint.js'
 export default {
+  name: 'InventoryQueryList',
   components: { STable, VSelect, inventoryQueryDetailModal },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 3 - 0
src/views/inventoryManagement/inventoryQuery/warehouseDetail.vue

@@ -97,13 +97,16 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { stockFlowList } from '@/api/stockFlow'
 import { stockByProductSn } from '@/api/stock'
 import { warehouseAllList } from '@/api/warehouse'
 export default {
+  name: 'WarehouseDetail',
   components: { STable, VSelect, rangeDate },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 47 - 83
src/views/inventoryManagement/inventoryWarning/list.vue

@@ -65,14 +65,6 @@
             <a-col :md="6" :sm="24">
               <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="inventoryWarningList-refresh">查询</a-button>
               <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="inventoryWarningList-reset">重置</a-button>
-              <!-- <a-button
-                style="margin-left: 8px"
-                type="primary"
-                class="button-warning"
-                @click="handleExport"
-                :disabled="disabled"
-                :loading="exportLoading"
-                id="inventoryWarningList-export">导出</a-button> -->
               <a @click="advanced=!advanced" style="margin-left: 5px">
                 {{ advanced ? '收起' : '展开' }}
                 <a-icon :type="advanced ? 'up' : 'down'"/>
@@ -84,8 +76,8 @@
       <!-- 操作按钮 -->
       <div class="table-operator">
         <a-button type="primary" v-if="$hasPermissions('B_inventoryWarningBatchSave')" id="inventoryWarningList-update" @click="handleupdate">批量更新</a-button>
-        <span style="margin-left: 8px" v-if="$hasPermissions('B_inventoryWarningBatchSave')">
-          <template v-if="hasSelected">{{ `已选 ${selectedRowKeys.length} 项` }}</template>
+        <span style="margin-left: 5px" v-if="$hasPermissions('B_inventoryWarningBatchSave')">
+          <template v-if="rowSelectionInfo&&rowSelectionInfo.selectedRowKeys.length>0">{{ `已选 ${rowSelectionInfo.selectedRowKeys.length} 项` }}</template>
         </span>
       </div>
       <!-- 列表 -->
@@ -94,16 +86,12 @@
         ref="table"
         :style="{ height: tableHeight+84.5+'px' }"
         size="small"
-        :row-selection="$hasPermissions('B_inventoryWarningBatchSave') ? {
-          selectedRowKeys: selectedRowKeys,
-          onChange: onChange,
-          onSelect: onSelectChange,
-          onSelectAll: onSelectAllChange
-        } : null"
         :rowKey="(record) => record.id"
+        :row-selection="$hasPermissions('B_inventoryWarningBatchSave') ? { columnWidth: 40 } : null"
+        @rowSelection="rowSelectionFun"
         :columns="columns"
         :data="loadData"
-        :scroll="{ x: 1490, y: tableHeight }"
+        :scroll="{ x: 1330, y: tableHeight }"
         :defaultLoadData="false"
         bordered>
         <!-- 产品分类 -->
@@ -131,6 +119,8 @@
               :precision="0"
               :min="0"
               :max="999999"
+              style="width: 100%;"
+              @change="numChange(record)"
               placeholder="请输入在途数" />
           </div>
         </template>
@@ -144,6 +134,8 @@
               :precision="0"
               :min="0"
               :max="999999"
+              style="width: 100%;"
+              @change="numChange(record)"
               placeholder="请输入最大库存数" />
           </div>
         </template>
@@ -157,6 +149,8 @@
               :precision="0"
               :min="0"
               :max="record.upperLimit"
+              style="width: 100%;"
+              @change="numChange(record)"
               placeholder="请输入最小库存数" />
           </div>
         </template>
@@ -177,13 +171,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import { stockWarnList, stockWarnSaveBatch } from '@/api/stockWarn'
 import { dealerProductBrandQuery } from '@/api/dealerProductBrand'
 import { dealerProductTypeList } from '@/api/dealerProductType'
-import { downloadExcel } from '@/libs/JGPrint.js'
 export default {
+  name: 'InventoryWarning',
   components: { STable, VSelect },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,
@@ -205,20 +201,19 @@ export default {
       productTypeList: [], //  产品类别下拉数据
       productType: [],
       columns: [
-        { title: '序号', dataIndex: 'no', width: 70, align: 'center' },
+        { title: '序号', dataIndex: 'no', width: 50, align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', align: 'center', ellipsis: true, customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
         { title: '原厂编码', dataIndex: 'productOrigCode', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品品牌', dataIndex: 'brandName', width: 150, align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 150, align: 'center' },
-        // { title: '实时库存数(个)', scopedSlots: { customRender: 'stockQty' }, width: 110, align: 'center' },
-        { title: '在途数(个)', scopedSlots: { customRender: 'inTransit' }, width: 100, align: 'center' },
-        { title: '总库存数(个)', dataIndex: 'currentStockQty', width: 100, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '最大库存数(个)', scopedSlots: { customRender: 'upperLimit' }, width: 110, align: 'center' },
-        { title: '最小库存数(个)', scopedSlots: { customRender: 'lowerLimit' }, width: 110, align: 'center' },
+        { title: '产品品牌', dataIndex: 'brandName', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: 120, align: 'center' },
+        { title: '在途数(个)', scopedSlots: { customRender: 'inTransit' }, width: 80, align: 'center' },
+        { title: '总库存数(个)', dataIndex: 'currentStockQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '最大库存数(个)', scopedSlots: { customRender: 'upperLimit' }, width: 100, align: 'center' },
+        { title: '最小库存数(个)', scopedSlots: { customRender: 'lowerLimit' }, width: 100, align: 'center' },
         { title: '差异数量', dataIndex: 'differenceNum', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '预警提示', scopedSlots: { customRender: 'stockState' }, width: 100, align: 'center' },
-        { title: '操作', scopedSlots: { customRender: 'action' }, width: 100, align: 'center', fixed: 'right' }
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: 80, align: 'center', fixed: 'right' }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -231,12 +226,12 @@ export default {
             const no = (data.pageNo - 1) * data.pageSize
             for (var i = 0; i < data.list.length; i++) {
               data.list[i].no = no + i + 1
-              if (this.selectedRowKeys) { //  处理切换页码后 上页已选已输数据保留
-                const ind = this.selectedRowKeys.indexOf(data.list[i].id)
+              if (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys) { //  处理切换页码后 上页已选已输数据保留
+                const ind = this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.indexOf(data.list[i].id)
                 if (ind >= 0) {
-                  data.list[i].inTransit = this.selectedRows[ind].inTransit
-                  data.list[i].upperLimit = this.selectedRows[ind].upperLimit
-                  data.list[i].lowerLimit = this.selectedRows[ind].lowerLimit
+                  data.list[i].inTransit = this.rowSelectionInfo && this.rowSelectionInfo.selectedRows[ind].inTransit
+                  data.list[i].upperLimit = this.rowSelectionInfo && this.rowSelectionInfo.selectedRows[ind].upperLimit
+                  data.list[i].lowerLimit = this.rowSelectionInfo && this.rowSelectionInfo.selectedRows[ind].lowerLimit
                 }
               }
             }
@@ -246,23 +241,31 @@ export default {
           return data
         })
       },
-      selectedRowKeys: [],
-      selectedRows: [],
-      loading: false
-    }
-  },
-  computed: {
-    hasSelected () {
-      return this.selectedRowKeys.length > 0
+      loading: false,
+      rowSelectionInfo: null
     }
   },
   methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
+    numChange (row) {
+      if (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys) { //  处理切换页码后 上页已选已输数据保留
+        const ind = this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.indexOf(row.id)
+        if (ind >= 0) {
+          this.rowSelectionInfo.selectedRows[ind].inTransit = row.inTransit
+          this.rowSelectionInfo.selectedRows[ind].upperLimit = row.upperLimit
+          this.rowSelectionInfo.selectedRows[ind].lowerLimit = row.lowerLimit
+        }
+      }
+    },
     //  保存
     handleSave (row, isBatch) {
       const params = []
       if (isBatch) { //  批量更新
         const dataInd = []
-        this.selectedRows.map((item, index) => {
+        this.rowSelectionInfo && this.rowSelectionInfo.selectedRows.map((item, index) => {
           if ((!item.inTransit && item.inTransit != 0) || (!item.upperLimit && item.upperLimit != 0) || (!item.lowerLimit && item.lowerLimit != 0)) {
             dataInd.push(item.no)
           }
@@ -307,43 +310,13 @@ export default {
         if (res.status == 200) {
           this.$message.success(res.message)
           this.$refs.table.refresh()
-          this.selectedRowKeys = []
-          this.selectedRows = []
+          this.$refs.table.clearSelected() // 清空表格选中项
           this.spinning = false
         } else {
           this.spinning = false
         }
       })
     },
-    onChange (selectedRowKeys, selectedRows) {
-      this.selectedRowKeys = selectedRowKeys
-    },
-    onSelectChange (record, selected, selectedRows, nativeEvent) {
-      if (selected) { //  选择
-        this.selectedRows.push(record)
-      } else { //  取消
-        this.selectedRows = selectedRows
-      }
-    },
-    // 本页全选/取消全选
-    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)
-        })
-      }
-    },
     //  重置
     resetSearchForm () {
       this.queryParam.productCode = ''
@@ -359,7 +332,7 @@ export default {
     },
     //  批量更新
     handleupdate () {
-      if (this.selectedRowKeys.length < 1) {
+      if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length < 1)) {
         this.$message.warning('请在列表勾选后再进行批量操作!')
         return
       }
@@ -405,15 +378,6 @@ export default {
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
     },
-    //  导出
-    handleExport () {
-      const params = this.queryParam
-      this.exportLoading = true
-      // customerBundleExportDelay(params).then(res => {
-      //   this.exportLoading = false
-	  // downloadExcel(res, '库存预警')
-      // })
-    },
     pageInit () {
       const _this = this
       this.$nextTick(() => { // 页面渲染完成后的回调

+ 2 - 0
src/views/inventoryManagement/satelliteWarehouseInventory/addModal.vue

@@ -63,11 +63,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { satelliteWHSupplyList, satelliteWHSupplyUpdate, satelliteWHSupplyDel, satelliteWHSupplyValidateStock, satelliteWHSupplyAddSales } from '@/api/satelliteWH'
 export default {
   name: 'SatelliteWarehouseInventoryAddModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

+ 3 - 0
src/views/inventoryManagement/satelliteWarehouseInventory/list.vue

@@ -65,12 +65,15 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable, VSelect } from '@/components'
 import satelliteWarehouseInventoryAddModal from './addModal.vue'
 import custSatelliteList from '@/views/common/custSatelliteList.vue'
 import { satelliteWHStockList, satelliteWHSupplyInsert } from '@/api/satelliteWH'
 export default {
+  name: 'SatelliteWHStockList',
   components: { STable, VSelect, satelliteWarehouseInventoryAddModal, custSatelliteList },
+  mixins: [commonMixin],
   data () {
     return {
       spinning: false,

+ 2 - 0
src/views/inventoryManagement/warehouse/editModal.vue

@@ -49,11 +49,13 @@
 </template>
 
 <script>
+import { commonMixin } from '@/utils/mixin'
 import { STable } from '@/components'
 import { warehouseSave } from '@/api/warehouse'
 export default {
   name: 'WarehouseEditModal',
   components: { STable },
+  mixins: [commonMixin],
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,

Некоторые файлы не были показаны из-за большого количества измененных файлов