Ver Fonte

Merge branch 'develop_yh12' of http://git.chelingzhu.com/jianguan-web/jg-ocs-html into pre-release

# Conflicts:
#	src/config/router.config.js
#	vue.config.js
lilei há 2 anos atrás
pai
commit
b21dc4fe5d
54 ficheiros alterados com 8389 adições e 3266 exclusões
  1. 1 1
      public/version.json
  2. 68 1
      src/api/reportData.js
  3. 37 1
      src/api/spareParts.js
  4. 137 0
      src/api/sparePartsReturn.js
  5. 69 0
      src/api/supplier.js
  6. 3227 3051
      src/config/router.config.js
  7. 1 1
      src/libs/getDate.js
  8. 1 3
      src/libs/tools.js
  9. 12 0
      src/utils/mixin.js
  10. 41 4
      src/views/allocationManagement/transferOut/basicInfoModal.vue
  11. 13 0
      src/views/allocationManagement/transferOut/detail.vue
  12. 34 3
      src/views/allocationManagement/transferOut/edit.vue
  13. 3 2
      src/views/common/chooseProductsModal.vue
  14. 20 15
      src/views/common/supplier.js
  15. 6 28
      src/views/expenseManagement/expenseReimbursement/add.vue
  16. 6 6
      src/views/expenseManagement/expenseReimbursement/chooseImportModal.vue
  17. 3 3
      src/views/expenseManagement/expenseReimbursement/detail.vue
  18. 7 6
      src/views/expenseManagement/expenseReimbursement/productInfoModal.vue
  19. 6 1
      src/views/inventoryManagement/inventoryQuery/warehouseDetail.vue
  20. 99 0
      src/views/purchasingManagement/bulkWarehousingOrder/auditNoPassModal.vue
  21. 3 32
      src/views/purchasingManagement/bulkWarehousingOrder/basicInfoModal.vue
  22. 193 0
      src/views/purchasingManagement/bulkWarehousingOrder/batchAuditNoModal.vue
  23. 7 5
      src/views/purchasingManagement/bulkWarehousingOrder/chooseImportModal.vue
  24. 7 2
      src/views/purchasingManagement/bulkWarehousingOrder/detailModal.vue
  25. 10 3
      src/views/purchasingManagement/bulkWarehousingOrder/edit.vue
  26. 3 3
      src/views/purchasingManagement/bulkWarehousingOrder/importGuideModal.vue
  27. 39 21
      src/views/purchasingManagement/bulkWarehousingOrder/list.vue
  28. 41 19
      src/views/purchasingManagement/bulkWarehousingOrder/productModal.vue
  29. 201 0
      src/views/purchasingManagement/purchaseReturn/addModal.vue
  30. 185 0
      src/views/purchasingManagement/purchaseReturn/chooseDepartUserModal.vue
  31. 188 0
      src/views/purchasingManagement/purchaseReturn/detailModal.vue
  32. 376 0
      src/views/purchasingManagement/purchaseReturn/list.vue
  33. 544 0
      src/views/purchasingManagement/purchaseReturn/purchaseReturnDeatil.vue
  34. 246 0
      src/views/purchasingManagement/purchaseReturn/queryPart.vue
  35. 97 0
      src/views/purchasingManagement/purchaseReturn/reviewProgressModal.vue
  36. 4 4
      src/views/reportData/transferReturnReport/list.vue
  37. 480 0
      src/views/reportData/urchaseDetailReturn/detailList.vue
  38. 253 0
      src/views/reportData/urchaseReturn/list.vue
  39. 19 6
      src/views/salesManagement/receiptPrint/list.vue
  40. 2 0
      src/views/salesManagement/salesQuery/edit.vue
  41. 32 2
      src/views/salesReturnManagement/receiveCheck/list.vue
  42. 152 0
      src/views/salesReturnManagement/receiveCheck/printModal.vue
  43. 14 20
      src/views/supplierManagement/associatedProduct/add.vue
  44. 4 4
      src/views/supplierManagement/associatedProduct/chooseImportModal.vue
  45. 2 2
      src/views/supplierManagement/associatedProduct/importGuideModal.vue
  46. 3 3
      src/views/supplierManagement/associatedProduct/settingCost.vue
  47. 2 1
      src/views/supplierManagement/associatedProductDetails/list.vue
  48. 208 0
      src/views/supplierManagement/costSetRecord/list.vue
  49. 346 0
      src/views/supplierManagement/costSetting/addProductModal.vue
  50. 191 0
      src/views/supplierManagement/costSetting/chooseImportModal.vue
  51. 221 0
      src/views/supplierManagement/costSetting/importGuideModal.vue
  52. 342 0
      src/views/supplierManagement/costSetting/list.vue
  53. 170 0
      src/views/supplierManagement/costSetting/settingCost.vue
  54. 13 13
      vue.config.js

+ 1 - 1
public/version.json

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

+ 68 - 1
src/api/reportData.js

@@ -578,4 +578,71 @@ export const expenseCollectReportExportByProductType = (params) => {
     method: 'post',
     responseType: 'blob'
   })
-}
+}
+
+/*
+* 采购退货报表列表
+*/
+export const sparePartsReturnReportList = (params) => {
+  const url = `/report/sparePartsReturn/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 采购退货报表合计
+export const sparePartsReturnReportStat = (params) => {
+  const url = `/report/sparePartsReturn/queryPageCount`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 采购退货报表导出
+export const sparePartsReturnReportExport = (params) => {
+  return axios({
+    url: '/report/sparePartsReturn/export',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+
+/*
+* 采购退货明细报表列表
+*/
+export const sparePartsReturnDetailReportList = (params) => {
+  const url = `/report/sparePartsReturn/detail/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 采购退货明细报表合计
+export const sparePartsReturnDetailReportStat = (params) => {
+  const url = `/report/sparePartsReturn/detail/queryPageCount`
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 导出明细
+export const sparePartsReturnReportExportDetail = (params) => {
+  return axios({
+    url: '/report/sparePartsReturn/detail/export',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}

+ 37 - 1
src/api/spareParts.js

@@ -24,11 +24,35 @@ export const sparePartsDetailExport = (params) => {
 // 审核
 export const sparePartsAudit = (params) => {
   return axios({
-    url: `/spareParts/audit`,
+    url: `/spareParts/audit/${params.sn}`,
+    method: 'get'
+  })
+}
+// 批量审核
+export const sparePartsBatchAudit = (params) => {
+  return axios({
+    url: `/spareParts/batchAudit`,
+    data: params,
+    method: 'post'
+  })
+}
+// 多审核校验
+export const sparePartsAuditVerify = (params) => {
+  return axios({
+    url: `/spareParts/auditVerify`,
     data: params,
     method: 'post'
   })
 }
+// 导出审核错误项
+export const sparePartsAuditFail = (params) => {
+  return axios({
+    url: `/spareParts/downloadAuditFail`,
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
 
 // 删除
 export const sparePartsDelete = (params) => {
@@ -128,3 +152,15 @@ export const sparePartsDetailFailExcel = (params) => {
     responseType: 'blob'
   })
 }
+
+// 明细库存分页列表
+export const queryDetailStockPage = (params) => {
+  const url = `/spareParts/queryDetailStockPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 137 - 0
src/api/sparePartsReturn.js

@@ -0,0 +1,137 @@
+import {
+  axios
+} from '@/utils/request'
+
+/*
+ * 采购退货 列表
+ * 采购退货 列表分页
+ */
+export const sparePartsReturnList = (params) => {
+  const url = `/sparePartsReturn/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 删除采购退货信息
+export const sparePartsReturnDelete = (params) => {
+  return axios({
+    url: `/sparePartsReturn/delete/${params.sn}`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 再次提交
+export const againSubmit = (params) => {
+  return axios({
+    url: `/sparePartsReturn/againSubmit`,
+    data: params,
+    method: 'post'
+  })
+}
+
+/*
+ * 采购退货 详情
+ * 采购退货详情基础信息
+ */
+export const sparePartsReturnInfo = params => {
+  return axios({
+    url: `/sparePartsReturn/queryBySn/${params.sn}`,
+    data: {},
+    method: 'get'
+  })
+}
+
+// 货详情分页列表
+export const sparePartsReturnQueryPage = (params) => {
+  const url = `/sparePartsReturn/detail/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 采购退货详情金额统计
+export const queryPageCount = (params) => {
+  return axios({
+    url: `/sparePartsReturn/detail/queryPageCount`,
+    data: params,
+    method: 'post'
+  })
+}
+
+/*
+ * 采购退货 新增
+ * 采购退货保存
+ */
+export const sparePartsReturnSave = (params) => {
+  return axios({
+    url: `/sparePartsReturn/save`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 采购退货 提交
+export const sparePartsReturnSubmit = (params) => {
+  return axios({
+    url: `/sparePartsReturn/submit`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 明细删除
+export const sparePartsReturnDetailDelete = (params) => {
+  return axios({
+    url: `sparePartsReturn/detail/delete/${params.detailSn}`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 明细保存  (明细中添加/编辑产品)
+export const sparePartsReturnDetailSave = (params) => {
+  return axios({
+    url: `/sparePartsReturn/detail/save`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 导出明细
+export const sparePartsReturnExportDetail = (params) => {
+  return axios({
+    url: `/report/sparePartsReturn/exportDetail`,
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 批量保存
+export const sparePartsReturnDetailSaveBatch = (params) => {
+  return axios({
+    url: `/sparePartsReturn/detail/saveBatch`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 禁止选择重复列表
+export const queryDetailSnListBySn = params => {
+  const url = `/sparePartsReturn/detail/queryDetailSnListBySn/${params.sn}`
+  delete params.sn
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}

+ 69 - 0
src/api/supplier.js

@@ -11,6 +11,27 @@ export const supplierList = (params) => {
     method: 'post'
   })
 }
+// 供应商成本变更记录
+export const supplierProductCostLogList = (params) => {
+  const url = `/supplierProductCostLog/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+// 成本变更导出明细
+export const supplierProductCostLogExport = params => {
+  return axios.request({
+    url: `/supplierProductCostLog/export`,
+    method: 'post',
+    data: params,
+    responseType: 'blob'
+  })
+}
+
 //  供应商 列表  无分页
 export const supplierAllList = (params) => {
   return axios({
@@ -95,6 +116,31 @@ export const supplierProductDownload = params => {
     responseType: 'blob'
   })
 }
+// 供应商关联产品 下载模板
+export const supplierProductNewDownloadExcel = params => {
+  return axios.request({
+    url: `/supplierProduct/newDownloadExcel`,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 设置成本导出明细
+export const supplierProductExportDetail = params => {
+  return axios.request({
+    url: `/supplierProduct/export`,
+    method: 'post',
+    data: params,
+    responseType: 'blob'
+  })
+}
+// 审核成本价
+export const supplierProductUpdateAuditState = params => {
+  return axios.request({
+    url: `/supplierProduct/updateAuditState`,
+    method: 'post',
+    data: params
+  })
+}
 // 供应商关联产品  解析导入的文件
 export const supplierProductParseProducts = params => {
   return axios({
@@ -103,6 +149,14 @@ export const supplierProductParseProducts = params => {
     method: 'post'
   })
 }
+// 供应商关联产品  解析导入的文件
+export const supplierProductParseNewProducts = params => {
+  return axios({
+    url: '/supplierProduct/newParseProducts',
+    data: params,
+    method: 'post'
+  })
+}
 // 供应商关联产品  批量插入
 export const supplierProductBatchInsert = params => {
   return axios({
@@ -111,6 +165,13 @@ export const supplierProductBatchInsert = params => {
     method: 'post'
   })
 }
+export const supplierProductNewBatchInsert = params => {
+  return axios({
+    url: '/supplierProduct/newBatchInsert',
+    data: params,
+    method: 'post'
+  })
+}
 //  供应商关联产品 导入产品  导出错误项
 export const supplierProductailExcel = (params) => {
   return axios({
@@ -120,3 +181,11 @@ export const supplierProductailExcel = (params) => {
     responseType: 'blob'
   })
 }
+export const supplierProductailNewExcel = (params) => {
+  return axios({
+    url: '/supplierProduct/newDownloadFailExcel',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}

+ 3227 - 3051
src/config/router.config.js

@@ -1,5 +1,4 @@
 // eslint-disable-next-line
-// RouteView,
 import {
   UserLayout,
   BasicLayout,
@@ -8,3105 +7,3282 @@ import {
   BigScreen
 } from '@/layouts'
 
-export const asyncRouterMap = [{
-  path: '/',
-  name: 'index',
-  component: BasicLayout,
-  meta: {
-    title: '首页'
-  },
-  redirect: '/home',
-  children: [{
-    path: '/home',
-    name: 'home',
-    redirect: '/home',
-    component: PageView,
+export const asyncRouterMap = [
+  {
+    path: '/',
+    name: 'index',
+    component: BasicLayout,
     meta: {
-      title: '首页',
-      icon: 'home'
+      title: '首页'
     },
-    hideChildrenInMenu: true,
-    children: [{
-      path: '/home',
-      name: 'home',
-      redirect: '/home',
-      component: BlankLayout,
-      meta: {
-        title: '首页',
-        icon: 'home',
-        hidden: true
-      },
-      hideChildrenInMenu: true,
-      children: [{
+    redirect: '/home',
+    children: [
+      {
         path: '/home',
         name: 'home',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/Home'),
+        redirect: '/home',
+        component: PageView,
         meta: {
           title: '首页',
-          icon: 'home',
-          hidden: true
-        }
-      },
-      {
-        path: '/changePwd',
-        name: 'changePwd',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/user/ChangePwd'),
-        meta: {
-          title: '修改密码',
           icon: 'home'
         },
-        hidden: true
-      },
+        hideChildrenInMenu: true,
+        children: [
+          {
+            path: '/home',
+            name: 'home',
+            redirect: '/home',
+            component: BlankLayout,
+            meta: {
+              title: '首页',
+              icon: 'home',
+              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/setting/notice/list'),
+                meta: {
+                  title: '公告',
+                  icon: 'bell'
+                },
+                hidden: true
+              },
+              {
+                path: '/dowloadFile',
+                name: 'dowloadFile',
+                component: () => import(/* webpackChunkName: "home" */ '@/views/dowloadFile/list'),
+                meta: {
+                  title: '下载中心',
+                  icon: 'bell'
+                },
+                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'
+                },
+                hidden: true
+              }
+            ]
+          }
+        ]
+      },
+      // 销售管理
       {
-        path: '/notice',
-        name: 'notice',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/setting/notice/list'),
+        path: '/salesManagement',
+        redirect: '/salesManagement/salesQuery',
+        component: PageView,
         meta: {
-          title: '公告',
-          icon: 'bell'
+          title: '销售管理',
+          icon: 'account-book',
+          permission: 'M_salesManagement'
         },
-        hidden: true
-      },
+        children: [
+          {
+            path: '/salesManagement/salesQuery',
+            redirect: '/salesManagement/salesQuery/list',
+            name: 'salesQuery',
+            component: BlankLayout,
+            meta: {
+              title: '销售单查询',
+              icon: 'monitor',
+              permission: 'M_salesQueryList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesQueryList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/salesQuery/list.vue'),
+                meta: {
+                  title: '销售单列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'salesDetail',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/salesQuery/detail.vue'),
+                meta: {
+                  title: '销售单详情',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true
+                  // permission: 'M_salesDetail'
+                }
+              },
+              {
+                path: 'add/:sn',
+                name: 'salesAdd',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/salesQuery/edit.vue'),
+                meta: {
+                  title: '新增销售单',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesNew'
+                }
+              },
+              {
+                path: 'edit/:sn',
+                name: 'salesEdit',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/salesQuery/edit.vue'),
+                meta: {
+                  title: '编辑销售单',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesNew'
+                }
+              },
+              {
+                path: 'waitDispatch/:salesBillSn/:dispatchBillSn',
+                name: 'waitDispatch',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/waitDispatch/edit.vue'),
+                meta: {
+                  title: '下推销售单',
+                  icon: 'monitor',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'M_salesNew'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/pushOrderManagement',
+            redirect: '/salesManagement/pushOrderManagement/list',
+            name: 'pushOrderManagement',
+            component: BlankLayout,
+            meta: {
+              title: '下推订单列表',
+              icon: 'vertical-align-bottom',
+              permission: 'M_pushOrderManagementList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'pushOrderManagementList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/pushOrderManagement/list.vue'),
+                meta: {
+                  title: '下推订单列表',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_pushOrderManagementList'
+                }
+              },
+              {
+                path: 'detail/:sn/:type',
+                name: 'pushOrderDetail',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/pushOrderManagement/detail.vue'),
+                meta: {
+                  title: '下推订单详情',
+                  icon: 'vertical-align-bottom',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'M_outboundList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/salesCollection',
+            redirect: '/salesManagement/salesCollection/list',
+            name: 'salesCollection',
+            component: BlankLayout,
+            meta: {
+              title: '销售收款',
+              icon: 'vertical-align-bottom',
+              permission: 'M_salesCollectionList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesCollectionList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/salesCollection/list.vue'),
+                meta: {
+                  title: '销售收款',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_salesCollectionList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/stockPrint',
+            redirect: '/salesManagement/stockPrint/list',
+            name: 'stockPrint',
+            component: BlankLayout,
+            meta: {
+              title: '备货打印',
+              icon: 'vertical-align-bottom',
+              permission: 'M_stockPrintList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'stockPrintList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/stockPrint/list.vue'),
+                meta: {
+                  title: '备货打印',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_stockPrintList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/receiptPrint',
+            redirect: '/salesManagement/receiptPrint/list',
+            name: 'receiptPrint',
+            component: BlankLayout,
+            meta: {
+              title: '收款打印',
+              icon: 'vertical-align-bottom',
+              permission: 'M_receiptPrintList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'receiptPrintList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/receiptPrint/list.vue'),
+                meta: {
+                  title: '收款打印',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_receiptPrintList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/matchSendOutOrder',
+            redirect: '/salesManagement/matchSendOutOrder/list',
+            name: 'matchSendOutOrder',
+            component: BlankLayout,
+            meta: {
+              title: '发货对单',
+              icon: 'vertical-align-bottom',
+              permission: 'M_matchSendOutOrderList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'matchSendOutOrderList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/matchSendOutOrder/list.vue'),
+                meta: {
+                  title: '发货对单',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_matchSendOutOrderList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/examineVerify',
+            redirect: '/salesManagement/examineVerify/list',
+            name: 'examineVerify',
+            component: BlankLayout,
+            meta: {
+              title: '备货审核',
+              icon: 'audit',
+              permission: 'M_examineVerifyList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'examineVerifyList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/examineVerify/list.vue'),
+                meta: {
+                  title: '备货审核列表',
+                  icon: 'audit',
+                  hidden: true,
+                  permission: 'M_examineVerifyList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/outboundOrder',
+            redirect: '/salesManagement/outboundOrder/list',
+            name: 'outboundOrder',
+            component: BlankLayout,
+            meta: {
+              title: '出库',
+              icon: 'export',
+              permission: 'M_outboundOrderList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'outboundOrderList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/outboundOrder/list.vue'),
+                meta: {
+                  title: '出库列表',
+                  icon: 'export',
+                  hidden: true,
+                  permission: 'M_outboundOrderList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/sendOutOrder',
+            redirect: '/salesManagement/sendOutOrder/list',
+            name: 'sendOutOrder',
+            component: BlankLayout,
+            meta: {
+              title: '发货单列表',
+              icon: 'export',
+              permission: 'M_sendOutOrderList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'sendOutOrderList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/sendOutOrder/list.vue'),
+                meta: {
+                  title: '发货单列表',
+                  icon: 'export',
+                  hidden: true,
+                  permission: 'M_sendOutOrderList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/backorder',
+            redirect: '/salesManagement/backorder/list',
+            name: 'backorder',
+            component: BlankLayout,
+            meta: {
+              title: '销售缺货列表',
+              icon: 'exception',
+              permission: 'M_backorderList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'backorderList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/backorder/list.vue'),
+                meta: {
+                  title: '销售缺货列表',
+                  icon: 'exception',
+                  hidden: true,
+                  permission: 'M_backorderList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/shortageStatisticsC',
+            redirect: '/salesManagement/shortageStatisticsC/list',
+            name: 'shortageStatisticsC',
+            component: BlankLayout,
+            meta: {
+              title: '缺货统计(按客户)',
+              icon: 'file-done',
+              permission: 'M_shortageStatisticsCList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'shortageStatisticsCList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/shortageStatisticsC/list.vue'),
+                meta: {
+                  title: '缺货统计(按客户)',
+                  icon: 'file-done',
+                  hidden: true,
+                  permission: 'M_shortageStatisticsCList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/shortageStatisticsP',
+            redirect: '/salesManagement/shortageStatisticsP/list',
+            name: 'shortageStatisticsP',
+            component: BlankLayout,
+            meta: {
+              title: '缺货统计(按产品)',
+              icon: 'file-protect',
+              permission: 'M_shortageStatisticsPList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'shortageStatisticsPList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/shortageStatisticsP/list.vue'),
+                meta: {
+                  title: '缺货统计(按产品)',
+                  icon: 'file-protect',
+                  hidden: true,
+                  permission: 'M_shortageStatisticsPList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesManagement/priceInquiry',
+            redirect: '/salesManagement/priceInquiry/list',
+            name: 'priceInquiry',
+            component: BlankLayout,
+            meta: {
+              title: '价格查询',
+              icon: 'file-protect',
+              permission: 'M_priceInquiryList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'priceInquiryList',
+                component: () => import(/* webpackChunkName: "salesManagement" */ '@/views/salesManagement/priceInquiry/list.vue'),
+                meta: {
+                  title: '价格查询列表',
+                  icon: 'file-protect',
+                  hidden: true,
+                  permission: 'M_priceInquiryList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 销售退货
       {
-        path: '/dowloadFile',
-        name: 'dowloadFile',
-        component: () => import(/* webpackChunkName: "home" */ '@/views/dowloadFile/list'),
+        path: '/salesReturnManagement',
+        redirect: '/salesReturnManagement/salesReturn',
+        component: PageView,
         meta: {
-          title: '下载中心',
-          icon: 'bell'
+          title: '销售退货',
+          icon: 'export',
+          permission: 'M_salesReturnManagement'
         },
-        hidden: true
-      },
-      // 新品列表
+        children: [
+          {
+            path: '/salesReturnManagement/salesReturn',
+            redirect: '/salesReturnManagement/salesReturn/list',
+            name: 'salesReturn',
+            component: BlankLayout,
+            meta: {
+              title: '销售退货列表',
+              icon: 'fund',
+              permission: 'M_salesReturnList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesReturnList',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/salesReturn/list.vue'),
+                meta: {
+                  title: '销售退货列表',
+                  icon: 'fund',
+                  hidden: true,
+                  permission: 'M_salesReturnList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'salesReturnDetail',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/salesReturn/detail.vue'),
+                meta: {
+                  title: '销售退货详情',
+                  icon: 'fund',
+                  hidden: true
+                }
+              },
+              {
+                path: 'salesReturnEdit/:sn/:buyerSn',
+                name: 'salesReturnEdit',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/salesReturn/salesReturnEdit.vue'),
+                meta: {
+                  title: '编辑销售退货',
+                  icon: 'fund',
+                  hidden: true
+                }
+              },
+              {
+                path: 'custConfirm/:sn/:buyerSn',
+                name: 'custConfirm',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/custConfirm/list.vue'),
+                meta: {
+                  title: '客服确认',
+                  icon: 'fund',
+                  replaceTab: true,
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesReturnManagement/billOfLading',
+            redirect: '/salesReturnManagement/billOfLading/list',
+            name: 'billOfLading',
+            component: BlankLayout,
+            meta: {
+              title: '提货单列表',
+              icon: 'fund',
+              permission: 'M_billOfLadingList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'billOfLadingList',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/billOfLading/list.vue'),
+                meta: {
+                  title: '提货单列表',
+                  icon: 'fund',
+                  hidden: true,
+                  permission: 'M_billOfLadingList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'billOfLadingDetail',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/billOfLading/detail.vue'),
+                meta: {
+                  title: '提货单详情',
+                  icon: 'fund',
+                  hidden: true
+                }
+              },
+              {
+                path: 'add',
+                name: 'billOfLadingAdd',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/billOfLading/add.vue'),
+                meta: {
+                  title: '新增提货单',
+                  icon: 'fund',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit/:sn',
+                name: 'billOfLadingEdit',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/billOfLading/add.vue'),
+                meta: {
+                  title: '编辑提货单',
+                  icon: 'fund',
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesReturnManagement/pickUp',
+            redirect: '/salesReturnManagement/pickUp/list',
+            name: 'pickUp',
+            component: BlankLayout,
+            meta: {
+              title: '仓库提货',
+              icon: 'fund',
+              permission: 'M_pickUpList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'pickUpList',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/pickUp/list.vue'),
+                meta: {
+                  title: '仓库提货列表',
+                  icon: 'fund',
+                  hidden: true,
+                  permission: 'M_pickUpList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/salesReturnManagement/receiveCheck',
+            redirect: '/salesReturnManagement/receiveCheck/list',
+            name: 'receiveCheck',
+            component: BlankLayout,
+            meta: {
+              title: '收货品检',
+              icon: 'fund',
+              permission: 'M_receiveCheckList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'receiveCheckList',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/receiveCheck/list.vue'),
+                meta: {
+                  title: '收货品检列表',
+                  icon: 'fund',
+                  hidden: true,
+                  permission: 'M_receiveCheckList'
+                }
+              },
+              {
+                path: 'receiving/:sn/:buyerSn',
+                name: 'salesReturnReceiving',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/receiveCheck/receiving.vue'),
+                meta: {
+                  title: '收货',
+                  icon: 'fund',
+                  hidden: true,
+                  replaceTab: true
+                }
+              },
+              {
+                path: 'checking/:sn/:buyerSn',
+                name: 'salesReturnCheck',
+                component: () => import(/* webpackChunkName: "salesReturnManagement" */ '@/views/salesReturnManagement/receiveCheck/checking.vue'),
+                meta: {
+                  title: '品检',
+                  icon: 'fund',
+                  hidden: true,
+                  replaceTab: true
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 采购管理
       {
-        path: '/newProduct/list/:onlineFalg',
-        name: 'newProductList',
-        component: () => import(/* webpackChunkName: "home" */
-          '@/views/productManagement/newProduct/list'),
+        path: '/purchasingManagement',
+        redirect: '/purchasingManagement/purchaseOrder',
+        component: PageView,
         meta: {
-          title: '新品信息',
-          icon: 'home'
+          title: '采购管理',
+          icon: 'money-collect',
+          permission: 'M_purchasingManagement'
         },
-        hidden: true
-      },
-      // 产品详情
+        children: [
+          {
+            path: '/purchasingManagement/bulkWarehousingOrder',
+            redirect: '/purchasingManagement/bulkWarehousingOrder/list',
+            name: 'bulkWarehousingOrder',
+            component: BlankLayout,
+            meta: {
+              title: '散件入库',
+              icon: 'gold',
+              permission: 'M_bulkWarehousingOrderList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'bulkWarehousingOrderList',
+                component: () => import(/* webpackChunkName: "purchasingManagement" */ '@/views/purchasingManagement/bulkWarehousingOrder/list.vue'),
+                meta: {
+                  title: '散件入库单列表',
+                  icon: 'gold',
+                  hidden: true,
+                  permission: 'M_bulkWarehousingOrderList'
+                }
+              },
+              {
+                path: 'add/:id/:sn',
+                name: 'bulkWarehousingOrderAdd',
+                component: () => import(/* webpackChunkName: "purchasingManagement" */ '@/views/purchasingManagement/bulkWarehousingOrder/edit.vue'),
+                meta: {
+                  title: '新增散件入库单',
+                  icon: 'gold',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit/:id/:sn',
+                name: 'bulkWarehousingOrderEdit',
+                component: () => import(/* webpackChunkName: "purchasingManagement" */ '@/views/purchasingManagement/bulkWarehousingOrder/edit.vue'),
+                meta: {
+                  title: '编辑散件入库单',
+                  icon: 'gold',
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/purchasingManagement/purchaseReturn',
+            redirect: '/purchasingManagement/purchaseReturn/list',
+            name: 'purchaseReturn',
+            component: BlankLayout,
+            meta: {
+              title: '采购退货',
+              icon: 'gold',
+              permission: 'M_purchaseReturn'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'purchaseReturnList',
+                component: () => import(/* webpackChunkName: "purchasingManagement" */ '@/views/purchasingManagement/purchaseReturn/list.vue'),
+                meta: {
+                  title: '采购退货',
+                  icon: 'gold',
+                  hidden: true,
+                  permission: 'M_purchaseReturnList'
+                }
+              },
+              {
+                path: 'add',
+                name: 'purchaseReturnAdd',
+                component: () => import(/* webpackChunkName: "purchasingManagement" */ '@/views/purchasingManagement/purchaseReturn/purchaseReturnDeatil.vue'),
+                meta: {
+                  title: '新增采购退货',
+                  icon: 'gold',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit',
+                name: 'purchaseReturnEdit',
+                component: () => import(/* webpackChunkName: "purchasingManagement" */ '@/views/purchasingManagement/purchaseReturn/purchaseReturnDeatil.vue'),
+                meta: {
+                  title: '编辑采购退货',
+                  icon: 'gold',
+                  hidden: true
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 财务管理
       {
-        path: '/viewProduct/:sn',
-        name: 'viewProduct',
-        component: () => import(/* webpackChunkName: "home" */
-          '@/views/productManagement/newProduct/detail'),
+        path: '/financialManagement',
+        redirect: '/financialManagement/returnConfirmation',
+        component: PageView,
         meta: {
-          title: '产品详情',
-          icon: 'home'
+          title: '财务管理',
+          icon: 'property-safety',
+          permission: 'M_financialManagement'
         },
-        hidden: true
-      }
-      ]
-    }]
-  },
-  // 销售管理
-  {
-    path: '/salesManagement',
-    redirect: '/salesManagement/salesQuery',
-    component: PageView,
-    meta: {
-      title: '销售管理',
-      icon: 'account-book',
-      permission: 'M_salesManagement'
-    },
-    children: [{
-      path: '/salesManagement/salesQuery',
-      redirect: '/salesManagement/salesQuery/list',
-      name: 'salesQuery',
-      component: BlankLayout,
-      meta: {
-        title: '销售单查询',
-        icon: 'monitor',
-        permission: 'M_salesQueryList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesQueryList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/salesQuery/list.vue'),
-        meta: {
-          title: '销售单列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_salesQueryList'
-        }
-      },
-      {
-        path: 'detail/:sn',
-        name: 'salesDetail',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/salesQuery/detail.vue'),
-        meta: {
-          title: '销售单详情',
-          icon: 'monitor',
-          hidden: true,
-          replaceTab: true
-          // permission: 'M_salesDetail'
-        }
-      },
-      {
-        path: 'add/:sn',
-        name: 'salesAdd',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/salesQuery/edit.vue'),
-        meta: {
-          title: '新增销售单',
-          icon: 'monitor',
-          hidden: true
-          // permission: 'M_salesNew'
-        }
-      },
-      {
-        path: 'edit/:sn',
-        name: 'salesEdit',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/salesQuery/edit.vue'),
-        meta: {
-          title: '编辑销售单',
-          icon: 'monitor',
-          hidden: true
-          // permission: 'M_salesNew'
-        }
-      },
-      {
-        path: 'waitDispatch/:salesBillSn/:dispatchBillSn',
-        name: 'waitDispatch',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/waitDispatch/edit.vue'),
-        meta: {
-          title: '下推销售单',
-          icon: 'monitor',
-          replaceTab: true,
-          hidden: true
-          // permission: 'M_salesNew'
-        }
-      }
-      ]
-    },
-    {
-      path: '/salesManagement/pushOrderManagement',
-      redirect: '/salesManagement/pushOrderManagement/list',
-      name: 'pushOrderManagement',
-      component: BlankLayout,
-      meta: {
-        title: '下推订单列表',
-        icon: 'vertical-align-bottom',
-        permission: 'M_pushOrderManagementList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'pushOrderManagementList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/pushOrderManagement/list.vue'),
-        meta: {
-          title: '下推订单列表',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_pushOrderManagementList'
-        }
-      },
-      {
-        path: 'detail/:sn/:type',
-        name: 'pushOrderDetail',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/pushOrderManagement/detail.vue'),
-        meta: {
-          title: '下推订单详情',
-          icon: 'vertical-align-bottom',
-          replaceTab: true,
-          hidden: true
-          // permission: 'M_outboundList'
-        }
-      }
-      ]
-    },
-    {
-      path: '/salesManagement/salesCollection',
-      redirect: '/salesManagement/salesCollection/list',
-      name: 'salesCollection',
-      component: BlankLayout,
-      meta: {
-        title: '销售收款',
-        icon: 'vertical-align-bottom',
-        permission: 'M_salesCollectionList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesCollectionList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/salesCollection/list.vue'),
-        meta: {
-          title: '销售收款',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_salesCollectionList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/stockPrint',
-      redirect: '/salesManagement/stockPrint/list',
-      name: 'stockPrint',
-      component: BlankLayout,
-      meta: {
-        title: '备货打印',
-        icon: 'vertical-align-bottom',
-        permission: 'M_stockPrintList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'stockPrintList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/stockPrint/list.vue'),
-        meta: {
-          title: '备货打印',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_stockPrintList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/receiptPrint',
-      redirect: '/salesManagement/receiptPrint/list',
-      name: 'receiptPrint',
-      component: BlankLayout,
-      meta: {
-        title: '收款打印',
-        icon: 'vertical-align-bottom',
-        permission: 'M_receiptPrintList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'receiptPrintList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/receiptPrint/list.vue'),
-        meta: {
-          title: '收款打印',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_receiptPrintList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/matchSendOutOrder',
-      redirect: '/salesManagement/matchSendOutOrder/list',
-      name: 'matchSendOutOrder',
-      component: BlankLayout,
-      meta: {
-        title: '发货对单',
-        icon: 'vertical-align-bottom',
-        permission: 'M_matchSendOutOrderList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'matchSendOutOrderList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/matchSendOutOrder/list.vue'),
-        meta: {
-          title: '发货对单',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_matchSendOutOrderList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/examineVerify',
-      redirect: '/salesManagement/examineVerify/list',
-      name: 'examineVerify',
-      component: BlankLayout,
-      meta: {
-        title: '备货审核',
-        icon: 'audit',
-        permission: 'M_examineVerifyList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'examineVerifyList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/examineVerify/list.vue'),
-        meta: {
-          title: '备货审核列表',
-          icon: 'audit',
-          hidden: true,
-          permission: 'M_examineVerifyList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/outboundOrder',
-      redirect: '/salesManagement/outboundOrder/list',
-      name: 'outboundOrder',
-      component: BlankLayout,
-      meta: {
-        title: '出库',
-        icon: 'export',
-        permission: 'M_outboundOrderList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'outboundOrderList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/outboundOrder/list.vue'),
-        meta: {
-          title: '出库列表',
-          icon: 'export',
-          hidden: true,
-          permission: 'M_outboundOrderList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/sendOutOrder',
-      redirect: '/salesManagement/sendOutOrder/list',
-      name: 'sendOutOrder',
-      component: BlankLayout,
-      meta: {
-        title: '发货单列表',
-        icon: 'export',
-        permission: 'M_sendOutOrderList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'sendOutOrderList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/sendOutOrder/list.vue'),
-        meta: {
-          title: '发货单列表',
-          icon: 'export',
-          hidden: true,
-          permission: 'M_sendOutOrderList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/backorder',
-      redirect: '/salesManagement/backorder/list',
-      name: 'backorder',
-      component: BlankLayout,
-      meta: {
-        title: '销售缺货列表',
-        icon: 'exception',
-        permission: 'M_backorderList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'backorderList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/backorder/list.vue'),
-        meta: {
-          title: '销售缺货列表',
-          icon: 'exception',
-          hidden: true,
-          permission: 'M_backorderList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/shortageStatisticsC',
-      redirect: '/salesManagement/shortageStatisticsC/list',
-      name: 'shortageStatisticsC',
-      component: BlankLayout,
-      meta: {
-        title: '缺货统计(按客户)',
-        icon: 'file-done',
-        permission: 'M_shortageStatisticsCList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'shortageStatisticsCList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/shortageStatisticsC/list.vue'),
-        meta: {
-          title: '缺货统计(按客户)',
-          icon: 'file-done',
-          hidden: true,
-          permission: 'M_shortageStatisticsCList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/shortageStatisticsP',
-      redirect: '/salesManagement/shortageStatisticsP/list',
-      name: 'shortageStatisticsP',
-      component: BlankLayout,
-      meta: {
-        title: '缺货统计(按产品)',
-        icon: 'file-protect',
-        permission: 'M_shortageStatisticsPList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'shortageStatisticsPList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/shortageStatisticsP/list.vue'),
-        meta: {
-          title: '缺货统计(按产品)',
-          icon: 'file-protect',
-          hidden: true,
-          permission: 'M_shortageStatisticsPList'
-        }
-      }]
-    },
-    {
-      path: '/salesManagement/priceInquiry',
-      redirect: '/salesManagement/priceInquiry/list',
-      name: 'priceInquiry',
-      component: BlankLayout,
-      meta: {
-        title: '价格查询',
-        icon: 'file-protect',
-        permission: 'M_priceInquiryList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'priceInquiryList',
-        component: () => import(/* webpackChunkName: "salesManagement" */
-          '@/views/salesManagement/priceInquiry/list.vue'),
-        meta: {
-          title: '价格查询列表',
-          icon: 'file-protect',
-          hidden: true,
-          permission: 'M_priceInquiryList'
-        }
-      }]
-    }
-    ]
-  },
-  // 销售退货
-  {
-    path: '/salesReturnManagement',
-    redirect: '/salesReturnManagement/salesReturn',
-    component: PageView,
-    meta: {
-      title: '销售退货',
-      icon: 'export',
-      permission: 'M_salesReturnManagement'
-    },
-    children: [{
-      path: '/salesReturnManagement/salesReturn',
-      redirect: '/salesReturnManagement/salesReturn/list',
-      name: 'salesReturn',
-      component: BlankLayout,
-      meta: {
-        title: '销售退货列表',
-        icon: 'fund',
-        permission: 'M_salesReturnList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesReturnList',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/salesReturn/list.vue'),
-        meta: {
-          title: '销售退货列表',
-          icon: 'fund',
-          hidden: true,
-          permission: 'M_salesReturnList'
-        }
-      },
-      {
-        path: 'detail/:sn',
-        name: 'salesReturnDetail',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/salesReturn/detail.vue'),
-        meta: {
-          title: '销售退货详情',
-          icon: 'fund',
-          hidden: true
-        }
-      },
-      {
-        path: 'salesReturnEdit/:sn/:buyerSn',
-        name: 'salesReturnEdit',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/salesReturn/salesReturnEdit.vue'),
-        meta: {
-          title: '编辑销售退货',
-          icon: 'fund',
-          hidden: true
-        }
-      },
-      {
-        path: 'custConfirm/:sn/:buyerSn',
-        name: 'custConfirm',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/custConfirm/list.vue'),
-        meta: {
-          title: '客服确认',
-          icon: 'fund',
-          replaceTab: true,
-          hidden: true
-        }
-      }
-      ]
-    },
-    {
-      path: '/salesReturnManagement/billOfLading',
-      redirect: '/salesReturnManagement/billOfLading/list',
-      name: 'billOfLading',
-      component: BlankLayout,
-      meta: {
-        title: '提货单列表',
-        icon: 'fund',
-        permission: 'M_billOfLadingList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'billOfLadingList',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/billOfLading/list.vue'),
-        meta: {
-          title: '提货单列表',
-          icon: 'fund',
-          hidden: true,
-          permission: 'M_billOfLadingList'
-        }
-      },
-      {
-        path: 'detail/:sn',
-        name: 'billOfLadingDetail',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/billOfLading/detail.vue'),
-        meta: {
-          title: '提货单详情',
-          icon: 'fund',
-          hidden: true
-        }
-      },
+        children: [
+          {
+            path: '/financialManagement/warehousingConfirmation',
+            redirect: '/financialManagement/warehousingConfirmation/list',
+            name: 'warehousingConfirmation',
+            component: BlankLayout,
+            meta: {
+              title: '入库确认',
+              icon: 'vertical-align-bottom',
+              permission: 'M_warehousingConfirmationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'warehousingConfirmationList',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/warehousingConfirmation/list.vue'),
+                meta: {
+                  title: '入库确认列表',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_warehousingConfirmationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/financialManagement/returnConfirmation',
+            redirect: '/financialManagement/returnConfirmation/list',
+            name: 'returnConfirmation',
+            component: BlankLayout,
+            meta: {
+              title: '销售退货确认',
+              icon: 'vertical-align-top',
+              permission: 'M_returnConfirmationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'returnConfirmationList',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/returnConfirmation/list.vue'),
+                meta: {
+                  title: '销售退货确认列表',
+                  icon: 'vertical-align-top',
+                  hidden: true,
+                  permission: 'M_returnConfirmationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/financialManagement/allocateReturnConfirmation',
+            redirect: '/financialManagement/allocateReturnConfirmation/list',
+            name: 'allocateReturnConfirmation',
+            component: BlankLayout,
+            meta: {
+              title: '调拨退货确认',
+              icon: 'vertical-align-top',
+              permission: 'M_allocateReturnConfirmationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'allocateReturnConfirmationList',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/allocateReturnConfirmation/list.vue'),
+                meta: {
+                  title: '调拨退货确认列表',
+                  icon: 'vertical-align-top',
+                  hidden: true,
+                  permission: 'M_allocateReturnConfirmationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/financialManagement/inventoryConfirmation',
+            redirect: '/financialManagement/inventoryConfirmation/list',
+            name: 'inventoryConfirmation',
+            component: BlankLayout,
+            meta: {
+              title: '盘点确认',
+              icon: 'monitor',
+              permission: 'M_inventoryConfirmationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'inventoryConfirmationList',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/inventoryConfirmation/list.vue'),
+                meta: {
+                  title: '盘点确认列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_inventoryConfirmationList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'inventoryConfirmationDetail',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/inventoryConfirmation/detail.vue'),
+                meta: {
+                  title: '盘点确认详情',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'B_inventoryConfirmationDetail'
+                }
+              }
+            ]
+          },
+          {
+            path: '/financialManagement/financialCollection',
+            redirect: '/financialManagement/financialCollection/list',
+            name: 'financialCollection',
+            component: BlankLayout,
+            meta: {
+              title: '财务收款',
+              icon: 'pay-circle',
+              permission: 'M_financialCollectionList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'financialCollectionList',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/financialCollection/list.vue'),
+                meta: {
+                  title: '财务收款列表',
+                  icon: 'pay-circle',
+                  hidden: true,
+                  permission: 'M_financialCollectionList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'financialCollectionDetail',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/financialCollection/detail.vue'),
+                meta: {
+                  title: '财务收款详情',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit/:sn',
+                name: 'financialCollectionEdit',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/financialCollection/edit.vue'),
+                meta: {
+                  title: '编辑财务收款',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/financialManagement/collectionDetailStatic',
+            redirect: '/financialManagement/collectionDetailStatic/list',
+            name: 'collectionDetailStatic',
+            component: BlankLayout,
+            meta: {
+              title: '财务收款明细统计',
+              icon: 'vertical-align-top',
+              permission: 'M_FC_Details_list'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'collectionDetailStaticList',
+                component: () => import(/* webpackChunkName: "financialManagement" */ '@/views/financialManagement/collectionDetailStatic/list.vue'),
+                meta: {
+                  title: '财务收款明细统计列表',
+                  icon: 'vertical-align-top',
+                  hidden: true,
+                  permission: 'M_FC_Details_list'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 费用报销
       {
-        path: 'add',
-        name: 'billOfLadingAdd',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/billOfLading/add.vue'),
+        path: '/expenseManagement',
+        redirect: '/expenseManagement/expenseReimbursement',
+        component: PageView,
         meta: {
-          title: '新增提货单',
-          icon: 'fund',
-          hidden: true
-        }
-      },
+          title: '费用报销',
+          icon: 'account-book',
+          permission: 'M_expenseManagement'
+        },
+        children: [
+          {
+            path: '/expenseManagement/expenseReimbursement',
+            redirect: '/expenseManagement/expenseReimbursement/list',
+            name: 'expenseReimbursement',
+            component: BlankLayout,
+            meta: {
+              title: '费用报销单',
+              icon: 'monitor',
+              permission: 'M_expenseReimbursementList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'expenseReimbursementList',
+                component: () => import(/* webpackChunkName: "expenseManagement" */ '@/views/expenseManagement/expenseReimbursement/list.vue'),
+                meta: {
+                  title: '费用报销单列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_expenseReimbursementList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'expenseReimbursementListDetail',
+                component: () => import(/* webpackChunkName: "expenseManagement" */ '@/views/expenseManagement/expenseReimbursement/detail.vue'),
+                meta: {
+                  title: '费用报销单详情',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'add',
+                name: 'expenseReimbursementAdd',
+                component: () => import(/* webpackChunkName: "expenseManagement" */ '@/views/expenseManagement/expenseReimbursement/add.vue'),
+                meta: {
+                  title: '新增费用报销单',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit/:sn',
+                name: 'expenseReimbursementEdit',
+                component: () => import(/* webpackChunkName: "expenseManagement" */ '@/views/expenseManagement/expenseReimbursement/add.vue'),
+                meta: {
+                  title: '编辑费用报销单',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/expenseManagement/expenseReimbursementDetail',
+            redirect: '/expenseManagement/expenseReimbursementDetail/list',
+            name: 'expenseReimbursementDetail',
+            component: BlankLayout,
+            meta: {
+              title: '费用报销明细统计',
+              icon: 'audit',
+              permission: 'M_expenseReimbursementDetailList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'expenseReimbursementDetailList',
+                component: () => import(/* webpackChunkName: "expenseManagement" */ '@/views/expenseManagement/expenseReimbursementDetail/list.vue'),
+                meta: {
+                  title: '费用报销明细统计列表',
+                  icon: 'audit',
+                  hidden: true,
+                  permission: 'M_expenseReimbursementDetailList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 库存管理
       {
-        path: 'edit/:sn',
-        name: 'billOfLadingEdit',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/billOfLading/add.vue'),
-        meta: {
-          title: '编辑提货单',
-          icon: 'fund',
-          hidden: true
-        }
-      }
-      ]
-    },
-    {
-      path: '/salesReturnManagement/pickUp',
-      redirect: '/salesReturnManagement/pickUp/list',
-      name: 'pickUp',
-      component: BlankLayout,
-      meta: {
-        title: '仓库提货',
-        icon: 'fund',
-        permission: 'M_pickUpList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'pickUpList',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/pickUp/list.vue'),
+        path: '/inventoryManagement',
+        redirect: '/inventoryManagement/inventoryQuery',
+        component: PageView,
         meta: {
-          title: '仓库提货列表',
-          icon: 'fund',
-          hidden: true,
-          permission: 'M_pickUpList'
-        }
-      }]
-    },
-    {
-      path: '/salesReturnManagement/receiveCheck',
-      redirect: '/salesReturnManagement/receiveCheck/list',
-      name: 'receiveCheck',
-      component: BlankLayout,
-      meta: {
-        title: '收货品检',
-        icon: 'fund',
-        permission: 'M_receiveCheckList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'receiveCheckList',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/receiveCheck/list.vue'),
-        meta: {
-          title: '收货品检列表',
-          icon: 'fund',
-          hidden: true,
-          permission: 'M_receiveCheckList'
-        }
-      },
+          title: '库存管理',
+          icon: 'shop',
+          permission: 'M_inventoryManagement'
+        },
+        children: [
+          {
+            path: '/inventoryManagement/inventoryQuery',
+            redirect: '/inventoryManagement/inventoryQuery/list',
+            name: 'inventoryQuery',
+            component: BlankLayout,
+            meta: {
+              title: '库存查询',
+              icon: 'monitor',
+              permission: 'M_inventoryQueryList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'inventoryQueryList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/inventoryQuery/list.vue'),
+                meta: {
+                  title: '库存列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_inventoryQueryList'
+                }
+              },
+              {
+                path: 'warehouseDetail/:sn',
+                name: 'inventoryQueryWarehouseDetail',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/inventoryQuery/warehouseDetail.vue'),
+                meta: {
+                  title: '出入库明细',
+                  icon: 'monitor',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/inventoryManagement/inventoryCheck',
+            redirect: '/inventoryManagement/inventoryCheck/list/0',
+            name: 'inventoryCheck',
+            component: BlankLayout,
+            meta: {
+              title: '库存盘点',
+              icon: 'monitor',
+              permission: 'M_inventoryCheckList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list/:type',
+                name: 'inventoryCheckList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/inventoryCheck/list.vue'),
+                meta: {
+                  title: '库存盘点列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_inventoryCheckList'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'inventoryCheckDetail',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/inventoryCheck/detail.vue'),
+                meta: {
+                  title: '库存盘点详情',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true,
+                  permission: 'B_inventoryCheckDetail'
+                }
+              }
+            ]
+          },
+          {
+            path: '/inventoryManagement/makeInventory',
+            redirect: '/inventoryManagement/makeInventory/list',
+            name: 'makeInventory',
+            component: BlankLayout,
+            meta: {
+              title: '盘点人盘点',
+              icon: 'monitor',
+              permission: 'M_inventoryMakeInventoryList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'makeInventoryList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/makeInventory/list.vue'),
+                meta: {
+                  title: '盘点人盘点列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_inventoryMakeInventoryList'
+                }
+              },
+              {
+                path: 'check/:sn',
+                name: 'makeInventoryCheck',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/makeInventory/check.vue'),
+                meta: {
+                  title: '盘点人盘点',
+                  icon: 'monitor',
+                  hidden: true,
+                  replaceTab: true,
+                  permission: 'B_inventoryMakeInventoryCheck'
+                }
+              }
+            ]
+          },
+          {
+            path: '/inventoryManagement/supervisionDisk',
+            redirect: '/inventoryManagement/supervisionDisk/list',
+            name: 'supervisionDisk',
+            component: BlankLayout,
+            meta: {
+              title: '监盘人盘点',
+              icon: 'monitor',
+              permission: 'M_supervisionDiskList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'supervisionDiskList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/supervisionDisk/list.vue'),
+                meta: {
+                  title: '监盘人盘点列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_supervisionDiskList'
+                }
+              },
+              {
+                path: 'check/:sn',
+                name: 'supervisionDiskCheck',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/supervisionDisk/check.vue'),
+                meta: {
+                  title: '监盘人监盘',
+                  icon: 'monitor',
+                  replaceTab: true,
+                  hidden: true,
+                  permission: 'B_supervisionDiskCheck'
+                }
+              }
+            ]
+          },
+          {
+            path: '/inventoryManagement/inventoryWarning',
+            redirect: '/inventoryManagement/inventoryWarning/list',
+            name: 'inventoryWarning',
+            component: BlankLayout,
+            meta: {
+              title: '库存预警',
+              icon: 'monitor',
+              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/intelligentReplenishment',
+            redirect: '/inventoryManagement/intelligentReplenishment/list',
+            name: 'intelligentReplenishment',
+            component: BlankLayout,
+            meta: {
+              title: '智能补货',
+              icon: 'monitor',
+              permission: 'M_intelligentReplenishmentList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'intelligentReplenishmentList',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/list.vue'),
+                meta: {
+                  title: '智能补货列表',
+                  icon: 'monitor',
+                  hidden: true,
+                  permission: 'M_intelligentReplenishmentList'
+                }
+              },
+              {
+                path: 'add/:sn',
+                name: 'intelligentReplenishmentAdd',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/edit.vue'),
+                meta: {
+                  title: '新增智能补货',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit/:sn',
+                name: 'intelligentReplenishmentEdit',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/edit.vue'),
+                meta: {
+                  title: '编辑智能补货',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'set',
+                name: 'intelligentReplenishmentSet',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/set.vue'),
+                meta: {
+                  title: '基础信息设置',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'import',
+                name: 'intelligentReplenishmentImport',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/import.vue'),
+                meta: {
+                  title: '确认导入',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'explainXsbz',
+                name: 'intelligentReplenishmentExplainXsbz',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/explainXsbz.vue'),
+                meta: {
+                  title: '销售保障法-说明',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              },
+              {
+                path: 'explainQspj',
+                name: 'intelligentReplenishmentExplainQspj',
+                component: () => import(/* webpackChunkName: "inventoryManagement" */ '@/views/inventoryManagement/intelligentReplenishment/explainQspj.vue'),
+                meta: {
+                  title: '趋势平均法-说明',
+                  icon: 'monitor',
+                  hidden: true
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 调拨管理
       {
-        path: 'receiving/:sn/:buyerSn',
-        name: 'salesReturnReceiving',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/receiveCheck/receiving.vue'),
+        path: '/allocationManagement',
+        redirect: '/allocationManagement/transferOut',
+        component: PageView,
         meta: {
-          title: '收货',
-          icon: 'fund',
-          hidden: true,
-          replaceTab: true
-        }
-      },
+          title: '调拨管理',
+          icon: 'cluster',
+          permission: 'M_allocationManagement'
+        },
+        children: [
+          {
+            path: '/allocationManagement/transferOut',
+            redirect: '/allocationManagement/transferOut/list',
+            name: 'transferOut',
+            component: BlankLayout,
+            meta: {
+              title: '调拨列表',
+              icon: 'pull-request',
+              permission: 'M_transferOutList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'transferOutList',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferOut/list.vue'),
+                meta: {
+                  title: '调拨列表',
+                  icon: 'pull-request',
+                  hidden: true,
+                  permission: 'M_transferOutList'
+                }
+              },
+              {
+                path: 'add/:sn/:dealerLevel',
+                name: 'transferOutAdd',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferOut/edit.vue'),
+                meta: {
+                  title: '新增调拨单',
+                  icon: 'pull-request',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'edit/:sn/:dealerLevel',
+                name: 'transferOutEdit',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferOut/edit.vue'),
+                meta: {
+                  title: '编辑调拨单',
+                  icon: 'pull-request',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'transferOutDetail',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferOut/detail.vue'),
+                meta: {
+                  title: '调拨单详情',
+                  icon: 'pull-request',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/allocationManagement/transfersPrint',
+            redirect: '/allocationManagement/transfersPrint/list',
+            name: 'transfersPrint',
+            component: BlankLayout,
+            meta: {
+              title: '调拨打印',
+              icon: 'pull-request',
+              permission: 'M_transfersPrintList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'transfersPrintList',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transfersPrint/list.vue'),
+                meta: {
+                  title: '调拨打印',
+                  icon: 'pull-request',
+                  hidden: true,
+                  permission: 'M_transfersPrintList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/allocationManagement/matchSendOutOrder',
+            redirect: '/allocationManagement/matchSendOutOrder/list',
+            name: 'matchSendOutOrderAllocation',
+            component: BlankLayout,
+            meta: {
+              title: '调拨发货对单',
+              icon: 'vertical-align-bottom',
+              permission: 'M_matchSendOutOrderAllocationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'matchSendOutOrderAllocationList',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/matchSendOutOrder/list.vue'),
+                meta: {
+                  title: '调拨发货对单',
+                  icon: 'vertical-align-bottom',
+                  hidden: true,
+                  permission: 'M_matchSendOutOrderAllocationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/allocationManagement/transferReturn',
+            redirect: '/allocationManagement/transferReturn/list',
+            name: 'transferReturn',
+            component: BlankLayout,
+            meta: {
+              title: '调拨退货列表',
+              icon: 'pull-request',
+              permission: 'M_transferReturnList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'transferReturnList',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferReturn/list.vue'),
+                meta: {
+                  title: '调拨退货列表',
+                  icon: 'pull-request',
+                  hidden: true,
+                  permission: 'M_transferReturnList'
+                }
+              },
+              {
+                path: 'editGrap/:sn/:targetType',
+                name: 'transferReturnGrpEdit',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferReturn/editGrp.vue'),
+                meta: {
+                  title: '编辑调拨退货单(抓单)',
+                  icon: 'pull-request',
+                  hidden: true
+                }
+              },
+              {
+                path: 'edit/:sn/:targetType/:dealerLevel',
+                name: 'transferReturnEdit',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferReturn/edit.vue'),
+                meta: {
+                  title: '编辑调拨退货单(不抓单)',
+                  icon: 'pull-request',
+                  hidden: true
+                }
+              },
+              {
+                path: 'detail/:sn',
+                name: 'transferReturnDetail',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferReturn/detail.vue'),
+                meta: {
+                  title: '调拨退货单详情',
+                  icon: 'pull-request',
+                  replaceTab: true,
+                  hidden: true
+                }
+              },
+              {
+                path: 'check/:sn/:grabFlag',
+                name: 'transferReturnCheck',
+                component: () => import(/* webpackChunkName: "allocationManagement" */ '@/views/allocationManagement/transferReturn/check.vue'),
+                meta: {
+                  title: '调拨退货品检',
+                  icon: 'fund',
+                  replaceTab: true,
+                  hidden: true
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 报表
       {
-        path: 'checking/:sn/:buyerSn',
-        name: 'salesReturnCheck',
-        component: () => import(/* webpackChunkName: "salesReturnManagement" */
-          '@/views/salesReturnManagement/receiveCheck/checking.vue'),
-        meta: {
-          title: '品检',
-          icon: 'fund',
-          hidden: true,
-          replaceTab: true
-        }
-      }
-      ]
-    }
-    ]
-  },
-  // 采购管理
-  {
-    path: '/purchasingManagement',
-    redirect: '/purchasingManagement/purchaseOrder',
-    component: PageView,
-    meta: {
-      title: '采购管理',
-      icon: 'money-collect',
-      permission: 'M_purchasingManagement'
-    },
-    children: [{
-      path: '/purchasingManagement/bulkWarehousingOrder',
-      redirect: '/purchasingManagement/bulkWarehousingOrder/list',
-      name: 'bulkWarehousingOrder',
-      component: BlankLayout,
-      meta: {
-        title: '散件入库',
-        icon: 'gold',
-        permission: 'M_bulkWarehousingOrderList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'bulkWarehousingOrderList',
-        component: () => import(/* webpackChunkName: "purchasingManagement" */
-          '@/views/purchasingManagement/bulkWarehousingOrder/list.vue'),
+        path: '/reportData',
+        redirect: '/reportData/salesOrderTotal',
+        component: PageView,
         meta: {
-          title: '散件入库单列表',
-          icon: 'gold',
-          hidden: true,
-          permission: 'M_bulkWarehousingOrderList'
-        }
-      },
+          title: '报表',
+          icon: 'project',
+          permission: 'M_reportData'
+        },
+        children: [
+          {
+            path: '/reportData/salesOrderTotal',
+            redirect: '/reportData/salesOrderTotal/list',
+            name: 'salesOrderTotal',
+            component: BlankLayout,
+            meta: {
+              title: '销售(开单统计)',
+              icon: 'profile',
+              permission: 'M_salesOrderTotalList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesOrderTotalList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesOrderTotal/list.vue'),
+                meta: {
+                  title: '销售(开单统计)列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_salesOrderTotalList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/salesDetails',
+            redirect: '/reportData/salesDetails/list',
+            name: 'salesDetails',
+            component: BlankLayout,
+            meta: {
+              title: '销售明细(开单统计)',
+              icon: 'profile',
+              permission: 'M_salesDetailsList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesDetailsList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesDetails/list.vue'),
+                meta: {
+                  title: '销售明细列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_salesDetailsList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/actualSalesReport',
+            redirect: '/reportData/actualSalesReport/list',
+            name: 'actualSalesReport',
+            component: BlankLayout,
+            meta: {
+              title: '实售销售报表',
+              icon: 'profile',
+              permission: 'M_actualSalesReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'actualSalesReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/actualSalesReport/list.vue'),
+                meta: {
+                  title: '实售销售列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_actualSalesReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/salesAmountReport',
+            redirect: '/reportData/salesAmountReport/list',
+            name: 'salesAmountReport',
+            component: BlankLayout,
+            meta: {
+              title: '开单销售报表',
+              icon: 'profile',
+              permission: 'M_salesAmountReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [{
+              path: 'list',
+              name: 'salesAmountReportList',
+              component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesAmountReport/list.vue'),
+              meta: {
+                title: '开单销售报表列表',
+                icon: 'profile',
+                hidden: true,
+                permission: 'M_salesAmountReportList'
+              }
+            }]
+          },
+          {
+            path: '/reportData/salesSlipReport',
+            redirect: '/reportData/salesSlipReport/list',
+            name: 'salesSlipReport',
+            component: BlankLayout,
+            meta: {
+              title: '开单销售单报表',
+              icon: 'profile',
+              permission: 'M_salesSlipReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [{
+              path: 'list',
+              name: 'salesSlipReportList',
+              component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesSlipReport/list.vue'),
+              meta: {
+                title: '开单销售单报表列表',
+                icon: 'profile',
+                hidden: true,
+                permission: 'M_salesSlipReportList'
+              }
+            }]
+          },
+          {
+            path: '/reportData/allocationOrderTotal',
+            redirect: '/reportData/allocationOrderTotal/list',
+            name: 'allocationOrderTotal',
+            component: BlankLayout,
+            meta: {
+              title: '调拨开单统计',
+              icon: 'profile',
+              permission: 'M_allocationOrderTotalList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'allocationOrderTotalList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/allocationOrderTotal/list.vue'),
+                meta: {
+                  title: '调拨开单列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_allocationOrderTotalList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/allocationDetails',
+            redirect: '/reportData/allocationDetails/list',
+            name: 'allocationDetails',
+            component: BlankLayout,
+            meta: {
+              title: '调拨明细',
+              icon: 'profile',
+              permission: 'M_allocationDetailsList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'allocationDetailsList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/allocationDetails/list.vue'),
+                meta: {
+                  title: '调拨明细列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_allocationDetailsList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/urchaseReturn',
+            redirect: '/reportData/urchaseReturn/list',
+            name: 'urchaseReturnList',
+            component: BlankLayout,
+            meta: {
+              title: '采购退货单报表',
+              icon: 'profile',
+              permission: 'M_urchaseReturn'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'urchaseReturnList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/urchaseReturn/list.vue'),
+                meta: {
+                  title: '采购退货单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_urchaseReturnList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/urchaseDetailReturn',
+            redirect: '/reportData/urchaseDetailReturn/detailList',
+            name: 'urchaseDetailReturnList',
+            component: BlankLayout,
+            meta: {
+              title: '采购退货单明细报表',
+              icon: 'profile',
+              permission: 'M_urchaseDetailReturn'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'detailList',
+                name: 'urchaseDetailReturnList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/urchaseDetailReturn/detailList.vue'),
+                meta: {
+                  title: '采购退货单明细报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_urchaseDetailReturnList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/salesReturnsReport',
+            redirect: '/reportData/salesReturnsReport/list',
+            name: 'salesReturnsReport',
+            component: BlankLayout,
+            meta: {
+              title: '销售退货单报表',
+              icon: 'profile',
+              permission: 'M_salesReturnsReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesReturnsReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesReturnsReport/list.vue'),
+                meta: {
+                  title: '销售退货单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_salesReturnsReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/salesReturnDetailReport',
+            redirect: '/reportData/salesReturnDetailReport/list',
+            name: 'salesReturnDetailReport',
+            component: BlankLayout,
+            meta: {
+              title: '销售退货明细报表',
+              icon: 'profile',
+              permission: 'M_salesReturnDetailReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [{
+              path: 'list',
+              name: 'salesReturnDetailReportList',
+              component: () => import(/* webpackChunkName: "reportData" */
+                '@/views/reportData/salesReturnDetailReport/list.vue'),
+              meta: {
+                title: '销售退货明细报表列表',
+                icon: 'profile',
+                hidden: true,
+                permission: 'M_salesReturnDetailReportList'
+              }
+            }]
+          },
+          {
+            path: '/reportData/transferReturnReport',
+            redirect: '/reportData/transferReturnReport/list',
+            name: 'transferReturnReport',
+            component: BlankLayout,
+            meta: {
+              title: '调拨退货单报表',
+              icon: 'profile',
+              permission: 'M_transferReturnReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'transferReturnReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/transferReturnReport/list.vue'),
+                meta: {
+                  title: '调拨退货单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_transferReturnReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/transferReturnDetailReport',
+            redirect: '/reportData/transferReturnDetailReport/list',
+            name: 'transferReturnDetailReport',
+            component: BlankLayout,
+            meta: {
+              title: '调拨退货单明细报表',
+              icon: 'profile',
+              permission: 'M_transferReturnDetailReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [{
+              path: 'list',
+              name: 'transferReturnDetailReportList',
+              component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/transferReturnDetailReport/list.vue'),
+              meta: {
+                title: '调拨退货单明细报表列表',
+                icon: 'profile',
+                hidden: true,
+                permission: 'M_transferReturnDetailReportList'
+              }
+            }]
+          },
+          {
+            path: '/reportData/salesReturnReport',
+            redirect: '/reportData/salesReturnReport/list',
+            name: 'salesReturnReport',
+            component: BlankLayout,
+            meta: {
+              title: '实售退货报表',
+              icon: 'profile',
+              permission: 'M_salesReturnReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesReturnReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesReturnReport/list.vue'),
+                meta: {
+                  title: '实售退货列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_salesReturnReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/billingReturnReport',
+            redirect: '/reportData/billingReturnReport/list',
+            name: 'billingReturnReport',
+            component: BlankLayout,
+            meta: {
+              title: '开单退货报表',
+              icon: 'profile',
+              permission: 'M_billingReturnReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'billingReturnReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/billingReturnReport/list.vue'),
+                meta: {
+                  title: '开单退货列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_billingReturnReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/returnSlipReport',
+            redirect: '/reportData/returnSlipReport/list',
+            name: 'returnSlipReport',
+            component: BlankLayout,
+            meta: {
+              title: '开单退货单报表',
+              icon: 'profile',
+              permission: 'M_returnSlipReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [{
+              path: 'list',
+              name: 'returnSlipReportList',
+              component: () => import(/* webpackChunkName: "reportData" */
+                '@/views/reportData/returnSlipReport/list.vue'),
+              meta: {
+                title: '开单退货单报表列表',
+                icon: 'profile',
+                hidden: true,
+                permission: 'M_returnSlipReportList'
+              }
+            }]
+          },
+          {
+            path: '/reportData/hPriceDifferenceDetailReport',
+            redirect: '/reportData/hPriceDifferenceDetailReport/list',
+            name: 'hPriceDifferenceDetailReport',
+            component: BlankLayout,
+            meta: {
+              title: '总部差价明细报表',
+              icon: 'profile',
+              permission: 'M_hPriceDifferenceDetailReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'hPriceDifferenceDetailReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/hPriceDifferenceDetailReport/list.vue'),
+                meta: {
+                  title: '总部差价明细列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_hPriceDifferenceDetailReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/priceDifferenceDetailReport',
+            redirect: '/reportData/priceDifferenceDetailReport/list',
+            name: 'priceDifferenceDetailReport',
+            component: BlankLayout,
+            meta: {
+              title: '差价明细报表',
+              icon: 'profile',
+              permission: 'M_priceDifferenceDetailReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'priceDifferenceDetailReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/priceDifferenceDetailReport/list.vue'),
+                meta: {
+                  title: '差价明细列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_priceDifferenceDetailReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/regionTypeSalesReport',
+            redirect: '/reportData/regionTypeSalesReport/list',
+            name: 'regionTypeSalesReport',
+            component: BlankLayout,
+            meta: {
+              title: '各省品类实售明细',
+              icon: 'profile',
+              permission: 'M_regionTypeSalesReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'regionTypeSalesReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/regionTypeSalesReport/list.vue'),
+                meta: {
+                  title: '各省品类实售明细',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_regionTypeSalesReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/warehousingOrder',
+            redirect: '/reportData/warehousingOrder/list',
+            name: 'warehousingOrder',
+            component: BlankLayout,
+            meta: {
+              title: '入库单报表',
+              icon: 'profile',
+              permission: 'M_warehousingOrderList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'warehousingOrderList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/warehousingOrder/list.vue'),
+                meta: {
+                  title: '入库单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_warehousingOrderList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/warehousingOrderDetail',
+            redirect: '/reportData/warehousingOrderDetail/list',
+            name: 'warehousingOrderDetail',
+            component: BlankLayout,
+            meta: {
+              title: '入库单明细报表',
+              icon: 'profile',
+              permission: 'M_warehousingOrderDetailList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'warehousingOrderDetailList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/warehousingOrderDetail/list.vue'),
+                meta: {
+                  title: '入库单明细报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_warehousingOrderDetailList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/salesPresentation',
+            redirect: '/reportData/salesPresentation/list',
+            name: 'salesPresentation',
+            component: BlankLayout,
+            meta: {
+              title: '销售交单报表',
+              icon: 'profile',
+              permission: 'M_salesPresentationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'salesPresentationList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/salesPresentation/list.vue'),
+                meta: {
+                  title: '销售交单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_salesPresentationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/allocationPresentation',
+            redirect: '/reportData/allocationPresentation/list',
+            name: 'allocationPresentation',
+            component: BlankLayout,
+            meta: {
+              title: '调拨交单报表',
+              icon: 'profile',
+              permission: 'M_allocationPresentationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'allocationPresentationList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/allocationPresentation/list.vue'),
+                meta: {
+                  title: '调拨交单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_allocationPresentationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/returnGoodsPresentation',
+            redirect: '/reportData/returnGoodsPresentation/list',
+            name: 'returnGoodsPresentation',
+            component: BlankLayout,
+            meta: {
+              title: '退货交单报表',
+              icon: 'profile',
+              permission: 'M_returnGoodsPresentationList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'returnGoodsPresentationList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/returnGoodsPresentation/list.vue'),
+                meta: {
+                  title: '退货交单报表列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_returnGoodsPresentationList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/expenseAccountBearerReport',
+            redirect: '/reportData/expenseAccountBearerReport/list',
+            name: 'expenseAccountBearerReport',
+            component: BlankLayout,
+            meta: {
+              title: '费用汇总报表(按承担方)',
+              icon: 'profile',
+              permission: 'M_expenseAccountBearerReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'expenseAccountBearerReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/expenseAccountReport/bearerList.vue'),
+                meta: {
+                  title: '费用汇总报表(按承担方)',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_expenseAccountBearerReportList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/reportData/expenseAccountCategoryReport',
+            redirect: '/reportData/expenseAccountCategoryReport/list',
+            name: 'expenseAccountCategoryReport',
+            component: BlankLayout,
+            meta: {
+              title: '费用汇总报表(按品类)',
+              icon: 'profile',
+              permission: 'M_expenseAccountCategoryReportList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'expenseAccountCategoryReportList',
+                component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/expenseAccountReport/categoryList.vue'),
+                meta: {
+                  title: '费用汇总报表(按品类)',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_expenseAccountCategoryReportList'
+                }
+              }
+            ]
+          }
+          // {
+          //   path: '/reportData/allCountryCostReport',
+          //   redirect: '/reportData/allCountryCostReport/list',
+          //   name: 'allCountryCostReport',
+          //   component: BlankLayout,
+          //   meta: {
+          //     title: '全国费用统计报表',
+          //     icon: 'profile'
+          //     // permission: 'M_nationalCustomerCostStatisticsList'
+          //   },
+          //   hideChildrenInMenu: true,
+          //   children: [
+          //     {
+          //       path: 'list',
+          //       name: 'allCountryCostReportList',
+          //       component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/allCountryCostReport/list.vue'),
+          //       meta: {
+          //         title: '全国费用统计报表',
+          //         icon: 'profile',
+          //         hidden: true
+          //         // permission: 'M_nationalCustomerCostStatisticsList'
+          //       }
+          //     }
+          //   ]
+          // }
+        ]
+      },
+      // 数据导出
       {
-        path: 'add/:id/:sn',
-        name: 'bulkWarehousingOrderAdd',
-        component: () => import(/* webpackChunkName: "purchasingManagement" */
-          '@/views/purchasingManagement/bulkWarehousingOrder/edit.vue'),
+        path: '/dataExport',
+        redirect: '/dataExport/exportCheck',
+        component: PageView,
         meta: {
-          title: '新增散件入库单',
-          icon: 'gold',
-          hidden: true
-        }
-      },
+          title: '数据导出',
+          icon: 'money-collect',
+          permission: 'M_dataExport'
+        },
+        children: [
+          {
+            path: '/dataExport/exportSales',
+            redirect: '/dataExport/exportSales/list',
+            name: 'exportSales',
+            component: BlankLayout,
+            meta: {
+              title: '导出销售',
+              icon: 'gold',
+              permission: 'M_exportSales'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'exportSalesList',
+                component: () => import(/* webpackChunkName: "dataExport" */ '@/views/dataExport/exportSales/list.vue'),
+                meta: {
+                  title: '导出销售',
+                  icon: 'gold',
+                  hidden: true,
+                  permission: 'M_exportSales'
+                }
+              }
+            ]
+          },
+          {
+            path: '/dataExport/exportCheck',
+            redirect: '/dataExport/exportCheck/list',
+            name: 'exportCheck',
+            component: BlankLayout,
+            meta: {
+              title: '导出盘点',
+              icon: 'gold',
+              permission: 'M_exportCheck'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'exportCheckList',
+                component: () => import(/* webpackChunkName: "dataExport" */ '@/views/dataExport/exportCheck/list.vue'),
+                meta: {
+                  title: '导出盘点',
+                  icon: 'gold',
+                  hidden: true,
+                  permission: 'M_exportCheck'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 产品管理
       {
-        path: 'edit/:id/:sn',
-        name: 'bulkWarehousingOrderEdit',
-        component: () => import(/* webpackChunkName: "purchasingManagement" */
-          '@/views/purchasingManagement/bulkWarehousingOrder/edit.vue'),
-        meta: {
-          title: '编辑散件入库单',
-          icon: 'gold',
-          hidden: true
-        }
-      }
-      ]
-    }]
-  },
-  // 财务管理
-  {
-    path: '/financialManagement',
-    redirect: '/financialManagement/returnConfirmation',
-    component: PageView,
-    meta: {
-      title: '财务管理',
-      icon: 'property-safety',
-      permission: 'M_financialManagement'
-    },
-    children: [{
-      path: '/financialManagement/warehousingConfirmation',
-      redirect: '/financialManagement/warehousingConfirmation/list',
-      name: 'warehousingConfirmation',
-      component: BlankLayout,
-      meta: {
-        title: '入库确认',
-        icon: 'vertical-align-bottom',
-        permission: 'M_warehousingConfirmationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'warehousingConfirmationList',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/warehousingConfirmation/list.vue'),
-        meta: {
-          title: '入库确认列表',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_warehousingConfirmationList'
-        }
-      }]
-    },
-    {
-      path: '/financialManagement/returnConfirmation',
-      redirect: '/financialManagement/returnConfirmation/list',
-      name: 'returnConfirmation',
-      component: BlankLayout,
-      meta: {
-        title: '销售退货确认',
-        icon: 'vertical-align-top',
-        permission: 'M_returnConfirmationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'returnConfirmationList',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/returnConfirmation/list.vue'),
-        meta: {
-          title: '销售退货确认列表',
-          icon: 'vertical-align-top',
-          hidden: true,
-          permission: 'M_returnConfirmationList'
-        }
-      }]
-    },
-    {
-      path: '/financialManagement/allocateReturnConfirmation',
-      redirect: '/financialManagement/allocateReturnConfirmation/list',
-      name: 'allocateReturnConfirmation',
-      component: BlankLayout,
-      meta: {
-        title: '调拨退货确认',
-        icon: 'vertical-align-top',
-        permission: 'M_allocateReturnConfirmationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'allocateReturnConfirmationList',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/allocateReturnConfirmation/list.vue'),
-        meta: {
-          title: '调拨退货确认列表',
-          icon: 'vertical-align-top',
-          hidden: true,
-          permission: 'M_allocateReturnConfirmationList'
-        }
-      }]
-    },
-    {
-      path: '/financialManagement/inventoryConfirmation',
-      redirect: '/financialManagement/inventoryConfirmation/list',
-      name: 'inventoryConfirmation',
-      component: BlankLayout,
-      meta: {
-        title: '盘点确认',
-        icon: 'monitor',
-        permission: 'M_inventoryConfirmationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'inventoryConfirmationList',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/inventoryConfirmation/list.vue'),
+        path: '/productManagement',
+        redirect: '/productManagement/productInfo',
+        component: PageView,
         meta: {
-          title: '盘点确认列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_inventoryConfirmationList'
-        }
-      },
+          title: '产品管理',
+          icon: 'shopping',
+          permission: 'M_productManagement'
+        },
+        children: [
+          {
+            path: '/productManagement/productInfo',
+            redirect: '/productManagement/productInfo/list',
+            name: 'productInfo',
+            component: BlankLayout,
+            meta: {
+              title: '产品列表',
+              icon: 'gold',
+              permission: 'M_productInfoList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productInfoList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productInfo/list.vue'),
+                meta: {
+                  title: '产品列表',
+                  icon: 'gold',
+                  hidden: true,
+                  permission: 'M_productInfoList'
+                }
+              },
+              {
+                path: 'add',
+                name: 'productInfoAdd',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productInfo/edit.vue'),
+                meta: {
+                  title: '新增产品',
+                  icon: 'gold',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'edit/:id/:sn',
+                name: 'productInfoEdit',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productInfo/edit.vue'),
+                meta: {
+                  title: '编辑产品',
+                  icon: 'gold',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productPricing',
+            redirect: '/productManagement/productPricing/list',
+            name: 'productPricing',
+            component: BlankLayout,
+            meta: {
+              title: '产品定价',
+              icon: 'transaction',
+              permission: 'M_productPricingList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productPricingList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productPricing/list.vue'),
+                meta: {
+                  title: '产品定价列表',
+                  icon: 'transaction',
+                  hidden: true,
+                  permission: 'M_productPricingList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productLaunchAudit',
+            redirect: '/productManagement/productLaunchAudit/list',
+            name: 'productLaunchAudit',
+            component: BlankLayout,
+            meta: {
+              title: '产品上线审核',
+              icon: 'rise',
+              permission: 'M_productLaunchAuditList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productLaunchAuditList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productLaunchAudit/list.vue'),
+                meta: {
+                  title: '产品上线审核列表',
+                  icon: 'rise',
+                  hidden: true,
+                  permission: 'M_productLaunchAuditList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productOfflineAudit',
+            redirect: '/productManagement/productOfflineAudit/list',
+            name: 'productOfflineAudit',
+            component: BlankLayout,
+            meta: {
+              title: '产品下线审核',
+              icon: 'fall',
+              permission: 'M_productOfflineAuditList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productOfflineAuditList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productOfflineAudit/list.vue'),
+                meta: {
+                  title: '产品下线审核列表',
+                  icon: 'fall',
+                  hidden: true,
+                  permission: 'M_productOfflineAuditList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/priceChangeRecord',
+            redirect: '/productManagement/priceChangeRecord/list',
+            name: 'priceChangeRecord',
+            component: BlankLayout,
+            meta: {
+              title: '价格变更记录',
+              icon: 'profile',
+              permission: 'M_priceChangeRecordList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'priceChangeRecordList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/priceChangeRecord/list.vue'),
+                meta: {
+                  title: '价格变更记录列表',
+                  icon: 'profile',
+                  hidden: true,
+                  permission: 'M_priceChangeRecordList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productUniversal',
+            redirect: '/productManagement/productUniversal/list',
+            name: 'productUniversal',
+            component: BlankLayout,
+            meta: {
+              title: '通用产品管理',
+              icon: 'deployment-unit',
+              permission: 'M_productUniversalList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productUniversalList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productUniversal/list.vue'),
+                meta: {
+                  title: '通用产品列表',
+                  icon: 'deployment-unit',
+                  hidden: true,
+                  permission: 'M_productUniversalList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productLevel',
+            redirect: '/productManagement/productLevel/list',
+            name: 'productLevel',
+            component: BlankLayout,
+            meta: {
+              title: '产品级别管理',
+              icon: 'fund',
+              permission: 'M_productLevelList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productLevelList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productLevel/list.vue'),
+                meta: {
+                  title: '产品级别列表',
+                  icon: 'fund',
+                  hidden: true,
+                  permission: 'M_productLevelList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productBrand',
+            redirect: '/productManagement/productBrand/list',
+            name: 'productBrand',
+            component: BlankLayout,
+            meta: {
+              title: '产品品牌管理',
+              icon: 'file-ppt',
+              permission: 'M_productBrandList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productBrandList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productBrand/list.vue'),
+                meta: {
+                  title: '产品品牌列表',
+                  icon: 'file-ppt',
+                  hidden: true,
+                  permission: 'M_productBrandList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/productCategory',
+            redirect: '/productManagement/productCategory/list',
+            name: 'productCategory',
+            component: BlankLayout,
+            meta: {
+              title: '产品分类管理',
+              icon: 'radar-chart',
+              permission: 'M_productCategoryList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productCategoryList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/productCategory/list.vue'),
+                meta: {
+                  title: '产品分类列表',
+                  icon: 'radar-chart',
+                  hidden: true,
+                  permission: 'M_productCategoryList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/productManagement/shelfNoManage',
+            redirect: '/productManagement/shelfNoManage/list',
+            name: 'shelfNoManage',
+            component: BlankLayout,
+            meta: {
+              title: '货位编号管理',
+              icon: 'radar-chart',
+              permission: 'M_shelfNoManageList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'shelfNoManageList',
+                component: () => import(/* webpackChunkName: "productManagement" */ '@/views/productManagement/shelfNoManage/list.vue'),
+                meta: {
+                  title: '货位编号管理',
+                  icon: 'radar-chart',
+                  hidden: true,
+                  permission: 'M_shelfNoManageList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 经销商管理
       {
-        path: 'detail/:sn',
-        name: 'inventoryConfirmationDetail',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/inventoryConfirmation/detail.vue'),
+        path: '/dealerManagement',
+        redirect: '/dealerManagement/marketingDivisionSet',
+        component: PageView,
         meta: {
-          title: '盘点确认详情',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'B_inventoryConfirmationDetail'
-        }
-      }
-      ]
-    },
-    {
-      path: '/financialManagement/financialCollection',
-      redirect: '/financialManagement/financialCollection/list',
-      name: 'financialCollection',
-      component: BlankLayout,
-      meta: {
-        title: '财务收款',
-        icon: 'pay-circle',
-        permission: 'M_financialCollectionList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'financialCollectionList',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/financialCollection/list.vue'),
-        meta: {
-          title: '财务收款列表',
-          icon: 'pay-circle',
-          hidden: true,
-          permission: 'M_financialCollectionList'
-        }
-      },
+          title: '经销商管理',
+          icon: 'idcard',
+          permission: 'M_dealerManagement'
+        },
+        children: [
+          {
+            path: '/dealerManagement/merchantInfoManagement',
+            redirect: '/dealerManagement/merchantInfoManagement/list',
+            name: 'merchantInfoManagement',
+            component: BlankLayout,
+            meta: {
+              title: '经销商资料管理',
+              icon: 'file-text',
+              permission: 'M_merchantInfoManagementList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'merchantInfoManagementList',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/merchantInfoManagement/list.vue'),
+                meta: {
+                  title: '经销商资料列表',
+                  icon: 'file-text',
+                  hidden: true,
+                  permission: 'M_merchantInfoManagementList'
+                }
+              },
+              {
+                path: 'add',
+                name: 'merchantInfoManagementAdd',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/merchantInfoManagement/edit.vue'),
+                meta: {
+                  title: '新增经销商',
+                  icon: 'file-text',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'edit/:id',
+                name: 'merchantInfoManagementEdit',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/merchantInfoManagement/edit.vue'),
+                meta: {
+                  title: '编辑经销商',
+                  icon: 'file-text',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'permissionSetting/:sn',
+                name: 'merchantInfoManagementSet',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/merchantInfoManagement/permissionSetting.vue'),
+                meta: {
+                  title: '经销权设置',
+                  icon: 'file-text',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/dealerManagement/dealerAccountManagement',
+            redirect: '/dealerManagement/dealerAccountManagement/list',
+            name: 'dealerAccountManagement',
+            component: BlankLayout,
+            meta: {
+              title: '经销商账号管理',
+              icon: 'team',
+              permission: 'M_dealerAccountManagementList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'dealerAccountManagementList',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/dealerAccountManagement/list.vue'),
+                meta: {
+                  title: '经销商账号列表',
+                  icon: 'team',
+                  hidden: true,
+                  permission: 'M_dealerAccountManagementList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/dealerManagement/dealerRelationshipBinding',
+            redirect: '/dealerManagement/dealerRelationshipBinding/list',
+            name: 'dealerRelationshipBinding',
+            component: BlankLayout,
+            meta: {
+              title: '经销商关系绑定',
+              icon: 'share-alt',
+              permission: 'M_dealerRelationshipBindingList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'dealerRelationshipBindingList',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/dealerRelationshipBinding/list.vue'),
+                meta: {
+                  title: '经销商关系绑定列表',
+                  icon: 'share-alt',
+                  hidden: true,
+                  permission: 'M_dealerRelationshipBindingList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/dealerManagement/rebateSettings',
+            redirect: '/dealerManagement/rebateSettings/list',
+            name: 'rebateSettings',
+            component: BlankLayout,
+            meta: {
+              title: '差价归属设置',
+              icon: 'stock',
+              permission: 'M_rebateSettingsList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'rebateSettingsList',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/rebateSettings/list.vue'),
+                meta: {
+                  title: '差价归属设置列表',
+                  icon: 'stock',
+                  hidden: true,
+                  permission: 'M_rebateSettingsList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/dealerManagement/marketingDivisionSet',
+            redirect: '/dealerManagement/marketingDivisionSet/list',
+            name: 'marketingDivisionSet',
+            component: BlankLayout,
+            meta: {
+              title: '营销分区设置',
+              icon: 'setting',
+              permission: 'M_marketingDivisionSetList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'marketingDivisionSetList',
+                component: () => import(/* webpackChunkName: "dealerManagement" */ '@/views/dealerManagement/marketingDivisionSet/list.vue'),
+                meta: {
+                  title: '营销分区列表',
+                  icon: 'setting',
+                  hidden: true,
+                  permission: 'M_marketingDivisionSetList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      //  供应商管理
       {
-        path: 'detail/:sn',
-        name: 'financialCollectionDetail',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/financialCollection/detail.vue'),
+        path: '/supplierManagement',
+        redirect: '/supplierManagement/supplierInfo',
+        component: PageView,
         meta: {
-          title: '财务收款详情',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
+          title: '供应商管理',
+          icon: 'team',
+          permission: 'M_supplierManagement'
+        },
+        children: [
+          {
+            path: '/supplierManagement/supplierInfo',
+            redirect: '/supplierManagement/supplierInfo/list',
+            name: 'supplierInfo',
+            component: BlankLayout,
+            meta: {
+              title: '供应商列表',
+              icon: 'team',
+              permission: 'M_supplierInfoList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'supplierInfoList',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/supplierInfo/list.vue'),
+                meta: {
+                  title: '供应商列表',
+                  icon: 'team',
+                  hidden: true,
+                  permission: 'M_supplierInfoList'
+                }
+              },
+              {
+                path: 'add',
+                name: 'supplierInfoAdd',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/supplierInfo/edit.vue'),
+                meta: {
+                  title: '新增供应商',
+                  icon: 'team',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'edit/:id',
+                name: 'supplierInfoEdit',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/supplierInfo/edit.vue'),
+                meta: {
+                  title: '编辑供应商',
+                  icon: 'team',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'associatedProduct/:sn/:name',
+                name: 'associatedProduct',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/associatedProduct/add.vue'),
+                meta: {
+                  title: '关联产品',
+                  icon: 'team',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/supplierManagement/costSetting',
+            redirect: '/supplierManagement/costSetting/list',
+            name: 'costSetting',
+            component: BlankLayout,
+            meta: {
+              title: '成本设置',
+              icon: 'build',
+              permission: 'M_costSettingList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'costSettingList',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/costSetting/list.vue'),
+                meta: {
+                  title: '成本设置列表',
+                  icon: 'build',
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/supplierManagement/costSetRecord',
+            redirect: '/supplierManagement/costSetRecord/list',
+            name: 'costSetRecord',
+            component: BlankLayout,
+            meta: {
+              title: '成本变更记录',
+              icon: 'build',
+              permission: 'M_costSetRecordList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'costSetRecordList',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/costSetRecord/list.vue'),
+                meta: {
+                  title: '成本变更记录列表',
+                  icon: 'build',
+                  hidden: true
+                }
+              }
+            ]
+          },
+          {
+            path: '/supplierManagement/associatedProductDetails',
+            redirect: '/supplierManagement/associatedProductDetails/list',
+            name: 'associatedProductDetails',
+            component: BlankLayout,
+            meta: {
+              title: '关联产品明细表',
+              icon: 'build',
+              permission: 'M_associatedProductDetailsList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'associatedProductDetailsList',
+                component: () => import(/* webpackChunkName: "supplierManagement" */ '@/views/supplierManagement/associatedProductDetails/list.vue'),
+                meta: {
+                  title: '关联产品明细列表',
+                  icon: 'build',
+                  hidden: true,
+                  permission: 'M_associatedProductDetailsList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 促销管理
       {
-        path: 'edit/:sn',
-        name: 'financialCollectionEdit',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/financialCollection/edit.vue'),
-        meta: {
-          title: '编辑财务收款',
-          icon: 'monitor',
-          hidden: true
-        }
-      }
-      ]
-    },
-    {
-      path: '/financialManagement/collectionDetailStatic',
-      redirect: '/financialManagement/collectionDetailStatic/list',
-      name: 'collectionDetailStatic',
-      component: BlankLayout,
-      meta: {
-        title: '财务收款明细统计',
-        icon: 'vertical-align-top',
-        permission: 'M_FC_Details_list'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'collectionDetailStaticList',
-        component: () => import(/* webpackChunkName: "financialManagement" */
-          '@/views/financialManagement/collectionDetailStatic/list.vue'),
-        meta: {
-          title: '财务收款明细统计列表',
-          icon: 'vertical-align-top',
-          hidden: true,
-          permission: 'M_FC_Details_list'
-        }
-      }]
-    }
-    ]
-  },
-  // 费用报销
-  {
-    path: '/expenseManagement',
-    redirect: '/expenseManagement/expenseReimbursement',
-    component: PageView,
-    meta: {
-      title: '费用报销',
-      icon: 'account-book',
-      permission: 'M_expenseManagement'
-    },
-    children: [{
-      path: '/expenseManagement/expenseReimbursement',
-      redirect: '/expenseManagement/expenseReimbursement/list',
-      name: 'expenseReimbursement',
-      component: BlankLayout,
-      meta: {
-        title: '费用报销单',
-        icon: 'monitor',
-        permission: 'M_expenseReimbursementList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'expenseReimbursementList',
-        component: () => import(/* webpackChunkName: "expenseManagement" */
-          '@/views/expenseManagement/expenseReimbursement/list.vue'),
+        path: '/promotionRulesManagement',
+        redirect: '/promotionRulesManagement/promotionRules',
+        component: PageView,
         meta: {
-          title: '费用报销单列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_expenseReimbursementList'
-        }
-      },
+          title: '促销管理',
+          icon: 'rocket',
+          permission: 'M_promotionRulesManagement'
+        },
+        children: [
+          {
+            path: '/promotionRulesManagement/promotionRules',
+            redirect: '/promotionRulesManagement/promotionRules/list',
+            name: 'promotionRules',
+            component: BlankLayout,
+            meta: {
+              title: '促销规则管理',
+              icon: 'thunderbolt',
+              permission: 'M_promotionRulesList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'promotionRulesManagementList',
+                component: () => import(/* webpackChunkName: "promotionRulesManagement" */ '@/views/promotionRulesManagement/promotionRules/list.vue'),
+                meta: {
+                  title: '促销规则列表',
+                  icon: 'thunderbolt',
+                  hidden: true,
+                  permission: 'M_promotionRulesList'
+                }
+              },
+              {
+                path: 'detail/:id/:sn',
+                name: 'promotionRulesManagementDetail',
+                component: () => import(/* webpackChunkName: "promotionRulesManagement" */ '@/views/promotionRulesManagement/promotionRules/detail.vue'),
+                meta: {
+                  title: '促销规则详情',
+                  icon: 'thunderbolt',
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              },
+              {
+                path: 'rule/:id/:sn',
+                name: 'promotionRulesManagementRule',
+                component: () => import(/* webpackChunkName: "promotionRulesManagement" */ '@/views/promotionRulesManagement/promotionRules/rule.vue'),
+                meta: {
+                  title: '促销规则设置',
+                  icon: 'thunderbolt',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/promotionRulesManagement/orderStatistics',
+            redirect: '/promotionRulesManagement/orderStatistics/list',
+            name: 'orderStatistics',
+            component: BlankLayout,
+            meta: {
+              title: '促销订单统计',
+              icon: 'contacts',
+              permission: 'M_orderStatisticsList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'orderStatisticsList',
+                component: () => import(/* webpackChunkName: "promotionRulesManagement" */ '@/views/promotionRulesManagement/orderStatistics/list.vue'),
+                meta: {
+                  title: '订单统计列表',
+                  icon: 'contacts',
+                  hidden: true,
+                  permission: 'M_orderStatisticsList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/promotionRulesManagement/productStatistics',
+            redirect: '/promotionRulesManagement/productStatistics/list',
+            name: 'productStatistics',
+            component: BlankLayout,
+            meta: {
+              title: '促销产品统计',
+              icon: 'file-ppt',
+              permission: 'M_productStatisticsList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'productStatisticsList',
+                component: () => import(/* webpackChunkName: "promotionRulesManagement" */ '@/views/promotionRulesManagement/productStatistics/list.vue'),
+                meta: {
+                  title: '产品统计列表',
+                  icon: 'file-ppt',
+                  hidden: true,
+                  permission: 'M_productStatisticsList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 基础设置
       {
-        path: 'detail/:sn',
-        name: 'expenseReimbursementListDetail',
-        component: () => import(/* webpackChunkName: "expenseManagement" */
-          '@/views/expenseManagement/expenseReimbursement/detail.vue'),
+        path: '/basicData',
+        redirect: '/basicData/warehouse',
+        component: PageView,
         meta: {
-          title: '费用报销单详情',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
+          title: '基础设置',
+          icon: 'pushpin',
+          permission: 'M_basicData'
+        },
+        children: [
+          {
+            path: '/basicData/warehouse',
+            redirect: '/basicData/warehouse/list',
+            name: 'warehouse',
+            component: BlankLayout,
+            meta: {
+              title: '仓库管理',
+              icon: 'deployment-unit',
+              permission: 'M_warehouseList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'warehouseList',
+                component: () => import(/* webpackChunkName: "basicData" */ '@/views/basicData/warehouse/list.vue'),
+                meta: {
+                  title: '仓库列表',
+                  icon: 'deployment-unit',
+                  hidden: true,
+                  permission: 'M_warehouseList'
+                }
+              },
+              {
+                path: '/basicData/storingLocation/:sn',
+                name: 'storingLocationList',
+                component: () => import(/* webpackChunkName: "basicData" */ '@/views/basicData/warehouse/storingLocation/list.vue'),
+                meta: {
+                  title: '仓位列表',
+                  icon: 'deployment-unit',
+                  replaceTab: true,
+                  hidden: true
+                  // permission: 'B_goodsManage_edit'
+                }
+              }
+            ]
+          },
+          {
+            path: '/basicData/transferTypeManagement',
+            redirect: '/basicData/transferTypeManagement/list',
+            name: 'transferTypeManagement',
+            component: BlankLayout,
+            meta: {
+              title: '调拨类型管理',
+              icon: 'interaction',
+              permission: 'M_transferTypeManagementList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'transferTypeManagementList',
+                component: () => import(/* webpackChunkName: "basicData" */ '@/views/basicData/transferTypeManagement/list.vue'),
+                meta: {
+                  title: '调拨类型列表',
+                  icon: 'interaction',
+                  hidden: true,
+                  permission: 'M_transferTypeManagementList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 权限管理
       {
-        path: 'add',
-        name: 'expenseReimbursementAdd',
-        component: () => import(/* webpackChunkName: "expenseManagement" */
-          '@/views/expenseManagement/expenseReimbursement/add.vue'),
+        path: '/auth',
+        redirect: '/auth/user',
+        component: PageView,
         meta: {
-          title: '新增费用报销单',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
+          title: '权限管理',
+          icon: 'lock',
+          permission: 'M_auth_0'
+        },
+        children: [
+          {
+            path: '/auth/user',
+            redirect: '/auth/user/list',
+            name: 'powerUser',
+            component: BlankLayout,
+            meta: {
+              title: '用户管理',
+              icon: 'user',
+              permission: 'M_userList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'powerUserList',
+                component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
+                meta: {
+                  title: '用户管理',
+                  icon: 'user',
+                  hidden: true,
+                  permission: 'M_userList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/auth/role',
+            redirect: '/auth/role/list',
+            name: 'powerRole',
+            component: BlankLayout,
+            meta: {
+              title: '角色管理',
+              icon: 'solution',
+              permission: 'M_roleList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'powerRoleList',
+                component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
+                meta: {
+                  title: '角色管理',
+                  icon: 'solution',
+                  hidden: true,
+                  permission: 'M_roleList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/auth/adminMenus',
+            redirect: '/auth/adminMenus/list',
+            name: 'adminMenus',
+            component: BlankLayout,
+            meta: {
+              title: '菜单管理',
+              icon: 'appstore',
+              permission: 'M_menuList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'adminMenusList',
+                component: () => import(/* webpackChunkName: "auth" */ '@/views/bnSetting/menu/adminMenus.vue'),
+                meta: {
+                  title: '菜单管理',
+                  icon: 'appstore',
+                  hidden: true,
+                  permission: 'M_menuList'
+                }
+              }
+            ]
+          }
+        ]
+      },
+      // 系统设置
       {
-        path: 'edit/:sn',
-        name: 'expenseReimbursementEdit',
-        component: () => import(/* webpackChunkName: "expenseManagement" */
-          '@/views/expenseManagement/expenseReimbursement/add.vue'),
+        path: '/setting',
+        redirect: '/setting/dataDictionary',
+        component: PageView,
         meta: {
-          title: '编辑费用报销单',
-          icon: 'monitor',
-          hidden: true
-        }
+          title: '系统设置',
+          icon: 'setting',
+          permission: 'M_systemSet'
+        },
+        children: [
+          {
+            path: '/setting/dataDictionary',
+            redirect: '/setting/dataDictionary/list',
+            name: 'dataDictionary',
+            component: BlankLayout,
+            meta: {
+              title: '数据字典管理',
+              icon: 'database',
+              permission: 'M_dataD_lookup'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'powerDD',
+                component: () => import(/* webpackChunkName: "setting" */ '@/views/power/dataDictionary/dataDictionary.vue'),
+                meta: {
+                  title: '数据字典管理',
+                  icon: 'database',
+                  hidden: true,
+                  permission: 'M_dataD_lookup'
+                }
+              }
+            ]
+          },
+          {
+            path: '/setting/OperateJournal',
+            redirect: '/setting/OperateJournal/list',
+            name: 'OperateJournal',
+            component: BlankLayout,
+            meta: {
+              title: '操作日志',
+              icon: 'read',
+              permission: 'M_OperateJournalList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'powerOperateJournal',
+                component: () => import(/* webpackChunkName: "setting" */ '@/views/power/OperateJournal/OperateJournal.vue'),
+                meta: {
+                  title: '操作日志',
+                  icon: 'read',
+                  permission: 'M_OperateJournalList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/setting/noticeManagement',
+            redirect: '/setting/noticeManagement/list',
+            name: 'noticeManagement',
+            component: BlankLayout,
+            meta: {
+              title: '公告管理',
+              icon: 'sketch',
+              permission: 'M_noticeManagementList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'noticeManagementList',
+                component: () => import(/* webpackChunkName: "setting" */ '@/views/setting/noticeManagement/list.vue'),
+                meta: {
+                  title: '公告列表',
+                  icon: 'sketch',
+                  hidden: true,
+                  permission: 'M_noticeManagementList'
+                }
+              }
+            ]
+          },
+          {
+            path: '/setting/bigScreenSet',
+            redirect: '/setting/bigScreenSet/index',
+            name: 'bigScreenSet',
+            component: BlankLayout,
+            meta: {
+              title: '大屏参数设置',
+              icon: 'sketch',
+              permission: 'M_bigScreenSetIndex'
+            },
+            hideChildrenInMenu: true,
+            children: [{
+              path: 'index',
+              name: 'bigScreenSetIndex',
+              component: () => import(/* webpackChunkName: "setting" */
+                '@/views/setting/bigScreenSet/index.vue'),
+              meta: {
+                title: '大屏参数设置',
+                icon: 'sketch',
+                hidden: true,
+                permission: 'M_bigScreenSetIndex'
+              }
+            }]
+          }
+        ]
       }
-      ]
-    },
-    {
-      path: '/expenseManagement/expenseReimbursementDetail',
-      redirect: '/expenseManagement/expenseReimbursementDetail/list',
-      name: 'expenseReimbursementDetail',
-      component: BlankLayout,
-      meta: {
-        title: '费用报销明细统计',
-        icon: 'audit',
-        permission: 'M_expenseReimbursementDetailList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'expenseReimbursementDetailList',
-        component: () => import(/* webpackChunkName: "expenseManagement" */
-          '@/views/expenseManagement/expenseReimbursementDetail/list.vue'),
-        meta: {
-          title: '费用报销明细统计列表',
-          icon: 'audit',
-          hidden: true,
-          permission: 'M_expenseReimbursementDetailList'
-        }
-      }]
-    }
     ]
   },
-  // 库存管理
   {
-    path: '/inventoryManagement',
-    redirect: '/inventoryManagement/inventoryQuery',
-    component: PageView,
-    meta: {
-      title: '库存管理',
-      icon: 'shop',
-      permission: 'M_inventoryManagement'
-    },
-    children: [{
-      path: '/inventoryManagement/inventoryQuery',
-      redirect: '/inventoryManagement/inventoryQuery/list',
-      name: 'inventoryQuery',
-      component: BlankLayout,
-      meta: {
-        title: '库存查询',
-        icon: 'monitor',
-        permission: 'M_inventoryQueryList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'inventoryQueryList',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/inventoryQuery/list.vue'),
-        meta: {
-          title: '库存列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_inventoryQueryList'
-        }
-      },
-      {
-        path: 'warehouseDetail/:sn',
-        name: 'inventoryQueryWarehouseDetail',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/inventoryQuery/warehouseDetail.vue'),
-        meta: {
-          title: '出入库明细',
-          icon: 'monitor',
-          replaceTab: true,
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/inventoryManagement/inventoryCheck',
-      redirect: '/inventoryManagement/inventoryCheck/list/0',
-      name: 'inventoryCheck',
-      component: BlankLayout,
-      meta: {
-        title: '库存盘点',
-        icon: 'monitor',
-        permission: 'M_inventoryCheckList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list/:type',
-        name: 'inventoryCheckList',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/inventoryCheck/list.vue'),
-        meta: {
-          title: '库存盘点列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_inventoryCheckList'
-        }
-      },
-      {
-        path: 'detail/:sn',
-        name: 'inventoryCheckDetail',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/inventoryCheck/detail.vue'),
-        meta: {
-          title: '库存盘点详情',
-          icon: 'monitor',
-          hidden: true,
-          replaceTab: true,
-          permission: 'B_inventoryCheckDetail'
-        }
-      }
-      ]
-    },
-    {
-      path: '/inventoryManagement/makeInventory',
-      redirect: '/inventoryManagement/makeInventory/list',
-      name: 'makeInventory',
-      component: BlankLayout,
-      meta: {
-        title: '盘点人盘点',
-        icon: 'monitor',
-        permission: 'M_inventoryMakeInventoryList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'makeInventoryList',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/makeInventory/list.vue'),
-        meta: {
-          title: '盘点人盘点列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_inventoryMakeInventoryList'
-        }
-      },
-      {
-        path: 'check/:sn',
-        name: 'makeInventoryCheck',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/makeInventory/check.vue'),
-        meta: {
-          title: '盘点人盘点',
-          icon: 'monitor',
-          hidden: true,
-          replaceTab: true,
-          permission: 'B_inventoryMakeInventoryCheck'
-        }
-      }
-      ]
-    },
-    {
-      path: '/inventoryManagement/supervisionDisk',
-      redirect: '/inventoryManagement/supervisionDisk/list',
-      name: 'supervisionDisk',
-      component: BlankLayout,
-      meta: {
-        title: '监盘人盘点',
-        icon: 'monitor',
-        permission: 'M_supervisionDiskList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'supervisionDiskList',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/supervisionDisk/list.vue'),
-        meta: {
-          title: '监盘人盘点列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_supervisionDiskList'
-        }
-      },
-      {
-        path: 'check/:sn',
-        name: 'supervisionDiskCheck',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/supervisionDisk/check.vue'),
-        meta: {
-          title: '监盘人监盘',
-          icon: 'monitor',
-          replaceTab: true,
-          hidden: true,
-          permission: 'B_supervisionDiskCheck'
-        }
-      }
-      ]
-    },
-    {
-      path: '/inventoryManagement/inventoryWarning',
-      redirect: '/inventoryManagement/inventoryWarning/list',
-      name: 'inventoryWarning',
-      component: BlankLayout,
-      meta: {
-        title: '库存预警',
-        icon: 'monitor',
-        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/intelligentReplenishment',
-      redirect: '/inventoryManagement/intelligentReplenishment/list',
-      name: 'intelligentReplenishment',
-      component: BlankLayout,
-      meta: {
-        title: '智能补货',
-        icon: 'monitor',
-        permission: 'M_intelligentReplenishmentList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'intelligentReplenishmentList',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/list.vue'),
-        meta: {
-          title: '智能补货列表',
-          icon: 'monitor',
-          hidden: true,
-          permission: 'M_intelligentReplenishmentList'
-        }
-      },
-      {
-        path: 'add/:sn',
-        name: 'intelligentReplenishmentAdd',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/edit.vue'),
-        meta: {
-          title: '新增智能补货',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
-      {
-        path: 'edit/:sn',
-        name: 'intelligentReplenishmentEdit',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/edit.vue'),
-        meta: {
-          title: '编辑智能补货',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
-      {
-        path: 'set',
-        name: 'intelligentReplenishmentSet',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/set.vue'),
-        meta: {
-          title: '基础信息设置',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
-      {
-        path: 'import',
-        name: 'intelligentReplenishmentImport',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/import.vue'),
-        meta: {
-          title: '确认导入',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
-      {
-        path: 'explainXsbz',
-        name: 'intelligentReplenishmentExplainXsbz',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/explainXsbz.vue'),
-        meta: {
-          title: '销售保障法-说明',
-          icon: 'monitor',
-          hidden: true
-        }
-      },
-      {
-        path: 'explainQspj',
-        name: 'intelligentReplenishmentExplainQspj',
-        component: () => import(/* webpackChunkName: "inventoryManagement" */
-          '@/views/inventoryManagement/intelligentReplenishment/explainQspj.vue'),
-        meta: {
-          title: '趋势平均法-说明',
-          icon: 'monitor',
-          hidden: true
-        }
-      }
-      ]
-    }
-    ]
-  },
-  // 调拨管理
-  {
-    path: '/allocationManagement',
-    redirect: '/allocationManagement/transferOut',
-    component: PageView,
-    meta: {
-      title: '调拨管理',
-      icon: 'cluster',
-      permission: 'M_allocationManagement'
-    },
-    children: [{
-      path: '/allocationManagement/transferOut',
-      redirect: '/allocationManagement/transferOut/list',
-      name: 'transferOut',
-      component: BlankLayout,
-      meta: {
-        title: '调拨列表',
-        icon: 'pull-request',
-        permission: 'M_transferOutList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'transferOutList',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferOut/list.vue'),
-        meta: {
-          title: '调拨列表',
-          icon: 'pull-request',
-          hidden: true,
-          permission: 'M_transferOutList'
-        }
-      },
-      {
-        path: 'add/:sn/:dealerLevel',
-        name: 'transferOutAdd',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferOut/edit.vue'),
-        meta: {
-          title: '新增调拨单',
-          icon: 'pull-request',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'edit/:sn/:dealerLevel',
-        name: 'transferOutEdit',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferOut/edit.vue'),
-        meta: {
-          title: '编辑调拨单',
-          icon: 'pull-request',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'detail/:sn',
-        name: 'transferOutDetail',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferOut/detail.vue'),
-        meta: {
-          title: '调拨单详情',
-          icon: 'pull-request',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/allocationManagement/transfersPrint',
-      redirect: '/allocationManagement/transfersPrint/list',
-      name: 'transfersPrint',
-      component: BlankLayout,
-      meta: {
-        title: '调拨打印',
-        icon: 'pull-request',
-        permission: 'M_transfersPrintList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'transfersPrintList',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transfersPrint/list.vue'),
-        meta: {
-          title: '调拨打印',
-          icon: 'pull-request',
-          hidden: true,
-          permission: 'M_transfersPrintList'
-        }
-      }]
-    },
-    {
-      path: '/allocationManagement/matchSendOutOrder',
-      redirect: '/allocationManagement/matchSendOutOrder/list',
-      name: 'matchSendOutOrderAllocation',
-      component: BlankLayout,
-      meta: {
-        title: '调拨发货对单',
-        icon: 'vertical-align-bottom',
-        permission: 'M_matchSendOutOrderAllocationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'matchSendOutOrderAllocationList',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/matchSendOutOrder/list.vue'),
-        meta: {
-          title: '调拨发货对单',
-          icon: 'vertical-align-bottom',
-          hidden: true,
-          permission: 'M_matchSendOutOrderAllocationList'
-        }
-      }]
-    },
-    {
-      path: '/allocationManagement/transferReturn',
-      redirect: '/allocationManagement/transferReturn/list',
-      name: 'transferReturn',
-      component: BlankLayout,
-      meta: {
-        title: '调拨退货列表',
-        icon: 'pull-request',
-        permission: 'M_transferReturnList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'transferReturnList',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferReturn/list.vue'),
-        meta: {
-          title: '调拨退货列表',
-          icon: 'pull-request',
-          hidden: true,
-          permission: 'M_transferReturnList'
-        }
-      },
-      {
-        path: 'editGrap/:sn/:targetType',
-        name: 'transferReturnGrpEdit',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferReturn/editGrp.vue'),
-        meta: {
-          title: '编辑调拨退货单(抓单)',
-          icon: 'pull-request',
-          hidden: true
-        }
-      },
-      {
-        path: 'edit/:sn/:targetType/:dealerLevel',
-        name: 'transferReturnEdit',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferReturn/edit.vue'),
-        meta: {
-          title: '编辑调拨退货单(不抓单)',
-          icon: 'pull-request',
-          hidden: true
-        }
-      },
-      {
-        path: 'detail/:sn',
-        name: 'transferReturnDetail',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferReturn/detail.vue'),
-        meta: {
-          title: '调拨退货单详情',
-          icon: 'pull-request',
-          replaceTab: true,
-          hidden: true
-        }
-      },
-      {
-        path: 'check/:sn/:grabFlag',
-        name: 'transferReturnCheck',
-        component: () => import(/* webpackChunkName: "allocationManagement" */
-          '@/views/allocationManagement/transferReturn/check.vue'),
-        meta: {
-          title: '调拨退货品检',
-          icon: 'fund',
-          replaceTab: true,
-          hidden: true
-        }
-      }
-      ]
-    }
-    ]
-  },
-  // 报表
-  {
-    path: '/reportData',
-    redirect: '/reportData/salesOrderTotal',
-    component: PageView,
-    meta: {
-      title: '报表',
-      icon: 'project',
-      permission: 'M_reportData'
-    },
-    children: [{
-      path: '/reportData/salesOrderTotal',
-      redirect: '/reportData/salesOrderTotal/list',
-      name: 'salesOrderTotal',
-      component: BlankLayout,
-      meta: {
-        title: '销售(开单统计)',
-        icon: 'profile',
-        permission: 'M_salesOrderTotalList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesOrderTotalList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesOrderTotal/list.vue'),
-        meta: {
-          title: '销售(开单统计)列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesOrderTotalList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesDetails',
-      redirect: '/reportData/salesDetails/list',
-      name: 'salesDetails',
-      component: BlankLayout,
-      meta: {
-        title: '销售明细(开单统计)',
-        icon: 'profile',
-        permission: 'M_salesDetailsList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesDetailsList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesDetails/list.vue'),
-        meta: {
-          title: '销售明细列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesDetailsList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/actualSalesReport',
-      redirect: '/reportData/actualSalesReport/list',
-      name: 'actualSalesReport',
-      component: BlankLayout,
-      meta: {
-        title: '实售销售报表',
-        icon: 'profile',
-        permission: 'M_actualSalesReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'actualSalesReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/actualSalesReport/list.vue'),
-        meta: {
-          title: '实售销售列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_actualSalesReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesAmountReport',
-      redirect: '/reportData/salesAmountReport/list',
-      name: 'salesAmountReport',
-      component: BlankLayout,
-      meta: {
-        title: '开单销售报表',
-        icon: 'profile',
-        permission: 'M_salesAmountReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesAmountReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesAmountReport/list.vue'),
-        meta: {
-          title: '开单销售报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesAmountReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesSlipReport',
-      redirect: '/reportData/salesSlipReport/list',
-      name: 'salesSlipReport',
-      component: BlankLayout,
-      meta: {
-        title: '开单销售单报表',
-        icon: 'profile',
-        permission: 'M_salesSlipReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesSlipReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesSlipReport/list.vue'),
-        meta: {
-          title: '开单销售单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesSlipReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/allocationOrderTotal',
-      redirect: '/reportData/allocationOrderTotal/list',
-      name: 'allocationOrderTotal',
-      component: BlankLayout,
-      meta: {
-        title: '调拨开单统计',
-        icon: 'profile',
-        permission: 'M_allocationOrderTotalList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'allocationOrderTotalList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/allocationOrderTotal/list.vue'),
-        meta: {
-          title: '调拨开单列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_allocationOrderTotalList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/allocationDetails',
-      redirect: '/reportData/allocationDetails/list',
-      name: 'allocationDetails',
-      component: BlankLayout,
-      meta: {
-        title: '调拨明细',
-        icon: 'profile',
-        permission: 'M_allocationDetailsList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'allocationDetailsList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/allocationDetails/list.vue'),
-        meta: {
-          title: '调拨明细列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_allocationDetailsList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesReturnsReport',
-      redirect: '/reportData/salesReturnsReport/list',
-      name: 'salesReturnsReport',
-      component: BlankLayout,
-      meta: {
-        title: '销售退货单报表',
-        icon: 'profile',
-        permission: 'M_salesReturnsReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesReturnsReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesReturnsReport/list.vue'),
-        meta: {
-          title: '销售退货单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesReturnsReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesReturnDetailReport',
-      redirect: '/reportData/salesReturnDetailReport/list',
-      name: 'salesReturnDetailReport',
-      component: BlankLayout,
-      meta: {
-        title: '销售退货明细报表',
-        icon: 'profile',
-        permission: 'M_salesReturnDetailReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesReturnDetailReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesReturnDetailReport/list.vue'),
-        meta: {
-          title: '销售退货明细报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesReturnDetailReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/transferReturnReport',
-      redirect: '/reportData/transferReturnReport/list',
-      name: 'transferReturnReport',
-      component: BlankLayout,
-      meta: {
-        title: '调拨退货单报表',
-        icon: 'profile',
-        permission: 'M_transferReturnReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'transferReturnReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/transferReturnReport/list.vue'),
-        meta: {
-          title: '调拨退货单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_transferReturnReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/transferReturnDetailReport',
-      redirect: '/reportData/transferReturnDetailReport/list',
-      name: 'transferReturnDetailReport',
-      component: BlankLayout,
-      meta: {
-        title: '调拨退货单明细报表',
-        icon: 'profile',
-        permission: 'M_transferReturnDetailReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'transferReturnDetailReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/transferReturnDetailReport/list.vue'),
-        meta: {
-          title: '调拨退货单明细报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_transferReturnDetailReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesReturnReport',
-      redirect: '/reportData/salesReturnReport/list',
-      name: 'salesReturnReport',
-      component: BlankLayout,
-      meta: {
-        title: '实售退货报表',
-        icon: 'profile',
-        permission: 'M_salesReturnReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesReturnReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesReturnReport/list.vue'),
-        meta: {
-          title: '实售退货列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesReturnReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/billingReturnReport',
-      redirect: '/reportData/billingReturnReport/list',
-      name: 'billingReturnReport',
-      component: BlankLayout,
-      meta: {
-        title: '开单退货报表',
-        icon: 'profile',
-        permission: 'M_billingReturnReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'billingReturnReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/billingReturnReport/list.vue'),
-        meta: {
-          title: '开单退货列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_billingReturnReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/returnSlipReport',
-      redirect: '/reportData/returnSlipReport/list',
-      name: 'returnSlipReport',
-      component: BlankLayout,
-      meta: {
-        title: '开单退货单报表',
-        icon: 'profile',
-        permission: 'M_returnSlipReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'returnSlipReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/returnSlipReport/list.vue'),
-        meta: {
-          title: '开单退货单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_returnSlipReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/hPriceDifferenceDetailReport',
-      redirect: '/reportData/hPriceDifferenceDetailReport/list',
-      name: 'hPriceDifferenceDetailReport',
-      component: BlankLayout,
-      meta: {
-        title: '总部差价明细报表',
-        icon: 'profile',
-        permission: 'M_hPriceDifferenceDetailReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'hPriceDifferenceDetailReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/hPriceDifferenceDetailReport/list.vue'),
-        meta: {
-          title: '总部差价明细列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_hPriceDifferenceDetailReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/priceDifferenceDetailReport',
-      redirect: '/reportData/priceDifferenceDetailReport/list',
-      name: 'priceDifferenceDetailReport',
-      component: BlankLayout,
-      meta: {
-        title: '差价明细报表',
-        icon: 'profile',
-        permission: 'M_priceDifferenceDetailReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'priceDifferenceDetailReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/priceDifferenceDetailReport/list.vue'),
-        meta: {
-          title: '差价明细列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_priceDifferenceDetailReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/regionTypeSalesReport',
-      redirect: '/reportData/regionTypeSalesReport/list',
-      name: 'regionTypeSalesReport',
-      component: BlankLayout,
-      meta: {
-        title: '各省品类实售明细',
-        icon: 'profile',
-        permission: 'M_regionTypeSalesReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'regionTypeSalesReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/regionTypeSalesReport/list.vue'),
-        meta: {
-          title: '各省品类实售明细',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_regionTypeSalesReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/warehousingOrder',
-      redirect: '/reportData/warehousingOrder/list',
-      name: 'warehousingOrder',
-      component: BlankLayout,
-      meta: {
-        title: '入库单报表',
-        icon: 'profile',
-        permission: 'M_warehousingOrderList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'warehousingOrderList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/warehousingOrder/list.vue'),
-        meta: {
-          title: '入库单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_warehousingOrderList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/warehousingOrderDetail',
-      redirect: '/reportData/warehousingOrderDetail/list',
-      name: 'warehousingOrderDetail',
-      component: BlankLayout,
-      meta: {
-        title: '入库单明细报表',
-        icon: 'profile',
-        permission: 'M_warehousingOrderDetailList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'warehousingOrderDetailList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/warehousingOrderDetail/list.vue'),
-        meta: {
-          title: '入库单明细报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_warehousingOrderDetailList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/salesPresentation',
-      redirect: '/reportData/salesPresentation/list',
-      name: 'salesPresentation',
-      component: BlankLayout,
-      meta: {
-        title: '销售交单报表',
-        icon: 'profile',
-        permission: 'M_salesPresentationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'salesPresentationList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/salesPresentation/list.vue'),
-        meta: {
-          title: '销售交单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_salesPresentationList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/allocationPresentation',
-      redirect: '/reportData/allocationPresentation/list',
-      name: 'allocationPresentation',
-      component: BlankLayout,
-      meta: {
-        title: '调拨交单报表',
-        icon: 'profile',
-        permission: 'M_allocationPresentationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'allocationPresentationList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/allocationPresentation/list.vue'),
-        meta: {
-          title: '调拨交单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_allocationPresentationList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/returnGoodsPresentation',
-      redirect: '/reportData/returnGoodsPresentation/list',
-      name: 'returnGoodsPresentation',
-      component: BlankLayout,
-      meta: {
-        title: '退货交单报表',
-        icon: 'profile',
-        permission: 'M_returnGoodsPresentationList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'returnGoodsPresentationList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/returnGoodsPresentation/list.vue'),
-        meta: {
-          title: '退货交单报表列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_returnGoodsPresentationList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/expenseAccountBearerReport',
-      redirect: '/reportData/expenseAccountBearerReport/list',
-      name: 'expenseAccountBearerReport',
-      component: BlankLayout,
-      meta: {
-        title: '费用汇总报表(按承担方)',
-        icon: 'profile',
-        permission: 'M_expenseAccountBearerReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'expenseAccountBearerReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/expenseAccountReport/bearerList.vue'),
-        meta: {
-          title: '费用汇总报表(按承担方)',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_expenseAccountBearerReportList'
-        }
-      }]
-    },
-    {
-      path: '/reportData/expenseAccountCategoryReport',
-      redirect: '/reportData/expenseAccountCategoryReport/list',
-      name: 'expenseAccountCategoryReport',
-      component: BlankLayout,
-      meta: {
-        title: '费用汇总报表(按品类)',
-        icon: 'profile',
-        permission: 'M_expenseAccountCategoryReportList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'expenseAccountCategoryReportList',
-        component: () => import(/* webpackChunkName: "reportData" */
-          '@/views/reportData/expenseAccountReport/categoryList.vue'),
-        meta: {
-          title: '费用汇总报表(按品类)',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_expenseAccountCategoryReportList'
-        }
-      }]
-    }
-      // {
-      //   path: '/reportData/allCountryCostReport',
-      //   redirect: '/reportData/allCountryCostReport/list',
-      //   name: 'allCountryCostReport',
-      //   component: BlankLayout,
-      //   meta: {
-      //     title: '全国费用统计报表',
-      //     icon: 'profile'
-      //     // permission: 'M_nationalCustomerCostStatisticsList'
-      //   },
-      //   hideChildrenInMenu: true,
-      //   children: [
-      //     {
-      //       path: 'list',
-      //       name: 'allCountryCostReportList',
-      //       component: () => import(/* webpackChunkName: "reportData" */ '@/views/reportData/allCountryCostReport/list.vue'),
-      //       meta: {
-      //         title: '全国费用统计报表',
-      //         icon: 'profile',
-      //         hidden: true
-      //         // permission: 'M_nationalCustomerCostStatisticsList'
-      //       }
-      //     }
-      //   ]
-      // }
-    ]
-  },
-  // 数据导出
-  {
-    path: '/dataExport',
-    redirect: '/dataExport/exportCheck',
-    component: PageView,
-    meta: {
-      title: '数据导出',
-      icon: 'money-collect',
-      permission: 'M_dataExport'
-    },
-    children: [{
-      path: '/dataExport/exportSales',
-      redirect: '/dataExport/exportSales/list',
-      name: 'exportSales',
-      component: BlankLayout,
-      meta: {
-        title: '导出销售',
-        icon: 'gold',
-        permission: 'M_exportSales'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'exportSalesList',
-        component: () => import(/* webpackChunkName: "dataExport" */
-          '@/views/dataExport/exportSales/list.vue'),
-        meta: {
-          title: '导出销售',
-          icon: 'gold',
-          hidden: true,
-          permission: 'M_exportSales'
-        }
-      }]
-    },
-    {
-      path: '/dataExport/exportCheck',
-      redirect: '/dataExport/exportCheck/list',
-      name: 'exportCheck',
-      component: BlankLayout,
-      meta: {
-        title: '导出盘点',
-        icon: 'gold',
-        permission: 'M_exportCheck'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'exportCheckList',
-        component: () => import(/* webpackChunkName: "dataExport" */
-          '@/views/dataExport/exportCheck/list.vue'),
-        meta: {
-          title: '导出盘点',
-          icon: 'gold',
-          hidden: true,
-          permission: 'M_exportCheck'
-        }
-      }]
-    }
-    ]
-  },
-  // 产品管理
-  {
-    path: '/productManagement',
-    redirect: '/productManagement/productInfo',
-    component: PageView,
-    meta: {
-      title: '产品管理',
-      icon: 'shopping',
-      permission: 'M_productManagement'
-    },
-    children: [{
-      path: '/productManagement/productInfo',
-      redirect: '/productManagement/productInfo/list',
-      name: 'productInfo',
-      component: BlankLayout,
-      meta: {
-        title: '产品列表',
-        icon: 'gold',
-        permission: 'M_productInfoList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productInfoList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productInfo/list.vue'),
-        meta: {
-          title: '产品列表',
-          icon: 'gold',
-          hidden: true,
-          permission: 'M_productInfoList'
-        }
-      },
-      {
-        path: 'add',
-        name: 'productInfoAdd',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productInfo/edit.vue'),
-        meta: {
-          title: '新增产品',
-          icon: 'gold',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'edit/:id/:sn',
-        name: 'productInfoEdit',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productInfo/edit.vue'),
-        meta: {
-          title: '编辑产品',
-          icon: 'gold',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/productManagement/productPricing',
-      redirect: '/productManagement/productPricing/list',
-      name: 'productPricing',
-      component: BlankLayout,
-      meta: {
-        title: '产品定价',
-        icon: 'transaction',
-        permission: 'M_productPricingList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productPricingList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productPricing/list.vue'),
-        meta: {
-          title: '产品定价列表',
-          icon: 'transaction',
-          hidden: true,
-          permission: 'M_productPricingList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/productLaunchAudit',
-      redirect: '/productManagement/productLaunchAudit/list',
-      name: 'productLaunchAudit',
-      component: BlankLayout,
-      meta: {
-        title: '产品上线审核',
-        icon: 'rise',
-        permission: 'M_productLaunchAuditList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productLaunchAuditList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productLaunchAudit/list.vue'),
-        meta: {
-          title: '产品上线审核列表',
-          icon: 'rise',
-          hidden: true,
-          permission: 'M_productLaunchAuditList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/productOfflineAudit',
-      redirect: '/productManagement/productOfflineAudit/list',
-      name: 'productOfflineAudit',
-      component: BlankLayout,
-      meta: {
-        title: '产品下线审核',
-        icon: 'fall',
-        permission: 'M_productOfflineAuditList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productOfflineAuditList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productOfflineAudit/list.vue'),
-        meta: {
-          title: '产品下线审核列表',
-          icon: 'fall',
-          hidden: true,
-          permission: 'M_productOfflineAuditList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/priceChangeRecord',
-      redirect: '/productManagement/priceChangeRecord/list',
-      name: 'priceChangeRecord',
-      component: BlankLayout,
-      meta: {
-        title: '价格变更记录',
-        icon: 'profile',
-        permission: 'M_priceChangeRecordList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'priceChangeRecordList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/priceChangeRecord/list.vue'),
-        meta: {
-          title: '价格变更记录列表',
-          icon: 'profile',
-          hidden: true,
-          permission: 'M_priceChangeRecordList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/productUniversal',
-      redirect: '/productManagement/productUniversal/list',
-      name: 'productUniversal',
-      component: BlankLayout,
-      meta: {
-        title: '通用产品管理',
-        icon: 'deployment-unit',
-        permission: 'M_productUniversalList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productUniversalList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productUniversal/list.vue'),
-        meta: {
-          title: '通用产品列表',
-          icon: 'deployment-unit',
-          hidden: true,
-          permission: 'M_productUniversalList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/productLevel',
-      redirect: '/productManagement/productLevel/list',
-      name: 'productLevel',
-      component: BlankLayout,
-      meta: {
-        title: '产品级别管理',
-        icon: 'fund',
-        permission: 'M_productLevelList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productLevelList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productLevel/list.vue'),
-        meta: {
-          title: '产品级别列表',
-          icon: 'fund',
-          hidden: true,
-          permission: 'M_productLevelList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/productBrand',
-      redirect: '/productManagement/productBrand/list',
-      name: 'productBrand',
-      component: BlankLayout,
-      meta: {
-        title: '产品品牌管理',
-        icon: 'file-ppt',
-        permission: 'M_productBrandList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productBrandList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productBrand/list.vue'),
-        meta: {
-          title: '产品品牌列表',
-          icon: 'file-ppt',
-          hidden: true,
-          permission: 'M_productBrandList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/productCategory',
-      redirect: '/productManagement/productCategory/list',
-      name: 'productCategory',
-      component: BlankLayout,
-      meta: {
-        title: '产品分类管理',
-        icon: 'radar-chart',
-        permission: 'M_productCategoryList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productCategoryList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/productCategory/list.vue'),
-        meta: {
-          title: '产品分类列表',
-          icon: 'radar-chart',
-          hidden: true,
-          permission: 'M_productCategoryList'
-        }
-      }]
-    },
-    {
-      path: '/productManagement/shelfNoManage',
-      redirect: '/productManagement/shelfNoManage/list',
-      name: 'shelfNoManage',
-      component: BlankLayout,
-      meta: {
-        title: '货位编号管理',
-        icon: 'radar-chart',
-        permission: 'M_shelfNoManageList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'shelfNoManageList',
-        component: () => import(/* webpackChunkName: "productManagement" */
-          '@/views/productManagement/shelfNoManage/list.vue'),
-        meta: {
-          title: '货位编号管理',
-          icon: 'radar-chart',
-          hidden: true,
-          permission: 'M_shelfNoManageList'
-        }
-      }]
-    }
-    ]
-  },
-  // 经销商管理
-  {
-    path: '/dealerManagement',
-    redirect: '/dealerManagement/marketingDivisionSet',
-    component: PageView,
-    meta: {
-      title: '经销商管理',
-      icon: 'idcard',
-      permission: 'M_dealerManagement'
-    },
-    children: [{
-      path: '/dealerManagement/merchantInfoManagement',
-      redirect: '/dealerManagement/merchantInfoManagement/list',
-      name: 'merchantInfoManagement',
-      component: BlankLayout,
-      meta: {
-        title: '经销商资料管理',
-        icon: 'file-text',
-        permission: 'M_merchantInfoManagementList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'merchantInfoManagementList',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/merchantInfoManagement/list.vue'),
-        meta: {
-          title: '经销商资料列表',
-          icon: 'file-text',
-          hidden: true,
-          permission: 'M_merchantInfoManagementList'
-        }
-      },
-      {
-        path: 'add',
-        name: 'merchantInfoManagementAdd',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/merchantInfoManagement/edit.vue'),
-        meta: {
-          title: '新增经销商',
-          icon: 'file-text',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'edit/:id',
-        name: 'merchantInfoManagementEdit',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/merchantInfoManagement/edit.vue'),
-        meta: {
-          title: '编辑经销商',
-          icon: 'file-text',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'permissionSetting/:sn',
-        name: 'merchantInfoManagementSet',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/merchantInfoManagement/permissionSetting.vue'),
-        meta: {
-          title: '经销权设置',
-          icon: 'file-text',
-          replaceTab: true,
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/dealerManagement/dealerAccountManagement',
-      redirect: '/dealerManagement/dealerAccountManagement/list',
-      name: 'dealerAccountManagement',
-      component: BlankLayout,
-      meta: {
-        title: '经销商账号管理',
-        icon: 'team',
-        permission: 'M_dealerAccountManagementList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'dealerAccountManagementList',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/dealerAccountManagement/list.vue'),
-        meta: {
-          title: '经销商账号列表',
-          icon: 'team',
-          hidden: true,
-          permission: 'M_dealerAccountManagementList'
-        }
-      }]
-    },
-    {
-      path: '/dealerManagement/dealerRelationshipBinding',
-      redirect: '/dealerManagement/dealerRelationshipBinding/list',
-      name: 'dealerRelationshipBinding',
-      component: BlankLayout,
-      meta: {
-        title: '经销商关系绑定',
-        icon: 'share-alt',
-        permission: 'M_dealerRelationshipBindingList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'dealerRelationshipBindingList',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/dealerRelationshipBinding/list.vue'),
-        meta: {
-          title: '经销商关系绑定列表',
-          icon: 'share-alt',
-          hidden: true,
-          permission: 'M_dealerRelationshipBindingList'
-        }
-      }]
-    },
-    {
-      path: '/dealerManagement/rebateSettings',
-      redirect: '/dealerManagement/rebateSettings/list',
-      name: 'rebateSettings',
-      component: BlankLayout,
-      meta: {
-        title: '差价归属设置',
-        icon: 'stock',
-        permission: 'M_rebateSettingsList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'rebateSettingsList',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/rebateSettings/list.vue'),
-        meta: {
-          title: '差价归属设置列表',
-          icon: 'stock',
-          hidden: true,
-          permission: 'M_rebateSettingsList'
-        }
-      }]
-    },
-    {
-      path: '/dealerManagement/marketingDivisionSet',
-      redirect: '/dealerManagement/marketingDivisionSet/list',
-      name: 'marketingDivisionSet',
-      component: BlankLayout,
-      meta: {
-        title: '营销分区设置',
-        icon: 'setting',
-        permission: 'M_marketingDivisionSetList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'marketingDivisionSetList',
-        component: () => import(/* webpackChunkName: "dealerManagement" */
-          '@/views/dealerManagement/marketingDivisionSet/list.vue'),
-        meta: {
-          title: '营销分区列表',
-          icon: 'setting',
-          hidden: true,
-          permission: 'M_marketingDivisionSetList'
-        }
-      }]
-    }
-    ]
-  },
-  //  供应商管理
-  {
-    path: '/supplierManagement',
-    redirect: '/supplierManagement/supplierInfo',
-    component: PageView,
-    meta: {
-      title: '供应商管理',
-      icon: 'team',
-      permission: 'M_supplierManagement'
-    },
-    children: [{
-      path: '/supplierManagement/supplierInfo',
-      redirect: '/supplierManagement/supplierInfo/list',
-      name: 'supplierInfo',
-      component: BlankLayout,
-      meta: {
-        title: '供应商列表',
-        icon: 'team',
-        permission: 'M_supplierInfoList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'supplierInfoList',
-        component: () => import(/* webpackChunkName: "supplierManagement" */
-          '@/views/supplierManagement/supplierInfo/list.vue'),
-        meta: {
-          title: '供应商列表',
-          icon: 'team',
-          hidden: true,
-          permission: 'M_supplierInfoList'
-        }
-      },
-      {
-        path: 'add',
-        name: 'supplierInfoAdd',
-        component: () => import(/* webpackChunkName: "supplierManagement" */
-          '@/views/supplierManagement/supplierInfo/edit.vue'),
-        meta: {
-          title: '新增供应商',
-          icon: 'team',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'edit/:id',
-        name: 'supplierInfoEdit',
-        component: () => import(/* webpackChunkName: "supplierManagement" */
-          '@/views/supplierManagement/supplierInfo/edit.vue'),
-        meta: {
-          title: '编辑供应商',
-          icon: 'team',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'associatedProduct/:sn/:name',
-        name: 'associatedProduct',
-        component: () => import(/* webpackChunkName: "supplierManagement" */
-          '@/views/supplierManagement/associatedProduct/add.vue'),
-        meta: {
-          title: '关联产品',
-          icon: 'team',
-          replaceTab: true,
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/supplierManagement/associatedProductDetails',
-      redirect: '/supplierManagement/associatedProductDetails/list',
-      name: 'associatedProductDetails',
-      component: BlankLayout,
-      meta: {
-        title: '关联产品明细表',
-        icon: 'build',
-        permission: 'M_associatedProductDetailsList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'associatedProductDetailsList',
-        component: () => import(/* webpackChunkName: "supplierManagement" */
-          '@/views/supplierManagement/associatedProductDetails/list.vue'),
-        meta: {
-          title: '关联产品明细列表',
-          icon: 'build',
-          hidden: true,
-          permission: 'M_associatedProductDetailsList'
-        }
-      }]
-    }
-    ]
-  },
-  // 促销管理
-  {
-    path: '/promotionRulesManagement',
-    redirect: '/promotionRulesManagement/promotionRules',
-    component: PageView,
-    meta: {
-      title: '促销管理',
-      icon: 'rocket',
-      permission: 'M_promotionRulesManagement'
-    },
-    children: [{
-      path: '/promotionRulesManagement/promotionRules',
-      redirect: '/promotionRulesManagement/promotionRules/list',
-      name: 'promotionRules',
-      component: BlankLayout,
-      meta: {
-        title: '促销规则管理',
-        icon: 'thunderbolt',
-        permission: 'M_promotionRulesList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'promotionRulesManagementList',
-        component: () => import(/* webpackChunkName: "promotionRulesManagement" */
-          '@/views/promotionRulesManagement/promotionRules/list.vue'),
-        meta: {
-          title: '促销规则列表',
-          icon: 'thunderbolt',
-          hidden: true,
-          permission: 'M_promotionRulesList'
-        }
-      },
-      {
-        path: 'detail/:id/:sn',
-        name: 'promotionRulesManagementDetail',
-        component: () => import(/* webpackChunkName: "promotionRulesManagement" */
-          '@/views/promotionRulesManagement/promotionRules/detail.vue'),
-        meta: {
-          title: '促销规则详情',
-          icon: 'thunderbolt',
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      },
-      {
-        path: 'rule/:id/:sn',
-        name: 'promotionRulesManagementRule',
-        component: () => import(/* webpackChunkName: "promotionRulesManagement" */
-          '@/views/promotionRulesManagement/promotionRules/rule.vue'),
-        meta: {
-          title: '促销规则设置',
-          icon: 'thunderbolt',
-          replaceTab: true,
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/promotionRulesManagement/orderStatistics',
-      redirect: '/promotionRulesManagement/orderStatistics/list',
-      name: 'orderStatistics',
-      component: BlankLayout,
-      meta: {
-        title: '促销订单统计',
-        icon: 'contacts',
-        permission: 'M_orderStatisticsList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'orderStatisticsList',
-        component: () => import(/* webpackChunkName: "promotionRulesManagement" */
-          '@/views/promotionRulesManagement/orderStatistics/list.vue'),
-        meta: {
-          title: '订单统计列表',
-          icon: 'contacts',
-          hidden: true,
-          permission: 'M_orderStatisticsList'
-        }
-      }]
-    },
-    {
-      path: '/promotionRulesManagement/productStatistics',
-      redirect: '/promotionRulesManagement/productStatistics/list',
-      name: 'productStatistics',
-      component: BlankLayout,
-      meta: {
-        title: '促销产品统计',
-        icon: 'file-ppt',
-        permission: 'M_productStatisticsList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'productStatisticsList',
-        component: () => import(/* webpackChunkName: "promotionRulesManagement" */
-          '@/views/promotionRulesManagement/productStatistics/list.vue'),
-        meta: {
-          title: '产品统计列表',
-          icon: 'file-ppt',
-          hidden: true,
-          permission: 'M_productStatisticsList'
-        }
-      }]
-    }
-    ]
-  },
-  // 基础设置
-  {
-    path: '/basicData',
-    redirect: '/basicData/warehouse',
-    component: PageView,
-    meta: {
-      title: '基础设置',
-      icon: 'pushpin',
-      permission: 'M_basicData'
-    },
-    children: [{
-      path: '/basicData/warehouse',
-      redirect: '/basicData/warehouse/list',
-      name: 'warehouse',
-      component: BlankLayout,
-      meta: {
-        title: '仓库管理',
-        icon: 'deployment-unit',
-        permission: 'M_warehouseList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'warehouseList',
-        component: () => import(/* webpackChunkName: "basicData" */
-          '@/views/basicData/warehouse/list.vue'),
-        meta: {
-          title: '仓库列表',
-          icon: 'deployment-unit',
-          hidden: true,
-          permission: 'M_warehouseList'
-        }
-      },
-      {
-        path: '/basicData/storingLocation/:sn',
-        name: 'storingLocationList',
-        component: () => import(/* webpackChunkName: "basicData" */
-          '@/views/basicData/warehouse/storingLocation/list.vue'),
-        meta: {
-          title: '仓位列表',
-          icon: 'deployment-unit',
-          replaceTab: true,
-          hidden: true
-          // permission: 'B_goodsManage_edit'
-        }
-      }
-      ]
-    },
-    {
-      path: '/basicData/transferTypeManagement',
-      redirect: '/basicData/transferTypeManagement/list',
-      name: 'transferTypeManagement',
-      component: BlankLayout,
-      meta: {
-        title: '调拨类型管理',
-        icon: 'interaction',
-        permission: 'M_transferTypeManagementList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'transferTypeManagementList',
-        component: () => import(/* webpackChunkName: "basicData" */
-          '@/views/basicData/transferTypeManagement/list.vue'),
-        meta: {
-          title: '调拨类型列表',
-          icon: 'interaction',
-          hidden: true,
-          permission: 'M_transferTypeManagementList'
-        }
-      }]
-    }
-    ]
-  },
-  // 权限管理
-  {
-    path: '/auth',
-    redirect: '/auth/user',
-    component: PageView,
-    meta: {
-      title: '权限管理',
-      icon: 'lock',
-      permission: 'M_auth_0'
-    },
-    children: [{
-      path: '/auth/user',
-      redirect: '/auth/user/list',
-      name: 'powerUser',
-      component: BlankLayout,
-      meta: {
-        title: '用户管理',
-        icon: 'user',
-        permission: 'M_userList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'powerUserList',
-        component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
-        meta: {
-          title: '用户管理',
-          icon: 'user',
-          hidden: true,
-          permission: 'M_userList'
-        }
-      }]
-    },
-    {
-      path: '/auth/role',
-      redirect: '/auth/role/list',
-      name: 'powerRole',
-      component: BlankLayout,
-      meta: {
-        title: '角色管理',
-        icon: 'solution',
-        permission: 'M_roleList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'powerRoleList',
-        component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
-        meta: {
-          title: '角色管理',
-          icon: 'solution',
-          hidden: true,
-          permission: 'M_roleList'
-        }
-      }]
-    },
-    {
-      path: '/auth/adminMenus',
-      redirect: '/auth/adminMenus/list',
-      name: 'adminMenus',
-      component: BlankLayout,
-      meta: {
-        title: '菜单管理',
-        icon: 'appstore',
-        permission: 'M_menuList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'adminMenusList',
-        component: () => import(/* webpackChunkName: "auth" */
-          '@/views/bnSetting/menu/adminMenus.vue'),
-        meta: {
-          title: '菜单管理',
-          icon: 'appstore',
-          hidden: true,
-          permission: 'M_menuList'
-        }
-      }]
-    }
-    ]
-  },
-  // 系统设置
-  {
-    path: '/setting',
-    redirect: '/setting/dataDictionary',
-    component: PageView,
-    meta: {
-      title: '系统设置',
-      icon: 'setting',
-      permission: 'M_systemSet'
-    },
-    children: [{
-      path: '/setting/dataDictionary',
-      redirect: '/setting/dataDictionary/list',
-      name: 'dataDictionary',
-      component: BlankLayout,
-      meta: {
-        title: '数据字典管理',
-        icon: 'database',
-        permission: 'M_dataD_lookup'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'powerDD',
-        component: () => import(/* webpackChunkName: "setting" */
-          '@/views/power/dataDictionary/dataDictionary.vue'),
-        meta: {
-          title: '数据字典管理',
-          icon: 'database',
-          hidden: true,
-          permission: 'M_dataD_lookup'
-        }
-      }]
-    },
-    {
-      path: '/setting/OperateJournal',
-      redirect: '/setting/OperateJournal/list',
-      name: 'OperateJournal',
-      component: BlankLayout,
-      meta: {
-        title: '操作日志',
-        icon: 'read',
-        permission: 'M_OperateJournalList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'powerOperateJournal',
-        component: () => import(/* webpackChunkName: "setting" */
-          '@/views/power/OperateJournal/OperateJournal.vue'),
-        meta: {
-          title: '操作日志',
-          icon: 'read',
-          permission: 'M_OperateJournalList'
-        }
-      }]
-    },
-    {
-      path: '/setting/noticeManagement',
-      redirect: '/setting/noticeManagement/list',
-      name: 'noticeManagement',
-      component: BlankLayout,
-      meta: {
-        title: '公告管理',
-        icon: 'sketch',
-        permission: 'M_noticeManagementList'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'list',
-        name: 'noticeManagementList',
-        component: () => import(/* webpackChunkName: "setting" */
-          '@/views/setting/noticeManagement/list.vue'),
-        meta: {
-          title: '公告列表',
-          icon: 'sketch',
-          hidden: true,
-          permission: 'M_noticeManagementList'
-        }
-      }]
-    },
-    {
-      path: '/setting/bigScreenSet',
-      redirect: '/setting/bigScreenSet/index',
-      name: 'bigScreenSet',
-      component: BlankLayout,
-      meta: {
-        title: '大屏参数设置',
-        icon: 'sketch',
-        permission: 'M_bigScreenSetIndex'
-      },
-      hideChildrenInMenu: true,
-      children: [{
-        path: 'index',
-        name: 'bigScreenSetIndex',
-        component: () => import(/* webpackChunkName: "setting" */
-          '@/views/setting/bigScreenSet/index.vue'),
-        meta: {
-          title: '大屏参数设置',
-          icon: 'sketch',
-          hidden: true,
-          permission: 'M_bigScreenSetIndex'
-        }
-      }]
-    }
-    ]
+    path: '*',
+    redirect: '/404',
+    hidden: true
   }
-  ]
-},
-{
-  path: '*',
-  redirect: '/404',
-  hidden: true
-}
 ]
 
 /**

+ 1 - 1
src/libs/getDate.js

@@ -1,6 +1,6 @@
 // 引入 moment 时间插件
 import moment from 'moment'
-moment.updateLocale('en', { week: {
+moment.updateLocale('zh-cn', { week: {
   dow: 1, // 星期的第一天是星期一
   doy: 7 // 年份的第一周必须包含1月1日 (7 + 1 - 1)
 } })

+ 1 - 3
src/libs/tools.js

@@ -258,9 +258,7 @@ export const toThousands = (num, decimal) => {
   if (num == undefined) {
     return '--'
   }
-  if (decimal) {
-    num = formatDecimal(num, decimal)
-  }
+  num = formatDecimal(num, decimal || decimal==0 ? decimal : 2)
   return num.toString().replace(/\d+/, function (n) { // 先提取整数部分
     return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) {
       return $1 + ','

+ 12 - 0
src/utils/mixin.js

@@ -1,5 +1,6 @@
 // import Vue from 'vue'
 import { deviceEnquire, DEVICE_TYPE } from '@/utils/device'
+import { toThousands } from '@/libs/tools'
 import { mapState } from 'vuex'
 
 // const mixinsComputed = Vue.config.optionMergeStrategies.computed
@@ -77,6 +78,11 @@ const AppDeviceEnquire = {
 
 // 所有页
 const commonMixin = {
+  data(){
+    return {
+      toThousands
+    }
+  },
   watch: {
     '$store.state.app.loadingStatus': function (a, b) {
       if (!a) {
@@ -89,6 +95,12 @@ const commonMixin = {
         if (this.exportLoading !== undefined){
           this.exportLoading = a
         }
+        if(this.isInster !== undefined){
+          this.isInster = a
+        }
+        if(this.addMoreLoading != undefined){
+          this.addMoreLoading = a
+        }
       }
     }
   },

+ 41 - 4
src/views/allocationManagement/transferOut/basicInfoModal.vue

@@ -70,10 +70,26 @@
             </a-form-model-item>
           </a-col>
           <a-col :md="24" :sm="24">
-            <a-form-model-item label="备注" prop="remark" :wrapperCol="{ span: 20 }" :labelCol="{ span: 4 }">
+            <a-form-model-item style="margin-bottom:10px;" label="备注" prop="remark" :wrapperCol="{ span: 20 }" :labelCol="{ span: 4 }">
               <a-textarea id="allocateBill-basicInfo-remark" :maxLength="120" v-model="form.remark" placeholder="请输入备注(最多120个字符)" allowClear />
             </a-form-model-item>
           </a-col>
+          <a-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
+            <a-form-model-item label="附件" help="(支持图片、word、excel、PDF等格式,最多10个附件)" :label-col="{span:4}" :wrapper-col="{span:18}">
+              <Upload
+                style="height: 100%;"
+                id="allocateBill-attachList"
+                v-model="form.attachmentList"
+                ref="attachList"
+                :fileSize="10"
+                :maxNums="10"
+                fileType="*"
+                uploadType="attach"
+                :action="attachAction"
+                @change="changeAttach"
+                upText="上传附件"></Upload>
+            </a-form-model-item>
+          </a-col>
         </a-row>
       </a-form-model>
       <div class="btn-cont">
@@ -87,7 +103,7 @@
 <script>
 import { commonMixin } from '@/utils/mixin'
 import debounce from 'lodash/debounce'
-import { VSelect } from '@/components'
+import { VSelect, Upload } from '@/components'
 import { allocateBillSave } from '@/api/allocateBill'
 import { dealerSubareaScopeList } from '@/api/dealer'
 import { getLookUpData } from '@/api/data'
@@ -97,7 +113,7 @@ import AllocateType from '@/views/common/allocateType.js'
 export default {
   name: 'TransferOutBasicInfoModal',
   mixins: [commonMixin],
-  components: { VSelect, ProductBrand, productTypeAll, AllocateType },
+  components: { VSelect, Upload, ProductBrand, productTypeAll, AllocateType },
   props: {
     openModal: {
       //  弹框显示状态
@@ -116,6 +132,8 @@ export default {
         wrapperCol: { span: 16 }
       },
       productType: [],
+      attachList: [],
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/uploadGetFileInfo',
       form: {
         targetType: 'DEALER',
         targetSn: undefined,
@@ -130,7 +148,8 @@ export default {
         time: [],
         promoStartDate: '',
         promoEndDate: '',
-        remark: ''
+        remark: '',
+        attachmentList: ''
       },
       rules: {
         targetType: [{ required: true, message: '请选择调往对象', trigger: 'change' }],
@@ -160,6 +179,13 @@ export default {
       this.form.promoStartDate = date.length ? dateStrings[0] : ''
       this.form.promoEndDate = date.length ? dateStrings[1] : ''
     },
+    //  附件上传
+    changeAttach (file) {
+      this.attachList = JSON.parse(file)
+      this.attachList.map(item => {
+        item.fileType = item.extName
+      })
+    },
     // 调拨类别 change
     allocateTypeChange (val, opt) {
       console.log(val, opt, '------------')
@@ -216,6 +242,7 @@ export default {
           if (!form.productBrandName) {
             form.productBrandSn = ''
           }
+          form.attachmentList = this.attachList
           _this.spinning = true
           allocateBillSave(form).then(res => {
             if (res.status == 200) {
@@ -267,6 +294,9 @@ export default {
         this.$refs.ruleForm.resetFields()
         this.allocateTypeVal = []
         this.productType = []
+        this.attachList = []
+        this.form.attachmentList = ''
+        this.$refs.attachList.setFileList('')
         this.form = {
           targetType: 'DEALER',
           targetSn: undefined,
@@ -289,6 +319,13 @@ export default {
         if (this.detailData) {
           this.isEdit = true
           this.form = Object.assign(this.form, this.detailData)
+          // 获取附件列表
+          this.form.attachmentList = ''
+          this.attachList = this.detailData.attachmentList
+          this.$nextTick(() => {
+            this.$refs.attachList.setFileList(this.attachList)
+          })
+
           this.allocateTypeVal = [this.detailData.costTypeSn, this.detailData.allocateSortSn, this.detailData.allocateTypeSn]
           if (this.detailData.productTypeSn1) {
             this.productType = [this.detailData.productTypeSn1, this.detailData.productTypeSn2, this.detailData.productTypeSn3]

+ 13 - 0
src/views/allocationManagement/transferOut/detail.vue

@@ -85,6 +85,19 @@
                 <span v-else>--</span>
               </a-descriptions-item>
               <a-descriptions-item label="备注">{{ (basicInfoData&&basicInfoData.remark) || '--' }}</a-descriptions-item>
+              <a-descriptions-item label="附件" :span="4">
+                <div v-if="basicInfoData&&basicInfoData.attachmentList&&basicInfoData.attachmentList.length">
+                  <a
+                    target="_blank"
+                    style="color: #00aaff;text-decoration: underline;margin-right: 15px;"
+                    :href="item.filePath"
+                    v-for="item in basicInfoData.attachmentList"
+                    :key="item.id">
+                    {{ item.fileName }}
+                  </a>
+                </div>
+                <span v-else>--</span>
+              </a-descriptions-item>
             </a-descriptions>
           </a-collapse-panel>
         </a-collapse>

+ 34 - 3
src/views/allocationManagement/transferOut/edit.vue

@@ -83,6 +83,19 @@
               <a-descriptions-item label="备注">
                 {{ (basicInfoData&&basicInfoData.remark||'--') }}
               </a-descriptions-item>
+              <a-descriptions-item label="附件" :span="4">
+                <div v-if="basicInfoData&&basicInfoData.attachmentList&&basicInfoData.attachmentList.length">
+                  <a
+                    target="_blank"
+                    style="color: #00aaff;text-decoration: underline;margin-right: 15px;"
+                    :href="item.filePath"
+                    v-for="item in basicInfoData.attachmentList"
+                    :key="item.id">
+                    {{ item.fileName }}
+                  </a>
+                </div>
+                <span v-else>--</span>
+              </a-descriptions-item>
             </a-descriptions>
           </a-collapse-panel>
         </a-collapse>
@@ -130,6 +143,17 @@
               :data="loadData"
               :scroll="{ y: 300 }"
               bordered>
+              <!-- 调出数量 -->
+              <template slot="qty" slot-scope="text, record">
+                <a-input-number
+                  size="small"
+                  v-model="record.qty"
+                  :precision="0"
+                  :min="1"
+                  :max="record.currentStockQty"
+                  placeholder="请输入"
+                  style="width: 100%;" />
+              </template>
               <!-- 操作 -->
               <template slot="action1" slot-scope="text, record">
                 <a-button
@@ -367,6 +391,7 @@ 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
+            data.list[i].qty = 1
           }
           this.loadDataSource = data.list || []
           this.disabled = false
@@ -411,12 +436,13 @@ export default {
       const arr = [
         { title: '序号', dataIndex: 'no', width: '4%', align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', align: 'center', width: '29%', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '产品名称', dataIndex: 'productName', align: 'center', width: '26%', customRender: function (text) { return text || '--' }, ellipsis: true },
         { title: '原厂编码', dataIndex: 'productOrigCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
         // { title: '成本价', dataIndex: 'lastStockCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         // { title: '售价', dataIndex: 'productPrice', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '库存数量', dataIndex: 'currentStockQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '单位', dataIndex: 'productUnit', width: '7%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '调出数量', scopedSlots: { customRender: 'qty' }, width: '8%', align: 'center' },
+        { title: '单位', dataIndex: 'productUnit', width: '6%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '操作', scopedSlots: { customRender: 'action1' }, width: '10%', align: 'center' }
       ]
       if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
@@ -551,7 +577,7 @@ export default {
         allocateSn: this.$route.params.sn,
         cost: isEdit ? row.cost : row.lastStockCost,
         price: isEdit ? row.price : row.productPrice,
-        qty: isEdit ? row.qty : 1, //  添加时调出数量默认为1
+        qty: row.qty, //  添加时调出数量默认为1
         productSn: row.productSn,
         departmentSn: row.departmentSn,
         departmentName: row.departmentName
@@ -566,6 +592,11 @@ export default {
           row.price = row.priceBackups
           return
         }
+      } else {
+        if (!row.qty) {
+          this.$message.info('请输入调出数量')
+          return
+        }
       }
       this.spinning = true
       allocateBillDetailSave(params).then(res => {

+ 3 - 2
src/views/common/chooseProductsModal.vue

@@ -71,7 +71,7 @@
             size="small"
             :rowKey="(record) => record.productSn"
             rowKeyName="productSn"
-            :row-selection="{ columnWidth: 40, getCheckboxProps:record =>({props: { disabled: (this.type == 'supplier') && (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.indexOf(record.productSn) > -1) }}) }"
+            :row-selection="{ columnWidth: 40, getCheckboxProps:record =>({props: { disabled: (this.type == 'supplier') && (this.chooseData && this.chooseData.indexOf(record.productSn) > -1) }}) }"
             @rowSelection="rowSelectionFun"
             :columns="columns"
             :data="loadData"
@@ -254,7 +254,8 @@ export default {
     //  重置
     resetSearchForm () {
       this.resetData()
-      this.$refs.table.clearTable()
+      // this.$refs.table.clearTable()
+      this.$refs.table.refresh(true)
     },
     // 保存
     handleSave () {

+ 20 - 15
src/views/common/supplier.js

@@ -7,6 +7,7 @@ const Employee = {
         allowClear
         :value="defaultVal"
         :showSearch="true"
+        :disabled="disabledFlag"
         @change="handleChange"
         option-filter-prop="children"
         :filter-option="filterOption">
@@ -31,21 +32,25 @@ const Employee = {
     enableFlag: {
       type: String,
       default: ''
+    },
+    disabledFlag: {
+      type: Boolean,
+      default: false
     }
   },
-  data() {
+  data () {
     return {
       defaultVal: this.value,
       list: []
-    };
+    }
   },
-  mounted() {
+  mounted () {
     this.getList()
   },
   watch: {
-    value(newValue, oldValue) {
+    value (newValue, oldValue) {
       this.defaultVal = newValue
-    },
+    }
   },
   methods: {
     filterOption (input, option) {
@@ -53,26 +58,26 @@ const Employee = {
         option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
       )
     },
-    handleChange(value) {
-      this.defaultVal = value;
+    handleChange (value) {
+      this.defaultVal = value
       const item = this.list.find(item => item.supplierSn == value)
-      this.$emit('change', value, item);
-      this.$emit('input', value);
+      this.$emit('input', value)
+      this.$emit('change', value, item)
     },
     getList () {
       supplierAllList().then(res => {
         if (res.status == 200) {
-          if(this.enableFlag!=''){
+          if (this.enableFlag != '') {
             this.list = res.data.filter(item => item.enableFlag == this.enableFlag)
-          }else{
+          } else {
             this.list = res.data
           }
         } else {
           this.list = []
         }
       })
-    },
-  },
-};
+    }
+  }
+}
 
-export default Employee
+export default Employee

+ 6 - 28
src/views/expenseManagement/expenseReimbursement/add.vue

@@ -95,13 +95,12 @@
           </template>
           <!-- 产品信息 -->
           <template slot="cpxx" slot-scope="text,record">
-            <div style="display:flex;align-items: center;" v-if="record.detailProductsList">
-              <a-icon style="color:red;font-size:16px;" v-if="record.ptaFlag" type="exclamation-circle" />
-              <div style="padding-left: 6px;">
+            <div v-if="record.detailProductsList">
+              <div>
                 <div v-for="item in record.detailProductsList" :key="item.id">
-                  <div v-if="item.productCode">{{ item.productCode }}: <span :style="{color:record.ptaFlag?'red':''}">¥{{ item.expense }}</span></div>
-                  <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}: <span :style="{color:record.ptaFlag?'red':''}">¥{{ item.expense }}</span></div>
-                  <div v-else>{{ item.productTypeShowName }}: <span :style="{color:record.ptaFlag?'red':''}">¥{{ item.expense }}</span></div>
+                  <div v-if="item.productCode">{{ item.productCode }}</div>
+                  <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}</div>
+                  <div v-else>{{ item.productTypeShowName }}</div>
                 </div>
               </div>
             </div>
@@ -170,7 +169,6 @@ export default {
       expenseAccountDetailSn: '',
       openProductInfoModal: false, // 产品信息弹框
       total: 0,
-      hasPtaFlag: [],
       loadData: parameter => {
         const params = Object.assign(parameter, { expenseAccountSn: this.$route.params.sn })
         return expenseAcctDetailFindList(params).then(res => {
@@ -178,7 +176,6 @@ export default {
           if (res.status == 200) {
             data = res.data
             const no = 0
-            this.hasPtaFlag = []
             for (var i = 0; i < data.length; i++) {
               data[i].no = no + i + 1
               // 产品信息合计
@@ -187,10 +184,6 @@ export default {
                 data[i].detailProductsList.map(item => {
                   data[i].productTotalAmount += item.expense
                 })
-                data[i].ptaFlag = data[i].productTotalAmount !== Math.abs(data[i].expense)
-                if (data[i].ptaFlag) {
-                  this.hasPtaFlag.push('第 ' + (i + 1) + ' 行')
-                }
               }
             }
             this.total = data.length
@@ -305,22 +298,7 @@ export default {
     },
     beforeSubmit () {
       if (this.total) {
-        // 判断是否存在产品信息合计不等于记账费用
-        if (this.hasPtaFlag.length) {
-          const h = this.$createElement
-          this.$warning({
-            title: '操作提示',
-            content: h('div', {}, [
-              h('p', '提交失败,以下费用明细的产品信息金额之和,不等于记账费用,请修改后再提交!'),
-              h('p', '需要修改的行数:'),
-              h('p', { style: { color: '#00aaff' } }, this.hasPtaFlag.join(','))
-            ]),
-            centered: true,
-            onOk () {}
-          })
-        } else {
-          this.openDepartUserModal = true
-        }
+        this.openDepartUserModal = true
       } else {
         this.$message.info('请新增费用明细')
       }

+ 6 - 6
src/views/expenseManagement/expenseReimbursement/chooseImportModal.vue

@@ -31,9 +31,9 @@
         <!-- 产品信息 -->
         <template slot="cpxx" slot-scope="text,record">
           <div v-for="item in record.detailProductsList" :key="item.id">
-            <div v-if="item.productCode">{{ item.productCode }}: ¥{{ item.expense }}</div>
-            <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}: ¥{{ item.expense }}</div>
-            <div v-else>{{ item.productTypeShowName }}: ¥{{ item.expense }}</div>
+            <div v-if="item.productCode">{{ item.productCode }}</div>
+            <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}</div>
+            <div v-else>{{ item.productTypeShowName }}</div>
           </div>
           <span v-if="!record.detailProductsList||record.detailProductsList.length==0">--</span>
         </template>
@@ -61,9 +61,9 @@
         <!-- 产品信息 -->
         <template slot="cpxx" slot-scope="text,record">
           <div v-for="(item,index) in record.detailProductsList" :key="item.no+'-'+index">
-            <div v-if="item.productCode">{{ item.productCode }}: ¥{{ item.expense }}</div>
-            <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}: ¥{{ item.expense }}</div>
-            <div v-else>{{ item.productTypeShowName }}: ¥{{ item.expense }}</div>
+            <div v-if="item.productCode">{{ item.productCode }}</div>
+            <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}</div>
+            <div v-else>{{ item.productTypeShowName }}</div>
           </div>
           <span v-if="!record.detailProductsList||record.detailProductsList.length==0">--</span>
         </template>

+ 3 - 3
src/views/expenseManagement/expenseReimbursement/detail.vue

@@ -88,9 +88,9 @@
           <!-- 产品信息 -->
           <template slot="cpxx" slot-scope="text,record">
             <div v-for="item in record.detailProductsList" :key="item.id">
-              <div v-if="item.productCode">{{ item.productCode }}: ¥{{ item.expense }}</div>
-              <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}: ¥{{ item.expense }}</div>
-              <div v-else>{{ item.productTypeShowName }}: ¥{{ item.expense }}</div>
+              <div v-if="item.productCode">{{ item.productCode }}</div>
+              <div v-else-if="item.productBrandName">{{ item.productBrandName }}<span v-if="item.productTypeShowName">/</span>{{ item.productTypeShowName }}</div>
+              <div v-else>{{ item.productTypeShowName }}</div>
             </div>
             <span v-if="!record.detailProductsList||record.detailProductsList.length==0">--</span>
           </template>

+ 7 - 6
src/views/expenseManagement/expenseReimbursement/productInfoModal.vue

@@ -26,7 +26,7 @@
           <a-table
             class="sTable fixPagination"
             ref="table"
-            :scroll="{ y: 500 }"
+            :scroll="{ y: 200 }"
             size="small"
             :rowKey="(record) => record.id"
             :columns="columns"
@@ -75,6 +75,7 @@
               <a-button
                 type="link"
                 class="button-info"
+                v-if="dataList.length==0"
                 block
                 @click="handleAddRow()"
               >+ 新增产品信息</a-button>
@@ -127,7 +128,7 @@ export default {
         { title: '产品品牌', scopedSlots: { customRender: 'productBrand' }, align: 'center', width: '20%' },
         { title: '产品分类', scopedSlots: { customRender: 'productType' }, align: 'center', width: '30%' },
         { title: '产品编码', scopedSlots: { customRender: 'productCode' }, align: 'center', width: '20%' },
-        { slots: { title: 'customTitle' }, scopedSlots: { customRender: 'expense' }, align: 'center', width: '20%' },
+        // { slots: { title: 'customTitle' }, scopedSlots: { customRender: 'expense' }, align: 'center', width: '20%' }
         { title: '操作', scopedSlots: { customRender: 'action' }, width: '10%', align: 'center' }
       ]
     }
@@ -237,10 +238,10 @@ export default {
         delete item.productType
         delete item.no
       })
-      if (hasError == 1) {
-        this.$message.info('请输入费用金额')
-        return
-      }
+      // if (hasError == 1) {
+      //   this.$message.info('请输入费用金额')
+      //   return
+      // }
       if (hasError == 2) {
         this.$message.info('产品品牌、产品分类、产品编码,三个至少填一个')
         return

+ 6 - 1
src/views/inventoryManagement/inventoryQuery/warehouseDetail.vue

@@ -122,6 +122,11 @@
               {{ record.qty }}
             </p>
           </template>
+          <!-- 总售价 -->
+          <template slot="totalAmount" slot-scope="text, record">
+            <span v-if="record.bizType!='SPARE_PARTS_RETURN'"> {{ record.totalPrice }}</span>
+            <span v-else>--</span>
+          </template>
         </s-table>
       </a-card>
     </a-spin>
@@ -210,7 +215,7 @@ export default {
         arr.splice(13, 0, { title: '总成本', dataIndex: 'totalCost', width: '4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
       }
       if (this.$hasPermissions('B_isShowPrice')) { // 售价权限
-        arr.splice(arr.length, 0, { title: '总售价', dataIndex: 'totalPrice', width: '4%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+        arr.splice(arr.length, 0, { title: '总售价', width: '4%', align: 'center', scopedSlots: { customRender: 'totalAmount' } })
       }
       return arr
     }

+ 99 - 0
src/views/purchasingManagement/bulkWarehousingOrder/auditNoPassModal.vue

@@ -0,0 +1,99 @@
+<template>
+  <a-modal
+    centered
+    class="bulkWarehousingOrder-auditNo-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="提示"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="960">
+    <a-card size="small" :bordered="false" class="bulkWarehousingOrderDetail-cont">
+      <!-- 总计 -->
+      <a-alert style="margin-bottom:10px" type="error" message="对不起,审核失败! OCS和金蝶上产品成本不一致。请确保成本价格一致后再进行审核。" />
+      <!-- 列表 -->
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :dataSource="list"
+        :scroll="{ y: 400 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+    </a-card>
+    <div class="btn-cont">
+      <a-button id="bulkWarehousingOrder-auditNo-modal-back" @click="isShow = false" style="margin-left: 15px;">返回列表</a-button>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+export default {
+  name: 'AuditNoPassModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      list: []
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '产品编码', dataIndex: 'productCode', width: '25%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', width: '40%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
+        arr.splice(5, 0, { title: 'OCS成本价', dataIndex: 'verifyCost', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+        arr.splice(5, 0, { title: '金蝶成本价', dataIndex: 'productCost', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    //  返回列表
+    handleBack () {
+      this.isShow = false
+    },
+    setData (data) {
+      this.list = data
+      this.list.map((item, i) => {
+        item.no = i + 1
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .bulkWarehousingOrder-auditNo-modal{
+    .ant-modal-body {
+      padding: 10px 10px 20px;
+    }
+    .btn-cont {
+      text-align: center;
+      margin: 5px 0 10px;
+    }
+  }
+</style>

+ 3 - 32
src/views/purchasingManagement/bulkWarehousingOrder/basicInfoModal.vue

@@ -17,15 +17,7 @@
         :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">
-            <a-select-option v-for="item in supplierList" :key="item.supplierSn" :value="item.supplierSn" :disabled="item.enableFlag==0">{{ item.supplierName }}</a-select-option>
-          </a-select>
+          <supplier v-model="form.supplierSn" placeholder="请输入供应商名称"></supplier>
         </a-form-model-item>
         <a-form-model-item label="入库类型" prop="sparePartsType">
           <v-select
@@ -64,12 +56,12 @@
 <script>
 import { commonMixin } from '@/utils/mixin'
 import { VSelect } from '@/components'
-import { supplierAllList } from '@/api/supplier'
 import { sparePartsSave } from '@/api/spareParts'
+import supplier from '@/views/common/supplier.js'
 export default {
   name: 'BulkWarehousingOrderBasicInfoModal',
   mixins: [commonMixin],
-  components: { VSelect },
+  components: { VSelect, supplier },
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,
@@ -126,25 +118,6 @@ export default {
           return false
         }
       })
-    },
-    filterOption (input, option) {
-      return (
-        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
-      )
-    },
-    // 供应商下拉数据
-    getSupplierList (val) {
-      supplierAllList().then(res => {
-        if (res.status == 200) {
-          this.supplierList = res.data
-          if (val) { //  需将新增加的供应商回填,即不需要用户再选一下
-            this.form.supplierSn = this.supplierList[0].supplierSn
-            this.$refs.ruleForm.clearValidate('supplierSn')
-          }
-        } else {
-          this.supplierList = []
-        }
-      })
     }
   },
   watch: {
@@ -157,8 +130,6 @@ export default {
       if (!newValue) {
         this.$emit('close')
         this.$refs.ruleForm.resetFields()
-      } else {
-        this.getSupplierList()
       }
     }
   }

+ 193 - 0
src/views/purchasingManagement/bulkWarehousingOrder/batchAuditNoModal.vue

@@ -0,0 +1,193 @@
+<template>
+  <a-modal
+    centered
+    class="batchAuditModal-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="批量审核"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="900">
+    <div class="batchAuditModal-con">
+      <!-- 可导入数据 -->
+      <p class="">可审核通过数据{{ loadData.length }}条</p>
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.allocateSn"
+        :columns="nowColumns"
+        :dataSource="loadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <a-divider />
+      <!-- 不可导入数据 -->
+      <p class="red">审核不通过数据{{ unLoadData.length }}条(成本价不一致)</p>
+      <a-table
+        class="unTable"
+        ref="unTable"
+        size="small"
+        :rowKey="(record) => record.errorDesc"
+        :columns="nowUnColumns"
+        :dataSource="unLoadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="batchAuditModal-submit"
+          size="large"
+          :loading="spinning"
+          :class="loadData.length==0?'button-grey':'button-primary'"
+          @click="handleSubmit"
+          style="padding: 0 40px;">确认审核</a-button>
+        <a-button
+          id="batchAuditModal-cancel"
+          size="large"
+          :loading="spinning"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 40px;margin-left: 15px;">取消</a-button>
+        <a-button
+          type="primary"
+          id="batchAuditModal-error"
+          size="large"
+          :loading="spinning"
+          class="button-error"
+          @click="handleError"
+          style="padding: 0 40px;margin-left: 15px;">导出错误项</a-button>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { hdExportExcel } from '@/libs/exportExcel'
+import { sparePartsAuditVerify, sparePartsBatchAudit, sparePartsAuditFail } from '@/api/spareParts'
+export default {
+  name: 'batchAudtiModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      spinning: false,
+      nowColumns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库类型', dataIndex: 'sparePartsTypeDictValue', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '关联单号', dataIndex: 'relationNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '金蝶单号', dataIndex: 'kingdeeNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      loadData: [],
+      nowUnColumns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库类型', dataIndex: 'sparePartsTypeDictValue', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '关联单号', dataIndex: 'relationNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '金蝶单号', dataIndex: 'kingdeeNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      unLoadData: [],
+      loading: false,
+      snList: []
+    }
+  },
+  methods: {
+    getData (data) {
+      if (data.okList && data.okList.length > 0) {
+        data.okList.map((item, index) => {
+          item.no = index + 1
+          this.snList.push(item.sparePartsSn)
+        })
+      }
+      if (data.errList && data.errList.length > 0) {
+        data.errList.map((item, index) => {
+          item.no = index + 1
+        })
+      }
+      this.loadData = data.okList || []
+      this.unLoadData = data.errList || []
+    },
+    // 确认导入
+    handleSubmit () {
+      const _this = this
+      if (this.loadData.length == 0) {
+        this.$message.warning('没有可审核的数据!')
+      } else {
+        this.$confirm({
+          title: '提示',
+          content: '确认要审核通过吗?',
+          centered: true,
+          onOk () {
+            _this.spinning = true
+            sparePartsBatchAudit(_this.snList).then(res => {
+              if(res.status == 200){
+                _this.$emit('ok',res.message)
+                _this.isShow = false
+              }
+              _this.spinning = false
+            })
+          }
+        })
+      }
+    },
+    // 导出
+    handleError () {
+      const _this = this
+      if (_this.unLoadData.length < 1) {
+        _this.$message.info('暂无可导出错误项~')
+        return
+      }
+      _this.spinning = true
+      hdExportExcel(sparePartsAuditFail, _this.unLoadData, '散件入库审核错误项', function () {
+        _this.spinning = false
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.loadData = []
+        this.unLoadData = []
+        this.snList = []
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .batchAuditModal-modal{
+    .batchAuditModal-con{
+      .red{
+        color: #f30;
+      }
+      .btn-con{
+        text-align: center;
+        margin: 30px 0 20px;
+        .button-cancel,.button-error{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 7 - 5
src/views/purchasingManagement/bulkWarehousingOrder/chooseImportModal.vue

@@ -87,19 +87,21 @@ export default {
       isShow: this.openModal, //  是否打开弹框
       nowColumns: [
         { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
-        { title: '产品编码', dataIndex: 'productCode', width: '30%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '产品名称', dataIndex: 'productName', width: '30%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '数量', dataIndex: 'qtyText', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '单位', dataIndex: 'unit', width: '15%', align: 'center', customRender: function (text) { return text || '--' } }
+        { title: '单位', dataIndex: 'unit', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '成本价', dataIndex: 'costText', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
       ],
       loadData: [],
       nowUnColumns: [
         { title: '序号', dataIndex: 'no', width: '9%', align: 'center' },
-        { title: '产品编码', dataIndex: 'productCode', width: '23%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', width: '26%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'productName', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '数量', dataIndex: 'qtyText', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '单位', dataIndex: 'unit', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '备注', dataIndex: 'errorDesc', width: '22%', align: 'center', customRender: function (text) { return text || '--' } }
+        { title: '成本价', dataIndex: 'costText', width: '11%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '备注', dataIndex: 'errorDesc', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }
       ],
       unLoadData: [],
       loading: false

+ 7 - 2
src/views/purchasingManagement/bulkWarehousingOrder/detailModal.vue

@@ -44,6 +44,11 @@
         :columns="columns"
         :data="loadData"
         bordered>
+        <!-- 产品名称 -->
+        <template slot="productName" slot-scope="text, record">
+          {{ record.productName }}
+          <a-tag color="red" v-if="record.giftFlag==1">赠品</a-tag>
+        </template>
       </s-table>
     </a-card>
     <div class="btn-cont">
@@ -97,11 +102,11 @@ export default {
       const arr = [
         { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', width: '40%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '产品名称', scopedSlots: { customRender: 'productName' }, width: '40%', align: 'center', ellipsis: true },
         { title: '单位', dataIndex: 'unit', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '入库数量', dataIndex: 'productQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         // { title: '入库单价', dataIndex: 'productCost',width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '小计', dataIndex: 'subtotal', width: '12%', align: 'center', customRender: function (text) { return text || '--' } }
+        { title: '小计', dataIndex: 'subtotal', width: '12%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
       ]
       if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
         arr.splice(5, 0, { title: '入库单价', dataIndex: 'productCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })

+ 10 - 3
src/views/purchasingManagement/bulkWarehousingOrder/edit.vue

@@ -25,7 +25,7 @@
       </a-card>
       <a-card size="small" :bordered="false" class="bulkWarehousingOrderEdit-cont">
         <!-- 操作按钮 -->
-        <div class="table-operator" style="display: flex;">
+        <div class="table-operator" style="display: flex;align-items:center;">
           <div>
             <a-button id="bulkWarehousingOrderEdit-add" type="primary" class="button-primary" @click="handleEdit()">新增产品</a-button>
             <a-button id="bulkWarehousingOrderEdit-import" type="default" class="button-primary" @click="openGuideModal=true">导入产品</a-button>
@@ -84,6 +84,11 @@
               class="button-error"
               id="bulkWarehousingOrderList-del-btn">删除</a-button>
           </template>
+
+          <template slot="productName" slot-scope="text, record">
+            {{ record.productName }}
+            <a-tag color="red" v-if="record.giftFlag==1">赠品</a-tag>
+          </template>
         </s-table>
       </a-card>
     </a-spin>
@@ -151,11 +156,11 @@ export default {
       const arr = [
         { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'productName', width: '25%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '产品名称', scopedSlots: { customRender: 'productName' }, width: '25%', align: 'center' },
         { title: '单位', dataIndex: 'unit', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '入库数量', dataIndex: 'productQty', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         // { title: '入库单价', dataIndex: 'productCost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
-        { title: '小计', dataIndex: 'subtotal', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '小计', dataIndex: 'subtotal', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '操作', scopedSlots: { customRender: 'action' }, width: '10%', align: 'center' }
       ]
       if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
@@ -204,10 +209,12 @@ export default {
     },
     // 导入产品
     hanldeOk (obj) {
+      this.spinning = true
       sparePartsDetailBatchInsert(obj).then(res => {
         if (res.status == 200) {
           this.$refs.table.refresh(true)
         }
+        this.spinning = false
       })
     },
     //  返回列表

+ 3 - 3
src/views/purchasingManagement/bulkWarehousingOrder/importGuideModal.vue

@@ -15,9 +15,9 @@
             <span>1</span>准备导入
           </div>
           <ul>
-            <li>1) 导入的Excel文件中必须包含名为“产品编码”、“数量”的列,且名称必须相同</li>
-            <li>2) 除了“产品编码”、“数量”列,其他列可自定义,不影响数据导入</li>
-            <li>3) 如果导入的产品已经存在,则不会导入该行</li>
+            <li>1) 导入的Excel文件中必须包含名为“产品编码”、“数量”、“成本价”的列,且名称必须相同</li>
+            <li>2) 除了“产品编码”、“数量”、“成本价”三列,其他列可自定义,不影响数据导入</li>
+            <li>3) “成本价”为0或输入的价格与系统相同时,允许导入,成本价为0按赠品处理</li>
           </ul>
           <a-button type="link" icon="download" style="padding: 0 0 0 23px;" :loading="exportLoading" @click="handleExport">下载导入模板</a-button>
         </div>

+ 39 - 21
src/views/purchasingManagement/bulkWarehousingOrder/list.vue

@@ -138,6 +138,9 @@
     <sparePartsDetailModal v-drag :openModal="openDetailModal" :itemSn="itemSn" @close="closeDetailModal" />
     <!-- 导出提示框 -->
     <reportModal :visible="showExport" @close="showExport=false"></reportModal>
+    <!-- 审核不通过弹框 -->
+    <auditNoPassModal v-drag ref="auditNoPassModal" :openModal="openAuditNoModal" @close="openAuditNoModal=false" />
+    <batchAuditNoModal v-drag ref="batchAuditNoModal" :openModal="openBatchAuditNoModal" @close="openBatchAuditNoModal=false" @ok="hanldeAuditOk" />
   </a-card>
 </template>
 
@@ -147,12 +150,14 @@ import { STable, VSelect } from '@/components'
 import basicInfoModal from './basicInfoModal.vue'
 import sparePartsDetailModal from './detailModal.vue'
 import reportModal from '@/views/common/reportModal.vue'
+import auditNoPassModal from './auditNoPassModal.vue'
+import batchAuditNoModal from './batchAuditNoModal.vue'
 import { hdExportExcel } from '@/libs/exportExcel'
-import { sparePartsList, sparePartsDelete, sparePartsAudit, sparePartsDetailExport } from '@/api/spareParts'
+import { sparePartsList, sparePartsDelete, sparePartsAudit, sparePartsAuditVerify, sparePartsDetailExport } from '@/api/spareParts'
 export default {
   name: 'BulkWarehousingOrderList',
   mixins: [commonMixin],
-  components: { STable, VSelect, basicInfoModal, sparePartsDetailModal, reportModal },
+  components: { STable, VSelect, basicInfoModal, sparePartsDetailModal, reportModal, auditNoPassModal,batchAuditNoModal },
   data () {
     return {
       spinning: false,
@@ -160,6 +165,8 @@ export default {
       openModal: false, // 基本信息弹框是否显示
       showExport: false,
       exportLoading: false,
+      openAuditNoModal: false,
+      openBatchAuditNoModal: false,
       tableHeight: 0,
       // 查询参数
       queryParam: {
@@ -290,43 +297,54 @@ export default {
       this.$refs.table.refresh(true)
     },
     //  单条审核
-    handleAudit (row, isBatch) {
+    handleAudit (row) {
       const _this = this
-      let content = ''
-      let params = []
-      if (isBatch) { //  批量
-        content = '确认要批量审核吗?'
-        params = row
-      } else { //  单条
-        content = '确认要审核通过吗?'
-        params = [row.sparePartsSn]
-      }
       this.$confirm({
         title: '提示',
-        content: content,
+        content: '确认要审核通过吗?',
         centered: true,
         onOk () {
           _this.spinning = true
-          sparePartsAudit(params).then(res => {
+          sparePartsAudit({sn:row.sparePartsSn}).then(res => {
             if (res.status == 200) {
-              _this.$refs.table.clearSelected() // 清空表格选中项
-              _this.$message.success(res.message)
-              _this.$refs.table.refresh()
-              _this.spinning = false
-            } else {
-              _this.spinning = false
+              if(res.data&&res.data.sparePartsDetailList){
+                _this.$nextTick(()=>{
+                  _this.openAuditNoModal = true
+                  _this.$refs.auditNoPassModal.setData(res.data.sparePartsDetailList)
+                })
+              }else{
+                _this.hanldeAuditOk(res.message)
+              }
             }
+            _this.spinning = false
           })
         }
       })
     },
     // 批量审核
     handleBatchAudit () {
+      const _this = this
       if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length < 1)) {
         this.$message.warning('请在列表勾选后再进行批量操作!')
         return
       }
-      this.handleAudit(this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys, 'batch')
+      const snList = this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys || []
+      _this.spinning = true
+      sparePartsAuditVerify(snList).then(res => {
+        if(res.status == 200&&res.data){
+          _this.$nextTick(()=>{
+            _this.openBatchAuditNoModal = true
+            _this.$refs.batchAuditNoModal.getData(res.data)
+          })
+        }
+        _this.spinning = false
+      })
+    },
+    // 审核成功
+    hanldeAuditOk(message){
+      this.$refs.table.clearSelected() // 清空表格选中项
+      this.$message.success(message)
+      this.$refs.table.refresh()
     },
     pageInit () {
       const _this = this

+ 41 - 19
src/views/purchasingManagement/bulkWarehousingOrder/productModal.vue

@@ -18,11 +18,12 @@
         :wrapper-col="formItemLayout.wrapperCol"
         @keyup.enter.native="handleSave">
         <a-form-model-item label="供应商" prop="supplierSn">{{ (nowData&&nowData.supplierName) || '--' }}</a-form-model-item>
-        <a-form-model-item label="产品编码" prop="productSn">
+        <a-form-model-item label="产品编码" :prop="!itemSn?'productSn':''">
           <a-select
             show-search
             id="bulkWarehousingOrder-product-productSn"
             ref="productSn"
+            v-if="!itemSn"
             v-model="form.productSn"
             placeholder="请选择"
             :filter-option="false"
@@ -34,6 +35,7 @@
             <a-spin v-if="fetching" slot="notFoundContent" size="small" />
             <a-select-option v-for="item in productData" :key="item.product.productSn + item.product.code" :value="item.product.productSn">{{ item.product.code }}</a-select-option>
           </a-select>
+          <span v-else>{{ form.productCode }}</span>
         </a-form-model-item>
         <a-form-model-item label="产品名称" prop="productName">{{ form.productName || '--' }}</a-form-model-item>
         <a-form-model-item label="原厂编码" prop="productOrigCode">{{ form.productOrigCode || '--' }}</a-form-model-item>
@@ -49,15 +51,9 @@
             placeholder="请选择仓库仓位"
             style="width: 100%;" />
         </a-form-model-item>
-        <a-form-model-item label="成本价" prop="productCost">
-          <a-input-number
-            id="bulkWarehousingOrder-product-productCost"
-            v-model="form.productCost"
-            :precision="2"
-            :min="0"
-            :max="999999"
-            placeholder="请输入"
-            style="width: 100%;" />
+        <a-form-model-item label="成本价">
+          <span style="margin-right:20px;">{{ form.productCost || form.productCost == 0 ? form.productCost : '--' }}</span>
+          <a-checkbox v-if="productCost||isGift" :disabled="!!itemSn" v-model="isGift">是否为赠品</a-checkbox>
         </a-form-model-item>
         <a-form-model-item label="数量" prop="productQty">
           <a-input-number
@@ -68,7 +64,7 @@
             :min="1"
             :max="999999"
             placeholder="请输入"
-            style="width: 80%;" /><span>个</span>
+            style="width: 50%;margin-right:20px;" /><span>个</span>
         </a-form-model-item>
         <div class="btn-cont">
           <a-button type="primary" id="bulkWarehousingOrder-product-modal-save" @click="handleSave">{{ itemSn?'保存':'保存并新增' }}</a-button>
@@ -127,6 +123,7 @@ export default {
         productCost: '',
         productQty: ''
       },
+      productCost: '',
       rules: {
         productSn: [
           { required: true, message: '请选择产品编码', trigger: 'change' }
@@ -135,7 +132,7 @@ export default {
           { required: true, message: '请选择仓库仓位', trigger: 'change' }
         ],
         productCost: [
-          { required: true, message: '请输入成本价', trigger: 'blur' }
+          { required: true, message: '该产品没有设置成本价', trigger: 'blur' }
         ],
         productQty: [
           { required: true, message: '请输入数量', trigger: 'blur' }
@@ -146,7 +143,8 @@ export default {
       warehouseCascadeData: [], //  仓库仓位  下拉数据
       warehouseSnBackups: '', //  仓库备份数据
       warehouseLocationSnBackups: '', //  仓位备份数据
-      defaultWarehouseCascade: [] //  默认仓库仓位
+      defaultWarehouseCascade: [], //  默认仓库仓位
+      isGift: false
     }
   },
   methods: {
@@ -178,20 +176,27 @@ export default {
       this.form.productName = this.productData[ind].product.name
       this.form.productCode = this.productData[ind].product.code
       this.form.productOrigCode = this.productData[ind].product.origCode
-      this.form.productCost = (this.productData[ind].cost && this.productData[ind].cost != 0) ? this.productData[ind].cost : ''
+      this.form.productCost = this.productData[ind].cost
+      this.productCost = this.form.productCost
+      this.form.productQty = ''
+      this.isGift = false
       this.$refs.productQty.focus()
+      this.$refs.ruleForm.validate()
     },
     // 详情
     getDetail () {
+      this.spinning = true
       sparePartsDetailD({ sn: this.itemSn }).then(res => {
         if (res.status == 200) {
           const data = res.data
           this.form = Object.assign(this.form, data)
-          this.fetchUser(this.form.productCode)
+          // this.fetchUser(this.form.productCode)
           this.form.warehouse = [this.form.warehouseSn, this.form.warehouseLocationSn]
           this.warehouseSnBackups = this.form.warehouseSn || undefined
           this.warehouseLocationSnBackups = this.form.warehouseLocationSn || undefined
+          this.isGift = this.form.giftFlag == 1
         }
+        this.spinning = false
       })
     },
     //  保存
@@ -203,9 +208,14 @@ export default {
           form.sparePartsSn = this.nowData.sparePartsSn
           form.sparePartsNo = this.nowData.sparePartsNo
           form.supplierSn = this.nowData.supplierSn
+          form.giftFlag = this.isGift ? 1 : 0
           if (!_this.itemSn) {
             delete form.id
             delete form.sparePartsDetailSn
+            if (!this.productCost) {
+              _this.$message.warning('该产品没有设置成本价!')
+              return false
+            }
           }
           _this.spinning = true
           sparePartsSaveDetail(form).then(res => {
@@ -214,9 +224,13 @@ export default {
               setTimeout(() => {
                 _this.$emit('ok', res.data)
                 _this.spinning = false
-                _this.resetData()
-                _this.$refs.productQty.blur()
-                _this.$refs.productSn.focus()
+                if (!_this.itemSn) {
+                  _this.resetData()
+                  _this.$refs.productQty.blur()
+                  _this.$refs.productSn.focus()
+                } else {
+                  _this.isShow = false
+                }
               })
             } else {
               _this.spinning = false
@@ -296,7 +310,8 @@ export default {
         productCost: '',
         productQty: ''
       }
-      // this.$refs.productSn.focus()
+      this.productCost = ''
+      this.isGift = false
     }
   },
   watch: {
@@ -322,6 +337,13 @@ export default {
       if (this.isShow && newValue) {
         this.getDetail()
       }
+    },
+    isGift (newValue, oldValue) {
+      if (newValue) {
+        this.form.productCost = 0
+      } else {
+        this.form.productCost = this.productCost
+      }
     }
   }
 }

+ 201 - 0
src/views/purchasingManagement/purchaseReturn/addModal.vue

@@ -0,0 +1,201 @@
+<template>
+  <a-modal
+    centered
+    class="purchaseReturn-basicInfo-modal"
+    :footer="null"
+    :maskClosable="false"
+    :title="itemSn?'编辑':'新增'"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="800">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <a-form-model
+        id="purchaseReturn-basicInfo-form"
+        ref="ruleForm"
+        :model="form"
+        :rules="rules"
+        :label-col="formItemLayout.labelCol"
+        :wrapper-col="formItemLayout.wrapperCol" >
+        <a-form-model-item label="供应商名称" prop="supplierSn">
+          <supplier v-model="form.supplierSn" :disabledFlag="itemSn?true:false" placeholder="请输入供应商名称"></supplier>
+        </a-form-model-item>
+        <a-form-model-item label="退货原因" prop="returnReason">
+          <v-select
+            v-model="form.returnReason"
+            ref="returnReason"
+            id="purchaseReturn-basicInfo-returnReason"
+            code="SPARE_PARTS_RETURN_REASON"
+            placeholder="请选择退货原因"
+            allowClear></v-select>
+        </a-form-model-item>
+        <a-form-model-item label="补充说明" prop="explainInfo">
+          <a-textarea
+            id="purchaseReturn"
+            :maxLength="60"
+            v-model="form.explainInfo"
+            placeholder="具体描述下退货原因"
+            allowClear />
+        </a-form-model-item>
+        <a-form-model-item label="附件" help="(支持图片、word、excel、PDF等格式,最多10个附件)">
+          <Upload
+            style="height: 100%;"
+            id="allocateBill-attachList"
+            v-model="form.attachmentList"
+            ref="attachList"
+            :fileSize="10"
+            :maxNums="10"
+            fileType="*"
+            uploadType="attach"
+            :action="attachAction"
+            @change="changeAttach"
+            upText="上传附件"></Upload>
+        </a-form-model-item>
+      </a-form-model>
+      <div class="btn-cont">
+        <a-button id="purchaseReturn-basicInfo-modal-back" @click="isShow = false">取消</a-button>
+        <a-button style="margin-left: 15px;" type="primary" id="purchaseReturn-modal-save" @click="handleSave">确定</a-button>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { VSelect, Upload } from '@/components'
+import supplier from '@/views/common/supplier.js'
+import { sparePartsReturnSave, sparePartsReturnInfo } from '@/api/sparePartsReturn'
+export default {
+  name: 'PurchaseReturnBasicInfoModal',
+  mixins: [commonMixin],
+  components: { VSelect, Upload, supplier },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    itemSn: {
+      type: [Number, String],
+      default: ''
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      spinning: false,
+      formItemLayout: {
+        labelCol: { span: 5 },
+        wrapperCol: { span: 16 }
+      },
+      form: {
+        supplierSn: undefined, // 供应商
+        returnReason: '', // 退货原因
+        explainInfo: '', // 补充说明
+        attachmentList: ''
+      },
+      attachList: [], // 附件
+      rules: {
+        supplierSn: [
+          { required: true, message: '请选择供应商名称', trigger: 'change' }
+        ],
+        returnReason: [
+          { required: true, message: '请选择退货原因', trigger: 'change' }
+        ]
+      },
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/uploadGetFileInfo'
+    }
+  },
+  methods: {
+    //  附件上传
+    changeAttach (file) {
+      this.attachList = JSON.parse(file)
+      this.attachList.map(item => {
+        item.fileType = item.extName
+      })
+    },
+    //  保存
+    handleSave () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const form = JSON.parse(JSON.stringify(_this.form))
+          form.attachmentList = _this.attachList
+          _this.spinning = true
+          sparePartsReturnSave(form).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              setTimeout(() => {
+                _this.isShow = false
+                _this.$emit('ok', res.data)
+                _this.spinning = false
+              }, 1000)
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    // 获取编辑详情
+    getDetail () {
+      sparePartsReturnInfo({ sn: this.itemSn }).then(res => {
+        if (res.status == 200) {
+          const resultObj = res.data
+          this.attachList = resultObj.attachmentList
+          const obj = {
+            supplierSn: resultObj.supplierSn,
+            returnReason: resultObj.returnReason, // 退货原因
+            explainInfo: resultObj.explainInfo, // 补充说明
+            sparePartsReturnSn: this.itemSn
+          }
+          this.$nextTick(() => {
+            this.$refs.attachList.setFileList(this.attachList)
+          })
+          this.form = { ...this.form, ...obj }
+        } else {
+          this.detailsData = null
+        }
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.attachList = []
+        this.supplierName = null
+        this.$nextTick(() => {
+          this.$refs.attachList.setFileList('')
+          this.$refs.ruleForm.resetFields()
+        })
+      } else {
+        if (this.itemSn) {
+          this.getDetail()
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .purchaseReturn-basicInfo-modal{
+    .ant-modal-body {
+      padding: 40px 40px 24px;
+    }
+    .btn-cont {
+      text-align: center;
+      margin: 35px 0 10px;
+    }
+    .ant-form-item:nth-child(4){
+      margin-bottom: 0px !important;
+    }
+  }
+
+</style>

+ 185 - 0
src/views/purchasingManagement/purchaseReturn/chooseDepartUserModal.vue

@@ -0,0 +1,185 @@
+<template>
+  <a-modal
+    centered
+    class="departUser-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="选择审批人员"
+    v-model="isShow"
+    @cancel="cancel"
+    width="60%">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div>
+        <div class="departUser-con">
+          <a-form-model
+            id="departUser-form"
+            ref="ruleForm"
+            :model="form"
+            :rules="rules"
+            :label-col="formItemLayout.labelCol"
+            :wrapper-col="formItemLayout.wrapperCol">
+            <a-form-model-item label="申请人员" prop="applyPersonSn">
+              <employee style="width: 100%;" @change="employeeChange" id="departUser-Employee" v-model="form.applyPersonSn"></employee>
+            </a-form-model-item>
+            <a-form-model-item label="审批人员" prop="approvers">
+              <dingDepartUser
+                ref="departUserApp"
+                @loaded="uploading=false"
+                id="departUser-approvers"
+                :disabled="uploading"
+                v-model="form.approvers"
+                @change="changeApprovers"
+                allowClear
+                placeholder="请选择审批人员"
+              ></dingDepartUser>
+            </a-form-model-item>
+            <a-form-model-item label="抄送人" prop="ccList">
+              <dingDepartUser
+                ref="departUserCc"
+                @loaded="uploading=false"
+                :disabled="uploading"
+                id="departUser-ccList"
+                v-model="form.ccList"
+                allowClear
+                placeholder="请选择抄送人"
+              ></dingDepartUser>
+            </a-form-model-item>
+          </a-form-model>
+        </div>
+        <div class="btn-cont">
+          <a-button type="primary" id="departUser-save" @click="handleSave">确定</a-button>
+          <a-button :loading="uploading" style="margin-left: 15px;" @click="updateUser">刷新人员</a-button>
+          <a-button id="departUser-back" @click="cancel" style="margin-left: 15px;">取消</a-button>
+        </div>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { VSelect, Upload } from '@/components'
+import dingDepartUser from '@/views/common/dingDepartUser.js'
+import employee from '@/views/expenseManagement/expenseReimbursement/employee.js'
+import { sign } from 'core-js/fn/number'
+export default {
+  name: 'ChooseDepartUserModal',
+  components: { dingDepartUser, employee, VSelect, Upload },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      uploading: false,
+      spinning: false,
+      isShow: this.openModal, //  是否打开弹框
+      formItemLayout: {
+        labelCol: { span: 4 },
+        wrapperCol: { span: 16 }
+      },
+      form: {
+        applyPersonSn: undefined,
+        approvers: [], // 审批人
+        ccList: [] // 抄送人
+      },
+      rules: {
+        applyPersonSn: [
+          { required: true, message: '请选择申请人员', trigger: 'change' }
+        ],
+        approvers: [
+          { required: true, type: 'array', message: '请选择审批人员', trigger: 'change' }
+        ]
+      }
+    }
+  },
+  methods: {
+    // 申请人员
+    employeeChange (v, r) {
+      this.$nextTick(() => {
+        this.$refs.ruleForm.validateField(['applyPersonSn'])
+      })
+    },
+    updateUser () {
+      this.uploading = true
+      this.$refs.departUserApp.updateDeptUser()
+      this.$refs.departUserCc.updateDeptUser()
+    },
+    changeApprovers (value) {
+      this.form.approvers = value
+      this.$refs.ruleForm.clearValidate()
+    },
+    getTreeVal (data) {
+      const ret = []
+      data.map(item => {
+        ret.push(item.value)
+      })
+      return ret.join(',')
+    },
+    // 确定
+    handleSave (e) {
+      e.preventDefault()
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const form = JSON.parse(JSON.stringify(_this.form))
+          if (form.approvers) {
+            form.approvers = this.getTreeVal(form.approvers)
+          }
+          if (form.ccList) {
+            form.ccList = this.getTreeVal(form.ccList)
+          }
+          this.$emit('submit', form)
+          this.$emit('close')
+        } else {
+          return false
+        }
+      })
+    },
+    getDetail (data) {
+      this.form = Object.assign(this.form, {
+        applyPersonSn: data.applyPersonSn
+      })
+    },
+    resetForm () {
+      this.$nextTick(() => {
+        this.$refs.ruleForm.resetFields()
+      })
+      this.form = {
+        applyPersonSn: undefined,
+        ccList: undefined,
+        approvers: undefined
+      }
+    },
+    cancel () {
+      this.isShow = false
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.resetForm()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .departUser-modal{
+    .ant-modal-body {
+      padding: 30px 40px 24px;
+    }
+    .btn-cont {
+      text-align: center;
+      margin: 35px 0 10px;
+    }
+  }
+</style>

+ 188 - 0
src/views/purchasingManagement/purchaseReturn/detailModal.vue

@@ -0,0 +1,188 @@
+<template>
+  <a-modal
+    centered
+    class="confirmationDetail-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="采购退货详情"
+    v-model="isShow"
+    @cancel="isShow=false"
+    width="80%">
+    <div>
+      <a-descriptions size="small" :column="3" style="margin-bottom: 10px;">
+        <a-descriptions-item label="采购退货单号">{{ detailsData&&detailsData.sparePartsReturnNo || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="供应商名称">{{ detailsData&&detailsData.supplier&&detailsData.supplier.supplierName || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="退货原因">{{ detailsData&&detailsData.returnReasonDictValue || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="创建时间">{{ detailsData&&detailsData.createDate || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="出库时间" v-if="detailsData&&detailsData.state!='AUDIT_REJECT'">{{ detailsData&&detailsData.auditDate || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="出库时间" v-else>--</a-descriptions-item>
+        <a-descriptions-item label="业务状态">{{ detailsData&&detailsData.stateDictValue || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="补充说明" :span="3">{{ detailsData&&detailsData.explainInfo || '--' }}</a-descriptions-item>
+        <a-descriptions-item label="附件" :span="3">
+          <span v-if="detailsData&&detailsData.attachmentList&&detailsData.attachmentList.length>0">
+            <a target="_blank" style="color: #00aaff;text-decoration: underline;margin-right: 15px;" :href="item.filePath" v-for="item in detailsData.attachmentList" :key="item.id">
+              {{ item.fileName }}
+            </a>
+          </span>
+          <span v-else>--</span>
+        </a-descriptions-item>
+      </a-descriptions>
+      <a-alert type="info" style="margin-bottom:10px">
+        <div slot="message">
+          <span>产品款数:<strong>{{ statisticsObj&&statisticsObj.totalCategory|| '--' }}</strong>;</span>
+          <span>申请退货总数量:<strong>{{ statisticsObj&&statisticsObj.qty||'--' }}</strong>;</span>
+          <span v-if="$hasPermissions('B_isShowCost')">退货金额:<strong>{{ statisticsObj&&statisticsObj.totalCost || '--' }}</strong></span>
+        </div>
+      </a-alert>
+      <s-table
+        class="sTable"
+        ref="tableDetail"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :defaultLoadData="true"
+        bordered>
+      </s-table>
+      <div class="btn-cont"><a-button id="confirmationDetail-modal-back" @click="isShow = false">返回列表</a-button></div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { STable } from '@/components'
+import { sparePartsReturnQueryPage, queryPageCount, sparePartsReturnInfo } from '@/api/sparePartsReturn'
+import { toThousands } from '@/libs/tools.js'
+export default {
+  name: 'ConfirmationDetailModal',
+  components: { STable },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    itemSn: {
+      type: [Number, String],
+      default: ''
+    },
+    nowData: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      detailsData: null, //  详情数据
+      statisticsObj: null, // 统计金额数据
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        return sparePartsReturnQueryPage(Object.assign(parameter, { sparePartsReturnSn: this.itemSn })).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          return data
+        })
+      }
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '7%', align: 'center' },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'product.name', width: '30%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '单位', dataIndex: 'product.unit', width: '14%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '批次号', dataIndex: 'stockBatchNo', width: '20%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '入库数量', dataIndex: 'putQty', width: '14%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '申请退货数量', dataIndex: 'qty', width: '14%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) { //  售价权限
+        arr.splice(7, 0, { title: '退货单价', dataIndex: 'cost', width: '10%', align: 'right', customRender: function (text) { return ((text || text == 0) ? toThousands(text, 2) : '--') } })
+        arr.splice(9, 0, { title: '退货金额', dataIndex: 'totalCost', width: '10%', align: 'right', customRender: function (text) { return ((text || text == 0) ? toThousands(text, 2) : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    getBasicsInfo () {
+      sparePartsReturnInfo({ sn: this.itemSn }).then(res => {
+        if (res.status == 200) {
+          this.detailsData = res.data
+        } else {
+          this.detailsData = null
+        }
+      })
+    },
+    // 获取金额统计
+    getStatisticsData () {
+      queryPageCount({ sparePartsReturnSn: this.itemSn }).then(res => {
+        if (res.status == 200) {
+          if (res.data) {
+            res.data.totalCost = (res.data && (res.data.totalCost || res.data.totalCost == 0)) ? toThousands(res.data.totalCost, 2) : '--'
+            this.statisticsObj = res.data
+          } else {
+            this.statisticsObj = null
+          }
+        } else {
+          this.statisticsObj = null
+        }
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.$refs.tableDetail.clearTable()
+      } else {
+        this.getStatisticsData()
+        this.getBasicsInfo()
+      }
+    },
+    itemSn (newValue, oldValue) {
+      if (this.isShow && newValue) {
+        const _this = this
+        setTimeout(() => {
+          _this.$refs.tableDetail.refresh(true)
+        }, 200)
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .confirmationDetail-modal{
+    .ant-modal-body {
+      padding: 40px 40px 24px;
+    }
+    .btn-cont {
+      text-align: center;
+      margin-top:24px;
+    }
+  }
+  .auditProgress{
+    margin-top:24px;
+  }
+  .ant-divider-horizontal{
+    margin:20px 0 4px;
+  }
+  .tip{
+    line-height: 30px;
+  }
+</style>

+ 376 - 0
src/views/purchasingManagement/purchaseReturn/list.vue

@@ -0,0 +1,376 @@
+<template>
+  <a-card size="small" :bordered="false" class="bulkWarehousingOrderList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="创建时间">
+                <rangeDate ref="rangeDate" @change="dateChange" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="采购退货单号">
+                <a-input id="bulkWarehousingOrderList-productCode" v-model.trim="queryParam.sparePartsReturnNo" allowClear placeholder="请输入采购退货单号"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="供应商名称">
+                <supplier v-model="queryParam.supplierSn" placeholder="请输入供应商名称"></supplier>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="退货原因">
+                <v-select
+                  v-model="queryParam.returnReason"
+                  ref="returnReason"
+                  id="purchaseReturn-returnReason"
+                  code="SPARE_PARTS_RETURN_REASON"
+                  placeholder="请选择退货原因"
+                  allowClear></v-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="业务状态">
+                <v-select
+                  v-model="queryParam.state"
+                  ref="state"
+                  id="purchaseReturn-state"
+                  code="SPARE_PARTS_RETURN_STATE"
+                  placeholder="请选择审核状态"
+                  allowClear
+                ></v-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <span class="table-page-search-submitButtons">
+                <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="bulkWarehousingOrderList-refresh">查询</a-button>
+                <a-button style="margin-left: 5px" @click="resetSearchForm()" :disabled="disabled" id="bulkWarehousingOrderList-reset">重置</a-button>
+                <a-button
+                  style="margin-left: 10px"
+                  type="primary"
+                  class="button-warning"
+                  @click="handleExport"
+                  :disabled="disabled"
+                  :loading="exportLoading"
+                  v-if="$hasPermissions('B_purchaseReturnExport')"
+                >导出明细</a-button>
+              </span>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <!-- 操作按钮 -->
+      <div class="table-operator">
+        <a-button v-if="$hasPermissions('B_purchaseReturnAdd')" id="bulkWarehousingOrderList-add" type="primary" class="button-error" @click="handleAdd">新增</a-button>
+        <!-- <a-button
+          style="margin-left: 10px"
+          type="primary"
+          class="button-warning"
+          @click="handleExport"
+          :disabled="disabled"
+          :loading="exportLoading"
+        >同步到ERP</a-button> -->
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px' }"
+        size="small"
+        :rowKey="(record) => record.sparePartsReturnNo"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+        <!-- 采购退货单号 -->
+        <template slot="sparePartsReturnNo" slot-scope="text, record">
+          <span v-if="$hasPermissions('B_purchaseReturnDetail')" class="link-bule" @click="handleDetail(record)">{{ record.sparePartsReturnNo }}</span>
+          <span v-else>{{ record.sparePartsReturnNo }}</span>
+        </template>
+        <!-- 操作 -->
+        <!-- state 待提交 WAIT_SUBMIT 待审核 WAIT_AUDIT 已完结 FINISH 审核不通过 AUDIT_REJECT -->
+        <template slot="action" slot-scope="text, record">
+          <a-button
+            size="small"
+            type="link"
+            v-if="$hasPermissions('B_purchaseReturnEdit') && record.state == 'WAIT_SUBMIT'"
+            @click="handleEdit(record)"
+            class="button-info"
+            id="bulkWarehousingOrderList-edit-btn">编辑</a-button>
+          <a-button
+            size="small"
+            type="link"
+            class="button-warning"
+            @click="handleSH(record)"
+            v-if="$hasPermissions('B_purchaseReturnRate') && record.state !='WAIT_SUBMIT'"
+            id="allocateBillList-examine-btn">审核进度</a-button>
+          <!-- <a-button
+            size="small"
+            type="link"
+            v-if="record.state == 'FINISH'"
+            @click="handleEdit(record)"
+            class="button-info"
+            id="bulkWarehousingOrderList-edit-btn">同步到ERP</a-button> -->
+          <a-button
+            size="small"
+            type="link"
+            v-if="$hasPermissions('B_purchaseReturnSubmit') && record.state == 'AUDIT_REJECT'"
+            @click="handleResubmit(record)"
+            class="button-info"
+            id="bulkWarehousingOrderList-edit-btn">再次提交</a-button>
+          <a-button
+            size="small"
+            type="link"
+            v-if="$hasPermissions('B_purchaseReturnDel') && record.state == 'WAIT_SUBMIT'"
+            @click="handleDel(record)"
+            class="button-error"
+            id="bulkWarehousingOrderList-del-btn">删除</a-button>
+        </template>
+      </s-table>
+    </a-spin>
+    <!-- 新增、详情弹窗-->
+    <add-modal v-drag :openModal="openModal" @ok="handleOk" @close="openModal=false" />
+    <detailModal v-drag :openModal="openDetailModal" :itemSn="itemSn" @close="closeDetailModal" />
+    <!-- 导出提示框 -->
+    <reportModal :visible="showExport" @close="showExport=false"></reportModal>
+    <!-- 审核进度弹窗 -->
+    <reviewProgressModal v-drag :itemSn="itemSn" :auditTime="auditTime" :openModal="openReviewModal" @close="openReviewModal=false"></reviewProgressModal>
+  </a-card>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { STable, VSelect } from '@/components'
+import addModal from './addModal.vue'
+import detailModal from './detailModal.vue'
+import rangeDate from '@/views/common/rangeDate.vue'
+import chooseDepartUserModal from './chooseDepartUserModal.vue'
+import reviewProgressModal from './reviewProgressModal.vue'
+import reportModal from '@/views/common/reportModal.vue'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { toThousands } from '@/libs/tools.js'
+import supplier from '@/views/common/supplier.js'
+import { sparePartsReturnList, sparePartsReturnDelete, sparePartsReturnExportDetail, againSubmit } from '@/api/sparePartsReturn'
+export default {
+  name: 'PurchaseReturnList',
+  mixins: [commonMixin],
+  components: { STable, supplier, VSelect, reportModal, detailModal, addModal, chooseDepartUserModal, rangeDate, reviewProgressModal },
+  data () {
+    return {
+      spinning: false,
+      disabled: false, //  查询、重置按钮是否可操作
+      openModal: false, // 新增弹框是否显示
+      openDetailModal: false, // 详情弹窗
+      openReviewModal: false, // 审核进度弹窗
+      showExport: false,
+      exportLoading: false,
+      tableHeight: 0,
+      // 查询参数
+      queryParam: {
+        beginDate: undefined,
+        endDate: undefined,
+        sparePartsReturnNo: undefined,
+        supplierSn: undefined,
+        returnReason: undefined,
+        state: undefined
+      },
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        return sparePartsReturnList(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      itemSn: null, // 采购退货SN
+      auditTime: null// 审核时间
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '9%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '采购退货单号', scopedSlots: { customRender: 'sparePartsReturnNo' }, width: '15%', align: 'center' },
+        { title: '供应商名称', dataIndex: 'supplier.supplierName', align: 'center', width: '15%', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '退货原因', dataIndex: 'returnReasonDictValue', width: '15%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '申请退货数量', dataIndex: 'totalQty', width: '8%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '审核时间', dataIndex: 'auditDate', width: '9%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '审核状态', dataIndex: 'stateDictValue', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '9%', align: 'center' }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) { //  售价权限
+        arr.splice(6, 0, { title: '退货金额', dataIndex: 'totalCost', width: '5%', align: 'right', customRender: function (text) { return ((text || text == 0) ? toThousands(text, 2) : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    // 创建时间
+    dateChange (date) {
+      this.queryParam.beginDate = date[0]
+      this.queryParam.endDate = date[1]
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      _this.exportLoading = true
+      _this.spinning = true
+      _this.queryParam.showCostFlag = this.$hasPermissions('B_isShowCost') ? 1 : 0
+      hdExportExcel(sparePartsReturnExportDetail, _this.queryParam, '采购退货', function () {
+        _this.exportLoading = false
+        _this.spinning = false
+        _this.showExport = true
+      })
+    },
+    //  新增
+    handleAdd () {
+      this.openModal = true
+    },
+    //  基本信息  保存
+    handleOk (row) {
+      this.$router.push({ name: 'purchaseReturnAdd', query: { returnSn: row.sparePartsReturnSn, no: row.sparePartsReturnNo, sn: row.supplierSn } })
+    },
+    //  编辑
+    handleEdit (row) {
+      this.$router.push({ name: 'purchaseReturnEdit', query: { returnSn: row.sparePartsReturnSn, no: row.sparePartsReturnNo, sn: row.supplierSn } })
+    },
+    // 审核进度
+    handleSH (row) {
+      this.itemSn = row.sparePartsReturnSn
+      this.auditTime = row.submitDate
+      this.openReviewModal = true
+    },
+    // 再次提交
+    handleResubmit (row) {
+      const _this = this
+      this.$confirm({
+        title: '操作提示',
+        content: '系统将自动生成一个新的采购退货单,新单据中的产品申退数量将以最大可用库存为准,最大可用库存为0时,系统将强制删除已选的对应产品。您可以对新单据进行编辑、提交等操作,原单据保持不变,确认操作吗?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          againSubmit({ sparePartsReturnSn: row.sparePartsReturnSn }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$refs.table.refresh()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    //  采购退货详情
+    handleDetail (row) {
+      this.itemSn = row.sparePartsReturnSn
+      this.openDetailModal = true
+    },
+    // 关闭采购退货详情弹框
+    closeDetailModal () {
+      this.itemSn = null
+      this.openDetailModal = false
+    },
+    //  删除
+    handleDel (row) {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '删除后不可恢复,确定要进行删除吗?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          sparePartsReturnDelete({ sn: row.sparePartsReturnSn }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$refs.table.refresh()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam = {
+        beginDate: undefined,
+        endDate: undefined,
+        sparePartsReturnNo: undefined,
+        supplierSn: undefined,
+        returnReason: undefined,
+        state: undefined
+      }
+      this.$refs.rangeDate.resetDate()
+      this.$refs.table.refresh(true)
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+      this.openModal = false
+      this.openDetailModal = false
+      this.itemSn = null
+      this.rowSelectionInfo = null
+      this.$refs.table.clearTable()
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 235
+    }
+  },
+  watch: {
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+    // 仅刷新列表,不重置页面
+    if (this.$store.state.app.updateList) {
+      this.pageInit()
+      this.$refs.table.refresh()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>
+<style lang="less">
+  .bulkWarehousingOrderList-wrap{
+    .active{
+      color: #ed1c24;
+      cursor: pointer;
+    }
+    .common{
+      color: rgba(0, 0, 0);
+    }
+  }
+</style>

+ 544 - 0
src/views/purchasingManagement/purchaseReturn/purchaseReturnDeatil.vue

@@ -0,0 +1,544 @@
+<template>
+  <div class="salesReturnEdit-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <a-page-header :ghost="false" :backIcon="false" class="salesReturnEdit-back">
+        <!-- 自定义的二级文字标题 -->
+        <template slot="subTitle">
+          <a id="salesReturnEdit-back-btn" href="javascript:;" @click="handleBack">
+            <a-icon type="left" />
+            返回列表
+          </a>
+        </template>
+      </a-page-header>
+      <a-card size="small" :bordered="false" class="outboundOrderDetail-cont">
+        <a-collapse :activeKey="['1']">
+          <a-collapse-panel key="1" header="基础信息">
+            <div slot="extra" style="padding: 0 20px; color: #00aaff;" @click.stop="handleEditBase">
+              <a-icon type="edit" />
+              编辑基础信息
+            </div>
+            <a-descriptions size="small" :column="3" style="margin-bottom: 10px;">
+              <a-descriptions-item label="采购退货单号">{{ (detailsData && detailsData.sparePartsReturnNo) || '--' }}</a-descriptions-item>
+              <a-descriptions-item label="供应商名称">{{ (detailsData && detailsData.supplier && detailsData.supplier.supplierName) || '--' }}</a-descriptions-item>
+              <a-descriptions-item label="退货原因">{{ (detailsData && detailsData.returnReasonDictValue) || '--' }}</a-descriptions-item>
+              <a-descriptions-item label="补充说明" :span="3">{{ (detailsData && detailsData.explainInfo) || '--' }}</a-descriptions-item>
+              <a-descriptions-item label="附件" :span="3">
+                <span v-if="detailsData && detailsData.attachmentList && detailsData.attachmentList.length > 0">
+                  <a
+                    target="_blank"
+                    style="color: #00aaff;text-decoration: underline;margin-right: 15px;"
+                    :href="item.filePath"
+                    v-for="item in detailsData.attachmentList"
+                    :key="item.id"
+                  >
+                    {{ item.fileName }}
+                  </a>
+                </span>
+                <span v-else>--</span>
+              </a-descriptions-item>
+            </a-descriptions>
+          </a-collapse-panel>
+        </a-collapse>
+      </a-card>
+      <a-card size="small" :bordered="false" class="salesReturnEdit-cont">
+        <!-- <div>已入库产品信息</div>
+        <a-divider /> -->
+        <queryPart ref="partQuery" :newLoading="isInster" :addMoreLoading="addMoreLoading" @add="saveProduct" @bachAdd="saveMoreProduct"></queryPart>
+      </a-card>
+      <a-card size="small" :bordered="false" class="salesReturnEdit-cont">
+        <a-alert style="margin-bottom: 10px;" type="info">
+          <div slot="message" class="total-bar">
+            <div>
+              <span>申请退货数量:{{ statisticsObj && (statisticsObj.qty || statisticsObj.qty == 0) ? statisticsObj.qty : '--' }};</span>
+              <span v-if="$hasPermissions('B_isShowCost')">退货金额:{{ statisticsObj && statisticsObj.totalCost }}元;</span>
+            </div>
+          </div>
+        </a-alert>
+        <div class="table-page-search-wrapper" style="display:flex;align-items: center;justify-content: space-between;">
+          <div style="flex-grow:1;">
+            <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+              <a-row :gutter="15">
+                <a-col :md="6" :sm="24">
+                  <a-form-item label="入库单号"><a-input v-model.trim="productForm.sparePartsNo" allowClear placeholder="请输入入库单号" /></a-form-item>
+                </a-col>
+                <a-col :md="6" :sm="24">
+                  <a-form-item label="产品编码"><a-input v-model.trim="productForm.productCode" allowClear placeholder="请输入产品编码" /></a-form-item>
+                </a-col>
+                <a-col :md="6" :sm="24">
+                  <a-form-item label="产品名称"><a-input v-model.trim="productForm.productName" allowClear placeholder="请输入产品名称" /></a-form-item>
+                </a-col>
+                <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+                  <a-button type="primary" @click="$refs.table.refresh(true)">查询</a-button>
+                  <a-button style="margin-left: 5px" @click="resetSearchForm">重置</a-button>
+                </a-col>
+              </a-row>
+            </a-form>
+          </div>
+        </div>
+        <!-- 已选配件列表 -->
+        <s-table
+          class="sTable"
+          ref="table"
+          size="small"
+          :rowKey="(record,index) => index"
+          :columns="columns"
+          :data="loadData"
+          :defaultLoadData="false"
+          :scroll="{ y: 300 }"
+          bordered>
+          <!--申请退货数量 -->
+          <template slot="qty" slot-scope="text, record">
+            <a-input-number
+              id="salesReturn-qty"
+              size="small"
+              v-model="record.qty"
+              :precision="0"
+              :min="1"
+              :max="record.qty"
+              placeholder="请输入"
+              style="width: 100%;"
+              @blur="e => onCellBlur(e.target.value, record)"
+            />
+          </template>
+
+          <!-- 操作 -->
+          <template slot="action" slot-scope="text, record">
+            <a-button
+              size="small"
+              type="link"
+              :loading="delLoading"
+              class="button-error"
+              @click="handleDel(record)"
+              id="salesReturn-Del">删除</a-button>
+          </template>
+        </s-table>
+      </a-card>
+    </a-spin>
+    <div class="affix-cont">
+      <a-button
+        size="large"
+        style="padding: 0 60px;"
+        :disabled="spinning"
+        type="primary"
+        class="button-primary"
+        @click="beforeSubmit"
+        id="salesReturn-handleSubmit">提交</a-button>
+    </div>
+    <!-- 选择审核人员 -->
+    <chooseDepartUserModal ref="chooseDepart" :openModal="openDepartUserModal" @close="openDepartUserModal = false" @submit="handleSubmit"></chooseDepartUserModal>
+    <!-- 编辑基础信息弹窗 -->
+    <add-modal v-drag :openModal="openModal" :itemSn="sparePartsReturnSn" @ok="getBasicsData" @close="openModal = false" />
+  </div>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { STable, VSelect } from '@/components'
+import queryPart from './queryPart.vue'
+import addModal from './addModal.vue'
+import chooseDepartUserModal from './chooseDepartUserModal.vue'
+import {
+  sparePartsReturnQueryPage,
+  queryPageCount,
+  sparePartsReturnDetailDelete,
+  sparePartsReturnDetailSave,
+  sparePartsReturnSubmit,
+  sparePartsReturnInfo,
+  sparePartsReturnDetailSaveBatch
+} from '@/api/sparePartsReturn'
+import { toThousands } from '@/libs/tools.js'
+export default {
+  name: 'PurchaseReturnEdit',
+  mixins: [commonMixin],
+  components: {
+    STable,
+    VSelect,
+    queryPart,
+    addModal,
+    chooseDepartUserModal
+  },
+  data () {
+    return {
+      spinning: false,
+      isInster: false, // 是否正在添加产品
+      openDepartUserModal: false, // 审核人员弹窗
+      delLoading: false,
+      productForm: {
+        productName: '',
+        productCode: '',
+        sparePartsNo: '',
+        orderBy: 'sprd.CREATE_DATE DESC'
+      },
+      sparePartsReturnSn: null,
+      sparePartsReturnNo: null,
+      chooseList: [],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.productForm.sparePartsReturnSn = this.$route.query.returnSn
+        return sparePartsReturnQueryPage(Object.assign(parameter, this.productForm)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+          }
+          this.chooseList = data.list
+          return data
+        })
+      },
+      openModal: false, // 修改信息弹窗
+      statisticsObj: null, // 统计明细
+      detailsData: null, // 基础信息数据
+      addMoreLoading: false // 批量添加动画
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '序号', dataIndex: 'no', align: 'center', width: '4%' },
+        {
+          title: '入库单号',
+          dataIndex: 'sparePartsNo',
+          width: '18%',
+          align: 'center',
+          customRender: function (text) {
+            return text || '--'
+          }
+        },
+        {
+          title: '产品编码',
+          dataIndex: 'product.code',
+          width: '18%',
+          align: 'center',
+          customRender: function (text) {
+            return text || '--'
+          }
+        },
+        {
+          title: '产品名称',
+          dataIndex: 'product.name',
+          width: '25%',
+          align: 'left',
+          customRender: function (text) {
+            return text || '--'
+          },
+          ellipsis: true
+        },
+        {
+          title: '单位',
+          dataIndex: 'product.unit',
+          align: 'center',
+          width: '6%',
+          customRender: function (text) {
+            return text || '--'
+          }
+        },
+        {
+          title: '批次号',
+          dataIndex: 'stockBatchNo',
+          align: 'center',
+          width: '10%',
+          customRender: function (text) {
+            return text || '--'
+          }
+        },
+        { title: '申请退货数量', align: 'center', width: '13%', scopedSlots: { customRender: 'qty' } },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '10%', align: 'center' }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) {
+        arr.splice(6, 0, {
+          title: '退货单价',
+          dataIndex: 'cost',
+          width: '8%',
+          align: 'right',
+          customRender: function (text) {
+            return text || text == 0 ? toThousands(text, 2) : '--'
+          }
+        })
+        arr.splice(8, 0, {
+          title: '退款金额',
+          dataIndex: 'totalCost',
+          width: '8%',
+          align: 'right',
+          customRender: function (text) {
+            return text || text == 0 ? toThousands(text, 2) : '--'
+          }
+        })
+      }
+      return arr
+    }
+  },
+  methods: {
+    // 编辑基础信息
+    handleEditBase () {
+      this.openModal = true
+    },
+    //  返回
+    handleBack () {
+      this.$router.push({ path: `/purchasingManagement/purchaseReturn/list`, query: { closeLastOldTab: true } })
+    },
+    // 删除所选产品
+    handleDel (row) {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确认要删除吗?',
+        centered: true,
+        closable: true,
+        onOk () {
+          _this.delLoading = true
+          _this.spinning = true
+          sparePartsReturnDetailDelete({ detailSn: row.sparePartsReturnDetailSn })
+            .then(res => {
+              if (res.status == 200) {
+                _this.resetTable(false)
+                _this.getStatisticsData()
+                _this.getChooseList()
+                _this.$refs.partQuery.refreshLength()
+              }
+              _this.$message.info(res.message)
+              _this.delLoading = false
+              _this.spinning = false
+            })
+            .catch(err => {
+              _this.delLoading = false
+            })
+        }
+      })
+    },
+    resetTable (flag) {
+      this.$refs.table.refresh(flag)
+    },
+    //  重置
+    resetSearchForm (flag) {
+      this.productForm.productName = ''
+      this.productForm.productCode = ''
+      this.productForm.sparePartsNo = ''
+      this.$refs.table.refresh(!!flag)
+    },
+    // 已选产品  blur
+    onCellBlur (val, record) {
+      if (val * 1 > record.putQty * 1) {
+        this.$message.warning('申请退货数量不能大于入库数量!')
+        this.$refs.table.refresh(true)
+        return
+      }
+      const ajax_data = {
+        sparePartsReturnSn: this.sparePartsReturnSn,
+        sparePartsReturnNo: this.sparePartsReturnNo,
+        sparePartsDetailSn: record.sparePartsDetailSn,
+        productSn: record.productSn,
+        sparePartsReturnDetailSn: record.sparePartsReturnDetailSn,
+        stockDetailSn: record.stockDetailSn,
+        productCode: record.productCode,
+        putQty: record.putQty, // 入库数量
+        returnedQty: record.returnedQty, // 已退数量
+        qty: val, // 申退数量
+        cost: record.cost, // 成本
+        stockBatchNo: record.stockBatchNo, // 批次号
+        warehouseSn: record.warehouseSn, // 仓库sn
+        warehouseLocationSn: record.warehouseLocationSn, // 仓位sn
+        sparePartsNo: record.sparePartsNo,
+        sparePartsSn: record.sparePartsSn
+      }
+      this.saveEdit(ajax_data)
+    },
+    // 添加或修改产品
+    saveProduct (row) {
+      if (this.isInster) {
+        // 防止多次添加产品
+        return
+      }
+      this.isInster = true
+      const paramsData = {
+        sparePartsReturnSn: this.sparePartsReturnSn,
+        sparePartsReturnNo: this.sparePartsReturnNo,
+        sparePartsDetailSn: row.sparePartsDetailSn,
+        productSn: row.productSn,
+        stockDetailSn: row.stockDetailSn,
+        productCode: row.productCode,
+        putQty: row.productQty, // 入库数量
+        returnedQty: row.returnedQty, // 已退数量
+        qty: row.qty, // 申退数量
+        cost: row.productCost, // 成本
+        stockBatchNo: row.sparePartsBatchNo, // 批次号
+        warehouseSn: row.warehouseSn, // 仓库sn
+        warehouseLocationSn: row.warehouseLocationSn, // 仓位sn
+        sparePartsNo: row.sparePartsNo,
+        sparePartsSn: row.sparePartsSn
+      }
+      this.saveEdit(paramsData)
+    },
+    saveMoreProduct (data) {
+      if (this.addMoreLoading) {
+        // 防止多次添加产品
+        return
+      }
+      this.addMoreLoading = true
+      var ajax_data = []
+      data.forEach(item => {
+        const obj = {
+          sparePartsReturnSn: this.sparePartsReturnSn,
+          sparePartsReturnNo: this.sparePartsReturnNo,
+          sparePartsDetailSn: item.sparePartsDetailSn,
+          productSn: item.productSn,
+          stockDetailSn: item.stockDetailSn,
+          productCode: item.productCode,
+          putQty: item.productQty, // 入库数量
+          returnedQty: item.returnedQty, // 已退数量
+          qty: item.qty, // 申退数量
+          cost: item.productCost, // 成本
+          stockBatchNo: item.sparePartsBatchNo, // 批次号
+          warehouseSn: item.warehouseSn, // 仓库sn
+          warehouseLocationSn: item.warehouseLocationSn, // 仓位sn
+          sparePartsNo: item.sparePartsNo,
+          sparePartsSn: item.sparePartsSn
+        }
+        ajax_data.push(obj)
+      })
+      this.saveMore(ajax_data)
+    },
+    saveEdit (params) {
+      this.spinning = true
+      sparePartsReturnDetailSave(params).then(res => {
+        if (res.status == 200) {
+          this.getStatisticsData()
+          this.$refs.table.refresh(true)
+          this.getChooseList()
+        }
+        this.isInster = false
+        this.spinning = false
+        this.addMoreLoading = false
+      }).catch(err => {
+        this.isInster = false
+      })
+    },
+    saveMore (params) {
+      this.spinning = true
+      sparePartsReturnDetailSaveBatch(params)
+        .then(res => {
+          if (res.status == 200) {
+            this.getStatisticsData()
+            this.getChooseList()
+            this.$refs.table.refresh(true)
+            this.$refs.partQuery.refreshLength()
+          }
+          this.isInster = false
+          this.spinning = false
+          this.addMoreLoading = false
+        })
+        .catch(err => {
+          this.isInster = false
+          this.addMoreLoading = false
+          this.spinning = false
+        })
+    },
+    beforeSubmit () {
+      if (this.chooseList.length > 0) {
+        this.openDepartUserModal = true
+      } else {
+        this.$message.warning('请先添加要退货的产品!')
+      }
+    },
+    // 提交采购退货
+    handleSubmit (data) {
+      this.spinning = true
+      sparePartsReturnSubmit({ sparePartsReturnSn: this.sparePartsReturnSn, ...data }).then(res => {
+        if (res.status == 200) {
+          this.handleBack()
+          this.$message.success(res.message)
+        }
+        this.spinning = false
+      })
+    },
+    pageInit () {
+      this.supplierSn = this.$route.query.sn
+      this.sparePartsReturnSn = this.$route.query.returnSn
+      this.sparePartsReturnNo = this.$route.query.no
+      this.getStatisticsData()
+      this.getBasicsData()
+      this.resetSearchForm(true)
+      this.getChooseList()
+    },
+    getChooseList () {
+      this.$refs.partQuery.pageInit(this.supplierSn, this.sparePartsReturnSn)
+    },
+    // 获取页面统计数据
+    getStatisticsData () {
+      queryPageCount({ sparePartsReturnSn: this.sparePartsReturnSn }).then(res => {
+        if (res.status == 200) {
+          if (res.data) {
+            res.data.totalCost = res.data && (res.data.totalCost || res.data.totalCost == 0) ? toThousands(res.data.totalCost, 2) : '--'
+            this.statisticsObj = res.data
+          } else {
+            this.statisticsObj = null
+          }
+        } else {
+          this.statisticsObj = null
+        }
+      })
+    },
+    // 获取基础信息
+    getBasicsData () {
+      sparePartsReturnInfo({ sn: this.sparePartsReturnSn }).then(res => {
+        if (res.status == 200) {
+          this.detailsData = res.data
+        } else {
+          this.detailsData = null
+        }
+      })
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) {
+      // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>
+
+<style lang="less">
+.salesReturnEdit-wrap {
+  position: relative;
+  height: 100%;
+  padding-bottom: 51px;
+  box-sizing: border-box;
+  > .ant-spin-nested-loading {
+    overflow-y: scroll;
+    height: 100%;
+  }
+  .salesReturnEdit-cont {
+    margin-top: 10px;
+    .ant-divider-horizontal {
+      margin: 10px 0 24px;
+    }
+    .total-bar {
+      display: flex;
+      align-items: center;
+      justify-content: space-between;
+      > div {
+        &:last-child {
+          display: flex;
+          align-items: center;
+          justify-content: space-between;
+          > div {
+            padding: 0 10px;
+          }
+        }
+      }
+    }
+  }
+}
+</style>

+ 246 - 0
src/views/purchasingManagement/purchaseReturn/queryPart.vue

@@ -0,0 +1,246 @@
+<template>
+  <div class="salesReturnList-wrap">
+    <!-- 搜索条件 -->
+    <div class="table-page-search-wrapper">
+      <div style="width:80%">
+        <a-form layout="inline" @keyup.enter.native="$refs.chooseTable.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="5" :sm="24">
+              <a-form-item label="入库单号">
+                <a-input id="salesReturnList-productCode" v-model.trim="queryParam.sparePartsNo" allowClear placeholder="请输入入库单号"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="5" :sm="24">
+              <a-form-item label="财务审核时间">
+                <rangeDate ref="rangeDate" :value="warehousingDate" @change="dateChange" />
+              </a-form-item>
+            </a-col>
+            <a-col :md="5" :sm="24">
+              <a-form-item label="产品编码">
+                <a-input id="salesReturnList-productCode" v-model.trim="queryParam.productCode" allowClear placeholder="请输入产品编码"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="5" :sm="24">
+              <a-form-item label="产品名称">
+                <a-input id="salesReturnList-productName" v-model.trim="queryParam.productName" allowClear placeholder="请输入产品名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="4" :sm="24">
+              <a-button type="primary" @click="$refs.chooseTable.refresh(true)" id="salesReturnList-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" id="salesReturnList-reset">重置</a-button>
+            </a-col>
+            <a-col :md="12" :sm="24" style="margin-bottom: 10px;display: flex;align-items: center;">
+              <a-button type="primary" style="margin-right: 5px" @click="handleBatchAdd" :loading="addMoreLoading">批量添加</a-button>
+              <span v-if="selNums&&selNums!=0" style="margin:0 10px;">已选中{{ selNums }}项</span>
+              <a-checkbox @change="onChange" :checked="isChecked">
+                显示最大可退数量为0的产品
+              </a-checkbox>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+    </div>
+    <!-- 列表 -->
+    <s-table
+      class="sTable"
+      ref="chooseTable"
+      size="small"
+      :rowKey="(record,i) => record.sparePartsDetailSn"
+      rowKeyName="sparePartsDetailSn"
+      :row-selection="{ columnWidth: 40,getCheckboxProps: record => ({ props: { disabled: record.currentStockQty == 0 || record.isCheckedFlag} }) }"
+      @rowSelection="rowSelectionFun"
+      :columns="columns"
+      :data="loadData"
+      :defaultLoadData="false"
+      :scroll="{ y: 300 }"
+      bordered>
+      <!-- 申请退货数量 -->
+      <template slot="qty" slot-scope="text, record">
+        <div @dblclick.stop>
+          <a-input-number
+            size="small"
+            v-model="record.qty"
+            :precision="0"
+            :min="1"
+            :disabled="record.currentStockQty == 0"
+            :max="record.currentStockQty"
+            style="width: 100%;"
+            placeholder="请输入"/>
+        </div>
+      </template>
+      <!-- 操作 -->
+      <template slot="action" slot-scope="text, record">
+        <a-button
+          size="small"
+          type="link"
+          class="button-info"
+          :loading="newLoading"
+          v-if="record.currentStockQty != 0 && !record.isCheckedFlag"
+          @click="handleAdd(record)"
+        >添加</a-button>
+        <span v-else>--</span>
+      </template>
+    </s-table>
+  </div>
+</template>
+
+<script>
+import { queryDetailStockPage } from '@/api/spareParts'
+import { queryDetailSnListBySn } from '@/api/sparePartsReturn'
+import { STable, VSelect } from '@/components'
+import rangeDate from '@/views/common/rangeDate.vue'
+import { toThousands } from '@/libs/tools.js'
+export default {
+  name: 'QueryPart',
+  components: { STable, VSelect, rangeDate },
+  props: {
+    newLoading: Boolean,
+    isShowPrice: {
+      type: Boolean,
+      default: true
+    },
+    // 是否显示仓库实收数量
+    showReceiveQty: {
+      type: Boolean,
+      default: false
+    },
+    addMoreLoading: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      buyerSn: '',
+      queryParam: { //  查询条件
+        productName: '', // 产品名称
+        productCode: '', //  产品编码
+        beginDate: '',
+        endDate: '',
+        sparePartsNo: '',
+        isZero: 0
+      },
+      warehousingDate: [], // 入库时间
+      rowSelectionInfo: null,
+      isChecked: false,
+      repeatList: null,
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.queryParam.supplierSn = this.buyerSn
+        return queryDetailStockPage(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+              data.list[i].qty = data.list[i].currentStockQty
+              data.list[i].isCheckedFlag = this.repeatList.findIndex(item => { return item == data.list[i].sparePartsDetailSn }) > -1
+            }
+          }
+          return data
+        })
+      }
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '6%', align: 'center' },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: '24%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'product.code', width: '24%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'product.name', width: '27%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '单位', dataIndex: 'product.unit', width: '6%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '批次号', dataIndex: 'sparePartsBatchNo', width: '13%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库数量', dataIndex: 'productQty', width: '9%', align: 'center', customRender: function (text) { return (text || text == 0) ? text : '--' } },
+        { title: '已退数量', dataIndex: 'returnedQty', width: '9%', align: 'center', customRender: function (text) { return (text || text == 0) ? text : '--' } },
+        { title: '最大可退数量', dataIndex: 'currentStockQty', width: '9%', align: 'center', customRender: function (text) { return (text || text == 0) ? text : '--' } },
+        { title: '申请退货数量', width: '9%', align: 'center', scopedSlots: { customRender: 'qty' } },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '10%', align: 'center' }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) {
+        arr.splice(6, 0, { title: '入库单价', dataIndex: 'productCost', width: '8%', align: 'right', customRender: function (text) { return ((text || text == 0) ? toThousands(text, 2) : '--') } })
+      }
+      return arr
+    },
+    selNums () {
+      return this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length || 0
+    }
+  },
+  methods: {
+    //  重置
+    resetSearchForm () {
+      this.queryParam.productName = ''
+      this.queryParam.productCode = ''
+      this.queryParam.sparePartsNo = ''
+      this.warehousingDate = []
+      this.$refs.rangeDate.resetDate(this.warehousingDate)
+      this.$refs.chooseTable.refresh(true)
+    },
+    onChange (e) {
+      this.isChecked = !this.isChecked
+      this.queryParam.isZero = e.target.checked ? 1 : 0
+      this.$refs.chooseTable.refresh()
+    },
+    //  入库时间  change
+    dateChange (date) {
+      this.queryParam.beginDate = date[0] ? date[0] : ''
+      this.queryParam.endDate = date[1] ? date[1] : ''
+    },
+    pageInit (buyerSn, returnSn) {
+      this.buyerSn = buyerSn
+      this.getRepeatResult(returnSn)
+      this.$refs.chooseTable.refresh()
+      // this.$refs.chooseTable.clearSelected()
+    },
+    // 添加
+    handleAdd (row) {
+      const selectArr = this.rowSelectionInfo ? this.rowSelectionInfo.selectedRowKeys : null
+      if (selectArr && selectArr.length > 0) {
+        const pot = selectArr.findIndex(item => { return item == row.sparePartsDetailSn })
+        selectArr.splice(pot, 1)
+        const index = this.rowSelectionInfo.selectedRows.findIndex(item => { return item.sparePartsDetailSn == row.sparePartsDetailSn })
+        this.rowSelectionInfo.selectedRows.splice(index, 1)
+        this.$nextTick(() => { // 页面渲染完成后的回调
+          this.$refs.chooseTable.setTableSelected(selectArr, this.rowSelectionInfo.selectedRows) // 设置表格选中项
+        })
+      }
+      this.$emit('add', row)
+    },
+    // 删除后选中长度恢复
+    refreshLength (row) {
+      this.$refs.chooseTable.clearSelected()
+    },
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
+    // 批量添加
+    handleBatchAdd () {
+      if (this.rowSelectionInfo.selectedRowKeys.length == 0) {
+        this.$message.warning('请先选择要添加的产品!')
+        return
+      }
+      this.$emit('bachAdd', this.rowSelectionInfo.selectedRows)
+    },
+    getRepeatResult (sn) {
+      queryDetailSnListBySn({ sn }).then(res => {
+        if (res.status == 200) {
+          this.repeatList = res.data
+        }
+      })
+    }
+  }
+}
+</script>
+<style lang="less" scoped>
+  .salesReturnList-wrap{
+    .redBg-row{
+      background-color: #f5cdc8;
+    }
+  }
+  /deep/.sTable input:disabled{
+    color:gray !important;
+    -webkit-text-fill-color:gray !important;
+  }
+</style>

+ 97 - 0
src/views/purchasingManagement/purchaseReturn/reviewProgressModal.vue

@@ -0,0 +1,97 @@
+<template>
+  <a-modal
+    centered
+    :footer="null"
+    :maskClosable="false"
+    title="采购退货的审核进度"
+    v-model="isShow"
+    @cancel="isShow=false"
+    width="50%">
+    <p>说明:以下信息来自钉钉</p>
+    <p style="font-weight:bold;">提审时间:{{ auditTime }}</p>
+    <a-spin :spinning="spinning" tip="Loading...">
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        size="small"
+        :rowKey="(record,index) => {return index}"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: 500 }"
+        :showPagination="false"
+        :defaultLoadData="true"
+        bordered>
+      </s-table>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { STable } from '@/components'
+import { getProcessInstance } from '@/api/expenseManagement'
+export default {
+  name: 'VerifyModal',
+  components: { STable },
+  props: {
+    openModal: {
+      type: Boolean,
+      default: false
+    },
+    itemSn: {
+      type: [Number, String],
+      default: ''
+    },
+    auditTime: {
+      type: String,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      spinning: false,
+      isShow: this.openModal,
+      columns: [{ title: '序号', dataIndex: 'no', width: '8%', align: 'center' },
+        { title: '人员姓名', width: '12%', dataIndex: 'userName', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '人员类型', dataIndex: 'userType', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '状态', dataIndex: 'state', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '审批意见', dataIndex: 'remark', width: '20%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '附件', dataIndex: 'hasAttachments', width: '20%', align: 'center', customRender: function (text) { return text != '0' ? '请在钉钉中查看附件内容' : '--' } },
+        { title: '操作时间', dataIndex: 'date', width: '20%', align: 'center', customRender: function (text) { return text || '--' } }],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        delete parameter.tableId
+        delete parameter.index
+        return getProcessInstance({ businessType: 'SPARE_PARTS_RETURN', businessSn: this.itemSn }).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = 0
+            for (var i = 0; i < data.length; i++) {
+              data[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  watch: {
+    openModal (nVal, oVal) {
+      this.isShow = nVal
+    },
+    isShow (nVal, oVal) {
+      if (!nVal) {
+        this.$emit('close')
+        this.$refs.table.clearTable()
+      } else {
+        this.$nextTick(() => {
+          this.$refs.table.refresh()
+        })
+      }
+    }
+  }
+}
+</script>

+ 4 - 4
src/views/reportData/transferReturnReport/list.vue

@@ -120,7 +120,7 @@ import subarea from '@/views/common/subarea.js'
 import reportModal from '@/views/common/reportModal.vue'
 import AllocateType from '@/views/common/allocateType.js'
 import { hdExportExcel } from '@/libs/exportExcel'
-import { allocateReturnReportQueryPage, allocateReturnReportQueryCount, allocateReturnReportExport } from '@/api/reportData'
+import { sparePartsReturnDetailReportList, sparePartsReturnDetailReportStat, sparePartsReturnReportExportDetail } from '@/api/reportData'
 export default {
   name: 'TransferReturnReportList',
   mixins: [commonMixin],
@@ -157,7 +157,7 @@ export default {
         this.spinning = true
         const params = Object.assign(parameter, this.queryParam)
         delete params.time
-        return allocateReturnReportQueryPage(params).then(res => {
+        return sparePartsReturnDetailReportList(params).then(res => {
           let data
           if (res.status == 200) {
             data = res.data
@@ -214,7 +214,7 @@ export default {
           _this.showExport = true
           _this.exportLoading = true
           _this.spinning = true
-          hdExportExcel(allocateReturnReportExport, params, '调拨退货单报表', function () {
+          hdExportExcel(sparePartsReturnReportExportDetail, params, '调拨退货单报表', function () {
             _this.exportLoading = false
             _this.spinning = false
           })
@@ -229,7 +229,7 @@ export default {
     },
     // 总计
     getCount (params) {
-      allocateReturnReportQueryCount(params).then(res => {
+      sparePartsReturnDetailReportStat(params).then(res => {
         if (res.status == 200 && res.data) {
           this.totalData = res.data
         } else {

+ 480 - 0
src/views/reportData/urchaseDetailReturn/detailList.vue

@@ -0,0 +1,480 @@
+<template>
+  <a-card size="small" :bordered="false" class="salesReturnDetailList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper">
+        <a-form-model
+          id="salesSlipReportList-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam"
+          :rules="rules"
+          @keyup.enter.native="handleSearch">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="退货完成日期" prop="time">
+                <rangeDate ref="rangeDate" :value="queryParam.time" @change="dateChange" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="采购退货单号">
+                <a-input v-model.trim="queryParam.sparePartsReturnNo" allowClear placeholder="请输入采购退货单号"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="供应商名称">
+                <supplier v-model="queryParam.supplierSn" placeholder="请输入供应商名称"></supplier>
+              </a-form-model-item>
+            </a-col>
+            <template v-if="advanced">
+              <a-col :md="6" :sm="24">
+                <a-form-item label="退货原因">
+                  <v-select
+                    v-model="queryParam.returnReason"
+                    ref="returnReason"
+                    code="SPARE_PARTS_RETURN_REASON"
+                    placeholder="请选择退货原因"
+                    allowClear></v-select>
+                </a-form-item>
+              </a-col>
+              <a-col :md="5" :sm="24">
+                <a-form-model-item label="产品编码">
+                  <a-input id="urchaseDetailReturn-productCode" v-model.trim="queryParam.productCode" allowClear placeholder="请输入产品编码"/>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="产品名称">
+                  <a-input id="urchaseDetailReturn-productName" v-model.trim="queryParam.productName" allowClear placeholder="请输入产品名称"/>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="产品品牌">
+                  <ProductBrand id="urchaseDetailReturn-productBrandSn" v-model="queryParam.productBrandSn"></ProductBrand>
+                </a-form-model-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-model-item label="品牌分类">
+                  <v-select code="BRAND_TYPE" id="urchaseDetailReturn-productBrandTypeSn" v-model="queryParam.productBrandTypeSn" allowClear placeholder="请选择品牌分类"></v-select>
+                </a-form-model-item>
+              </a-col>
+              <!-- <a-col :md="6" :sm="24">
+                <a-form-model-item label="产品分类">
+                  <a-cascader
+                    @change="changeProductType"
+                    expand-trigger="hover"
+                    change-on-select
+                    :options="productTypeList"
+                    :fieldNames="{ label: 'productTypeName', value: 'productTypeSn', children: 'children' }"
+                    id="salesReturnDetailList-productType"
+                    placeholder="请选择产品分类"
+                    allowClear
+                    v-model="productType" />
+                </a-form-model-item>
+              </a-col> -->
+              <!-- <a-col :md="6" :sm="24">
+                <a-form-model-item label="所在区域">
+                  <subarea id="salesReturnDetailList-subareaSn" v-model="queryParam.subareaSn"></subarea>
+                </a-form-model-item>
+              </a-col> -->
+              <a-col :md="12" :sm="24">
+                <a-row>
+                  <a-form-model-item label="地区">
+                    <a-col span="7">
+                      <a-form-model-item prop="dealerProvinceSn" style="margin: 0;">
+                        <a-select v-model="queryParam.dealerProvinceSn" allowClear @change="getCityList" placeholder="请选择省">
+                          <a-select-option v-for="item in addrProvinceList" :value="item.id" :key="item.id + 'a'">{{ item.name }}</a-select-option>
+                        </a-select>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col span="7" offset="1">
+                      <a-form-model-item prop="dealerCitySn" style="margin: 0;">
+                        <a-select v-model="queryParam.dealerCitySn" allowClear @change="getAreaList" placeholder="请选择市">
+                          <a-select-option v-for="item in addrCityList" :value="item.id" :key="item.id + 'b'">{{ item.name }}</a-select-option>
+                        </a-select>
+                      </a-form-model-item>
+                    </a-col>
+                    <a-col span="7" offset="1">
+                      <a-form-model-item prop="dealerCountySn" style="margin: 0;">
+                        <a-select v-model="queryParam.dealerCountySn" allowClear placeholder="请选择区/县">
+                          <a-select-option v-for="item in addrDistrictList" :value="item.id" :key="item.id + 'c'">{{ item.name }}</a-select-option>
+                        </a-select>
+                      </a-form-model-item>
+                    </a-col>
+                  </a-form-model-item>
+                </a-row>
+              </a-col>
+            </template>
+            <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-button style="margin-left: 5px" type="primary" @click="handleSearch" :disabled="disabled" id="salesReturnDetailList-refresh">查询</a-button>
+              <a-button style="margin-left: 8px" @click="resetSearchForm" :disabled="disabled" id="salesReturnDetailList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 10px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_urchaseDetailReturn_export')"
+                id="salesReturnDetailList-export">导出</a-button>
+              <a @click="advanced=!advanced" style="margin-left: 5px">
+                {{ advanced ? '收起' : '展开' }}
+                <a-icon :type="advanced ? 'up' : 'down'"/>
+              </a>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ x: 2960 }"
+        :defaultLoadData="false"
+        bordered>
+        <!-- 附件 -->
+        <template slot="attachmentList" slot-scope="text, record">
+          <span v-if="record.attachmentList && record.attachmentList.length > 0">
+            <a
+              target="_blank"
+              style="color: #00aaff;text-decoration: underline;margin-right: 15px;"
+              :href="item.filePath"
+              v-for="item in record.attachmentList"
+              :key="item.id"
+            >
+              {{ item.fileName }}
+            </a>
+          </span>
+          <span v-else>--</span>
+        </template>
+        <!-- <template slot="footer" v-if="totalData && $hasPermissions('B_isShowCost')">
+          <a-row>
+            <a-col span="2">合计:</a-col>
+            <a-col span="22">
+              <a-row>
+                <a-col span="4" v-if="totalData && totalData.jpLqqAmount">箭牌滤清器:{{ totalData.jpLqqAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.jpBsxLqqAmount">箭牌变速箱滤清器:{{ totalData.jpBsxLqqAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.jpYgpAmount">箭牌雨刮片:{{ totalData.jpYgpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.jpLbAmount">箭牌喇叭:{{ totalData.jpLbAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.jpScpAmount">箭牌刹车片:{{ totalData.jpScpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.jpGyxAmount">箭牌感应线:{{ totalData.jpGyxAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.gpLqqAmount">冠牌滤清器:{{ totalData.gpLqqAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.gpYgpAmount">冠牌雨刮片:{{ totalData.gpYgpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.gpScpAmount">冠牌刹车片:{{ totalData.gpScpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.wsDhxqAmount">稳升点火线圈:{{ totalData.wsDhxqAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.wsDpAmount">稳升灯泡:{{ totalData.wsDpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.hjAmount">汇箭:{{ totalData.hjAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.dlsAmount">德路斯:{{ totalData.dlsAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.tbuAmount">TBU:{{ totalData.tbuAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.tbupAmount">TBU-P:{{ totalData.tbupAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.brsAmount">布瑞斯:{{ totalData.brsAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.ngkAmount">NGK:{{ totalData.ngkAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.flpAmount">飞利浦:{{ totalData.flpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.cpAmount">车仆:{{ totalData.cpAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.wetAmount">瓦尔塔:{{ totalData.wetAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.lbstAmount">雷贝斯托:{{ totalData.lbstAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.defAmount">德尔福:{{ totalData.defAmount }}</a-col>
+                <a-col span="4" v-if="totalData && totalData.bndAmount">巴诺德:{{ totalData.bndAmount }}</a-col>
+                <a-col span="6" v-if="totalData && totalData.totalAmount">实售销售合计金额:{{ totalData.totalAmount }}</a-col>
+              </a-row>
+            </a-col>
+          </a-row>
+        </template> -->
+        <template slot="footer">
+          <a-row :gutter="15">
+            <a-col :md="4" :sm="24">申请退货数量:{{ (totalData && (totalData.qty || totalData.qty==0)) ? totalData.qty : '--' }}</a-col>
+            <a-col :md="4" :sm="24" v-if="$hasPermissions('B_isShowCost')">退货金额:{{ (totalData && (totalData.totalCost || totalData.totalCost==0)) ? toThousands(totalData.totalCost,2) : '--' }}</a-col>
+          </a-row>
+        </template>
+      </s-table>
+    </a-spin>
+    <!-- 导出提示框 -->
+    <reportModal :visible="showExport" @close="showExport=false"></reportModal>
+  </a-card>
+</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 subarea from '@/views/common/subarea.js'
+import supplier from '@/views/common/supplier.js'
+import reportModal from '@/views/common/reportModal.vue'
+import { getArea } from '@/api/data'
+import { productBrandQuery } from '@/api/productBrand'
+import { productTypeQuery } from '@/api/productType'
+import ProductBrand from '@/views/common/productBrand.js'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { sparePartsReturnDetailReportList, sparePartsReturnDetailReportStat, sparePartsReturnReportExportDetail } from '@/api/reportData'
+export default {
+  name: 'UrchaseDetailReturnList',
+  mixins: [commonMixin],
+  components: { STable, VSelect, rangeDate, supplier, ProductBrand, reportModal },
+  data () {
+    return {
+      spinning: false,
+      advanced: false, // 高级搜索 展开/关闭
+      tableHeight: 0,
+      showExport: false,
+      queryParam: { //  查询条件
+        time: [
+          getDate.getCurrMonthDays().starttime,
+          getDate.getCurrMonthDays().endtime
+        ],
+        beginDate: getDate.getCurrMonthDays().starttime,
+        endDate: getDate.getCurrMonthDays().endtime,
+        sparePartsReturnNo: '', // 采购退货单号
+        supplierSn: '', // 供应商sn
+        returnReason: '',
+        productCode: '',
+        productName: '',
+        productBrandTypeSn: undefined,
+        productBrandSn: undefined, //  产品品牌
+        // productTypeSn1: '', //  产品一级分类
+        // productTypeSn2: '', //  产品二级分类
+        // productTypeSn3: '', //  产品三级分类
+        dealerProvinceSn: undefined,
+        dealerCitySn: undefined,
+        dealerCountySn: undefined
+      },
+      // productType: [],
+      rules: {
+        'time': [{ required: true, message: '请选择退货完成日期', trigger: 'change' }]
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      exportLoading: false,
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        const params = Object.assign(parameter, this.queryParam)
+        delete params.time
+        return sparePartsReturnDetailReportList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            this.getCount(params)
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      totalData: null,
+      addrProvinceList: [], //  省下拉
+      addrCityList: [], //  市下拉
+      addrDistrictList: [], //  区下拉
+      productBrandList: [], //  品牌下拉数据
+      productTypeList: [] //  分类下拉数据
+    }
+  },
+  computed: {
+    columns () {
+      const _this = this
+      const arr = [
+        { title: '采购退货单号', dataIndex: 'sparePartsReturnNo', width: 90, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '省份', dataIndex: 'supplier.provinceName', width: 80, align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '供应商名称', dataIndex: 'supplier.supplierName', width: 120, align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '退货原因', dataIndex: 'returnReasonDictValue', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '补充说明', dataIndex: 'explainInfo', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '附件', width: 100, align: 'center', scopedSlots: { customRender: 'attachmentList' } },
+        { title: '退货完成日期', dataIndex: 'auditDate', width: 100, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库单号', dataIndex: 'sparePartsNo', width: 90, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '品牌', dataIndex: 'product.productBrandName', width: 110, align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '二级分类', dataIndex: 'product.productTypeName2', width: 110, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '三级分类', dataIndex: 'product.productTypeName3', width: 110, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: 80, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'product.name', width: 150, align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '单位', dataIndex: 'product.unit', width: 50, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '批次号', dataIndex: 'stockBatchNo', width: 90, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '入库数量', dataIndex: 'putQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '已退数量', dataIndex: 'returnedQty', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '申请退货数量', dataIndex: 'qty', width: 100, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '操作员', dataIndex: 'submitorName', width: 80, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } }
+      ]
+
+      if (_this.$hasPermissions('B_isShowCost')) {
+        arr.splice(15, 0, { title: '入库单价', dataIndex: 'cost', width: 60, align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text, 2) : '--') } })
+        arr.splice(19, 0, { title: '退货金额', dataIndex: 'totalCost', width: 60, align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text, 2) : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    // 总计
+    getCount (params) {
+      sparePartsReturnDetailReportStat(params).then(res => {
+        if (res.status == 200 && res.data) {
+          this.totalData = res.data
+        } else {
+          this.totalData = null
+        }
+      })
+    },
+    handleSearch () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          _this.$refs.table.refresh(true)
+        } else {
+          return false
+        }
+      })
+    },
+    //  创建时间  change
+    dateChange (date) {
+      if (date[0] && date[1]) {
+        this.queryParam.time = date
+      } else {
+        this.queryParam.time = []
+      }
+      this.queryParam.beginDate = date[0] || ''
+      this.queryParam.endDate = date[1] || ''
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.time = [
+        getDate.getCurrMonthDays().starttime,
+        getDate.getCurrMonthDays().endtime
+      ]
+      this.$refs.rangeDate.resetDate(this.queryParam.time)
+      this.queryParam.beginDate = getDate.getCurrMonthDays().starttime
+      this.queryParam.endDate = getDate.getCurrMonthDays().endtime
+      this.queryParam.sparePartsReturnNo = ''
+      this.queryParam.productCode = ''
+      this.queryParam.productName = ''
+      this.queryParam.supplierSn = ''
+      this.queryParam.returnReason = undefined
+      this.queryParam.productBrandTypeSn = undefined
+      this.queryParam.productBrandSn = undefined
+      // this.queryParam.productTypeSn1 = ''
+      // this.queryParam.productTypeSn2 = ''
+      // this.queryParam.productTypeSn3 = ''
+      this.queryParam.dealerProvinceSn = undefined
+      this.queryParam.dealerCitySn = undefined
+      this.queryParam.dealerCountySn = undefined
+      // this.productType = []
+      this.totalData = null
+      this.$refs.ruleForm.resetFields()
+      this.$refs.table.clearTable()
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = _this.queryParam
+          _this.showExport = true
+          _this.exportLoading = true
+          _this.spinning = true
+          params.showCostFlag = _this.$hasPermissions('B_isShowCost') ? 1 : 0
+          hdExportExcel(sparePartsReturnReportExportDetail, params, '采购退货明细报表', function () {
+            _this.exportLoading = false
+            _this.spinning = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    //  产品分类  change
+    changeProductType (val, opt) {
+      this.queryParam.productTypeSn1 = val[0] ? val[0] : ''
+      this.queryParam.productTypeSn2 = val[1] ? val[1] : ''
+      this.queryParam.productTypeSn3 = val[2] ? val[2] : ''
+    },
+    //  产品品牌  列表
+    getProductBrand () {
+      productBrandQuery({}).then(res => {
+        if (res.status == 200) {
+          this.productBrandList = res.data
+        } else {
+          this.productBrandList = []
+        }
+      })
+    },
+    //  产品分类  列表
+    getProductType () {
+      productTypeQuery({}).then(res => {
+        if (res.status == 200) {
+          this.productTypeList = res.data
+        } else {
+          this.productTypeList = []
+        }
+      })
+    },
+    // 获取城市列表
+    getCityList (val) {
+      this.addrCityList = []
+      this.addrDistrictList = []
+      this.queryParam.dealerCitySn = undefined
+      this.queryParam.dealerCountySn = undefined
+      if (val) {
+        this.getArea('city', val)
+      }
+    },
+    // 获取区县列表
+    getAreaList (val) {
+      this.addrDistrictList = []
+      this.queryParam.dealerCountySn = undefined
+      if (val) {
+        this.getArea('district', val)
+      }
+    },
+    //  省/市/区
+    getArea (leve, sn) {
+      let params
+      if (leve == 'province') {
+        params = { type: '2' }
+      } else {
+        params = { parentId: sn, type: leve == 'city' ? '3' : '4' }
+      }
+      getArea(params).then(res => {
+        if (res.status == 200) {
+          if (leve == 'province') {
+            this.addrProvinceList = res.data || []
+          } else if (leve == 'city') {
+            this.addrCityList = res.data || []
+          } else if (leve == 'district') {
+            this.addrDistrictList = res.data || []
+          }
+        } else {
+          if (leve == 'province') {
+            this.addrProvinceList = []
+          } else if (leve == 'city') {
+            this.addrCityList = []
+          } else if (leve == 'district') {
+            this.addrDistrictList = []
+          }
+        }
+      })
+    },
+    pageInit () {
+      this.getProductBrand()
+      this.getProductType()
+      this.getArea('province')
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 253 - 0
src/views/reportData/urchaseReturn/list.vue

@@ -0,0 +1,253 @@
+<template>
+  <a-card size="small" :bordered="false" class="urchaseReturn-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div class="table-page-search-wrapper">
+        <a-form-model
+          id="urchaseReturn-form"
+          ref="ruleForm"
+          class="form-model-con"
+          layout="inline"
+          :model="queryParam"
+          :rules="rules"
+          @keyup.enter.native="handleSearch">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="退货完成日期" prop="time">
+                <rangeDate ref="rangeDate" :value="queryParam.time" @change="dateChange" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="采购退货单号">
+                <a-input id="urchaseReturnList-productCode" v-model.trim="queryParam.sparePartsReturnNo" allowClear placeholder="请输入采购退货单号"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-model-item label="供应商名称">
+                <supplier v-model="queryParam.supplierSn" placeholder="请输入供应商名称"></supplier>
+              </a-form-model-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="退货原因">
+                <v-select
+                  v-model="queryParam.returnReason"
+                  ref="returnReason"
+                  id="purchaseReturn-returnReason"
+                  code="SPARE_PARTS_RETURN_REASON"
+                  placeholder="请选择退货原因"
+                  allowClear></v-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="8" :sm="24" style="margin-bottom: 10px;">
+              <a-button style="margin-left: 5px" type="primary" @click="handleSearch" :disabled="disabled" id="urchaseReturn-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="urchaseReturn-reset">重置</a-button>
+              <a-button
+                style="margin-left: 5px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_urchaseReturn_Export')"
+                id="urchaseReturn-export">导出</a-button>
+            </a-col>
+          </a-row>
+        </a-form-model>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ x: 1740 }"
+        :defaultLoadData="false"
+        bordered>
+        <!-- 附件 -->
+        <template slot="attachmentList" slot-scope="text, record">
+          <span v-if="record.attachmentList && record.attachmentList.length > 0">
+            <a
+              target="_blank"
+              style="color: #00aaff;text-decoration: underline;margin-right: 15px;"
+              :href="item.filePath"
+              v-for="item in record.attachmentList"
+              :key="item.id"
+            >
+              {{ item.fileName }}
+            </a>
+          </span>
+          <span v-else>--</span>
+        </template>
+        <template slot="footer">
+          <a-row :gutter="15">
+            <a-col :md="4" :sm="24">申请退货数量:{{ (totalData && (totalData.totalQty || totalData.totalQty==0)) ? totalData.totalQty : '--' }}</a-col>
+            <a-col :md="4" :sm="24" v-if="$hasPermissions('B_isShowCost')">退货金额:{{ (totalData && (totalData.totalCost || totalData.totalCost==0)) ? totalData.totalCost : '--' }}</a-col>
+          </a-row>
+        </template>
+      </s-table>
+    </a-spin>
+    <!-- 导出提示框 -->
+    <reportModal :visible="showExport" @close="showExport=false"></reportModal>
+  </a-card>
+</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 supplier from '@/views/common/supplier.js'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { toThousands } from '@/libs/tools.js'
+import reportModal from '@/views/common/reportModal.vue'
+import { sparePartsReturnReportList, sparePartsReturnReportStat, sparePartsReturnReportExport } from '@/api/reportData'
+export default {
+  name: 'UrchaseReturn',
+  mixins: [commonMixin],
+  components: { STable, VSelect, rangeDate, supplier, reportModal },
+  data () {
+    return {
+      spinning: false,
+      exportLoading: false,
+      tableHeight: 0,
+      showExport: false,
+      queryParam: { //  查询条件
+        time: [
+          getDate.getCurrMonthDays().starttime,
+          getDate.getCurrMonthDays().endtime
+        ],
+        beginDate: getDate.getCurrMonthDays().starttime,
+        endDate: getDate.getCurrMonthDays().endtime,
+        sparePartsReturnNo: undefined,
+        supplierSn: undefined,
+        returnReason: undefined
+      },
+      rules: {
+        'time': [{ required: true, message: '请选择退货完成日期', trigger: 'change' }]
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        const params = Object.assign(parameter, this.queryParam)
+        delete params.time
+        return sparePartsReturnReportList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            this.getCount(params)
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      totalData: null
+    }
+  },
+  computed: {
+    columns () {
+      const arr = [
+        { title: '采购退货单号', dataIndex: 'sparePartsReturnNo', width: 160, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '退货完成日期', dataIndex: 'auditDate', width: 130, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '供应商名称', dataIndex: 'supplierName', width: 120, align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '退货原因', dataIndex: 'returnReasonDictValue', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '补充说明', dataIndex: 'explainInfo', width: 120, align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '附件', width: 120, align: 'center', scopedSlots: { customRender: 'attachmentList' } },
+        { title: '入库数量', dataIndex: 'totalPutQty', width: 90, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '申请退货数量', dataIndex: 'totalQty', width: 90, align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '操作员', dataIndex: 'submitorName', width: 130, align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) { //  售价权限
+        arr.splice(8, 0, { title: '退货金额', dataIndex: 'totalCost', width: 60, align: 'right', customRender: function (text) { return ((text || text == 0) ? toThousands(text, 2) : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    //  导出
+    handleExport () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = _this.queryParam
+          _this.showExport = true
+          _this.exportLoading = true
+          _this.spinning = true
+          params.showCostFlag = _this.$hasPermissions('B_isShowCost') ? 1 : 0
+          hdExportExcel(sparePartsReturnReportExport, params, '采购退货单报表', function () {
+            _this.exportLoading = false
+            _this.spinning = false
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    // 总计
+    getCount (params) {
+      sparePartsReturnReportStat(params).then(res => {
+        if (res.status == 200 && res.data) {
+          res.data.totalCost = res.data && (res.data.totalCost || res.data.totalCost == 0) ? toThousands(res.data.totalCost, 2) : '--'
+          this.totalData = res.data
+        } else {
+          this.totalData = null
+        }
+      })
+    },
+    handleSearch () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          _this.$refs.table.refresh(true)
+        } else {
+          return false
+        }
+      })
+    },
+    //  创建时间  change
+    dateChange (date) {
+      if (date[0] && date[1]) {
+        this.queryParam.time = date
+      } else {
+        this.queryParam.time = []
+      }
+      this.queryParam.beginDate = date[0] || ''
+      this.queryParam.endDate = date[1] || ''
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.time = [
+        getDate.getCurrMonthDays().starttime,
+        getDate.getCurrMonthDays().endtime
+      ]
+      this.$refs.rangeDate.resetDate(this.queryParam.time)
+      this.queryParam.beginDate = getDate.getCurrMonthDays().starttime
+      this.queryParam.endDate = getDate.getCurrMonthDays().endtime
+      this.queryParam.sparePartsReturnNo = ''
+      this.queryParam.supplierSn = undefined
+      this.queryParam.returnReason = undefined
+      this.totalData = null
+      this.$refs.ruleForm.resetFields()
+      this.$refs.table.clearTable()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.resetSearchForm()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 19 - 6
src/views/salesManagement/receiptPrint/list.vue

@@ -14,22 +14,22 @@
         <div ref="tableSearch" class="table-page-search-wrapper">
           <a-form layout="inline">
             <a-row :gutter="15">
-              <a-col :md="8" :sm="24">
+              <a-col :md="6" :sm="24">
                 <a-form-item label="允许打印时间">
                   <rangeDate ref="rangeDate" :value="time" @change="dateChange" />
                 </a-form-item>
               </a-col>
-              <a-col :md="8" :sm="24">
+              <a-col :md="5" :sm="24">
                 <a-form-item label="收款单号">
                   <a-input id="salesCollectionList-bookNo" v-model.trim="queryParam.bookNo" allowClear placeholder="请输入备货单号"/>
                 </a-form-item>
               </a-col>
-              <a-col :md="8" :sm="24">
+              <a-col :md="5" :sm="24">
                 <a-form-item label="客户名称">
                   <dealerSubareaScopeList ref="payerName" id="salesCollectionList-payerName" @change="custChange" />
                 </a-form-item>
               </a-col>
-              <a-col :md="8" :sm="24" v-if="currentTab == 1">
+              <a-col :md="4" :sm="24" v-if="currentTab == 1">
                 <a-form-item label="收款打印状态">
                   <v-select
                     v-model="queryParam.printStatus"
@@ -41,8 +41,19 @@
                   ></v-select>
                 </a-form-item>
               </a-col>
-              <a-col :offset="currentTab==2?8:0" :md="16" :sm="24">
-                <span style="float: right;" class="table-page-search-submitButtons">
+              <a-col :md="4" :sm="24">
+                <a-form-item label="足额打款">
+                  <v-select
+                    v-model="queryParam.fullPaymentFlag"
+                    ref="fullPaymentFlag"
+                    id="salesCollectionList-fullPaymentFlag"
+                    code="FLAG"
+                    placeholder="请选择是否足额打款"
+                    allowClear></v-select>
+                </a-form-item>
+              </a-col>
+              <a-col :md="currentTab==2?4:24" :sm="24">
+                <span style="float:right;" class="table-page-search-submitButtons">
                   <a-button type="primary" :disabled="disabled" @click="$refs.table.refresh(true)">查询</a-button>
                   <a-button style="margin-left: 8px" :disabled="disabled" @click="resetSearchForm()">重置</a-button>
                 </span>
@@ -146,6 +157,7 @@ export default {
         subareaSn: undefined,
         billStatus: undefined,
         dealerProvinceSn: undefined,
+        fullPaymentFlag:undefined,
         printStatus: 'NO_PRINT'
       },
       totalData: {
@@ -341,6 +353,7 @@ export default {
         subareaSn: undefined,
         billStatus: undefined,
         dealerProvinceSn: undefined,
+        fullPaymentFlag:undefined,
         printStatus: this.currentTab == 2 ? 'NO_PRINT' : undefined
       }
       this.$refs.table.refresh(true)

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

@@ -487,6 +487,8 @@ export default {
           this.spinning = false
         }
         this.isInster = false
+      }).catch(err => {
+        this.isInster = false
       })
     },
     //  销售单详情

+ 32 - 2
src/views/salesReturnManagement/receiveCheck/list.vue

@@ -77,10 +77,25 @@
               v-if="record.billStatus == 'WAIT_CHECK'&&$hasPermissions('B_salesReturnCheck')"
               @click="handleCheck(record)"
               id="salesReturn-eexamine-btn">品检</a-button>
+              <a-button
+                size="small"
+                type="link"
+                class="button-warning"
+                @click="handleOpenPrintModal(record)"
+                id="salesReturn-print-btn">打印</a-button>
           </div>
         </template>
       </s-table>
     </a-spin>
+    <commonModal
+      modalTit="品检打印预览"
+      bodyPadding="10px"
+      width="700pt"
+      :showFooter="false"
+      :openModal="showTipModal"
+      @cancel="canselPrintView">
+      <printModal ref="printModel" @cancel="showTipModal=false"></printModal>
+    </commonModal>
   </a-card>
 </template>
 
@@ -91,6 +106,8 @@ import dealerSubareaScopeList from '@/views/common/dealerSubareaScopeList.vue'
 import employee from '../../expenseManagement/expenseReimbursement/employee.js'
 import rangeDate from '@/views/common/rangeDate.vue'
 import { salesReturnList } from '@/api/salesReturn'
+import printModal from './printModal.vue'
+import commonModal from '@/views/common/commonModal.vue'
 export default {
   name: 'ReceiveCheckList',
   mixins: [commonMixin],
@@ -99,7 +116,9 @@ export default {
     VSelect,
     dealerSubareaScopeList,
     employee,
-    rangeDate
+    rangeDate,
+    printModal,
+    commonModal
   },
   data () {
     return {
@@ -139,7 +158,8 @@ export default {
       },
       visibleAudit: false,
       auditInfo: null,
-      spinningAudit: false
+      spinningAudit: false,
+      showTipModal:false
     }
   },
   computed: {
@@ -200,6 +220,16 @@ export default {
     setTableH () {
       const tableSearchH = this.$refs.tableSearch.offsetHeight
       this.tableHeight = window.innerHeight - tableSearchH - 175
+    },
+    canselPrintView () {
+      this.showTipModal = false
+      this.$refs.printModel.handleCommonCancel()
+    },
+    handleOpenPrintModal(row){
+      this.showTipModal=true
+      this.$nextTick(() => {
+        this.$refs.printModel.getData(row)
+      })
     }
   },
   watch: {

+ 152 - 0
src/views/salesReturnManagement/receiveCheck/printModal.vue

@@ -0,0 +1,152 @@
+<template>
+  <div>
+    <a-spin :spinning="spinning" tip="Loading..." style="width: 100%;padding:20px 40px;">
+      <div style="height: 60vh;overflow: auto;">
+      <div id="sendGood-print" v-if="detailData">
+        <div class="sendGood-print-box" style="width:564pt;margin:0 auto;">
+          <table ref="printBox" cellspacing="0" cellpadding="0" style="border-collapse: collapse;width: 564pt;font-size:14px;">
+            <tr>
+              <td>
+                <div class="print-box" style="width: 564pt;margin-left:1.5pt;">
+                  <div style="text-align:center;margin:15pt 0 5pt;font-size:22px;font-weight: bold;">箭冠退货单</div>
+                  <div style="display:flex;align-item:center;justify-content: space-between;flex-wrap: wrap;line-height: 20pt;margin:15pt 0;">
+                    <div style="width: 100%;">客户名称:{{ detailData.buyerName||'--' }}</div>
+                    <div style="width: 50%;">退货单号:{{ detailData.salesReturnBillNo||'--' }}</div>
+                    <div style="width: 50%;">退货日期:{{ detailData.auditTime||'--' }}</div>
+                  </div>
+                  <div>
+                    <div>
+                      <table border="1" style="width: 564pt;border-collapse: collapse;text-align: center;">
+                        <tr>
+                          <th style="line-height: 20pt;width: 40pt;background:#f6f6f6;">序号</th>
+                          <th style="line-height: 20pt;width: 65pt;background:#f6f6f6;">产品编码</th>
+                          <th style="line-height: 20pt;width: 80pt;background:#f6f6f6;">产品名称</th>
+                          <th style="line-height: 20pt;width: 40pt;background:#f6f6f6;">单位</th>
+                          <th style="line-height: 20pt;width: 58pt;background:#f6f6f6;">退货数量</th>
+                          <th style="line-height: 20pt;width: 58pt;background:#f6f6f6;">实收数量</th>
+                          <th style="line-height: 20pt;width: 66pt;background:#f6f6f6;">退货原因</th>
+                          <th style="line-height: 20pt;width: 80pt;background:#f6f6f6;">实际原因</th>
+                          <th style="line-height: 20pt;width: 78pt;background:#f6f6f6;">备注</th>
+                        </tr>
+                        <tr v-for="(item,index) in list" :key="item.id">
+                          <td style="padding:3pt;width: 34pt;">{{index+1}}</td>
+                          <td style="padding:3pt;width: 59pt;text-align:center;">{{ item.productEntity.code }}</td>
+                          <td style="padding:3pt;width: 74pt;text-align:center;word-break:break-all;">{{ item.productEntity.name }}</td>
+                          <td style="padding:3pt;width: 34pt;text-align:center;">{{ item.productEntity.unit }}</td>
+                          <td style="padding:3pt;width: 52pt;text-align:center;">{{ item.initialQty }}</td>
+                          <td style="padding:3pt;width: 52pt;text-align:center;"></td>
+                          <td style="padding:3pt;width: 60pt;text-align:center;word-break:break-all;">{{ item.returnReason }}</td>
+                          <td style="padding:3pt;width: 74pt;text-align:center;word-break:break-all;"></td>
+                          <td style="padding:3pt;width: 72pt;word-break:break-all;"></td>
+                        </tr>
+                        </table>
+                        <table border="0" style="width: 564pt;border-collapse: collapse;text-align: center;margin-top:5pt;">
+                        <tr>
+                          <td style="padding:3pt;width: 34pt;border:0;">&nbsp;</td>
+                          <td style="padding:3pt;width: 59pt;border:0;">&nbsp;</td>
+                          <td style="padding:3pt;width: 74pt;border:0;">&nbsp;</td>
+                          <td style="padding:3pt;width: 34pt;text-align:center;border:0;">合计:</td>
+                          <td style="padding:3pt;width: 52pt;text-align:center;border:0;">{{ totalNums }}</td>
+                          <td style="padding:3pt;width: 52pt;border:0;">&nbsp;</td>
+                          <td style="padding:3pt;width: 60pt;border:0;">&nbsp;</td>
+                          <td style="padding:3pt;width: 74pt;border:0;">&nbsp;</td>
+                          <td style="padding:3pt;width: 72pt;border:0;">&nbsp;</td>
+                        </tr>
+                      </table>
+                    </div>
+                  </div>
+                </div>
+              </td>
+            </tr>
+          </table>
+        </div>
+      </div>
+      </div>
+      <div class="btn-box" style="display:flex;align-item:center;justify-content: center;">
+        <a-button @click="handleCommonCancel">取消</a-button>
+        <a-button :loading="spinning" type="primary" @click="handleCommonOk">立即打印</a-button>
+      </div>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { jGPrint } from '@/libs/JGPrint.js';
+import { salesReturnDetail } from '@/api/salesReturn'
+import { salesReturnDetailList } from '@/api/salesReturnDetail'
+export default {
+  data() {
+    return {
+      spinning: false,
+      detailData: null,
+      list: [],
+      printNums: []
+    };
+  },
+  computed: {
+    totalNums() {
+      let ret = 0
+      this.list.map(item => {
+        ret = ret + item.initialQty
+      })
+      return ret
+    }
+  },
+  methods: {
+    //  详情
+    getDetail () {
+      this.spinning = true
+      salesReturnDetail({ sn: this.salesReturnBillSn }).then(res => {
+        if (res.status == 200) {
+          this.detailData = res.data
+        } else {
+          this.detailData = null
+        }
+        this.spinning = false
+      })
+    },
+    // 明细列表
+    getDetailList(){
+      salesReturnDetailList({
+        pageNo:1,
+        pageSize: 999999,
+        salesReturnBillSn: this.salesReturnBillSn
+      }).then(res => {
+        if (res.status == 200) {
+          this.list = res.data.list
+        } else {
+          this.list = null
+        }
+      })
+    },
+    handleCommonOk() {
+      const _this = this;
+      const html = document.getElementById('sendGood-print').innerHTML;
+      _this.spinning = true
+      jGPrint(
+        html,
+        'print',
+        function(res) {
+          _this.spinning = false
+          _this.$emit('printOk');
+        },
+      );
+    },
+    getData(data) {
+       this.salesReturnBillSn = data.salesReturnBillSn
+       this.getDetail()
+       this.getDetailList()
+    },
+    handleCommonCancel() {
+      this.$emit('cancel');
+      this.clearData();
+    },
+    clearData() {
+      this.detailData = null;
+      this.list = [];
+    }
+  }
+};
+</script>
+
+<style></style>

+ 14 - 20
src/views/supplierManagement/associatedProduct/add.vue

@@ -14,35 +14,29 @@
         <div ref="tableSearch" class="table-page-search-wrapper">
           <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
             <a-row :gutter="15">
-              <a-col :md="6" :sm="24">
+              <a-col :md="5" :sm="24">
                 <a-form-item label="产品名称">
                   <a-input id="associatedProduct-name" v-model.trim="queryParam.product.name" allowClear placeholder="请输入产品名称"/>
                 </a-form-item>
               </a-col>
-              <a-col :md="6" :sm="24">
+              <a-col :md="5" :sm="24">
                 <a-form-item label="产品编码/原厂编码">
                   <a-input id="associatedProduct-queryWord" v-model.trim="queryParam.product.queryWord" allowClear placeholder="请输入产品编码/原厂编码"/>
                 </a-form-item>
               </a-col>
-              <a-col :md="6" :sm="24">
+              <a-col :md="5" :sm="24">
                 <a-form-item label="品牌">
                   <ProductBrand id="associatedProduct-productBrandSn" v-model="queryParam.product.productBrandSn"></ProductBrand>
                 </a-form-item>
               </a-col>
-              <template v-if="advanced">
-                <a-col :md="6" :sm="24">
-                  <a-form-item label="产品分类">
-                    <ProductType id="associatedProduct-productType" v-model="productType" @change="changeProductType"></ProductType>
-                  </a-form-item>
-                </a-col>
-              </template>
-              <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-col :md="5" :sm="24">
+                <a-form-item label="产品分类">
+                  <ProductType id="associatedProduct-productType" v-model="productType" @change="changeProductType"></ProductType>
+                </a-form-item>
+              </a-col>
+              <a-col :md="4" :sm="24" style="margin-bottom: 10px;">
                 <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="associatedProduct-refresh">查询</a-button>
                 <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="associatedProduct-reset">重置</a-button>
-                <a @click="advanced=!advanced" style="margin-left: 5px">
-                  {{ advanced ? '收起' : '展开' }}
-                  <a-icon :type="advanced ? 'up' : 'down'"/>
-                </a>
               </a-col>
             </a-row>
           </a-form>
@@ -77,12 +71,12 @@
           </template>
           <!-- 操作 -->
           <template slot="action" slot-scope="text, record">
-            <a-button
+            <!-- <a-button
               size="small"
               type="link"
               class="button-info"
               @click="handleSetPrice(record)"
-              id="associatedProduct-setCostPrice-btn">设置成本价</a-button>
+              id="associatedProduct-setCostPrice-btn">设置成本价</a-button> -->
             <a-button
               size="small"
               type="link"
@@ -169,9 +163,9 @@ export default {
         // { title: '成本价', dataIndex: 'cost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '操作', scopedSlots: { customRender: 'action' }, width: '13%', align: 'center' }
       ]
-      if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
-        arr.splice(6, 0, { title: '成本价', dataIndex: 'cost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
-      }
+      // if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
+      //   arr.splice(6, 0, { title: '成本价', dataIndex: 'cost', width: '10%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+      // }
       return arr
     }
   },

+ 4 - 4
src/views/supplierManagement/associatedProduct/chooseImportModal.vue

@@ -88,15 +88,15 @@ export default {
       nowColumns: [ //  可导入
         { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: '30%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'product.name', width: '30%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
-        { title: '成本', dataIndex: 'costText', width: '20%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '产品名称', dataIndex: 'product.name', width: '50%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        // { title: '成本', dataIndex: 'costText', width: '20%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '单位', dataIndex: 'product.unit', width: '10%', align: 'center', customRender: function (text) { return text || '--' } }
       ],
       nowUnColumns: [ //  不可导入
         { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
         { title: '产品编码', dataIndex: 'productCode', width: '25%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '产品名称', dataIndex: 'product.name', width: '25%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
-        { title: '成本', dataIndex: 'costText', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
+        { title: '产品名称', dataIndex: 'product.name', width: '40%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        // { title: '成本', dataIndex: 'costText', width: '15%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } },
         { title: '单位', dataIndex: 'product.unit', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
         { title: '备注', dataIndex: 'errorDesc', width: '15%', align: 'center', customRender: function (text) { return text || '--' } }
       ],

+ 2 - 2
src/views/supplierManagement/associatedProduct/importGuideModal.vue

@@ -15,8 +15,8 @@
             <span>1</span>准备导入
           </div>
           <ul>
-            <li>1) 导入的Excel文件中必须包含名为“产品编码”、“成本”的列,且名称必须相同</li>
-            <li>2) 除了“产品编码”、“成本”两列,其他列可自定义,不影响数据导入</li>
+            <li>1) 导入的Excel文件中必须包含名为“产品编码”的列,且名称必须相同</li>
+            <li>2) 除了“产品编码”列,其他列可自定义,不影响数据导入</li>
             <li>3) 如果导入的产品已经存在,则不会导入该行</li>
           </ul>
           <a-button type="link" icon="download" style="padding: 0 0 0 23px;" :loading="exportLoading" @click="handleExport">下载导入模板</a-button>

+ 3 - 3
src/views/supplierManagement/associatedProduct/settingCost.vue

@@ -17,10 +17,10 @@
           :label-col="labelCol"
           :wrapper-col="wrapperCol"
         >
-          <a-form-model-item label="产品名称">
-            {{ productName }}
+          <a-form-model-item style="margin-bottom:10px;" label="产品名称">
+            <div style="line-height:normal;padding-top:11px;">{{ productName }}</div>
           </a-form-model-item>
-          <a-form-model-item label="产品编码">
+          <a-form-model-item style="margin-bottom:10px;" label="产品编码">
             {{ productCode }}
           </a-form-model-item>
           <a-form-model-item label="成本价" prop="cost">

+ 2 - 1
src/views/supplierManagement/associatedProductDetails/list.vue

@@ -115,6 +115,7 @@ export default {
   },
   computed: {
     columns () {
+      const _this = this
       const arr = [
         { title: '序号', dataIndex: 'no', width: '4%', align: 'center' },
         { title: '供应商名称', dataIndex: 'supplierName', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
@@ -126,7 +127,7 @@ export default {
         { title: '原厂编码', dataIndex: 'product.origCode', width: '8%', align: 'center', customRender: function (text) { return text || '--' } }
       ]
       if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
-        arr.splice(6, 0, { title: '成本价(¥)', dataIndex: 'cost', width: '6%', align: 'center', customRender: function (text) { return ((text || text == 0) ? text : '--') } })
+        arr.splice(6, 0, { title: '成本价(¥)', dataIndex: 'cost', width: '6%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } })
       }
       return arr
     }

+ 208 - 0
src/views/supplierManagement/costSetRecord/list.vue

@@ -0,0 +1,208 @@
+<template>
+  <a-card size="small" :bordered="false" class="costSetRecordList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品名称">
+                <a-input id="costSetList-productName" v-model.trim="queryParam.product.name" allowClear placeholder="请输入产品名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品编码/原厂编码">
+                <a-input id="costSetList-productCode" v-model.trim="queryParam.product.queryWord" allowClear placeholder="请输入产品编码"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="品牌">
+                <ProductBrand id="costSetRecord-productBrandSn" v-model="queryParam.product.productBrandSn"></ProductBrand>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品分类">
+                <ProductType id="costSetRecord-productType" v-model="productType" @change="changeProductType"></ProductType>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="供应商名称">
+                <a-input id="costSetList-productName" v-model.trim="queryParam.supplierName" allowClear placeholder="请输入供应商名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="costSetList-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="costSetList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 10px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_costSetRecordExport')"
+                id="costSetDetailList-export">导出</a-button>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px' }"
+        size="small"
+        :rowKey="(record) => record.id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+        <!-- 产品分类 -->
+        <template slot="productType" slot-scope="text, record">
+          <span v-if="record.product&&(record.product.productTypeName2 || record.product.productTypeName3)">{{ record.product.productTypeName2 }} {{ record.product.productTypeName3 ? '>' : '' }} {{ record.product.productTypeName3 }}</span>
+          <span v-else>--</span>
+        </template>
+      </s-table>
+    </a-spin>
+  </a-card>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { STable, VSelect } from '@/components'
+import { hdExportExcel } from '@/libs/exportExcel'
+import ProductType from '@/views/common/productType.js'
+import ProductBrand from '@/views/common/productBrand.js'
+import { supplierProductCostLogList,supplierProductCostLogExport } from '@/api/supplier'
+export default {
+  name: 'costSetRecordList',
+  mixins: [commonMixin],
+  components: { STable, VSelect, ProductBrand, ProductType },
+  data () {
+    const _this = this
+    return {
+      spinning: false,
+      advanced: true, // 高级搜索 展开/关闭
+      tableHeight: 0,
+      queryParam: { //  查询条件
+        supplierName: '',
+        product: {
+          name: '', //  产品名称
+          queryWord: '', // 产品编码/原厂编码
+          productBrandSn: undefined, //  产品品牌
+          productTypeSn1: '', //  产品一级分类
+          productTypeSn2: '', //  产品二级分类
+          productTypeSn3: '' //  产品三级分类
+        }
+      },
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '4%', align: 'center' },
+        { title: '变更时间', dataIndex: 'auditTime', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'product.name', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'product.code', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '原厂编码', dataIndex: 'product.origCode', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品品牌', dataIndex: 'product.productBrandName', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: '12%', align: 'center' },
+        { title: '供应商名称', dataIndex: 'supplierName', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '变更前', dataIndex: 'oldCost', width: '7%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } },
+        { title: '变更后', dataIndex: 'newCost', width: '7%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } }
+
+      ],
+      disabled: false, //  查询、重置按钮是否可操作
+      productType: [],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        return supplierProductCostLogList(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  methods: {
+    // 导出明细
+    handleExport () {
+      const _this = this
+      const params = _this.queryParam
+      _this.exportLoading = true
+      _this.spinning = true
+      hdExportExcel(supplierProductCostLogExport, params, '成本变更记录', function () {
+        _this.exportLoading = false
+        _this.spinning = false
+      })
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.supplierName = ''
+      this.queryParam.product.name = ''
+      this.queryParam.product.queryWord = ''
+      this.queryParam.product.productBrandSn = undefined
+      this.queryParam.product.productTypeSn1 = ''
+      this.queryParam.product.productTypeSn2 = ''
+      this.queryParam.product.productTypeSn3 = ''
+      this.productType = []
+      this.$refs.table.refresh(true)
+    },
+    //  产品分类  change
+    changeProductType (val, opt) {
+      this.queryParam.product.productTypeSn1 = val[0] ? val[0] : ''
+      this.queryParam.product.productTypeSn2 = val[1] ? val[1] : ''
+      this.queryParam.product.productTypeSn3 = val[2] ? val[2] : ''
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 195
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+    // 仅刷新列表,不重置页面
+    if (this.$store.state.app.updateList) {
+      this.pageInit()
+      this.$refs.table.refresh()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 346 - 0
src/views/supplierManagement/costSetting/addProductModal.vue

@@ -0,0 +1,346 @@
+<template>
+  <a-modal
+    centered
+    class="chooseProducts-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="新增"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="900">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div class="products-con">
+        <div style="display:flex;align-items: center;padding:10px 0;">
+          <div style="font-size:14px;"><span style="color:red;">*</span>供应商名称:</div>
+          <div style="flex-grow: 1;">
+            <supplier style="width:50%" ref="supplier" v-model="supplierSn" @change="getChoosed" placeholder="请输入供应商名称搜索"></supplier>
+          </div>
+        </div>
+        <div style="padding:10px 0;border-bottom: 1px solid #eee;">
+          <span style="font-size:14px;">选择产品</span>
+          <span style="font-weight: bold;" v-if="rowSelectionInfo&&rowSelectionInfo.selectedRowKeys.length">
+            (已选:{{ rowSelectionInfo&&rowSelectionInfo.selectedRowKeys.length||0 }}个)
+          </span>
+        </div>
+        <div style="padding:15px 0 0;">
+          <!-- 搜索条件 -->
+          <div class="table-page-search-wrapper">
+            <a-form-model
+              ref="ruleForm"
+              class="form-model-con"
+              layout="inline"
+              :model="queryParam"
+              :rules="rules"
+              @keyup.enter.native="handleSearch"
+              :label-col="formItemLayout.labelCol"
+              :wrapper-col="formItemLayout.wrapperCol">
+              <a-row :gutter="15">
+                <a-col :md="6" :sm="24">
+                  <a-form-model-item label="产品编码" prop="code">
+                    <a-input id="chooseProducts-code" v-model.trim="queryParam.code" allowClear placeholder="请输入产品编码"/>
+                  </a-form-model-item>
+                </a-col>
+                <a-col :md="6" :sm="24">
+                  <a-form-model-item label="产品品牌">
+                    <a-select
+                      placeholder="请选择产品品牌"
+                      id="chooseProducts-productBrandSn"
+                      allowClear
+                      v-model="queryParam.productBrandSn"
+                      :showSearch="true"
+                      option-filter-prop="children"
+                      :filter-option="filterOption">
+                      <a-select-option v-for="item in productBrandList" :key="item.brandSn" :value="item.brandSn">{{ item.brandName }}</a-select-option>
+                    </a-select>
+                  </a-form-model-item>
+                </a-col>
+                <a-col :md="6" :sm="24">
+                  <a-form-model-item label="产品分类">
+                    <a-cascader
+                      @change="changeProductType"
+                      change-on-select
+                      v-model="queryParam.productType"
+                      expand-trigger="hover"
+                      :options="productTypeList"
+                      :fieldNames="{ label: 'productTypeName', value: 'productTypeSn', children: 'children' }"
+                      id="chooseProducts-productType"
+                      placeholder="请选择产品分类"
+                      allowClear />
+                  </a-form-model-item>
+                </a-col>
+                <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+                  <a-button type="primary" @click="handleSearch" :disabled="disabled" id="chooseProducts-refresh">查询</a-button>
+                  <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="chooseProducts-reset">重置</a-button>
+                </a-col>
+              </a-row>
+            </a-form-model></a-form>
+          </div>
+          <!-- 列表 -->
+          <s-table
+            class="sTable"
+            ref="table"
+            size="small"
+            :rowKey="(record) => record.productSn"
+            rowKeyName="productSn"
+            :row-selection="{ columnWidth: 40, getCheckboxProps:record =>({props: { disabled: this.chooseData && this.chooseData.indexOf(record.productSn) > -1 }}) }"
+            @rowSelection="rowSelectionFun"
+            :columns="columns"
+            :data="loadData"
+            :defaultLoadData="false"
+            bordered>
+          </s-table>
+        </div>
+        <!-- 按钮 -->
+        <div class="btn-con">
+          <a-button
+            type="primary"
+            id="chooseProducts-save"
+            size="large"
+            class="button-primary"
+            @click="handleSave"
+            style="padding: 0 60px;">保存</a-button>
+          <a-button
+            id="chooseProducts-cancel"
+            size="large"
+            class="button-cancel"
+            @click="isShow=false"
+            style="padding: 0 60px;margin-left: 15px;">取消</a-button>
+        </div>
+      </div>
+    </a-spin>
+  </a-modal>
+</template>
+
+<script>
+import { STable } from '@/components'
+import { productBrandQuery } from '@/api/productBrand'
+import { productTypeQuery, productTypeQueryAll } from '@/api/productType'
+import supplier from '@/views/common/supplier.js'
+import { addProduct, supplierProductSnList } from '@/api/supplier'
+import { productPricingList } from '@/api/product'
+export default {
+  name: 'ChooseProductsModal',
+  components: { STable, supplier },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    type: { //  类型,经销权设置dealership,  供应商添加产品supplier
+      type: String,
+      default: 'supplier'
+    },
+    dealerSn: {
+      type: String || Number,
+      default: ''
+    }
+  },
+  data () {
+    return {
+      spinning: false,
+      isShow: this.openModal, //  是否打开弹框
+      formItemLayout: {
+        labelCol: { span: 4 },
+        wrapperCol: { span: 20 }
+      },
+      supplierSn: undefined, // 供应商sn
+      queryParam: { //  查询条件
+        code: '', //  产品编码
+        productBrandSn: undefined, //  产品品牌
+        productType: [],
+        productTypeSn1: '', //  产品一级分类
+        productTypeSn2: '', //  产品二级分类
+        productTypeSn3: '' //  产品三级分类
+      },
+      rules: {
+        productBrandSn: [ { required: true, message: '请选择产品品牌', trigger: 'change' } ],
+        productType: [ { required: true, message: '请选择产品分类', trigger: 'change' } ]
+      },
+      chooseData: [], // 已选产品
+      disabled: false, //  查询、重置按钮是否可操作
+      loading: false, //  表格加载中
+      columns: [
+        { title: '序号', dataIndex: 'no', width: 80, align: 'center' },
+        { title: '产品编码', dataIndex: 'code', align: 'center' },
+        { title: '产品名称', dataIndex: 'name', align: 'center', ellipsis: true, customRender: function (text) { return text || '--' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        const params = Object.assign(parameter, this.queryParam)
+        return productPricingList(params).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      productBrandList: [], //  品牌下拉数据
+      productTypeList: [], //  分类下拉数据
+      rowSelectionInfo: null
+    }
+  },
+  methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
+    // 查询所有已选sn
+    getChoosed () {
+      this.spinning = true
+      supplierProductSnList({ sn: this.supplierSn }).then(res => {
+        if (res.status == 200) {
+          this.$refs.table.clearTable()
+          this.chooseData = res.data //  包含先前所选产品
+          this.handleSearch()
+        }
+        this.spinning = false
+      })
+    },
+    // 查询
+    handleSearch () {
+      const _this = this
+      _this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          if (_this.supplierSn) {
+            _this.$refs.table.refresh(true)
+          } else {
+            _this.$message.warning('请先选择供应商!')
+          }
+        } else {
+          return false
+        }
+      })
+    },
+    // 重置数据
+    resetData () {
+      this.queryParam.code = ''
+      this.queryParam.productBrandSn = undefined
+      this.queryParam.productTypeSn1 = ''
+      this.queryParam.productTypeSn2 = ''
+      this.queryParam.productTypeSn3 = ''
+      this.queryParam.productType = []
+      // this.supplierSn = undefined  //供应商sn
+    },
+    //  重置
+    resetSearchForm () {
+      this.resetData()
+      // this.$refs.table.clearTable()
+      this.$refs.table.refresh(true)
+    },
+    // 保存
+    handleSave () {
+      const _this = this
+      if (!this.supplierSn) {
+        this.$message.warning('请先选择供应商!')
+        return
+      }
+      if (!this.rowSelectionInfo || (this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.length < 1)) {
+        this.$message.warning('请选择产品!')
+        return
+      }
+      const arr = []
+      this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys.map(item => {
+        if (_this.chooseData.indexOf(item) == -1) {
+          arr.push(item)
+        }
+      })
+      if (arr.length) {
+        this.addProduct(arr)
+      } else {
+        this.$message.warning('请选择产品!')
+      }
+    },
+    // 添加产品  数据处理
+    addProduct (arr) {
+      this.spinning = true
+      addProduct({
+        supplierSn: this.supplierSn,
+        productSnList: arr
+      }).then(res => {
+        if (res.status == 200) {
+          this.$emit('ok')
+          this.isShow = false
+        }
+        this.spinning = false
+      })
+    },
+    //  产品分类  change
+    changeProductType (val, opt) {
+      this.queryParam.productTypeSn1 = val[0] ? val[0] : ''
+      this.queryParam.productTypeSn2 = val[1] ? val[1] : ''
+      this.queryParam.productTypeSn3 = val[2] ? val[2] : ''
+    },
+    filterOption (input, option) {
+      return (
+        option.componentOptions.children[0].text.toLowerCase().indexOf(input.toLowerCase()) >= 0
+      )
+    },
+    //  产品品牌  列表
+    getProductBrand () {
+      productBrandQuery({}).then(res => {
+        if (res.status == 200) {
+          this.productBrandList = res.data
+        } else {
+          this.productBrandList = []
+        }
+      })
+    },
+    //  产品分类  列表
+    getProductType () {
+      productTypeQuery({}).then(res => {
+        if (res.status == 200) {
+          this.productTypeList = res.data
+        } else {
+          this.productTypeList = []
+        }
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.$refs.table.clearTable()
+        this.chooseData = []
+        this.supplierSn = undefined
+        this.resetData()
+      } else {
+        if (this.productBrandList.length == 0) {
+          this.getProductBrand()
+        }
+        if (this.productTypeList.length == 0) {
+          this.getProductType()
+        }
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .chooseProducts-modal{
+    .products-con{
+      .btn-con{
+        text-align: center;
+        margin: 30px 0 20px;
+        .button-cancel{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 191 - 0
src/views/supplierManagement/costSetting/chooseImportModal.vue

@@ -0,0 +1,191 @@
+<template>
+  <a-modal
+    centered
+    class="chooseImport-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="导入"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="900">
+    <div class="chooseImport-con">
+      <!-- 可导入数据 -->
+      <p class="">可导入数据{{ loadData.length }}条</p>
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.supplierSn"
+        :columns="nowColumns"
+        :dataSource="loadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <a-divider />
+      <!-- 不可导入数据 -->
+      <p class="red">不可导入数据{{ unLoadData.length }}条</p>
+      <a-table
+        class="sTable"
+        ref="unTable"
+        size="small"
+        :rowKey="(record) => record.errorDesc"
+        :columns="nowUnColumns"
+        :dataSource="unLoadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="chooseImport-submit"
+          size="large"
+          :class="loadData.length==0?'button-grey':'button-primary'"
+          @click="handleSubmit"
+          style="padding: 0 40px;">确认导入</a-button>
+        <a-button
+          id="chooseImport-cancel"
+          size="large"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 40px;margin-left: 15px;">取消</a-button>
+        <a-button
+          type="primary"
+          id="chooseImport-error"
+          size="large"
+          class="button-error"
+          @click="handleError"
+          style="padding: 0 40px;margin-left: 15px;">导出错误项</a-button>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { hdExportExcel } from '@/libs/exportExcel'
+import { supplierProductParseNewProducts, supplierProductailNewExcel } from '@/api/supplier'
+export default {
+  mixins: [commonMixin],
+  name: 'ChooseImportModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    paramsData: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data () {
+    const _this = this
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      nowColumns: [ //  可导入
+        { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
+        { title: '供应商名称', dataIndex: 'supplierName', width: '25%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'product.name', width: '30%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '成本价', dataIndex: 'costText', width: '15%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } }
+      ],
+      nowUnColumns: [ //  不可导入
+        { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
+        { title: '供应商名称', dataIndex: 'supplierName', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'productCode', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品名称', dataIndex: 'product.name', width: '25%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '成本价', dataIndex: 'costText', width: '15%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } },
+        { title: '备注', dataIndex: 'importErrorMsgList', width: '15%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      loadData: [],
+      unLoadData: [],
+      loading: false
+    }
+  },
+  methods: {
+    getData () {
+      const _this = this
+      this.loading = true
+      supplierProductParseNewProducts(this.paramsData).then(res => {
+        this.loading = false
+        if (res.status == 200) {
+          if (res.data.okList && res.data.okList.length > 0) {
+            res.data.okList.map((item, index) => {
+              item.no = index + 1
+              item.costText = item.costText instanceof Number ? Number(item.costText).toFixed(2) : item.costText
+            })
+          }
+          if (res.data.failList && res.data.failList.length > 0) {
+            res.data.failList.map((item, index) => {
+              item.no = index + 1
+              item.costText = item.costText instanceof Number ? Number(item.costText).toFixed(2) : item.costText
+            })
+          }
+          _this.loadData = res.data.okList || []
+          _this.unLoadData = res.data.failList || []
+        }
+      })
+    },
+    // 确认导入
+    handleSubmit () {
+      if (this.loadData.length == 0) {
+        this.$message.warning('无可导入产品!')
+      } else {
+        this.$emit('ok', this.loadData)
+        this.isShow = false
+      }
+    },
+    // 导出
+    handleError () {
+      const _this = this
+      if (_this.unLoadData.length < 1) {
+        _this.$message.info('暂无可导出错误项~')
+        return
+      }
+      _this.spinning = true
+      hdExportExcel(supplierProductailNewExcel, _this.unLoadData, '成本设置产品导入错误项', function () {
+        _this.spinning = false
+      })
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.loadData = []
+        this.unLoadData = []
+      } else {
+        this.getData()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .chooseImport-modal{
+    .chooseImport-con{
+      .red{
+        color: #f30;
+      }
+      .btn-con{
+        text-align: center;
+        margin: 30px 0 20px;
+        .button-cancel,.button-error{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 221 - 0
src/views/supplierManagement/costSetting/importGuideModal.vue

@@ -0,0 +1,221 @@
+<template>
+  <a-modal
+    centered
+    class="importGuide-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="导入"
+    v-model="isShow"
+    @cancel="isShow=false"
+    :width="750">
+    <div class="importGuide-con">
+      <div class="explain-con">
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>1</span>准备导入
+          </div>
+          <ul>
+            <li>1) 导入的Excel文件中必须包含名为“供应商名称“、“产品编码”、“成本”的列,且名称必须与系统相同</li>
+            <li>2) 除了“供应商名称“、“产品编码”、“成本”三列,其他列可自定义,不影响数据导入</li>
+            <li>3) 如果导入的供应商名称、产品已经存在,未创建之间的关联,则允许导入,同时系统创建关联;若已建立之间的关联,则允许导入,成本按照更新处理,若不存在,则需先完善供应商和产品</li>
+          </ul>
+          <a-button type="link" icon="download" style="padding: 0 0 0 23px;" :loading="exportLoading" @click="handleExport">下载导入模板</a-button>
+        </div>
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>2</span>上传数据文件
+          </div>
+          <p>目前支持的文件类型*.xls,*.xlsx.</p>
+          <div style="overflow: hidden;padding-left: 23px;">
+            <Upload
+              id="importGuide-attachList"
+              ref="importUpload"
+              :maxNums="1"
+              fileType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
+              uploadType="import"
+              :action="attachAction"
+              :uploadParams="uploadParams"
+              upText="添加文件"
+              @change="changeImport"></Upload>
+          </div>
+        </div>
+      </div>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="importGuide-nextStep"
+          size="large"
+          class="button-primary"
+          @click="handlerNextStep"
+          style="padding: 0 60px;">下一步</a-button>
+        <a-button
+          id="importGuide-cancel"
+          size="large"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 60px;margin-left: 15px;">取消</a-button>
+      </div>
+    </div>
+    <!-- 导入 -->
+    <chooseImportModal :openModal="openImportModal" :paramsData="paramsData" @close="handleClose" @ok="hanldeOk" />
+  </a-modal>
+</template>
+
+<script>
+import ChooseImportModal from './chooseImportModal.vue'
+import { Upload } from '@/components'
+import { supplierProductNewDownloadExcel } from '@/api/supplier'
+export default {
+  name: 'ImportGuideModal',
+  components: { ChooseImportModal, Upload },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    params: {
+      type: Object,
+      default: null
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      openImportModal: false, //  导入
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/upload',
+      paramsData: null,
+      uploadParams: {
+        savePathType: 'local'
+      },
+      exportLoading: false
+    }
+  },
+  methods: {
+    // 下一步
+    handlerNextStep () {
+      if (this.paramsData) {
+        this.openImportModal = true
+      } else {
+        this.$message.warning('添加文件后再进行下一步操作!')
+      }
+    },
+    // 上传文件  change
+    changeImport (file) {
+      if (file) {
+        this.paramsData = {
+          path: file
+        }
+      }
+    },
+    // 导入
+    hanldeOk (obj) {
+      if (obj && obj.length > 0) {
+        this.$emit('ok', obj)
+        this.isShow = false
+      }
+    },
+    // 关闭
+    handleClose () {
+      this.openImportModal = false
+      this.isShow = false
+    },
+    //  导出
+    handleExport () {
+      const _this = this
+      _this.spinning = true
+      _this.exportLoading = true
+      supplierProductNewDownloadExcel({}).then(res => {
+        _this.spinning = false
+        _this.exportLoading = false
+        if (res.type == 'application/json') {
+          var reader = new FileReader()
+          reader.addEventListener('loadend', function () {
+            const obj = JSON.parse(reader.result)
+            _this.$notification.error({
+              message: '提示',
+              description: obj.message
+            })
+          })
+          reader.readAsText(res)
+        } else {
+          this.download(res)
+        }
+      })
+    },
+    download (data) {
+      if (!data) { return }
+      const url = window.URL.createObjectURL(new Blob([data]))
+      const link = document.createElement('a')
+      link.style.display = 'none'
+      link.href = url
+      const fname = '成本设置导入模板'
+      link.setAttribute('download', fname + '.xlsx')
+      document.body.appendChild(link)
+      link.click()
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.paramsData = null
+        this.$refs.importUpload.setFileList('')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .importGuide-modal{
+    .importGuide-con{
+      .explain-con{
+        .explain-item{
+          margin-bottom: 10px;
+          .explain-tit{
+            font-weight: bold;
+            span{
+              display: inline-block;
+              width: 18px;
+              height: 18px;
+              line-height: 16px;
+              text-align: center;
+              margin-right: 5px;
+              border-radius: 50%;
+              border: 1px solid rgba(0, 0, 0, 0.3);
+            }
+          }
+          p{
+            margin: 8px 0;
+            padding-left: 23px;
+          }
+          ul{
+            list-style: none;
+            padding: 0;
+            padding-left: 23px;
+            margin: 0;
+            li{
+              line-height: 26px;
+            }
+          }
+        }
+        #importGuide-attachList{
+          width: 100%;
+        }
+      }
+      .btn-con{
+        margin: 10px 0 20px;
+        text-align: center;
+        .button-cancel{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 342 - 0
src/views/supplierManagement/costSetting/list.vue

@@ -0,0 +1,342 @@
+<template>
+  <a-card size="small" :bordered="false" class="costSetList-wrap">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <!-- 搜索条件 -->
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品名称">
+                <a-input id="costSetList-productName" v-model.trim="queryParam.product.name" allowClear placeholder="请输入产品名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品编码/原厂编码">
+                <a-input id="costSetList-productCode" v-model.trim="queryParam.product.queryWord" allowClear placeholder="请输入产品编码"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="品牌">
+                <ProductBrand id="costSeting-productBrandSn" v-model="queryParam.product.productBrandSn"></ProductBrand>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="产品分类">
+                <ProductType id="costSeting-productType" v-model="productType" @change="changeProductType"></ProductType>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="供应商名称">
+                <a-input id="costSetList-productName" v-model.trim="queryParam.supplierName" allowClear placeholder="请输入供应商名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="审核状态">
+                <v-select
+                  v-model="queryParam.auditState"
+                  ref="auditState"
+                  id="costSetList-auditState"
+                  code="SUPPLIER_PRODUCT_STATE"
+                  placeholder="请选择审核状态"
+                  allowClear></v-select>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" :disabled="disabled" id="costSetList-refresh">查询</a-button>
+              <a-button style="margin-left: 5px" @click="resetSearchForm" :disabled="disabled" id="costSetList-reset">重置</a-button>
+              <a-button
+                style="margin-left: 10px"
+                type="primary"
+                class="button-warning"
+                @click="handleExport"
+                :disabled="disabled"
+                :loading="exportLoading"
+                v-if="$hasPermissions('B_costSetExportDetail')"
+                id="costSetDetailList-export">导出明细</a-button>
+            </a-col>
+          </a-row>
+        </a-form>
+        <!-- 操作按钮 -->
+        <div class="table-operator">
+          <a-button type="primary" v-if="$hasPermissions('B_costSetAddProduct')" class="button-error" @click="newProduct=true">新增</a-button>
+          <a-button type="primary" v-if="$hasPermissions('B_costSetBatchImport')" class="button-warning" @click="handleBatchImport">批量导入</a-button>
+          <a-button type="primary" v-if="$hasPermissions('B_costSetAudit')" class="button-warning" @click="handleBatchAudit">批量审核</a-button>
+        </div>
+      </div>
+      <!-- 列表 -->
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px' }"
+        size="small"
+        :rowKey="(record) => record.supplierProductSn"
+        rowKeyName="supplierProductSn"
+        :row-selection="$hasPermissions('B_costSetAudit')?{ columnWidth: 40, getCheckboxProps: record => ({ props: { disabled: record.auditState!=='WAIT' } }) }:null"
+        @rowSelection="rowSelectionFun"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+        <!-- 产品分类 -->
+        <template slot="productType" slot-scope="text, record">
+          <span v-if="record.product&&(record.product.productTypeName2 || record.product.productTypeName3)">{{ record.product.productTypeName2 }} {{ record.product.productTypeName3 ? '>' : '' }} {{ record.product.productTypeName3 }}</span>
+          <span v-else>--</span>
+        </template>
+        <!-- 操作 -->
+        <template slot="action" slot-scope="text, record">
+          <div>
+            <a-button
+              size="small"
+              type="link"
+              class="button-warning"
+              v-if="record.auditState=='WAIT'&&$hasPermissions('B_costSetAudit')"
+              @click="handleAudit([record.supplierProductSn])"
+            >审核</a-button>
+            <a-button
+              size="small"
+              type="link"
+              class="button-warning"
+              v-if="record.auditState!='WAIT'&&$hasPermissions('B_costSetting')"
+              @click="handleCostSet(record)"
+            >设置成本</a-button>
+          </div>
+        </template>
+      </s-table>
+    </a-spin>
+
+    <!-- 新增 -->
+    <addProductModal :openModal="newProduct" @close="newProduct=false" @ok="handleProductsOk" />
+    <!-- 设置成本价 -->
+    <SettingCost ref="settingCost" :openModal="openSetModal" @ok="$refs.table.refresh()" @close="openSetModal=false"></SettingCost>
+    <!-- 导入产品 -->
+    <importGuideModal :openModal="openGuideModal" @close="openGuideModal=false" @ok="handleGuideOk" />
+  </a-card>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { STable, VSelect } from '@/components'
+import { hdExportExcel } from '@/libs/exportExcel'
+import ProductType from '@/views/common/productType.js'
+import ProductBrand from '@/views/common/productBrand.js'
+import addProductModal from './addProductModal.vue'
+import ImportGuideModal from './importGuideModal.vue'
+import SettingCost from './settingCost.vue'
+import { supplierProductList, supplierProductExportDetail, supplierProductUpdateAuditState, supplierProductNewBatchInsert } from '@/api/supplier'
+export default {
+  name: 'costSettingList',
+  mixins: [commonMixin],
+  components: { STable, VSelect, ProductBrand, ProductType, addProductModal, SettingCost, ImportGuideModal },
+  data () {
+    return {
+      spinning: false,
+      exportLoading: false,
+      advanced: true, // 高级搜索 展开/关闭
+      openGuideModal: false,
+      tableHeight: 0,
+      queryParam: { //  查询条件
+        supplierName: '',
+        product: {
+          name: '', //  产品名称
+          queryWord: '', // 产品编码/原厂编码
+          productBrandSn: undefined, //  产品品牌
+          productTypeSn1: '', //  产品一级分类
+          productTypeSn2: '', //  产品二级分类
+          productTypeSn3: '' ,//  产品三级分类
+        },
+        auditState: undefined
+      },
+      disabled: false, //  查询、重置按钮是否可操作
+      productType: [],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.disabled = true
+        this.spinning = true
+        return supplierProductList(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (var i = 0; i < data.list.length; i++) {
+              data.list[i].no = no + i + 1
+            }
+            this.disabled = false
+          }
+          this.spinning = false
+          return data
+        })
+      },
+      rowSelectionInfo: null,
+      newProduct: false,
+      openSetModal: false
+    }
+  },
+  computed: {
+    columns () {
+      const _this = this
+      const arr = [
+        { title: '序号', dataIndex: 'no', width: '4%', align: 'center' },
+        { title: '产品名称', dataIndex: 'product.name', width: '12%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '产品编码', dataIndex: 'product.code', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '原厂编码', dataIndex: 'product.origCode', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品品牌', dataIndex: 'product.productBrandName', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '产品分类', scopedSlots: { customRender: 'productType' }, width: '12%', align: 'center' },
+        { title: '供应商名称', dataIndex: 'supplierName', width: '12%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '审核时间', dataIndex: 'auditTime', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '审核状态', dataIndex: 'auditStateDictValue', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '操作', scopedSlots: { customRender: 'action' }, width: '8%', align: 'center' }
+      ]
+      if (this.$hasPermissions('B_isShowCost')) { //  成本价权限
+        arr.splice(7, 0, { title: '当前成本价', dataIndex: 'cost', width: '7%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } })
+        arr.splice(8, 0, { title: '变更成本价', dataIndex: 'modifyCost', width: '7%', align: 'right', customRender: function (text) { return ((text || text == 0) ? _this.toThousands(text) : '--') } })
+      }
+      return arr
+    }
+  },
+  methods: {
+    // 表格选中项
+    rowSelectionFun (obj) {
+      this.rowSelectionInfo = obj || null
+    },
+    // 批量导入产品
+    handleGuideOk (obj) {
+      supplierProductNewBatchInsert(obj).then(res => {
+        if (res.status == 200) {
+          this.$refs.table.refresh(true)
+        }
+      })
+    },
+    //  重置
+    resetSearchForm () {
+      this.queryParam.supplierName = ''
+      this.queryParam.product.name = ''
+      this.queryParam.product.queryWord = ''
+      this.queryParam.product.productBrandSn = undefined
+      this.queryParam.product.productTypeSn1 = ''
+      this.queryParam.product.productTypeSn2 = ''
+      this.queryParam.product.productTypeSn3 = ''
+      this.queryParam.auditState = undefined
+      this.productType = []
+      this.$refs.table.refresh(true)
+    },
+    //  产品分类  change
+    changeProductType (val, opt) {
+      this.queryParam.product.productTypeSn1 = val[0] ? val[0] : ''
+      this.queryParam.product.productTypeSn2 = val[1] ? val[1] : ''
+      this.queryParam.product.productTypeSn3 = val[2] ? val[2] : ''
+    },
+    // 导出明细
+    handleExport () {
+      const _this = this
+      const params = _this.queryParam
+      _this.exportLoading = true
+      _this.spinning = true
+      hdExportExcel(supplierProductExportDetail, params, '成本设置明细', function () {
+        _this.exportLoading = false
+        _this.spinning = false
+      })
+    },
+    // 新增成功
+    handleProductsOk () {
+      this.newProduct = false
+      this.resetSearchForm()
+    },
+    // 批量导入
+    handleBatchImport () {
+      this.openGuideModal=true
+    },
+    // 批量审核
+    handleBatchAudit () {
+      const row = this.rowSelectionInfo && this.rowSelectionInfo.selectedRowKeys
+      if (!this.rowSelectionInfo || (row.length < 1)) {
+        this.$message.warning('请在列表中进行勾选!')
+        return false
+      }
+      this.handleAudit(row)
+    },
+    // 单个审核
+    handleAudit (sn) {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确认要审核通过吗?',
+        centered: true,
+        closable: true,
+        okText: '通过',
+        cancelText: '不通过',
+        onOk () {
+          _this.auditOrder(sn, 'PASS')
+        },
+        onCancel (e) {
+          if (!e.triggerCancel) {
+            _this.auditOrder(sn, 'REJECT')
+          }
+          _this.$destroyAll()
+        }
+      })
+    },
+    auditOrder(sn,val){
+      this.spinning = true
+      supplierProductUpdateAuditState({
+        auditState: val,
+        supplierProductSnList: sn
+      }).then(res => {
+        if(res.status == 200){
+          this.$refs.table.refresh(true)
+          this.$refs.table.clearSelected()
+          this.$message.info(res.message)
+        }
+        this.spinning = false
+      })
+    },
+    // 成本设置
+    handleCostSet (row) {
+      this.openSetModal = true
+      this.$refs.settingCost.setData(row)
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 195
+    }
+  },
+  watch: {
+    advanced (newValue, oldValue) {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.resetSearchForm()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.resetSearchForm()
+    }
+    // 仅刷新列表,不重置页面
+    if (this.$store.state.app.updateList) {
+      this.pageInit()
+      this.$refs.table.refresh()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>

+ 170 - 0
src/views/supplierManagement/costSetting/settingCost.vue

@@ -0,0 +1,170 @@
+<template>
+  <a-modal
+    centered
+    class="merchantInfoManagement-modal"
+    :footer="null"
+    :maskClosable="false"
+    :title="title"
+    v-model="isShow"
+    @cancel="cansel"
+    :width="600">
+    <div>
+      <a-spin :spinning="spinning" tip="Loading...">
+        <a-form-model
+          ref="ruleForm"
+          :model="form"
+          :rules="rules"
+          :label-col="labelCol"
+          :wrapper-col="wrapperCol"
+        >
+          <a-form-model-item style="margin-bottom:10px;" label="产品名称">
+            <div style="line-height:normal;padding-top:11px;">{{ productName }}</div>
+          </a-form-model-item>
+          <a-form-model-item style="margin-bottom:10px;" label="产品编码">
+            {{ productCode }}
+          </a-form-model-item>
+          <a-form-model-item style="margin-bottom:10px;" label="供应商名称">
+            {{ supplierName }}
+          </a-form-model-item>
+          <a-form-model-item style="margin-bottom:10px;" label="原成本价">
+            {{ cost ? toThousands(cost) : '--' }}
+          </a-form-model-item>
+          <a-form-model-item label="变更成本价" prop="modifyCost">
+            <a-input-number
+              id="setting-cost"
+              v-model="form.modifyCost"
+              :precision="2"
+              :min="0"
+              :max="999999"
+              placeholder="请输入"
+              ref="modifyCost"
+              @keyup.enter.native="onSubmit"
+              style="width: 100%;" />
+          </a-form-model-item>
+          <div style="display: flex;justify-content: center;padding: 30px 0;">
+            <a-button type="primary" @click="onSubmit">
+              确定
+            </a-button>
+            <a-button style="margin-left: 15px;" @click="cansel">
+              取消
+            </a-button>
+          </div>
+        </a-form-model></a-spin>
+      </a-form-model>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+import { commonMixin } from '@/utils/mixin'
+import { VSelect } from '@/components'
+import { settingCost } from '@/api/supplier'
+export default {
+  name: 'SettingCost',
+  mixins: [commonMixin],
+  components: { VSelect },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      spinning: false,
+      title: '设置成本价',
+      labelCol: { span: 4 },
+      wrapperCol: { span: 18 },
+      productName: '',
+      productCode: '',
+      supplierName: '',
+      cost: '',
+      form: {
+        supplierSn: '',
+        supplierProductSn: '',
+        modifyCost: ''
+      },
+      rules: {
+        modifyCost: [
+          { required: true, message: '请输入成本价', trigger: 'change' }
+        ]
+      }
+    }
+  },
+  methods: {
+    setData (row) {
+      this.form.supplierSn = row.supplierSn
+      this.form.supplierProductSn = row.supplierProductSn
+      this.form.modifyCost = ''
+      this.cost = row.cost
+      this.productName = row.product.name
+      this.productCode = row.product.code
+      this.supplierName = row.supplierName
+    },
+    onSubmit () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = JSON.parse(JSON.stringify(_this.form))
+          if(params.modifyCost==0){
+            this.$message.warning('成本价不能是0!')
+            return false
+          }
+          _this.spinning = true
+          settingCost(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('ok')
+              _this.cansel()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          return false
+        }
+      })
+    },
+    cansel () {
+      this.$emit('close')
+      this.productName = ''
+      this.productCode = ''
+      this.form.modifyCost = ''
+      this.form.supplierSn= ''
+      this.form.supplierProductSn= ''
+      this.$refs.ruleForm.resetFields()
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+      if (newValue) {
+        // 默认首项获取焦点
+        const _this = this
+        setTimeout(() => {
+          if (_this.$refs['modifyCost']) {
+            _this.$refs['modifyCost'].focus()
+          }
+        }, 300)
+      }
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less">
+  .merchantInfoManagement-modal{
+    .ant-modal-body {
+      padding: 40px 40px 24px;
+    }
+  }
+</style>

+ 13 - 13
vue.config.js

@@ -14,13 +14,13 @@ function isProd () {
   return process.env.NODE_ENV === 'production'
 }
 
-// ��Ŀ��������
-// Ĭ�������£����Ǽ�������Ӧ�ý������������ĸ�Ŀ¼��,
-// ���磺https://www.my-app.com/
-// Ĭ�ϣ�'/'
-// ��������Ӧ�ó�����������·���У�����Ҫ����ָ����·��
-// ���磺https://www.foobar.com/my-app/
-// ��Ҫ������Ϊ'/my-app/'
+// 项目部署基础
+// 默认情况下,我们假设你的应用将被部署在域的根目录下,
+// 例如:https://www.my-app.com/
+// 默认:'/'
+// 如果您的应用程序部署在子路径中,则需要在这指定子路径
+// 例如:https://www.foobar.com/my-app/
+// 需要将它改为'/my-app/'
 const BASE_URL = isProd ? '/' : '/'
 
 const assetsCDN = {
@@ -44,7 +44,7 @@ const prodExternals = {
 
 // vue.config.js
 const vueConfig = {
-  runtimeCompiler: true, // ��̬��������
+  runtimeCompiler: true, // 动态编译组件
   publicPath: BASE_URL,
   configureWebpack: {
     // webpack plugins
@@ -90,7 +90,7 @@ const vueConfig = {
     loaderOptions: {
       less: {
         modifyVars: {
-          // less vars,customize ant design theme
+          // less vars锛宑ustomize ant design theme
           'primary-color': process.env.VUE_APP_THEME_COLOR,
           'link-color': process.env.VUE_APP_THEME_COLOR
           // 'border-radius-base': '4px'
@@ -107,9 +107,9 @@ const vueConfig = {
     // If you want to turn on the proxy, please remove the mockjs /src/main.jsL11
     proxy: {
       '/api': {
-        // target: 'http://192.168.0.182/ocs-admin',
-        // target: 'https://t.ocs.360arrow.com/ocs-admin', //  ��ϰ
-        target: 'http://p.ocs.360arrow.com/ocs-admin', //  Ԥ����
+        // target: 'http://192.168.0.183:8602/ocs-admin',
+        // target: 'https://t.ocs.360arrow.com/ocs-admin', //  练习
+        target: 'http://p.ocs.360arrow.com/ocs-admin', //  预发布
         ws: false,
         changeOrigin: true,
         pathRewrite: {
@@ -134,4 +134,4 @@ if (process.env.VUE_APP_PREVIEW === 'true') {
   vueConfig.configureWebpack.plugins.push(createThemeColorReplacerPlugin())
 }
 
-module.exports = vueConfig
+module.exports = vueConfig