Ver Fonte

Merge branch 'master' of http://139.9.104.214:3000/Szw/yzzn-middleground-supplier

szw há 1 ano atrás
pai
commit
ecb31de84e
42 ficheiros alterados com 8371 adições e 480 exclusões
  1. 2 2
      .env.dev
  2. 54 0
      src/api/supplier/afterSale.js
  3. 62 0
      src/api/supplier/billInfo.js
  4. 54 0
      src/api/supplier/clientInfo.js
  5. 67 0
      src/api/supplier/goods.js
  6. 75 0
      src/api/supplier/goodsCategory.js
  7. 54 0
      src/api/supplier/goodsDetail.js
  8. 54 0
      src/api/supplier/loginPagePopularizeModuleConfig.js
  9. 54 0
      src/api/supplier/payLogDetail.js
  10. 62 0
      src/api/supplier/portalConfig.js
  11. 54 0
      src/api/supplier/portalManage.js
  12. 54 0
      src/api/supplier/portalSlideshowConfig.js
  13. 54 0
      src/api/supplier/purchaseInfo.js
  14. 54 0
      src/api/supplier/quoteInfo.js
  15. 62 0
      src/api/supplier/receiveLog.js
  16. 54 0
      src/api/supplier/receiveLogDetail.js
  17. 54 0
      src/api/supplier/saleOrder.js
  18. 54 0
      src/api/supplier/shipmentsManage.js
  19. 54 0
      src/api/supplier/signingInfo.js
  20. BIN
      src/assets/images/new_text_log.png
  21. 3 3
      src/assets/styles/login.scss
  22. 5 0
      src/router/index.js
  23. 125 93
      src/utils/dict.js
  24. 460 382
      src/views/login.vue
  25. 620 0
      src/views/navigation.vue
  26. 428 0
      src/views/supplier/afterSale/index.vue
  27. 451 0
      src/views/supplier/billInfo/index.vue
  28. 358 0
      src/views/supplier/clientInfo/index.vue
  29. 327 0
      src/views/supplier/goodsCategory/index.vue
  30. 375 0
      src/views/supplier/goodsDetail/index.vue
  31. 562 0
      src/views/supplier/goodsInfo/index.vue
  32. 400 0
      src/views/supplier/loginPagePopularizeModuleConfig/index.vue
  33. 109 0
      src/views/supplier/portalConfig/index.vue
  34. 270 0
      src/views/supplier/portalManage/index.vue
  35. 254 0
      src/views/supplier/portalSlideshowConfig/index.vue
  36. 278 0
      src/views/supplier/purchaseInfo/index.vue
  37. 257 0
      src/views/supplier/quoteInfo/index.vue
  38. 261 0
      src/views/supplier/receiveLog/index.vue
  39. 798 0
      src/views/supplier/saleOrder/index.vue
  40. 255 0
      src/views/supplier/seek/seekOrder.vue
  41. 431 0
      src/views/supplier/shipmentsManage/index.vue
  42. 312 0
      src/views/supplier/signingInfo/index.vue

+ 2 - 2
.env.dev

@@ -6,9 +6,9 @@ VUE_APP_TITLE = 会助理管理平台
 
 # 会助理管理平台
 # 本地环境
-# VUE_APP_BASE_API = 'http://localhost:48080'
+VUE_APP_BASE_API = 'http://localhost:48080'
 # 测试环境
-VUE_APP_BASE_API = 'https://ts.willalp.com:48080'
+# VUE_APP_BASE_API = 'https://ts.willalp.com:48080'
 # 线上环境
 # VUE_APP_BASE_API = 'https://hzl.willalp.com:48080'
 

+ 54 - 0
src/api/supplier/afterSale.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建售后列
+export function createAfterSale(data) {
+  return request({
+    url: '/supplier/after-sale/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新售后列
+export function updateAfterSale(data) {
+  return request({
+    url: '/supplier/after-sale/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除售后列
+export function deleteAfterSale(id) {
+  return request({
+    url: '/supplier/after-sale/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得售后列
+export function getAfterSale(id) {
+  return request({
+    url: '/supplier/after-sale/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得售后列分页
+export function getAfterSalePage(query) {
+  return request({
+    url: '/supplier/after-sale/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出售后列 Excel
+export function exportAfterSaleExcel(query) {
+  return request({
+    url: '/supplier/after-sale/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 62 - 0
src/api/supplier/billInfo.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 创建账单
+export function createBillInfo(data) {
+  return request({
+    url: '/supplier/bill-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新账单
+export function updateBillInfo(data) {
+  return request({
+    url: '/supplier/bill-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除账单
+export function deleteBillInfo(id) {
+  return request({
+    url: '/supplier/bill-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得账单
+export function getBillInfo(id) {
+  return request({
+    url: '/supplier/bill-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得账单分页
+export function getBillInfoPage(query) {
+  return request({
+    url: '/supplier/bill-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出账单 Excel
+export function exportBillInfoExcel(query) {
+  return request({
+    url: '/supplier/bill-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 获得付款详情记录
+export function getPayDetailList(id) {
+  return request({
+    url: '/supplier/bill-info/getPayDetailList?id=' + id,
+    method: 'get'
+  })
+}

+ 54 - 0
src/api/supplier/clientInfo.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建客户管理
+export function createClientInfo(data) {
+  return request({
+    url: '/supplier/client-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新客户管理
+export function updateClientInfo(data) {
+  return request({
+    url: '/supplier/client-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除客户管理
+export function deleteClientInfo(id) {
+  return request({
+    url: '/supplier/client-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得客户管理
+export function getClientInfo(id) {
+  return request({
+    url: '/supplier/client-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得客户管理分页
+export function getClientInfoPage(query) {
+  return request({
+    url: '/supplier/client-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出客户管理 Excel
+export function exportClientInfoExcel(query) {
+  return request({
+    url: '/supplier/client-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 67 - 0
src/api/supplier/goods.js

@@ -0,0 +1,67 @@
+import request from '@/utils/request'
+
+// 创建商品列表
+export function createGoods(data) {
+  return request({
+    url: '/supplier/goods/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新商品列表
+export function updateGoods(data) {
+  return request({
+    url: '/supplier/goods/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品列表
+export function deleteGoods(id) {
+  return request({
+    url: '/supplier/goods/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得商品列表
+export function getGoods(id) {
+  return request({
+    url: '/supplier/goods/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得商品列表分页
+export function getGoodsPage(query) {
+  return request({
+    url: '/supplier/goods/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出商品列表 Excel
+export function exportGoodsExcel(query) {
+  return request({
+    url: '/supplier/goods/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 商品状态修改
+export function changeGoodsStatus(id, state) {
+  const data = {
+    id,
+    state
+  }
+  return request({
+    url: '/supplier/goods/update-status',
+    method: 'put',
+    data: data
+  })
+}

+ 75 - 0
src/api/supplier/goodsCategory.js

@@ -0,0 +1,75 @@
+import request from '@/utils/request'
+
+// 创建商品分类
+export function createGoodsCategory(data) {
+  return request({
+    url: '/supplier/goods-category/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新商品分类
+export function updateGoodsCategory(data) {
+  return request({
+    url: '/supplier/goods-category/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品分类
+export function deleteGoodsCategory(id) {
+  return request({
+    url: '/supplier/goods-category/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得商品分类
+export function getGoodsCategory(id) {
+  return request({
+    url: '/supplier/goods-category/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得商品分类分页
+export function getGoodsCategoryPage(query) {
+  return request({
+    url: '/supplier/goods-category/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出商品分类 Excel
+export function exportGoodsCategoryExcel(query) {
+  return request({
+    url: '/supplier/goods-category/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 分类状态修改
+export function changeCategoryStatus(id, status) {
+  const data = {
+    id,
+    status
+  }
+  return request({
+    url: '/supplier/goods-category/update-status',
+    method: 'put',
+    data: data
+  })
+}
+
+// 获得商品分类启用列表
+export function getGoodsCategoryListAll() {
+  return request({
+    url: '/supplier/goods-category/getList',
+    method: 'get',
+  })
+}

+ 54 - 0
src/api/supplier/goodsDetail.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建商品详情
+export function createGoodsDetail(data) {
+  return request({
+    url: '/supplier/goods-detail/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新商品详情
+export function updateGoodsDetail(data) {
+  return request({
+    url: '/supplier/goods-detail/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除商品详情
+export function deleteGoodsDetail(id) {
+  return request({
+    url: '/supplier/goods-detail/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得商品详情
+export function getGoodsDetail(id) {
+  return request({
+    url: '/supplier/goods-detail/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得商品详情分页
+export function getGoodsDetailPage(query) {
+  return request({
+    url: '/supplier/goods-detail/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出商品详情 Excel
+export function exportGoodsDetailExcel(query) {
+  return request({
+    url: '/supplier/goods-detail/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/loginPagePopularizeModuleConfig.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建登录页面推广模块配置
+export function createLoginPagePopularizeModuleConfig(data) {
+  return request({
+    url: '/supplier/login-page-popularize-module-config/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新登录页面推广模块配置
+export function updateLoginPagePopularizeModuleConfig(data) {
+  return request({
+    url: '/supplier/login-page-popularize-module-config/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除登录页面推广模块配置
+export function deleteLoginPagePopularizeModuleConfig(id) {
+  return request({
+    url: '/supplier/login-page-popularize-module-config/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得登录页面推广模块配置
+export function getLoginPagePopularizeModuleConfig(id) {
+  return request({
+    url: '/supplier/login-page-popularize-module-config/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得登录页面推广模块配置分页
+export function getLoginPagePopularizeModuleConfigPage(query) {
+  return request({
+    url: '/supplier/login-page-popularize-module-config/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出登录页面推广模块配置 Excel
+export function exportLoginPagePopularizeModuleConfigExcel(query) {
+  return request({
+    url: '/supplier/login-page-popularize-module-config/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/payLogDetail.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建付款详情
+export function createPayLogDetail(data) {
+  return request({
+    url: '/supplier/pay-log-detail/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新付款详情
+export function updatePayLogDetail(data) {
+  return request({
+    url: '/supplier/pay-log-detail/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除付款详情
+export function deletePayLogDetail(id) {
+  return request({
+    url: '/supplier/pay-log-detail/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得付款详情
+export function getPayLogDetail(id) {
+  return request({
+    url: '/supplier/pay-log-detail/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得付款详情分页
+export function getPayLogDetailPage(query) {
+  return request({
+    url: '/supplier/pay-log-detail/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出付款详情 Excel
+export function exportPayLogDetailExcel(query) {
+  return request({
+    url: '/supplier/pay-log-detail/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 62 - 0
src/api/supplier/portalConfig.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 创建门户配置
+export function createPortalConfig(data) {
+  return request({
+    url: '/supplier/portal-config/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新门户配置
+export function updatePortalConfig(data) {
+  return request({
+    url: '/supplier/portal-config/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除门户配置
+export function deletePortalConfig(id) {
+  return request({
+    url: '/supplier/portal-config/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得门户配置
+export function getPortalConfig(id) {
+  return request({
+    url: '/supplier/portal-config/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得门户配置
+export function getThisConfig(id) {
+  return request({
+    url: '/supplier/portal-config/getThisConfig',
+    method: 'get'
+  })
+}
+
+// 获得门户配置分页
+export function getPortalConfigPage(query) {
+  return request({
+    url: '/supplier/portal-config/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出门户配置 Excel
+export function exportPortalConfigExcel(query) {
+  return request({
+    url: '/supplier/portal-config/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/portalManage.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建门户管理
+export function createPortalManage(data) {
+  return request({
+    url: '/supplier/portal-manage/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新门户管理
+export function updatePortalManage(data) {
+  return request({
+    url: '/supplier/portal-manage/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除门户管理
+export function deletePortalManage(id) {
+  return request({
+    url: '/supplier/portal-manage/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得门户管理
+export function getPortalManage(id) {
+  return request({
+    url: '/supplier/portal-manage/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得门户管理分页
+export function getPortalManagePage(query) {
+  return request({
+    url: '/supplier/portal-manage/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出门户管理 Excel
+export function exportPortalManageExcel(query) {
+  return request({
+    url: '/supplier/portal-manage/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/portalSlideshowConfig.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建门户轮播图配置
+export function createPortalSlideshowConfig(data) {
+  return request({
+    url: '/supplier/portal-slideshow-config/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新门户轮播图配置
+export function updatePortalSlideshowConfig(data) {
+  return request({
+    url: '/supplier/portal-slideshow-config/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除门户轮播图配置
+export function deletePortalSlideshowConfig(id) {
+  return request({
+    url: '/supplier/portal-slideshow-config/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得门户轮播图配置
+export function getPortalSlideshowConfig(id) {
+  return request({
+    url: '/supplier/portal-slideshow-config/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得门户轮播图配置分页
+export function getPortalSlideshowConfigPage(query) {
+  return request({
+    url: '/supplier/portal-slideshow-config/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出门户轮播图配置 Excel
+export function exportPortalSlideshowConfigExcel(query) {
+  return request({
+    url: '/supplier/portal-slideshow-config/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/purchaseInfo.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建采购信息
+export function createPurchaseInfo(data) {
+  return request({
+    url: '/supplier/purchase-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新采购信息
+export function updatePurchaseInfo(data) {
+  return request({
+    url: '/supplier/purchase-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除采购信息
+export function deletePurchaseInfo(id) {
+  return request({
+    url: '/supplier/purchase-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得采购信息
+export function getPurchaseInfo(id) {
+  return request({
+    url: '/supplier/purchase-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得采购信息分页
+export function getPurchaseInfoPage(query) {
+  return request({
+    url: '/supplier/purchase-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出采购信息 Excel
+export function exportPurchaseInfoExcel(query) {
+  return request({
+    url: '/supplier/purchase-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/quoteInfo.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建报价信息
+export function createQuoteInfo(data) {
+  return request({
+    url: '/supplier/quote-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新报价信息
+export function updateQuoteInfo(data) {
+  return request({
+    url: '/supplier/quote-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除报价信息
+export function deleteQuoteInfo(id) {
+  return request({
+    url: '/supplier/quote-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得报价信息
+export function getQuoteInfo(id) {
+  return request({
+    url: '/supplier/quote-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得报价信息分页
+export function getQuoteInfoPage(query) {
+  return request({
+    url: '/supplier/quote-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出报价信息 Excel
+export function exportQuoteInfoExcel(query) {
+  return request({
+    url: '/supplier/quote-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 62 - 0
src/api/supplier/receiveLog.js

@@ -0,0 +1,62 @@
+import request from '@/utils/request'
+
+// 创建交易记录
+export function createReceiveLog(data) {
+  return request({
+    url: '/supplier/receive-log/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新交易记录
+export function updateReceiveLog(data) {
+  return request({
+    url: '/supplier/receive-log/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除交易记录
+export function deleteReceiveLog(id) {
+  return request({
+    url: '/supplier/receive-log/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得交易记录
+export function getReceiveLog(id) {
+  return request({
+    url: '/supplier/receive-log/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得交易记录分页
+export function getReceiveLogPage(query) {
+  return request({
+    url: '/supplier/receive-log/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出交易记录 Excel
+export function exportReceiveLogExcel(query) {
+  return request({
+    url: '/supplier/receive-log/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+
+// 获得收款详情记录
+export function getReceiveDetailList(id) {
+  return request({
+    url: '/supplier/receive-log/getReceiveDetailList?id=' + id,
+    method: 'get'
+  })
+}

+ 54 - 0
src/api/supplier/receiveLogDetail.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建收款详情
+export function createReceiveLogDetail(data) {
+  return request({
+    url: '/supplier/receive-log-detail/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新收款详情
+export function updateReceiveLogDetail(data) {
+  return request({
+    url: '/supplier/receive-log-detail/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除收款详情
+export function deleteReceiveLogDetail(id) {
+  return request({
+    url: '/supplier/receive-log-detail/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得收款详情
+export function getReceiveLogDetail(id) {
+  return request({
+    url: '/supplier/receive-log-detail/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得收款详情分页
+export function getReceiveLogDetailPage(query) {
+  return request({
+    url: '/supplier/receive-log-detail/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出收款详情 Excel
+export function exportReceiveLogDetailExcel(query) {
+  return request({
+    url: '/supplier/receive-log-detail/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/saleOrder.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建已售订单
+export function createSaleOrder(data) {
+  return request({
+    url: '/supplier/sale-order/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新已售订单
+export function updateSaleOrder(data) {
+  return request({
+    url: '/supplier/sale-order/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除已售订单
+export function deleteSaleOrder(id) {
+  return request({
+    url: '/supplier/sale-order/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得已售订单
+export function getSaleOrder(id) {
+  return request({
+    url: '/supplier/sale-order/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得已售订单分页
+export function getSaleOrderPage(query) {
+  return request({
+    url: '/supplier/sale-order/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出已售订单 Excel
+export function exportSaleOrderExcel(query) {
+  return request({
+    url: '/supplier/sale-order/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/shipmentsManage.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建发货信息管理
+export function createShipmentsManage(data) {
+  return request({
+    url: '/supplier/shipments-manage/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新发货信息管理
+export function updateShipmentsManage(data) {
+  return request({
+    url: '/supplier/shipments-manage/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除发货信息管理
+export function deleteShipmentsManage(id) {
+  return request({
+    url: '/supplier/shipments-manage/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得发货信息管理
+export function getShipmentsManage(id) {
+  return request({
+    url: '/supplier/shipments-manage/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得发货信息管理分页
+export function getShipmentsManagePage(query) {
+  return request({
+    url: '/supplier/shipments-manage/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出发货信息管理 Excel
+export function exportShipmentsManageExcel(query) {
+  return request({
+    url: '/supplier/shipments-manage/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

+ 54 - 0
src/api/supplier/signingInfo.js

@@ -0,0 +1,54 @@
+import request from '@/utils/request'
+
+// 创建签约管理
+export function createSigningInfo(data) {
+  return request({
+    url: '/supplier/signing-info/create',
+    method: 'post',
+    data: data
+  })
+}
+
+// 更新签约管理
+export function updateSigningInfo(data) {
+  return request({
+    url: '/supplier/signing-info/update',
+    method: 'put',
+    data: data
+  })
+}
+
+// 删除签约管理
+export function deleteSigningInfo(id) {
+  return request({
+    url: '/supplier/signing-info/delete?id=' + id,
+    method: 'delete'
+  })
+}
+
+// 获得签约管理
+export function getSigningInfo(id) {
+  return request({
+    url: '/supplier/signing-info/get?id=' + id,
+    method: 'get'
+  })
+}
+
+// 获得签约管理分页
+export function getSigningInfoPage(query) {
+  return request({
+    url: '/supplier/signing-info/page',
+    method: 'get',
+    params: query
+  })
+}
+
+// 导出签约管理 Excel
+export function exportSigningInfoExcel(query) {
+  return request({
+    url: '/supplier/signing-info/export-excel',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}

BIN
src/assets/images/new_text_log.png


+ 3 - 3
src/assets/styles/login.scss

@@ -16,7 +16,7 @@ $logoWidth: 417px;
 $logoHeight: 64px;
 // $logoImage: '../assets/logo/login-logo_bak.png';
 // container-content
-$contentWidth: round($W / $H * 90) * 1vw;
+$contentWidth: round($W / $H * 80) * 1vw;
 $contentHeight: round($picH / $W * 110) / 100 * ($contentWidth / 1.05);
 // $contentWidth: round($W / $H * 100) * 1vw;
 // $contentHeight: round($picH / $W * 100) / 100 * ($contentWidth / 1);
@@ -54,9 +54,9 @@ $buttonHeight: $buttonH * 1px;
   width: inherit;
   height: inherit;
   min-width: 1080px;
-  min-height: 620px;
+  min-height: 920px;
   background-color: $containerBgColor;
-  background-image: url($containerBgImage);
+  //background-image: url($containerBgImage);
   background-size: cover;
   // 定位
   position: relative;

+ 5 - 0
src/router/index.js

@@ -39,6 +39,11 @@ export const constantRoutes = [
       }
     ]
   },
+  {
+    path: '/navigation',
+    component: (resolve) => require(['@/views/navigation'], resolve),
+    hidden: true
+  },
   {
     path: '/login',
     component: (resolve) => require(['@/views/login'], resolve),

+ 125 - 93
src/utils/dict.js

@@ -112,174 +112,206 @@ export const DICT_TYPE = {
 
   TRAVEL_MODE: 'travel_mode',//出行方式
 
-  SALARY_STATUS: "salary_status",
+  SALARY_STATUS: 'salary_status',
 
-  CLOCK_IN_TYPE: "clock_in_type",
+  CLOCK_IN_TYPE: 'clock_in_type',
 
   ATTENDANCE_STATUS: 'attendance_status',
 
-  CLOCK_IN_STAGE: "clock_in_stage",
+  CLOCK_IN_STAGE: 'clock_in_stage',
 
-  CODE_INFILL: "code_infill",
+  CODE_INFILL: 'code_infill',
 
-  SERIAL_NUM: "serial_num",
+  SERIAL_NUM: 'serial_num',
 
-  REIMBURSED_TYPE: "reimbursed_type",
+  REIMBURSED_TYPE: 'reimbursed_type',
 
-  SUPPLIER_TYPE: "supplier_type",
+  SUPPLIER_TYPE: 'supplier_type',
 
-  SUPPLIER_LABEL: "supplier_label",
+  SUPPLIER_LABEL: 'supplier_label',
 
-  FILE_TYPE: "file_type",
+  FILE_TYPE: 'file_type',
 
-  FILE_STATE: "file_state",
+  FILE_STATE: 'file_state',
 
-  CUSTOMER_CATEGORY: "customer_category",
+  CUSTOMER_CATEGORY: 'customer_category',
 
-  CUSTOMER_LABEL: "customer_label",
+  CUSTOMER_LABEL: 'customer_label',
 
-  POST_TYPE: "post_type",
+  POST_TYPE: 'post_type',
 
-  DEPT_NAME: "dept_name",
+  DEPT_NAME: 'dept_name',
 
-  NOTICE_TYPE: "notice_type",
+  NOTICE_TYPE: 'notice_type',
 
-  EDUCATION_LEVEL: "education_level",//学历水平
+  EDUCATION_LEVEL: 'education_level',//学历水平
 
-  EMP_GRADE: "emp_grade",
+  EMP_GRADE: 'emp_grade',
 
-  EMP_STATUS: "emp_status",//员工状态
-  EMP_STATUS_LEAVE: "emp_status_leave",//员工状态(离职/退休)
-  EMP_STATUS_NOT_LEAVE: "emp_status_not_leave",//员工状态(除离职退休)
-  EMP_STATUS_FOR_THIRD: "emp_status_for_third",//员工状态(第三方)
+  EMP_STATUS: 'emp_status',//员工状态
+  EMP_STATUS_LEAVE: 'emp_status_leave',//员工状态(离职/退休)
+  EMP_STATUS_NOT_LEAVE: 'emp_status_not_leave',//员工状态(除离职退休)
+  EMP_STATUS_FOR_THIRD: 'emp_status_for_third',//员工状态(第三方)
 
-  POST_LEVEL: "post_level",
+  POST_LEVEL: 'post_level',
 
-  POST_STATE: "post_state",
+  POST_STATE: 'post_state',
 
-  WAREHOUSE_STATE: "warehouse_state",
+  WAREHOUSE_STATE: 'warehouse_state',
 
-  WAREHOUSE_TYPE: "warehouse_type",
+  WAREHOUSE_TYPE: 'warehouse_type',
 
-  WAREHOUSE_IN_SOURCE: "warehouse_in_source",
+  WAREHOUSE_IN_SOURCE: 'warehouse_in_source',
 
-  MATERIAL_CATEGORY: "material_category",
+  MATERIAL_CATEGORY: 'material_category',
 
-  MATERIAL_STATE: "material_state",
+  MATERIAL_STATE: 'material_state',
 
-  UNIT: "unit",
+  UNIT: 'unit',
 
-  WAREHOUSE_OUT_USE: "warehouse_out_use",
+  WAREHOUSE_OUT_USE: 'warehouse_out_use',
 
-  PROJECT_STATUS: "project_status",
+  PROJECT_STATUS: 'project_status',
 
-  MENU_GROUP: "menu_group",
+  MENU_GROUP: 'menu_group',
 
-  MENU_GROUPS: "menu_groups",
+  MENU_GROUPS: 'menu_groups',
 
-  ISSYNC: "issync",
+  ISSYNC: 'issync',
 
-  POLITICAL_APPEARANCE: "political_appearance",
+  POLITICAL_APPEARANCE: 'political_appearance',
 
-  BORROW_TYPE: "borrow_type",
+  BORROW_TYPE: 'borrow_type',
 
-  INVOICE_TYPE: "invoice_type",
+  INVOICE_TYPE: 'invoice_type',
 
-  REPAYMENT_METHOD: "repayment_method",
+  REPAYMENT_METHOD: 'repayment_method',
 
-  POST_RANK_LEVEL: "post_rank_level",
+  POST_RANK_LEVEL: 'post_rank_level',
 
-  PROFESSIONAL_SKILL: "professional_skill",//专业技能
+  PROFESSIONAL_SKILL: 'professional_skill',//专业技能
 
-  INTERVIEW_METHOD: "interview_method",//面试形式
+  INTERVIEW_METHOD: 'interview_method',//面试形式
 
-  RECRUIT_METHOD: "recruit_method", //招聘方式
+  RECRUIT_METHOD: 'recruit_method', //招聘方式
 
-  SEAL_TYPE: "seal_type", //用章类别
+  SEAL_TYPE: 'seal_type', //用章类别
 
-  SEAL_USE_METHOD: "seal_use_method",//用章方式
+  SEAL_USE_METHOD: 'seal_use_method',//用章方式
 
-  WELFARE_STATUS: "welfare_status",
+  WELFARE_STATUS: 'welfare_status',
 
-  CONDOLE_TYPE: "condoleType",
+  CONDOLE_TYPE: 'condoleType',
 
-  CHECK_EXCEPTION_STATE: "check_exception_state",//盘点异常状态
+  CHECK_EXCEPTION_STATE: 'check_exception_state',//盘点异常状态
 
-  CHECK_TEST: "check_test",//盘点检验
+  CHECK_TEST: 'check_test',//盘点检验
 
-  CHECK_RESULT: "check_result",//检验结果
+  CHECK_RESULT: 'check_result',//检验结果
 
-  CHECK_CATEGORY: "check_category",
+  CHECK_CATEGORY: 'check_category',
 
-  SITE_TYPE: "site_type",
+  SITE_TYPE: 'site_type',
 
-  SEPARATION_REASON: "separation_reason",//离职原因
+  SEPARATION_REASON: 'separation_reason',//离职原因
 
   //积分模块
-  INTEGRAL_CHANGE_TYPE: "integral_change_type",
-  INTEGRAL_MODE: "integral_mode",
+  INTEGRAL_CHANGE_TYPE: 'integral_change_type',
+  INTEGRAL_MODE: 'integral_mode',
 
   //消息推送模块
-  MESSAGE_TYPE: "message_type",
+  MESSAGE_TYPE: 'message_type',
 
-  PURCHASE_STATE: "purchase_state",//采购状态
+  PURCHASE_STATE: 'purchase_state',//采购状态
 
-  THING_CATEGORY: "thing_category",//物品类型
+  THING_CATEGORY: 'thing_category',//物品类型
 
-  RECEIVE_CATEGORY: "receive_category",//领用类型
+  RECEIVE_CATEGORY: 'receive_category',//领用类型
 
-  PRUCHASE_CATEGORY: "purchase_category",//采购类型
+  PRUCHASE_CATEGORY: 'purchase_category',//采购类型
 
-  PHONE_APPLY_REASON: "phone_apply_reason",//手机号申请原因
+  PHONE_APPLY_REASON: 'phone_apply_reason',//手机号申请原因
 
-  LETTER_DISPOSE_RESULT: "letter_dispose_result",//信访件处理结果
+  LETTER_DISPOSE_RESULT: 'letter_dispose_result',//信访件处理结果
 
-  REPAIR_URGENCY_LEVEL: "repair_urgency_level",//报修紧急程度
+  REPAIR_URGENCY_LEVEL: 'repair_urgency_level',//报修紧急程度
 
-  REPAIR_SUBMIT_CATEGORY: "repair_submit_category",//报修提交类型
+  REPAIR_SUBMIT_CATEGORY: 'repair_submit_category',//报修提交类型
 
-  PROJECT_GRADE: "project_grade",
+  PROJECT_GRADE: 'project_grade',
 
-  URGENCY: "urgency",
+  URGENCY: 'urgency',
 
-  PROJECT_TYPE: "projectType",
+  PROJECT_TYPE: 'projectType',
 
-  TASK_PRIORITY: "task_priority",
+  TASK_PRIORITY: 'task_priority',
 
-  TASK_TYPE: "task_type",
+  TASK_TYPE: 'task_type',
 
-  TASK_STATUS: "task_status",
+  TASK_STATUS: 'task_status',
 
-  TASK_GRADE: "task_grade",
+  TASK_GRADE: 'task_grade',
 
-  TASK_URGENCY: "urgency",
+  TASK_URGENCY: 'urgency',
 
-  ISUPLOAD: "is_upload",
+  ISUPLOAD: 'is_upload',
 
-  PROFILE_FILE_TYPE: "profile_file_type",
+  PROFILE_FILE_TYPE: 'profile_file_type',
 
-  TASK_DEGREE: "task_degree",//任务进度
+  TASK_DEGREE: 'task_degree',//任务进度
 
-  WAREHOUSE_INVENTORY_STATE: "warehouse_inventory_state",//库存状态
+  WAREHOUSE_INVENTORY_STATE: 'warehouse_inventory_state',//库存状态
 
-  ERP_RECEIVE_URGENCY: "erp_receive_urgency",//物资领用紧急状态
+  ERP_RECEIVE_URGENCY: 'erp_receive_urgency',//物资领用紧急状态
 
-  SEAL_USE_PLACE: "seal_use_place",//用印地点
+  SEAL_USE_PLACE: 'seal_use_place',//用印地点
 
-  CONTRACT_TEMPLATE_CATEGORY: "contract_template_category",//合同模板类型
+  CONTRACT_TEMPLATE_CATEGORY: 'contract_template_category',//合同模板类型
 
-  WELFARE_APPLY_ADDR: "welfare_apply_addr",//福利领用地点
+  WELFARE_APPLY_ADDR: 'welfare_apply_addr',//福利领用地点
 
-  GXGA_RSSH_APPLICATION_TYPE: "gxga_rssh_application_type",//关心关爱-人身伤害申请
+  GXGA_RSSH_APPLICATION_TYPE: 'gxga_rssh_application_type',//关心关爱-人身伤害申请
 
-  DISHES_TYPE: "dishes_type",//关心关爱-人身伤害申请
+  DISHES_TYPE: 'dishes_type',//关心关爱-人身伤害申请
 
-  PRINT_STATUS: "print_status",//打印模板状态
+  PRINT_STATUS: 'print_status',//打印模板状态
 
-  MESSAGE_TIME_TYPE: "message_time_type",//定时任务消息类型
+  MESSAGE_TIME_TYPE: 'message_time_type',//定时任务消息类型
 
-  PLATFORM_MESSAGE_TYPE: "platform_message_type",//平台消息类型
+  PLATFORM_MESSAGE_TYPE: 'platform_message_type',//平台消息类型
 
+  // ========== supplier 供应商模块 ==========
+  GOODS_PACK: "goods_pack",//商品包装方式
+
+  PRICE_STRATEGY: "price_strategy",//价格策略
+
+  AFTERSALE_STRATEGY: "aftersale_strategy",//售后策略
+
+  BILL_STATE: "bill_state",//账单状态
+
+  BILL_CATEGORY: "bill_category",//账单类型
+
+  AFTERSALE_CATEGORY: "aftersale_category",//售后类型
+
+  AFTERSALE_STATE: "aftersale_state",//售后处理状态
+
+  AFTERSALE_RESULT: "aftersale_result",//售后处理结果
+
+  AFTERSALE_METHOD: "aftersale_method",//售后处理方式
+
+  CLIENT_CATEGORY: "client_category",//客户类型
+
+  SIGNING_STATE: "signing_state",//签约状态
+
+  SALE_ORDER_TYPE: 'sale_order_type',
+
+  PROVISION_PERIOD: 'provision_period',
+
+  LOGISTICS_STUTAS: 'shipments_status',
+
+  DELIVERY_MODE: 'delivery_mode',
+
+  SHIPMENTS_STATUS: 'logistics_stutas'
 }
 
 /**
@@ -301,21 +333,21 @@ export function getDictDatas(dictType) {
  */
 export function getDictDatas2(dictType, values) {
   if (values === undefined) {
-    return [];
+    return []
   }
   // 如果是单个元素,则转换成数组
   if (!Array.isArray(values)) {
-    values = [this.value];
+    values = [this.value]
   }
   // 获得字典数据
-  const results = [];
+  const results = []
   for (const value of values) {
-    const dict = getDictData(dictType, value);
+    const dict = getDictData(dictType, value)
     if (dict) {
-      results.push(dict);
+      results.push(dict)
     }
   }
-  return results;
+  return results
 }
 
 export function getDictData(dictType, value) {
@@ -328,13 +360,13 @@ export function getDictData(dictType, value) {
   value = value + '' // 强制转换成字符串,因为 DictData 小类数值,是字符串
   for (const dictData of dictDatas) {
     if (dictData.value === value) {
-      return dictData;
+      return dictData
     }
   }
   return undefined
 }
 
 export function getDictDataLabel(dictType, value) {
-  const dict = getDictData(dictType, value);
-  return dict ? dict.label : '';
+  const dict = getDictData(dictType, value)
+  return dict ? dict.label : ''
 }

Diff do ficheiro suprimidas por serem muito extensas
+ 460 - 382
src/views/login.vue


+ 620 - 0
src/views/navigation.vue

@@ -0,0 +1,620 @@
+<template>
+    <div class="main_container">
+        <div style="background-color: #F5F7FB;overflow: hidden;">
+            <div class="top">
+                <div class="top_one">
+                    <div class="top_one left">
+                        <span>会助理平台</span>
+                    </div>
+                    <div class="top_one middle">
+                        <el-input popper-class="my-autocomplete" v-model="queryWord" style="width: 81.25%;">
+                            <i class="el-icon-search" slot="suffix" @click="handleQuery()"
+                                style="width:2%; height: 100%; display: flex;align-items: center;cursor: pointer">
+                            </i>
+                        </el-input>
+                    </div>
+                    <div class="top_one right">
+                        <div style="display: flex;width: 15vh;justify-content: flex-end;align-items: center;font-weight: 400;
+                            font-size: 14px; text-overflow: ellipsis;">
+                            <el-avatar size="medium"
+                                src="https://hzl.willalp.com/static/img/profile.b87e3d56.jpg"></el-avatar>
+                            <span style="margin-left: 10%;cursor: pointer">用户名</span>
+                        </div>
+
+                        <div style="margin-left: 10%;margin-right: 8%">
+                            <span style="cursor: pointer">注销</span>
+                        </div>
+
+                    </div>
+                </div>
+                <div class="top_two">
+                    <div class="top_two left">
+                        <el-avatar size="medium"
+                            src="https://hzl.willalp.com/static/img/profile.b87e3d56.jpg"></el-avatar>
+                        <span style="margin-left: 2%;">xxx注册机构</span>
+                    </div>
+                    <div class="top_two middle">
+                        <el-menu default-active="1" class="top_two_menu" mode="horizontal" @select="">
+                            <el-menu-item index="1">首页</el-menu-item>
+                            <el-menu-item index="2">操作台</el-menu-item>
+                            <el-menu-item index="3">个人中心</el-menu-item>
+                        </el-menu>
+                    </div>
+                </div>
+            </div>
+            <div class="left">
+                <div class="left_top">
+                    <div class="left_top left">
+                        <div class="block" style="height:100%;width: 100%;">
+                            <el-carousel height="29.5vh">
+                                <el-carousel-item v-for="item in 4" :key="item">
+                                </el-carousel-item>
+                            </el-carousel>
+                        </div>
+                    </div>
+                    <div class="left_top right">
+                        <a class="moreMessage" @click="">更多</a>
+                        <el-tabs v-model="leftTopRight" @tab-click="" style="width: 98%; margin: 0px auto">
+                            <el-tab-pane label="机构资讯" name="">
+                                <div style="overflow-y: auto;height: 20vh;">
+                                    <el-row v-for="(item, index) of dataList" :key="index">
+                                        <div>
+                                            <el-row>
+                                                <div style="margin-bottom: 5px;">
+                                                    <div class="leftContent">{{ item.title }}</div>
+                                                    <div class="rightContent">{{ item.createTime }}</div>
+                                                </div>
+                                            </el-row>
+                                        </div>
+                                    </el-row>
+                                </div>
+                            </el-tab-pane>
+                            <el-tab-pane label="公司要闻" name=""></el-tab-pane>
+                            <el-tab-pane label="通知公告" name=""></el-tab-pane>
+                        </el-tabs>
+                    </div>
+                </div>
+                <div class="left_middle">
+                    <a class="moreMessage" @click="">更多</a>
+                    <el-tabs v-model="leftMiddle" @tab-click="" style="width: 98%; margin: 0px auto">
+                        <el-tab-pane label="专栏" name="">
+                            <div style="overflow-y: auto;height: 30vh;">
+                                <el-row v-for="(item, index) of dataList2" :key="index">
+                                    <div>
+                                        <el-row>
+                                            <div style="margin-bottom: 5px;">
+                                                <div class="leftContentPrefix">[ {{ item.tag }} ]</div>
+                                                <div class="leftContent">{{ item.title }}</div>
+                                                <div class="rightContent">{{ item.createTime }}</div>
+                                            </div>
+                                        </el-row>
+                                    </div>
+                                </el-row>
+                            </div>
+                        </el-tab-pane>
+                        <el-tab-pane label="党建" name=""></el-tab-pane>
+                        <el-tab-pane label="团建" name=""></el-tab-pane>
+                        <el-tab-pane label="工会" name=""></el-tab-pane>
+                        <el-tab-pane label="政策" name=""></el-tab-pane>
+                    </el-tabs>
+                </div>
+                <div class="left_bottom">
+                    <a class="moreMessage" @click="">更多</a>
+                    <el-tabs v-model="leftBottom" @tab-click="" style="width: 98%; margin: 0px auto">
+                        <el-tab-pane label="平台咨询" name="">
+                            <div class="sys_card" v-for="item in ptzxList">
+                                <img :src="item.coverPic" style="width: 100%;height: 100%;border-radius: 4px;"
+                                    @click=""></img>
+                                <div class="sys_card_title">
+                                    <div style="width: 98%;">
+                                        <el-row>
+                                            <span class="sys_card_title_font"
+                                                style="color: #fff;font-size: 13px;font-weight: bold;margin-left: 1vh;margin-top: 1vh; ">
+                                                {{ item.title }}
+                                            </span>
+                                        </el-row>
+                                        <el-row>
+                                            <span class="sys_card_title_font"
+                                                style="color: #fff;font-size: 12px;margin-left: 1vh;">
+                                                {{ item.sketch }}
+                                            </span>
+                                        </el-row>
+                                    </div>
+
+                                </div>
+                            </div>
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+            </div>
+            <div class="right">
+                <div class="right_top">
+                    <a class="moreMessage" @click="">更多</a>
+                    <el-tabs @tab-click="" style="width: 98%; margin: 0px auto">
+                        <el-tab-pane label="跳转模块" name="">
+                            <div v-for="(item, index) of menuList" :key="index" style="display: inline">
+                                <div class="listItem" @click="" style="cursor: pointer">
+                                    <div>
+                                        <div class="menuImg">
+                                            <img class="imgSty" :src="item.imgUrl" />
+                                        </div>
+                                        <div class="titleSty">
+                                            <span>{{ item.name }}</span>
+                                        </div>
+                                    </div>
+                                </div>
+                            </div>
+                        </el-tab-pane>
+                    </el-tabs>
+
+                </div>
+                <div class="right_middle">
+                    <a class="moreMessage" @click="">更多</a>
+                    <el-tabs v-model="rightMiddle" @tab-click="" style="width: 98%; margin: 0px auto">
+                        <el-tab-pane label="规章制度" name="">
+                            <div style="overflow-y: auto;height: 30vh;">
+                                <el-row v-for="(item, index) of dataList3" :key="index">
+                                    <div>
+                                        <el-row>
+                                            <div style="margin-bottom: 5px;">
+                                                <!-- <div class="leftContentPrefix">[ {{ item.tag }} ]</div> -->
+                                                <div class="leftContent">{{ item.title }}</div>
+                                                <div class="rightContent">{{ item.createTime }}</div>
+                                            </div>
+                                        </el-row>
+                                    </div>
+                                </el-row>
+                            </div>
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+                <div class="right_bottom">
+                    <a class="moreMessage" @click="">更多</a>
+                    <el-tabs v-model="rightBottom" @tab-click="" style="width: 98%; margin: 0px auto">
+                        <el-tab-pane label="文件下载" name="">
+                            <div style="overflow-y: auto;height: 20vh;">
+                                <el-row v-for="(item, index) of dataList3" :key="index">
+                                    <div>
+                                        <el-row>
+                                            <div style="margin-bottom: 5px;">
+                                                <!-- <div class="leftContentPrefix">[ {{ item.tag }} ]</div> -->
+                                                <div style="display: inline-block;">
+                                                    <div class="leftContent">{{ item.title }}</div>
+                                                    <div style="width: 20vh;">{{ item.createTime }}</div>
+                                                </div>
+                                                <div style="float: right;">
+                                                    <el-button class="rightBottomButter">下载</el-button>
+                                                </div>
+                                            </div>
+                                        </el-row>
+                                    </div>
+                                </el-row>
+                            </div>
+                        </el-tab-pane>
+                    </el-tabs>
+                </div>
+            </div>
+            <div class="bottom">
+            </div>
+        </div>
+
+    </div>
+</template>
+
+<script>
+
+
+export default {
+    name: "Navigation",
+    components: {
+    },
+    data() {
+        return {
+            queryWord: undefined,
+            leftTopRight: undefined,
+            leftMiddle: undefined,
+            rightMiddle: undefined,
+            leftBottom: undefined,
+            rightBottom: undefined,
+            dataList: [
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+            ],
+            dataList2: [
+                { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                // { tag: "党政要闻", title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+            ],
+            dataList3: [
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+                { title: "这是标题这是标题", createTime: "2024-09-07 15:23:22" },
+            ],
+            menuList: [
+                { name: "市场1", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场2", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场3", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场4", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场5", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场6", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场7", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场8", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场9", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+                { name: "市场10", imgUrl: "https://hzl.willalp.com:9000/willalpbucket/2.png" },
+            ],
+            ptzxList: [
+                { coverPic: "https://ts.willalp.com:9002/willalpbucket/微信图片_2024032809233720240328092531.png", title: "清明放假通知", sketch: "放假时间:4月4-6日放假,共3天。4月7日(星期日)上班。" },
+                { coverPic: "https://ts.willalp.com:9002/willalpbucket/微信图片_2024032809233720240328092531.png", title: "清明放假通知", sketch: "放假时间:4月4-6日放假,共3天。4月7日(星期日)上班。" },
+                { coverPic: "https://ts.willalp.com:9002/willalpbucket/微信图片_2024032809233720240328092531.png", title: "清明放假通知", sketch: "放假时间:4月4-6日放假,共3天。4月7日(星期日)上班。" }
+            ],
+        };
+    },
+    beforeCreate() {
+    },
+    created() {
+
+    },
+    methods: {
+        /** 处理搜索 */
+        handleQuery() {
+            console.log(this.queryWord)
+        },
+
+    },
+};
+</script>
+<style scoped>
+::v-deep .el-tabs__item {
+    color: #6F6F6F;
+}
+::v-deep .el-tabs__item.is-active {
+    color: #333333;
+}
+.rightBottomButter {
+    background: #FF9736;
+    border-radius: 4px 4px 4px 4px;
+    border: 1px solid #FF9736;
+
+    font-family: Inter, Inter;
+    font-weight: 400;
+    font-size: 14px;
+    color: #FFFFFF;
+    line-height: 16px;
+    text-align: left;
+    font-style: normal;
+    text-transform: none;
+}
+
+.sys_card_title_font {
+    display: block;
+    overflow: hidden;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    -o-text-overflow: ellipsis;
+}
+
+.sys_card_title {
+    position: absolute;
+    width: 100%;
+    height: 35%;
+    background-color: rgba(0, 0, 0, 0.3);
+    border-bottom-left-radius: 4px;
+    border-bottom-right-radius: 4px;
+    bottom: 0;
+    display: block;
+    white-space: nowrap;
+    text-overflow: ellipsis;
+    -o-text-overflow: ellipsis;
+}
+
+.sys_card {
+    width: 31%;
+    height: 19vh;
+    border-radius: 4px;
+    border: 1px solid #f2f2f2;
+    margin: auto 1%;
+    position: relative;
+    float: left;
+}
+
+.titleSty {
+    margin-top: 10px;
+    text-align: center;
+}
+
+.imgSty {
+    width: 100%;
+    height: 100%;
+}
+
+.menuImg {
+    width: 5vh;
+    height: 5vh;
+    /* margin: 1vh auto 0 auto; */
+    margin: 1vh auto 0 auto;
+}
+
+.listItem {
+    width: 20%;
+    /* height: 14vh; */
+    display: inline-block;
+}
+
+.rightContent {
+    /* display: inline-block; */
+    float: right;
+    margin-right: 25px;
+
+    font-family: Microsoft YaHei, Microsoft YaHei;
+    font-weight: 400;
+    font-size: 12px;
+    color: #6F6F6F;
+    line-height: 25px;
+    text-align: center;
+    font-style: normal;
+    text-transform: none;
+}
+
+.leftContentPrefix {
+    display: inline-block;
+    font-family: Microsoft YaHei, Microsoft YaHei;
+    font-weight: 400;
+    font-size: 16px;
+    color: #3B71DD;
+    text-align: left;
+    font-style: normal;
+    text-transform: none;
+    margin-right: 1%;
+}
+
+.leftContent {
+    display: inline-block;
+    font-family: Microsoft YaHei, Microsoft YaHei;
+    font-weight: 400;
+    font-size: 16px;
+    color: #333333;
+    text-align: center;
+    font-style: normal;
+}
+
+.moreMessage {
+    position: absolute;
+    right: 20px;
+    top: 12px;
+    z-index: 9;
+}
+
+.left_bottom .left {
+    height: 100vh;
+    width: 49.5%;
+    /* background-color: #fff; */
+    border-radius: 6px;
+    position: relative;
+}
+
+.el-carousel__item h3 {
+    color: #475669;
+    font-size: 14px;
+    opacity: 0.75;
+    line-height: 150px;
+    margin: 0;
+}
+
+.el-carousel__item:nth-child(2n) {
+    background-color: #99a9bf;
+}
+
+.el-carousel__item:nth-child(2n+1) {
+    background-color: #d3dce6;
+}
+
+.top {
+    height: 13vh;
+    width: 100%;
+    /* background-color: red; */
+}
+
+.top_one {
+    height: 6.5vh;
+    width: 100%;
+    background-color: #3B71DD;
+    display: flex;
+    align-items: center;
+}
+
+.top_one .left {
+    width: 33.33%;
+    height: 85%;
+    display: flex;
+    justify-content: flex-start;
+
+    span {
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: bold;
+        font-size: 24px;
+        color: #FFFFFF;
+        /* line-height: 28px; */
+        letter-spacing: 8px;
+        font-style: normal;
+        text-transform: none;
+        margin-left: 40px;
+    }
+}
+
+.top_one .middle {
+    width: 33.33%;
+}
+
+.top_one .right {
+    justify-content: flex-end;
+    width: 33.33%;
+    height: 85%;
+
+    span {
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: 400;
+        font-size: 14px;
+        color: #FFFFFF;
+        line-height: 16px;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+    }
+}
+
+.top_two {
+    height: 6.5vh;
+    width: 100%;
+    background-color: #FFFFFF;
+    display: flex;
+    align-items: center;
+}
+
+.top_two .left {
+    width: 20%;
+    height: 85%;
+    display: flex;
+    justify-content: flex-start;
+
+    span {
+        font-family: Microsoft YaHei, Microsoft YaHei;
+        font-weight: 400;
+        font-size: 24px;
+        letter-spacing: 3px;
+        line-height: 28px;
+        text-align: left;
+        font-style: normal;
+        text-transform: none;
+    }
+}
+
+.top_two .middle {
+    width: 60%;
+}
+
+.top_two_menu {
+    height: 100%;
+    display: flex;
+    align-items: center;
+    justify-content: center;
+    width: 100%;
+    font-family: Inter, Inter;
+    font-weight: 400;
+    font-size: 24px;
+    color: #6F6F6F;
+    line-height: 28px;
+    text-align: center;
+    font-style: normal;
+    text-transform: none;
+}
+
+.el-menu-item {
+    margin: 0 6%;
+}
+
+.left {
+    height: 100vh;
+    width: 54.25%;
+    margin-left: 1.5%;
+    margin-top: 1vh;
+    float: left;
+    /* background-color: blue; */
+}
+
+.left_top {
+    margin-top: 0;
+    height: 29.5vh;
+    background-color: #FFFFFF;
+    display: flex;
+}
+
+.left_top .left {
+    display: flex;
+    width: 42%;
+    height: 100%;
+    /* background-color: rgb(255, 0, 0); */
+}
+
+.left_top .right {
+    margin-top: 0;
+    display: flex;
+    width: 58%;
+    height: 100%;
+    /* background-color: rgb(255, 0, 191); */
+
+    /* height: 100vh; */
+    /* width: 49.5%; */
+    position: relative;
+}
+
+.left_middle {
+    height: 38vh;
+    margin-top: 2vh;
+    background-color: #FFFFFF;
+    position: relative;
+}
+
+.left_bottom {
+    height: 28.5vh;
+    margin-top: 2vh;
+    background-color: #FFFFFF;
+    position: relative;
+}
+
+.right {
+    height: 100vh;
+    width: 41.25%;
+    margin-left: 1.5%;
+    margin-top: 1vh;
+    float: left;
+    /* background-color: green; */
+}
+
+.right_top {
+    height: 29.5vh;
+    background-color: #FFFFFF;
+    ;
+    position: relative;
+}
+
+.right_middle {
+    height: 38vh;
+    margin-top: 2vh;
+    background-color: #FFFFFF;
+    position: relative;
+}
+
+.right_bottom {
+    height: 28.5vh;
+    margin-top: 2vh;
+    background-color: #FFFFFF;
+    position: relative;
+}
+
+.bottom {
+    height: 5vh;
+    width: 100%;
+    margin-top: 2vh;
+    float: left;
+    /* background-color: rgb(1, 7, 1); */
+}
+</style>

+ 428 - 0
src/views/supplier/afterSale/index.vue

@@ -0,0 +1,428 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="售后工单号" prop="ticketNum">
+        <el-input v-model="queryParams.ticketNum" placeholder="请输入售后工单号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="售后类型" prop="category">
+        <el-select v-model="queryParams.category" placeholder="请选择售后类型" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="dict.value"
+            :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="处理状态" prop="state">
+        <el-select v-model="queryParams.state" placeholder="请选择处理状态" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="处理人" prop="processor">
+        <el-input v-model="queryParams.processor" placeholder="请输入处理人" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="工单接受人" prop="receivePerson">
+        <el-input v-model="queryParams.receivePerson" placeholder="请输入工单接受人" clearable
+          @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:after-sale:create']">新增</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:after-sale:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="售后工单号" align="center" prop="ticketNum" />
+      <el-table-column label="订单编号" align="center" prop="orderCode" />
+      <el-table-column label="售后类型" align="center" prop="category">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_CATEGORY" :value="scope.row.category" />
+        </template>
+      </el-table-column>
+      <el-table-column label="处理状态" align="center" prop="state">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_STATE" :value="scope.row.state" />
+        </template>
+      </el-table-column>
+      <el-table-column label="处理开始时间" align="center" prop="startTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.startTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理结束时间" align="center" prop="endTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.endTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="处理结果" align="center" prop="result">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_RESULT" :value="scope.row.result" />
+        </template>
+      </el-table-column>
+      <el-table-column label="客户评价" align="center" prop="evaluation" />
+      <el-table-column label="处理人" align="center" prop="processor" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:after-sale:update']">修改</el-button> -->
+          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:after-sale:delete']">删除</el-button> -->
+          <el-button size="mini" type="text" @click="handleDetail(scope.row)">订单详情</el-button>
+          <el-button size="mini" type="text" @click="handleReceive(scope.row)">接受处理</el-button>
+          <el-button size="mini" type="text" @click="handleReject(scope.row)">驳回处理</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="550px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+        <el-form-item label="售后工单号" prop="ticketNum">
+          <el-input v-model="form.ticketNum" placeholder="请输入售后工单号" />
+        </el-form-item>
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="售后类型" prop="category">
+          <el-select v-model="form.category" placeholder="请选择售后类型">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="处理状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择处理状态">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="处理开始时间" prop="startTime">
+          <el-date-picker clearable v-model="form.startTime" type="datetime" value-format="timestamp"
+            placeholder="选择处理开始时间" />
+        </el-form-item>
+        <el-form-item label="处理结束时间" prop="endTime">
+          <el-date-picker clearable v-model="form.endTime" type="datetime" value-format="timestamp"
+            placeholder="选择处理结束时间" />
+        </el-form-item>
+        <el-form-item label="处理结果" prop="result">
+          <el-select v-model="form.result" placeholder="请选择处理结果">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_RESULT)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户评价" prop="evaluation">
+          <el-input type="textarea" v-model="form.evaluation" placeholder="请输入客户评价" />
+        </el-form-item>
+        <el-form-item label="处理人" prop="processor">
+          <el-input v-model="form.processor" placeholder="请输入处理人" />
+        </el-form-item>
+        <el-form-item label="问题描述" prop="questionDescriptive">
+          <el-input type="textarea" v-model="form.questionDescriptive" placeholder="请输入问题描述" />
+        </el-form-item>
+        <el-form-item label="问题照片" prop="questionPicture">
+          <el-input v-model="form.questionPicture" placeholder="请输入问题照片" />
+        </el-form-item>
+        <el-form-item label="工单接受人" prop="receivePerson">
+          <el-input v-model="form.receivePerson" placeholder="请输入工单接受人" />
+        </el-form-item>
+        <el-form-item label="处理方式" prop="processMethod">
+          <el-select v-model="form.processMethod" placeholder="请选择处理方式">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_METHOD)" :key="dict.value"
+              :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="处理建议" prop="processRecommendation">
+          <el-input type="textarea" v-model="form.processRecommendation" placeholder="请输入处理建议" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 对话框(售后工单) -->
+    <el-dialog title="售后工单" :visible.sync="openDetail" width="900px" v-dialogDrag append-to-body>
+      <el-row>
+        <el-form ref="form" :model="formDetail" label-width="95px">
+          <el-col :span="12">
+            <el-form-item label="售后工单" prop="ticketNum">
+              <el-input v-model="formDetail.ticketNum" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="订单编号" prop="orderCode">
+              <el-input v-model="formDetail.orderCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="售后类型" prop="category">
+              <el-select v-model="formDetail.category" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="处理状态" prop="state">
+              <el-select v-model="formDetail.state" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="问题描述" prop="questionDescriptive">
+              <el-input type="textarea" v-model="formDetail.questionDescriptive" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="问题照片" prop="questionPicture">
+              <el-input v-model="formDetail.questionPicture" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="工单接收人" prop="receivePerson">
+              <el-input v-model="formDetail.receivePerson" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="受理时间" prop="startTime">
+              <el-date-picker v-model="formDetail.startTime" type="datetime" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="问题处理人" prop="processor">
+              <el-input v-model="formDetail.processor" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="处理方式" prop="processMethod">
+              <el-select v-model="formDetail.processMethod" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_METHOD)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="处理建议" prop="processRecommendation">
+              <el-input type="textarea" v-model="formDetail.processRecommendation" disabled />
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </el-row>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createAfterSale,
+  updateAfterSale,
+  deleteAfterSale,
+  getAfterSale,
+  getAfterSalePage,
+  exportAfterSaleExcel
+} from "@/api/supplier/afterSale";
+
+export default {
+  name: "AfterSale",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 售后列列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openDetail: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        ticketNum: null,
+        orderCode: null,
+        category: null,
+        state: null,
+        startTime: [],
+        endTime: [],
+        result: null,
+        evaluation: null,
+        processor: null,
+        questionDescriptive: null,
+        questionPicture: null,
+        receivePerson: null,
+        processMethod: null,
+        processRecommendation: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      formDetail: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 订单详情 */
+    handleDetail(row) {
+      this.formDetail = {};
+      const id = row.id;
+      //获得售后详情
+      getAfterSale(id).then(response => {
+        this.formDetail = response.data;
+        this.openDetail = true;
+      });
+    },
+    /** 接受处理 */
+    handleReceive(row) {
+
+    },
+    /** 驳回处理 */
+    handleReject(row) {
+
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getAfterSalePage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        ticketNum: undefined,
+        orderCode: undefined,
+        category: undefined,
+        state: undefined,
+        startTime: undefined,
+        endTime: undefined,
+        result: undefined,
+        evaluation: undefined,
+        processor: undefined,
+        questionDescriptive: undefined,
+        questionPicture: undefined,
+        receivePerson: undefined,
+        processMethod: undefined,
+        processRecommendation: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加售后信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getAfterSale(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改售后信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateAfterSale(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createAfterSale(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除售后列编号为"' + id + '"的数据项?').then(function () {
+        return deleteAfterSale(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有售后列数据项?').then(() => {
+        this.exportLoading = true;
+        return exportAfterSaleExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '售后列.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 451 - 0
src/views/supplier/billInfo/index.vue

@@ -0,0 +1,451 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="78px">
+      <el-form-item label="账单编号" prop="billCode">
+        <el-input v-model="queryParams.billCode" placeholder="请输入账单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="账单类型" prop="category">
+        <el-select v-model="queryParams.category" placeholder="请选择账单类型" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_CATEGORY)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="账单状态" prop="state">
+        <el-select v-model="queryParams.state" placeholder="请选择账单状态" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:bill-info:create']">新增</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:bill-info:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-tabs type="border-card" value="2" @tab-click="handleClick">
+      <el-tab-pane label="全部" name="2">
+        <el-table v-loading="loading" :data="list">
+          <!-- <el-table-column label=" 主键id" align="center" prop="id" /> -->
+          <!-- <el-table-column label="序号" align="center">
+        <template slot-scope="scope">{{ scope.$index + 1 }}</template></el-table-column> -->
+          <el-table-column label="账单编号" align="center" prop="billCode" />
+          <el-table-column label="订单编号" align="center" prop="orderCode" />
+          <el-table-column label="账单类型" align="center" prop="category">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_CATEGORY" :value="scope.row.category" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单状态" align="center" prop="state">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单金额" align="center" prop="total" />
+          <el-table-column label="已付金额" align="center" prop="paid" />
+          <el-table-column label="未付金额" align="center" prop="unpaid" />
+          <el-table-column label="是否结清" align="center" prop="finished">
+            <template v-slot="scope">
+              <el-tag type="success" v-if="scope.row.finished == 1">是</el-tag>
+              <el-tag type="danger" v-if="scope.row.finished == 0">否</el-tag>
+            </template>
+          </el-table-column>
+          <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column> -->
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" @click="handlePay(scope.row)">账单结算</el-button>
+              <el-button size="mini" type="text" @click="handleReturn(scope.row)">退款</el-button>
+              <el-button size="mini" type="text" @click="handlePayLog(scope.row)">付款记录</el-button>
+              <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:bill-info:update']">修改</el-button> -->
+              <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:bill-info:delete']">删除</el-button> -->
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-tab-pane>
+      <el-tab-pane label="未结清" name="0">
+        <el-table v-loading="loading" :data="list">
+          <el-table-column label="账单编号" align="center" prop="billCode" />
+          <el-table-column label="订单编号" align="center" prop="orderCode" />
+          <el-table-column label="账单类型" align="center" prop="category">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_CATEGORY" :value="scope.row.category" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单状态" align="center" prop="state">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单金额" align="center" prop="total" />
+          <el-table-column label="已付金额" align="center" prop="paid" />
+          <el-table-column label="未付金额" align="center" prop="unpaid" />
+          <el-table-column label="是否结清" align="center" prop="finished">
+            <template v-slot="scope">
+              <el-tag type="success" v-if="scope.row.finished == 1">是</el-tag>
+              <el-tag type="danger" v-if="scope.row.finished == 0">否</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" @click="handlePay(scope.row)">账单结算</el-button>
+              <el-button size="mini" type="text" @click="handleReturn(scope.row)">退款</el-button>
+              <el-button size="mini" type="text" @click="handlePayLog(scope.row)">付款记录</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-tab-pane>
+      <el-tab-pane label="已结清" name="1">
+        <el-table v-loading="loading" :data="list">
+          <el-table-column label="账单编号" align="center" prop="billCode" />
+          <el-table-column label="订单编号" align="center" prop="orderCode" />
+          <el-table-column label="账单类型" align="center" prop="category">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_CATEGORY" :value="scope.row.category" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单状态" align="center" prop="state">
+            <template v-slot="scope">
+              <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+            </template>
+          </el-table-column>
+          <el-table-column label="账单金额" align="center" prop="total" />
+          <el-table-column label="已付金额" align="center" prop="paid" />
+          <el-table-column label="未付金额" align="center" prop="unpaid" />
+          <el-table-column label="是否结清" align="center" prop="finished">
+            <template v-slot="scope">
+              <el-tag type="success" v-if="scope.row.finished == 1">是</el-tag>
+              <el-tag type="danger" v-if="scope.row.finished == 0">否</el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" @click="handlePay(scope.row)">账单结算</el-button>
+              <el-button size="mini" type="text" @click="handleReturn(scope.row)">退款</el-button>
+              <el-button size="mini" type="text" @click="handlePayLog(scope.row)">付款记录</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-tab-pane>
+    </el-tabs>
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="账单编号" prop="billCode">
+          <el-input v-model="form.billCode" placeholder="请输入账单编号" />
+        </el-form-item>
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="账单类型" prop="category">
+          <el-select v-model="form.category" placeholder="请选择账单类型" clearable>
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_CATEGORY)" :key="dict.value" :label="dict.label"
+              :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="账单状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择账单状态" clearable>
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="dict.value" :label="dict.label"
+              :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="账单金额" prop="total">
+          <el-input-number v-model="form.total" :precision="2" :step="100" />
+        </el-form-item>
+        <el-form-item label="已付金额" prop="paid">
+          <el-input-number v-model="form.paid" :precision="2" :step="100" @change="changeUnpaid($event)" />
+        </el-form-item>
+        <el-form-item label="未付金额" prop="unpaid">
+          <el-input-number v-model="form.unpaid" :precision="2" :step="100" />
+        </el-form-item>
+        <el-form-item label="是否结清" prop="finished">
+          <el-radio-group v-model="form.finished">
+            <el-radio label="0">否</el-radio>
+            <el-radio label="1">是</el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 对话框(付款记录) -->
+    <el-dialog title="付款记录" :visible.sync="openPayLog" width="1000px" v-dialogDrag append-to-body>
+      <el-row>
+        <el-form ref="formPayLog" :model="formPayLog" label-width="90px">
+          <el-col :span="12">
+            <el-form-item label="订单编号" prop="orderCode">
+              <el-input v-model="formPayLog.orderCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="账单编号" prop="billCode">
+              <el-input v-model="formPayLog.billCode" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="账单状态" prop="state">
+              <el-select v-model="formPayLog.state" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="parseInt(dict.value)"
+                  :label="dict.label" :value="parseInt(dict.value)" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-table :data="formPayLog.list" v-loading="loadingPayLog">
+              <el-table-column label="序号" align="center" prop="id" />
+              <el-table-column label="付款方" align="center" prop="payer" />
+              <el-table-column label="付款账号" align="center" prop="payAccount" />
+              <el-table-column label="付款方式" align="center" prop="payMethod" />
+              <el-table-column label="付款金额" align="center" prop="payAmount" />
+              <el-table-column label="收款单位" align="center" prop="payee" />
+              <el-table-column label="收款账号" align="center" prop="receiveAccount" />
+              <el-table-column label="付款时间" align="center" prop="" width="150">
+                <template v-slot="scope">
+                  <span>{{ parseTime(scope.row.payTime) }}</span>
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+        </el-form>
+      </el-row>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {
+  createBillInfo,
+  updateBillInfo,
+  deleteBillInfo,
+  getBillInfo,
+  getBillInfoPage,
+  exportBillInfoExcel,
+  getPayDetailList,
+} from "@/api/supplier/billInfo";
+
+export default {
+  name: "BillInfo",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      loadingPayLog: false,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 账单列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openPayLog: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        billCode: null,
+        orderCode: null,
+        category: null,
+        state: null,
+        total: null,
+        paid: null,
+        unpaid: null,
+        finished: null,
+      },
+      // 表单参数
+      form: {},
+      formPayLog: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    handleClick(tab, event) {
+      if (tab.name == '2') {//全部
+        this.queryParams.finished = null;
+      }
+      if (tab.name == '0') {//未结清
+        this.queryParams.finished = 0;
+      }
+      if (tab.name == '1') {//已结清
+        this.queryParams.finished = 1;
+      }
+      this.getList();
+    },
+    changeUnpaid(event) {
+      this.$set(this.form, "unpaid", this.form.total - event);
+    },
+    /** 账单结算 */
+    handlePay(row) {
+
+    },
+    /** 退款 */
+    handleReturn(row) {
+
+    },
+    /** 付款记录 */
+    handlePayLog(row) {
+      this.formPayLog.orderCode = row.orderCode;
+      this.formPayLog.billCode = row.billCode;
+      this.formPayLog.state = row.state;
+      this.formPayLog.list = [];
+      this.loadingPayLog = true
+      //获取付款记录
+      getPayDetailList(row.id).then(res => {
+        this.formPayLog.list = res.data;
+        this.loadingPayLog = false;
+      })
+      this.openPayLog = true;
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getBillInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        billCode: undefined,
+        orderCode: undefined,
+        category: undefined,
+        state: undefined,
+        total: undefined,
+        paid: undefined,
+        unpaid: undefined,
+        finished: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加账单";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getBillInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改账单";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateBillInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createBillInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除账单编号为"' + id + '"的数据项?').then(function () {
+        return deleteBillInfo(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有账单数据项?').then(() => {
+        this.exportLoading = true;
+        return exportBillInfoExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '账单.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 358 - 0
src/views/supplier/clientInfo/index.vue

@@ -0,0 +1,358 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="客户编号" prop="code">
+        <el-input v-model="queryParams.code" placeholder="请输入客户编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="客户名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入客户名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="客户类型" prop="category">
+        <el-select v-model="queryParams.category" placeholder="请选择客户类型" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.CLIENT_CATEGORY)" :key="dict.value" :label="dict.label"
+            :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item label="客户联系人" prop="associate">
+        <el-input v-model="queryParams.associate" placeholder="请输入客户联系人" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="是否签约" prop="contracted">
+        <el-select v-model="queryParams.contracted" placeholder="请选择是否签约" clearable @keyup.enter.native="handleQuery">
+          <el-option v-for="dict in this.sureFlag" :key="dict.value" :label="dict.label" :value="dict.value" />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:client-info:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:client-info:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="客户编号" align="center" prop="code" />
+      <el-table-column label="客户名称" align="center" prop="name" />
+      <el-table-column label="客户类型" align="center" prop="category">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.CLIENT_CATEGORY" :value="scope.row.category" />
+        </template>
+      </el-table-column>
+      <el-table-column label="客户地址" align="center" prop="address" />
+      <el-table-column label="客户联系人" align="center" prop="associate" />
+      <el-table-column label="客户联系方式" align="center" prop="phone" />
+      <el-table-column label="成交次数" align="center" prop="dealNumber" />
+      <el-table-column label="成交总金额" align="center" prop="dealAmount" />
+      <el-table-column label="客户标签" align="center" prop="tag" />
+      <el-table-column label="是否签约" align="center" prop="contracted">
+        <template v-slot="scope">
+          <el-tag v-if="scope.row.category == 1">是</el-tag>
+          <el-tag v-if="scope.row.category == 0">否</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="签约周期" align="center" prop="contractedTime" />
+      <el-table-column label="备注" align="center" prop="remark" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['supplier:client-info:update']">修改</el-button>
+          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:client-info:delete']">删除</el-button> -->
+          <el-button size="mini" type="text" @click="handleDealLog(scope.row)">交易记录</el-button>
+          <el-button size="mini" type="text" @click="handleContractLog(scope.row)">签约记录</el-button>
+          <!-- <el-button size="mini" type="text" @click="handleUpdate(scope.row)">客户跟进</el-button> -->
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="98px">
+        <el-form-item label="客户编号" prop="code">
+          <el-input v-model="form.code" placeholder="请输入客户编号" />
+        </el-form-item>
+        <el-form-item label="客户名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入客户名称" />
+        </el-form-item>
+        <el-form-item label="客户类型" prop="category">
+          <el-select v-model="form.category" placeholder="请选择客户类型">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.CLIENT_CATEGORY)" :key="parseInt(dict.value)"
+              :label="dict.label" :value="parseInt(dict.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="客户地址" prop="address">
+          <el-input v-model="form.address" placeholder="请输入客户地址" />
+        </el-form-item>
+        <el-form-item label="客户联系人" prop="associate">
+          <el-input v-model="form.associate" placeholder="请输入客户联系人" />
+        </el-form-item>
+        <el-form-item label="客户联系方式" prop="phone">
+          <el-input v-model="form.phone" placeholder="请输入客户联系方式" />
+        </el-form-item>
+        <el-form-item label="成交次数" prop="dealNumber">
+          <el-input-number v-model="form.dealNumber" :precision="0" :min="0" placeholder="0" />
+        </el-form-item>
+        <el-form-item label="成交总金额" prop="dealAmount">
+          <el-input-number v-model="form.dealAmount" :precision="2" :min="0" placeholder="0.00" />
+        </el-form-item>
+        <el-form-item label="客户标签" prop="tag">
+          <el-input v-model="form.tag" placeholder="请输入客户标签" />
+        </el-form-item>
+        <el-form-item label="是否签约" prop="contracted">
+          <el-select v-model="form.contracted" placeholder="请选择是否签约">
+            <el-option v-for="dict in this.sureFlag" :key="parseInt(dict.value)" :label="dict.label"
+              :value="parseInt(dict.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="签约周期" prop="contractedTime">
+          <el-input v-model="form.contractedTime" placeholder="请输入签约周期" />
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input type="textarea" v-model="form.remark" placeholder="请输入备注" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+
+    <!-- 对话框(交易记录) -->
+    <el-dialog title="交易记录" :visible.sync="openDealLog" width="1100px" v-dialogDrag append-to-body>
+      <el-form ref="formDealLog" :model="formDealLog" label-width="68px">
+        <el-row>
+          <el-col :span="10">
+            <el-form-item label="订单编号" prop="orderCode">
+              <el-input v-model="formDealLog.name" disabled />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <span style="text-align: right;vertical-align: middle;float: left;font-size: 14px;
+            color: #606266;font-weight: 700;margin-bottom: 20px">交易记录</span>
+            <el-table :data="formDealLog.list" v-loading="loadingDealLog">
+              <el-table-column label="订单编号" align="center" prop="" />
+              <el-table-column label="商品名称" align="center" prop="" />
+              <el-table-column label="商品品牌" align="center" prop="" />
+              <el-table-column label="商品型号" align="center" prop="" />
+              <el-table-column label="单位" align="center" prop="" />
+              <el-table-column label="单价" align="center" prop="paee" />
+              <el-table-column label="成交数量" align="center" prop="" />
+              <el-table-column label="成交金额" align="center" prop="" />
+              <el-table-column label="物流状态" align="center" prop="" />
+              <el-table-column label="付款状态" align="center" prop="" />
+              <el-table-column label="订单状态" align="center" prop="" />
+              <el-table-column label="订单日期" align="center" prop="" width="150">
+                <template v-slot="scope">
+                  <!-- <span>{{ parseTime(scope.row.payTime, "{y}-{m}-{d}") }}</span> -->
+                </template>
+              </el-table-column>
+            </el-table>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-dialog>
+
+  </div>
+</template>
+
+<script>
+import {
+  createClientInfo,
+  updateClientInfo,
+  deleteClientInfo,
+  getClientInfo,
+  getClientInfoPage,
+  exportClientInfoExcel
+} from "@/api/supplier/clientInfo";
+
+export default {
+  name: "ClientInfo",
+  components: {
+  },
+  data() {
+    return {
+      sureFlag: [
+        { value: '0', label: '否' },
+        { value: '1', label: '是' }
+      ],
+      // 遮罩层
+      loading: true,
+      loadingDealLog: false,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 客户管理列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      openDealLog: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        code: null,
+        name: null,
+        category: null,
+        address: null,
+        associate: null,
+        phone: null,
+        dealNumber: null,
+        dealAmount: null,
+        tag: null,
+        contracted: null,
+        contractedTime: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      formDealLog: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 交易记录 */
+    handleDealLog(row) {
+      this.formDealLog = {};
+      this.formDealLog.name = row.name;
+      //获得交易记录
+      this.openDealLog = true;
+    },
+    /** 签约记录 */
+    handleContractLog(row) {
+
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getClientInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        code: undefined,
+        name: undefined,
+        category: undefined,
+        address: undefined,
+        associate: undefined,
+        phone: undefined,
+        dealNumber: undefined,
+        dealAmount: undefined,
+        tag: undefined,
+        contracted: undefined,
+        contractedTime: undefined,
+        remark: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加客户管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getClientInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改客户管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateClientInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createClientInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除客户管理编号为"' + id + '"的数据项?').then(function () {
+        return deleteClientInfo(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有客户管理数据项?').then(() => {
+        this.exportLoading = true;
+        return exportClientInfoExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '客户管理.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 327 - 0
src/views/supplier/goodsCategory/index.vue

@@ -0,0 +1,327 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="分类名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入分类名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <!-- <el-form-item label="排序值" prop="sort">
+        <el-input v-model="queryParams.sort" placeholder="请输入排序值" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+      <!-- <el-form-item label="状态" prop="status">
+        <el-select v-model="queryParams.status" placeholder="请选择是否启用" clearable size="small">
+          <el-option label="请选择字典生成" value="" />
+        </el-select>
+      </el-form-item> -->
+      <!-- <el-form-item label="说明" prop="remark">
+        <el-input v-model="queryParams.remark" placeholder="请输入说明" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+      <!-- <el-form-item label="商家数量" prop="number">
+        <el-input v-model="queryParams.number" placeholder="请输入商家数量" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+      <!-- <el-form-item label="父类id" prop="parentId">
+        <el-input v-model="queryParams.parentId" placeholder="请输入父类id" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item> -->
+      <!-- <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss"
+          type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+          :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item> -->
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:goods-category:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:goods-category:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <!-- <el-table v-loading="loading" :data="list"> -->
+    <el-table v-loading="loading" :data="list" row-key="id"
+      :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
+      <el-table-column label="序号" align="center" prop="id">
+        <!-- <template slot-scope="scope">{{ scope.$index + 1 }}</template> -->
+      </el-table-column>
+      <el-table-column label="分类名称" align="center" prop="name" />
+      <el-table-column label="排序值" align="center" prop="sort" />
+      <el-table-column label="状态" align="center" width="100">
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.status" :active-value="0" :inactive-value="1"
+            @change="handleStatusChange(scope.row)" />
+        </template>
+      </el-table-column>
+      <el-table-column label="说明" align="center" prop="remark" />
+      <el-table-column label="商家数量" align="center" prop="number" />
+      <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right" width="200">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-plus" @click="handleAdd(scope.row)"
+            v-hasPermi="['supplier:goods-category:create']">新增子分类</el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['supplier:goods-category:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['supplier:goods-category:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="上级分类" prop="parentId">
+          <treeselect v-model="form.parentId" :options="parentItems" :normalizer="normalizer" placeholder="选择上级分类" />
+        </el-form-item>
+        <el-form-item label="分类名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入分类名称" />
+        </el-form-item>
+        <el-form-item label="排序值" prop="sort">
+          <el-input-number v-model="form.sort" placeholder="请输入排序值" />
+        </el-form-item>
+        <el-form-item label="说明" prop="remark">
+          <el-input type="textarea" v-model="form.remark" placeholder="请输入说明" />
+        </el-form-item>
+        <el-form-item label="商家数量" prop="number">
+          <el-input-number v-model="form.number" placeholder="请输入商家数量" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createGoodsCategory,
+  updateGoodsCategory,
+  deleteGoodsCategory,
+  getGoodsCategory,
+  getGoodsCategoryPage,
+  exportGoodsCategoryExcel,
+  changeCategoryStatus,
+  getGoodsCategoryListAll,
+} from "@/api/supplier/goodsCategory";
+import { CommonStatusEnum } from "@/utils/constants";
+import Treeselect from "@riophae/vue-treeselect";
+import "@riophae/vue-treeselect/dist/vue-treeselect.css";
+
+export default {
+  name: "GoodsCategory",
+  components: {
+    Treeselect,
+  },
+  data() {
+    return {
+      SysCommonStatusEnum: CommonStatusEnum,
+      parentItems: [],
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品分类列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        name: null,
+        sort: null,
+        status: null,
+        remark: null,
+        number: null,
+        parentId: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+        name: [{ required: true, message: "分类名称不能为空", trigger: "blur" }],
+        status: [{ required: true, message: "是否启用(0正常 1停用)不能为空", trigger: "blur" }],
+      }
+    };
+  },
+  created() {
+    this.getList();
+    this.getTemplate();
+  },
+  methods: {
+    /** 转换商品分类结构 */
+    normalizer(node) {
+      if (node.children && !node.children.length) {
+        delete node.children;
+      }
+      return {
+        id: node.id,
+        label: node.name,
+        children: node.children
+      };
+    },
+    // 商品分类状态修改
+    handleStatusChange(row) {
+      // 此时,row 已经变成目标状态了,所以可以直接提交请求和提示
+      let text = row.status === CommonStatusEnum.ENABLE ? "启用" : "停用";
+      this.$modal
+        .confirm('确认要"' + text + '""' + row.name + '"商品分类吗?')
+        .then(function () {
+          return changeCategoryStatus(row.id, row.status);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "成功");
+          this.getList();
+        })
+        .catch(function () {
+          // 异常时,需要将 row.status 状态重置回之前的
+          row.status =
+            row.status === CommonStatusEnum.ENABLE
+              ? CommonStatusEnum.DISABLE
+              : CommonStatusEnum.ENABLE;
+        });
+    },
+    //页面初始化所需数据
+    getTemplate() {
+      //获得父类分类选项
+      getGoodsCategoryListAll().then(res => {
+        this.parentItems = this.handleTree(res.data, "id");
+      })
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getGoodsCategoryPage(this.queryParams).then(response => {
+        this.list = this.handleTree(response.data.list, "id");
+        // this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        sort: undefined,
+        status: undefined,
+        remark: undefined,
+        number: undefined,
+        parentId: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd(row) {
+      this.reset();
+      if (row !== undefined) {
+        this.form.parentId = row.id;
+      }
+      this.open = true;
+      this.title = "添加商品分类";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getGoodsCategory(id).then(response => {
+        this.form = response.data;
+        if (this.form.parentId === 0) { // 无父分类时,标记为 undefined,避免展示为 Unknown
+          this.form.parentId = undefined;
+        }
+        this.open = true;
+        this.title = "修改商品分类";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateGoodsCategory(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createGoodsCategory(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除商品分类编号为"' + id + '"的数据项?').then(function () {
+        return deleteGoodsCategory(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有商品分类数据项?').then(() => {
+        this.exportLoading = true;
+        return exportGoodsCategoryExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '商品分类.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 375 - 0
src/views/supplier/goodsDetail/index.vue

@@ -0,0 +1,375 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <!-- <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="商品编号" prop="code">
+        <el-input v-model="queryParams.code" placeholder="请输入商品编号" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入商品名称" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="关键词" prop="keyword">
+        <el-input v-model="queryParams.keyword" placeholder="请输入关键词" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品品牌" prop="brand">
+        <el-input v-model="queryParams.brand" placeholder="请输入商品品牌" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入商品状态" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="商品类型" prop="category">
+        <el-input v-model="queryParams.category" placeholder="请输入商品类型" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="上架时间" prop="upTime">
+        <el-date-picker v-model="queryParams.upTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form> -->
+
+    <!-- 操作工具栏 -->
+    <!-- <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:goods-detail:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
+                   v-hasPermi="['supplier:goods-detail:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row> -->
+
+    <el-row :gutter="10" class="mb8">
+
+    </el-row>
+    <!-- 列表 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="4">
+        <span>商品分类</span>
+        <el-tree :data="categoryOptions" :props="defaultProps" :expand-on-click-node="false"
+          :filter-node-method="filterNode" ref="tree" default-expand-all @node-click="handleNodeClick"
+          style="overflow: auto;" />
+      </el-col>
+      <el-col :span="20">
+        <el-table v-loading="loading" :data="list">
+          <el-table-column label="序号" align="center" prop="id" />
+          <el-table-column label="商品id" align="center" prop="goodsId" />
+          <el-table-column label="商品编号" align="center" prop="code" />
+          <el-table-column label="商品名称" align="center" prop="name" />
+          <el-table-column label="关键词" align="center" prop="keyword" />
+          <el-table-column label="单位" align="center" prop="unit" />
+          <el-table-column label="市场价" align="center" prop="marketPrice" />
+          <el-table-column label="平台价" align="center" prop="platPrice" />
+          <el-table-column label="商品品牌" align="center" prop="brand" />
+          <el-table-column label="库存" align="center" prop="num" />
+          <el-table-column label="商品状态" align="center" prop="state" />
+          <el-table-column label="商品类型" align="center" prop="category" />
+          <el-table-column label="销售数量" align="center" prop="saleNum" />
+          <el-table-column label="付款策略" align="center" prop="payMethod" />
+          <el-table-column label="售后策略" align="center" prop="aftersaleStrategy" />
+          <el-table-column label="价格策略" align="center" prop="priceStrategy" />
+          <el-table-column label="上架方式" align="center" prop="upMethod" />
+          <el-table-column label="上架数量" align="center" prop="upNum" />
+          <el-table-column label="上架时间" align="center" prop="upTime" width="180">
+            <template v-slot="scope">
+              <span>{{ parseTime(scope.row.upTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="是否置顶" align="center" prop="sticky" />
+          <el-table-column label="商品详情" align="center" prop="productDetail" />
+          <el-table-column label="商品封面" align="center" prop="productPhoto" />
+          <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+            <template v-slot="scope">
+              <span>{{ parseTime(scope.row.createTime) }}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                v-hasPermi="['supplier:goods-detail:update']">修改</el-button>
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                v-hasPermi="['supplier:goods-detail:delete']">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- 分页组件 -->
+        <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+          @pagination="getList" />
+      </el-col>
+    </el-row>
+
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="商品id" prop="goodsId">
+          <el-input v-model="form.goodsId" placeholder="请输入商品id" />
+        </el-form-item>
+        <el-form-item label="商品编号" prop="code">
+          <el-input v-model="form.code" placeholder="请输入商品编号" />
+        </el-form-item>
+        <el-form-item label="商品名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入商品名称" />
+        </el-form-item>
+        <el-form-item label="关键词" prop="keyword">
+          <el-input v-model="form.keyword" placeholder="请输入关键词" />
+        </el-form-item>
+        <el-form-item label="单位" prop="unit">
+          <el-input v-model="form.unit" placeholder="请输入单位" />
+        </el-form-item>
+        <el-form-item label="市场价" prop="marketPrice">
+          <el-input v-model="form.marketPrice" placeholder="请输入市场价" />
+        </el-form-item>
+        <el-form-item label="平台价" prop="platPrice">
+          <el-input v-model="form.platPrice" placeholder="请输入平台价" />
+        </el-form-item>
+        <el-form-item label="商品品牌" prop="brand">
+          <el-input v-model="form.brand" placeholder="请输入商品品牌" />
+        </el-form-item>
+        <el-form-item label="库存" prop="num">
+          <el-input v-model="form.num" placeholder="请输入库存" />
+        </el-form-item>
+        <el-form-item label="商品状态" prop="state">
+          <el-input v-model="form.state" placeholder="请输入商品状态" />
+        </el-form-item>
+        <el-form-item label="商品类型" prop="category">
+          <el-input v-model="form.category" placeholder="请输入商品类型" />
+        </el-form-item>
+        <el-form-item label="销售数量" prop="saleNum">
+          <el-input v-model="form.saleNum" placeholder="请输入销售数量" />
+        </el-form-item>
+        <el-form-item label="付款策略" prop="payMethod">
+          <el-input v-model="form.payMethod" placeholder="请输入付款策略" />
+        </el-form-item>
+        <el-form-item label="售后策略" prop="aftersaleStrategy">
+          <el-input v-model="form.aftersaleStrategy" placeholder="请输入售后策略" />
+        </el-form-item>
+        <el-form-item label="价格策略" prop="priceStrategy">
+          <el-input v-model="form.priceStrategy" placeholder="请输入价格策略" />
+        </el-form-item>
+        <el-form-item label="上架方式" prop="upMethod">
+          <el-input v-model="form.upMethod" placeholder="请输入上架方式" />
+        </el-form-item>
+        <el-form-item label="上架数量" prop="upNum">
+          <el-input v-model="form.upNum" placeholder="请输入上架数量" />
+        </el-form-item>
+        <el-form-item label="上架时间" prop="upTime">
+          <el-date-picker clearable v-model="form.upTime" type="date" value-format="timestamp" placeholder="选择上架时间" />
+        </el-form-item>
+        <el-form-item label="是否置顶" prop="sticky">
+          <el-input v-model="form.sticky" placeholder="请输入是否置顶" />
+        </el-form-item>
+        <el-form-item label="商品详情" prop="productDetail">
+          <el-input v-model="form.productDetail" placeholder="请输入商品详情" />
+        </el-form-item>
+        <el-form-item label="商品封面" prop="productPhoto">
+          <el-input v-model="form.productPhoto" placeholder="请输入商品封面" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createGoodsDetail,
+  updateGoodsDetail,
+  deleteGoodsDetail,
+  getGoodsDetail,
+  getGoodsDetailPage,
+  exportGoodsDetailExcel
+} from "@/api/supplier/goodsDetail";
+import { getGoodsCategoryListAll, } from "@/api/supplier/goodsCategory";
+import Treeselect from '@riophae/vue-treeselect'
+
+export default {
+  name: "GoodsDetail",
+  components: {
+    Treeselect,
+  },
+  data() {
+    return {
+      categoryOptions: [],
+      defaultProps: {
+        children: 'children',
+        label: 'name'
+      },
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品详情列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        goodsId: null,
+        code: null,
+        name: null,
+        keyword: null,
+        brand: null,
+        state: null,
+        category: null,
+        upTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+    getGoodsCategoryListAll().then(response => {
+      this.categoryOptions = this.handleTree(response.data, "id");
+    });
+  },
+  methods: {
+    // 筛选节点
+    filterNode(value, data) {
+      if (!value) return true
+      return data.label.indexOf(value) !== -1
+    },
+    handleNodeClick(data) {
+      this.reset();
+      this.queryParams.category = data.id
+      this.getList()
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getGoodsDetailPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        goodsId: undefined,
+        code: undefined,
+        name: undefined,
+        keyword: undefined,
+        unit: undefined,
+        marketPrice: undefined,
+        platPrice: undefined,
+        brand: undefined,
+        num: undefined,
+        state: undefined,
+        category: undefined,
+        saleNum: undefined,
+        payMethod: undefined,
+        aftersaleStrategy: undefined,
+        priceStrategy: undefined,
+        upMethod: undefined,
+        upNum: undefined,
+        upTime: undefined,
+        sticky: undefined,
+        productDetail: undefined,
+        productPhoto: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加商品详情";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getGoodsDetail(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改商品详情";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateGoodsDetail(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createGoodsDetail(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除商品详情编号为"' + id + '"的数据项?').then(function () {
+        return deleteGoodsDetail(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有商品详情数据项?').then(() => {
+        this.exportLoading = true;
+        return exportGoodsDetailExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '商品详情.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 562 - 0
src/views/supplier/goodsInfo/index.vue

@@ -0,0 +1,562 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="商品名称" prop="name">
+        <el-input v-model="queryParams.name" placeholder="请输入商品名称" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="商品类型" prop="category">
+        <el-input v-model="queryParams.category" placeholder="请输入商品类型" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="商品状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入商品状态" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:goods:create']">新增</el-button>
+      </el-col>
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
+                   v-hasPermi="['supplier:goods:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="序号" align="center" prop="id" />
+      <el-table-column label="商品编号" align="center" prop="code" />
+      <el-table-column label="商品名称" align="center" prop="name" />
+      <el-table-column label="商品类型" align="center" prop="category">
+        <template v-slot="scope">
+          <el-tag> {{ getCategoryName(scope.row.category) }}</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="商品单价" align="center" prop="price" />
+      <el-table-column label="付款方式" align="center" prop="payMethod">
+        <template v-slot="scope">
+          <dict-tag v-for="item in scope.row.payMethod" :type="DICT_TYPE.PAY_METHOD" :value="item" />
+        </template>
+      </el-table-column>
+      <el-table-column label="价格策略" align="center" prop="priceStrategy">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.PRICE_STRATEGY" :value="scope.row.priceStrategy" />
+        </template>
+      </el-table-column>
+      <el-table-column label="售后策略" align="center" prop="aftersaleStrategy">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.AFTERSALE_STRATEGY" :value="scope.row.aftersaleStrategy" />
+        </template>
+      </el-table-column>
+      <el-table-column label="关键词" align="center" prop="keyword">
+        <template v-slot="scope">
+          <el-tag v-for="item2 in scope.row.keyword"> {{ item2 }}</el-tag>
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="商品详情" align="center" prop="productDetail" /> -->
+      <el-table-column label="商品图片" align="center" prop="picture" />
+      <el-table-column label="商品状态" align="center" prop="state">
+        <template v-slot="scope">
+          <el-switch v-model="scope.row.state" :active-value="0" :inactive-value="1"
+            @change="handleStatusChange(scope.row)" />
+        </template>
+      </el-table-column>
+
+      <!-- <el-table-column label="商品型号" align="center" prop="model" /> -->
+      <!-- <el-table-column label="商品成本" align="center" prop="cost" /> -->
+      <!-- <el-table-column label="单位" align="center" prop="unit" /> -->
+      <!-- <el-table-column label="包装方式" align="center" prop="pack" /> -->
+      <!-- <el-table-column label="自定义策略" align="center" prop="customStrategy" /> -->
+      <!-- <el-table-column label="商品参数" align="center" prop="productParameter" /> -->
+      <!-- <el-table-column label="附件1" align="center" prop="attachmentOne" /> -->
+      <!-- <el-table-column label="附件2" align="center" prop="attachmentTwo" /> -->
+      <!-- <el-table-column label="创建时间" align="center" prop="createTime" width="180">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.createTime) }}</span>
+        </template>
+</el-table-column> -->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+            v-hasPermi="['supplier:goods:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            v-hasPermi="['supplier:goods:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="800px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="90px">
+        <el-row>
+          <el-col :span="13">
+            <el-form-item label="商品编号" prop="code">
+              <el-input v-model="form.code" placeholder="自动生成" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品名称" prop="name">
+              <el-input v-model="form.name" placeholder="请输入商品名称" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品品牌" prop="brand">
+              <el-input v-model="form.brand" placeholder="请输入商品品牌" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品型号" prop="model">
+              <el-input v-model="form.model" placeholder="请输入商品型号" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="13">
+            <el-form-item label="商品图片" prop="picture">
+              <!-- <el-input v-model="form.picture" placeholder="请输入商品图片" /> -->
+              <imageUpload v-model="form.picture" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="商品类型" prop="category">
+              <!-- <el-input v-model="form.category" placeholder="请输入商品类型" /> -->
+              <el-cascader v-model="form.category" :options="goodsCategory" :show-all-levels="false"
+                :props="{ label: 'name', value: 'id', children: 'children', checkStrictly: true }" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="商品成本" prop="cost">
+              <el-input-number v-model="form.cost" :precision="2" :step="100" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="商品单价" prop="price">
+              <el-input-number v-model="form.price" :precision="2" :step="100" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="10">
+            <el-form-item label="单位" prop="unit">
+              <el-input v-model="form.unit" placeholder="请输入单位" />
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="包装方式" prop="pack">
+              <el-select v-model="form.pack" placeholder="请选择包装方式" clearable>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.GOODS_PACK)" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="付款方式" prop="payMethod">
+              <el-select v-model="form.payMethod" placeholder="请选择付款方式" multiple>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PAY_METHOD)" :key="dict.value" :label="dict.label"
+                  :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="价格策略" prop="priceStrategy">
+              <el-select v-model="form.priceStrategy" placeholder="请选择价格策略" clearable>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PRICE_STRATEGY)" :key="dict.value"
+                  :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <!-- 阶梯价格策略 -->
+          <el-col :span="24" v-if="form.priceStrategy == 2" style="margin-bottom: 20px;">
+            <el-table :data="priceStrategyTableData" style="width: 100%">
+              <el-table-column prop="level" align="center" label="阶梯" />
+              <el-table-column prop="condition" align="center" label="数量条件" />
+              <el-table-column prop="unit" align="center" label="单位" />
+              <el-table-column prop="category" align="center" label="策略类型" />
+              <el-table-column prop="price" align="center" label="价格/RMB(元)" />
+            </el-table>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="售后策略" prop="aftersaleStrategy">
+              <el-select v-model="form.aftersaleStrategy" placeholder="请选择售后策略" clearable>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STRATEGY)" :key="dict.value"
+                  :label="dict.label" :value="dict.value" />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="自定义策略" prop="customStrategy">
+              <el-input type="textarea" v-model="form.customStrategy" placeholder="请输入自定义策略" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="关键词" prop="keyword">
+              <!-- <el-input v-model="form.keyword" placeholder="请输入关键词" /> -->
+              <el-tag :key="tag" v-for="tag in form.keyword" closable :disable-transitions="false"
+                @close="handleClose(tag)">
+                {{ tag }}
+              </el-tag>
+              <el-input class="input-new-tag" v-if="inputVisible" v-model="inputValue" ref="saveTagInput" size="small"
+                @keyup.enter.native="handleInputConfirm" @blur="handleInputConfirm">
+              </el-input>
+              <el-button v-else class="button-new-tag" size="small" @click="showInput">+ 新 关键词</el-button>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="商品参数" prop="productParameter">
+              <el-input type="textarea" v-model="form.productParameter" placeholder="请输入商品参数" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="商品详情" prop="productDetail">
+              <editor v-model="form.productDetail" :min-height="192" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="附件1" prop="attachmentOne">
+              <!-- <el-input v-model="form.attachmentOne" placeholder="请输入附件1" /> -->
+              <file-upload v-model="form.attachmentOne" />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="附件2" prop="attachmentTwo">
+              <!-- <el-input v-model="form.attachmentTwo" placeholder="请输入附件2" /> -->
+              <file-upload v-model="form.attachmentTwo" />
+            </el-form-item>
+          </el-col>
+
+          <!-- <el-form-item label="商品状态" prop="state">
+            <el-input v-model="form.state" placeholder="请输入商品状态" />
+          </el-form-item> -->
+        </el-row>
+      </el-form>
+
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createGoods,
+  updateGoods,
+  deleteGoods,
+  getGoods,
+  getGoodsPage,
+  exportGoodsExcel,
+  changeGoodsStatus,
+} from "@/api/supplier/goods";
+import { getGoodsCategoryListAll, } from "@/api/supplier/goodsCategory";
+import { CommonStatusEnum } from "@/utils/constants";
+import Editor from '@/components/Editor';
+import ImageUpload from "@/components/ImageUpload/index";
+import FileUpload from "@/components/FileUpload/index";
+
+export default {
+  name: "Goods",
+  components: {
+    Editor,
+    ImageUpload,
+    FileUpload,
+  },
+  data() {
+    return {
+      goodsCategory: [],
+      categoryList: [],
+      dynamicTags: [],
+      inputVisible: false,
+      inputValue: '',
+      SysCommonStatusEnum: CommonStatusEnum,
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 商品列表列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        code: null,
+        name: null,
+        model: null,
+        category: null,
+        cost: null,
+        unit: null,
+        price: null,
+        state: null,
+        pack: null,
+        payMethod: null,
+        priceStrategy: null,
+        aftersaleStrategy: null,
+        customStrategy: null,
+        keyword: null,
+        productParameter: null,
+        productDetail: null,
+        attachmentOne: null,
+        attachmentTwo: null,
+        createTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      },
+      priceStrategyTableData: [
+        { level: '1', condition: '0 ≤ 数量 ≤ 1', unit: '个', category: '固定价格', price: '¥100' },
+        { level: '2', condition: '2 ≤ 数量', unit: '个', category: '折扣/固定价格', price: '80%/¥90' },
+      ]
+    };
+  },
+  created() {
+    this.getList();
+    getGoodsCategoryListAll().then(response => {
+      this.categoryList = response.data
+      this.goodsCategory = this.handleTree(this.categoryList, "id");
+    });
+  },
+  methods: {
+    //获得商品类型名称
+    getCategoryName(category) {
+      for (const item of this.categoryList) {
+        if (item.id === category) {
+          return item.name;
+        }
+      }
+      return "未知类型";
+    },
+    // 商品状态修改
+    handleStatusChange(row) {
+      // 此时,row 已经变成目标状态了,所以可以直接提交请求和提示
+      let text = row.state === CommonStatusEnum.ENABLE ? "启用" : "停用";
+      this.$modal
+        .confirm('确认要"' + text + '""' + row.name + '"商品吗?')
+        .then(function () {
+          return changeGoodsStatus(row.id, row.state);
+        })
+        .then(() => {
+          this.$modal.msgSuccess(text + "成功");
+          this.getList();
+        })
+        .catch(function () {
+          // 异常时,需要将 row.status 状态重置回之前的
+          row.state =
+            row.status === CommonStatusEnum.ENABLE
+              ? CommonStatusEnum.DISABLE
+              : CommonStatusEnum.ENABLE;
+        });
+    },
+    // 关键词标签
+    handleClose(tag) {
+      this.form.keyword.splice(this.form.keyword.indexOf(tag), 1);
+    },
+    showInput() {
+      this.inputVisible = true;
+      this.$nextTick(_ => {
+        this.$refs.saveTagInput.$refs.input.focus();
+      });
+    },
+    handleInputConfirm() {
+      let inputValue = this.inputValue;
+      if (inputValue) {
+        this.form.keyword.push(inputValue);
+      }
+      this.inputVisible = false;
+      this.inputValue = '';
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getGoodsPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        for (let i = 0; i < this.list.length; i++) {
+          if (this.list[i].keyword) {
+            this.list[i].keyword = this.list[i].keyword.split(",");
+          }
+        }
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        code: undefined,
+        name: undefined,
+        model: undefined,
+        picture: undefined,
+        category: undefined,
+        cost: undefined,
+        unit: undefined,
+        price: undefined,
+        state: undefined,
+        pack: undefined,
+        payMethod: undefined,
+        priceStrategy: undefined,
+        aftersaleStrategy: undefined,
+        customStrategy: undefined,
+        keyword: [],
+        productParameter: undefined,
+        productDetail: undefined,
+        attachmentOne: undefined,
+        attachmentTwo: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加商品列表";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getGoods(id).then(response => {
+        this.form = response.data;
+        if (this.form.keyword) {
+          this.form.keyword = this.form.keyword.split(",");
+        }
+        if (this.form.payMethod) {
+          this.form.payMethod = this.form.payMethod.split(",");
+        }
+        this.form.priceStrategy = this.form.priceStrategy + "";
+        this.form.aftersaleStrategy = this.form.aftersaleStrategy + "";
+        this.form.pack = this.form.pack + "";
+        this.open = true;
+        this.title = "修改商品列表";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (this.form.category != null && this.form.category != "" && this.form.category instanceof Array) {
+          this.form.category = this.form.category[this.form.category.length - 1];
+        }
+        if (this.form.payMethod != null) {
+          let temp = "";
+          for (let i = 0; i < this.form.payMethod.length; i++) {
+            if (!temp) {
+              temp = this.form.payMethod[i];
+            } else {
+              temp = temp + "," + this.form.payMethod[i];
+            }
+          }
+          this.form.payMethod = temp;
+        }
+        if (this.form.keyword != null) {
+          let temp = "";
+          for (let i = 0; i < this.form.keyword.length; i++) {
+            if (!temp) {
+              temp = this.form.keyword[i];
+            } else {
+              temp = temp + "," + this.form.keyword[i];
+            }
+          }
+          this.form.keyword = temp;
+        }
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateGoods(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createGoods(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除商品列表编号为"' + id + '"的数据项?').then(function () {
+        return deleteGoods(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有商品列表数据项?').then(() => {
+        this.exportLoading = true;
+        return exportGoodsExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '商品列表.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>
+
+<style>
+.el-tag+.el-tag {
+  margin-left: 10px;
+}
+
+.button-new-tag {
+  margin-left: 10px;
+  height: 32px;
+  line-height: 30px;
+  padding-top: 0;
+  padding-bottom: 0;
+}
+
+.input-new-tag {
+  width: 90px;
+  margin-left: 10px;
+  vertical-align: bottom;
+}
+</style>

+ 400 - 0
src/views/supplier/loginPagePopularizeModuleConfig/index.vue

@@ -0,0 +1,400 @@
+<template>
+  <div class="app-container">
+    <div>
+      <div style="font-size: 30px;margin-bottom: 10px;background: #1c84c6;padding: 10px;color: #ffffff">
+        顶部菜单栏配置
+      </div>
+      <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd(0)">添 加 项 目</el-button>
+      <div v-for="menu in loginMenuData" style="margin: 10px">
+        <div style="font-size: 22px;margin-bottom: 10px">
+          {{ menu.name }}
+        </div>
+        <!-- 操作工具栏 -->
+        <el-row :gutter="10" class="mb8">
+          <el-col :span="1.5">
+            <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd(1)">新增</el-button>
+          </el-col>
+          <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+        </el-row>
+        <!-- 列表 -->
+        <el-table v-loading="loading" :data="menu.data">
+          <el-table-column label="序号" align="center" prop="id"/>
+          <el-table-column label="名称" align="center" prop="name"/>
+          <!--        <el-table-column label="链接" align="center" prop="link"/>-->
+          <el-table-column label="排序" align="center" prop="sort"/>
+          <el-table-column label="状态" align="center" prop="status">
+            <template v-slot="scope">
+              <!--              <dict-tag :type="DICT_TYPE.COMMON_STATUS" :value="scope.row.status"/>-->
+              <el-switch
+                  v-model="scope.row.status===1"
+              >
+              </el-switch>
+            </template>
+          </el-table-column>
+          <!--          <el-table-column label="父级ID" align="center" prop="parentId"/>-->
+          <el-table-column label="创建时间" align="center" prop="createTime">
+            <template v-slot="scope">
+              <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
+            </template>
+          </el-table-column>
+          <!--        <el-table-column label="类型" align="center" prop="type"/>-->
+          <!--          <el-table-column label="图片" align="center" prop="imgUrls"/>-->
+          <!--          <el-table-column label="模块摘要" align="center" prop="digest"/>-->
+          <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+            <template v-slot="scope">
+              <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                         v-hasPermi="['supplier:login-page-popularize-module-config:update']"
+              >编辑
+              </el-button>
+              <el-button size="mini" type="text" icon="el-icon-view"
+              >预览
+              </el-button>
+              <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                         v-hasPermi="['supplier:login-page-popularize-module-config:delete']"
+              >删除
+              </el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+      </div>
+
+      <!-- 分页组件 -->
+      <!--      <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"-->
+      <!--                  @pagination="getList"-->
+      <!--      />-->
+    </div>
+
+    <div>
+      <div style="font-size: 30px;margin-bottom: 10px;background: #1c84c6;padding: 10px;color: #ffffff">
+        中部模块配置
+      </div>
+      <!-- 操作工具栏 -->
+      <el-row :gutter="10" class="mb8">
+        <el-col :span="1.5">
+          <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd(3)">新增模块</el-button>
+        </el-col>
+        <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+      </el-row>
+      <!-- 列表 -->
+      <el-table v-loading="loading" :data="moduleList">
+        <el-table-column label="序号" align="center" prop="id"/>
+        <el-table-column label="模块名称" align="center" prop="name"/>
+        <el-table-column label="排序" align="center" prop="sort"/>
+        <el-table-column label="状态" align="center" prop="status">
+          <template v-slot="scope">
+            <el-switch v-model="scope.row.status===1">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="创建时间" align="center" prop="createTime">
+          <template v-slot="scope">
+            <span>{{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}') }}</span>
+          </template>
+        </el-table-column>
+
+        <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+          <template v-slot="scope">
+            <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row,scope.row.type)"
+            >编辑
+            </el-button>
+            <el-button size="mini" type="text" icon="el-icon-edit"
+            >预览
+            </el-button>
+            <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+            >删除
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <div style="padding: 0 15%" ref="sortableContainer">
+        <div shadow="hover" v-for="item in vModules" :key="item"
+             class="module-item"
+             :style="{height: vModuleHeight +'px'}"
+        >
+          {{ item }}
+          <div style="position: relative;text-align: center;z-index: 99999"
+               :style="{top: vModuleHeight - 80 +'px'}"
+          >
+            <el-popover placement="top" width="400" trigger="click">
+              <el-button v-for="item in moduleList">{{ item.name }}</el-button>
+              <el-button slot="reference" type="primary">选择模板</el-button>
+            </el-popover>
+          </div>
+        </div>
+      </div>
+    </div>
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="模块名称" prop="name">
+          <el-input v-model="form.name" placeholder="请输入模块名称"/>
+        </el-form-item>
+        <el-form-item label="链接" prop="link">
+          <el-input v-model="form.link" type="textarea" placeholder="请输入内容"/>
+        </el-form-item>
+        <el-form-item label="排序" prop="sort">
+          <el-input v-model="form.sort" placeholder="请输入排序"/>
+        </el-form-item>
+        <el-form-item label="状态" prop="status">
+          <el-radio-group v-model="form.status">
+            <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.COMMON_STATUS)"
+                      :key="dict.value" :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="图片" prop="imgUrls">
+          <el-input v-model="form.imgUrls" placeholder="请输入图片"/>
+        </el-form-item>
+        <el-form-item label="模块摘要" prop="digest">
+          <el-input v-model="form.digest" placeholder="请输入模块摘要"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createLoginPagePopularizeModuleConfig,
+  updateLoginPagePopularizeModuleConfig,
+  deleteLoginPagePopularizeModuleConfig,
+  getLoginPagePopularizeModuleConfig,
+  getLoginPagePopularizeModuleConfigPage,
+  exportLoginPagePopularizeModuleConfigExcel
+} from '@/api/supplier/loginPagePopularizeModuleConfig'
+import { getConfigKey } from '@/api/infra/config'
+import Sortable from 'sortablejs'
+
+export default {
+  name: 'LoginPagePopularizeModuleConfig',
+  components: {},
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 登录页面推广模块配置列表
+      list: [],
+      moduleList: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        createTime: [],
+        name: null,
+        link: null,
+        sort: null,
+        parentId: null,
+        type: null,
+        status: null,
+        imgUrls: null,
+        digest: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {},
+      loginMenuData: [],
+      sortableInstance: null,
+      vModules: [1, 2, 3, 4, 5, 6],
+      vModuleHeight: window.innerHeight * 0.35
+    }
+  },
+  watch: {},
+  mounted() {
+    //监听窗口大小变化
+    window.addEventListener('resize', this.adVModuleHeightHeight)
+    //模块拖动初始化
+    const list = this.$refs.sortableContainer
+    this.sortableInstance = new Sortable(list, {
+      group: 'shared', // 分组名称,相同组内的元素可以互相拖放
+      animation: 150, // 动画持续时间(毫秒)
+      ghostClass: 'my-sortable-ghost', // 拖动时克隆元素的附加类名
+      chosenClass: 'sortable-chosen', // 被拖动元素的附加类名
+      swap: true, // 允许元素交换位置而非直接插入
+      scroll: true, // 启用自动滚动(跟随鼠标移动滚动容器)
+      scrollSensitivity: 30, // 触发滚动的距离(像素)
+      scrollSpeed: 10, // 滚动速度(像素/秒)
+      onSort: this.handleSort // 拖放排序后的回调函数
+    })
+  },
+  beforeDestroy() {
+    if (this.sortableInstance) {
+      this.sortableInstance.destroy()
+    }
+  },
+  created() {
+    this.getList(5, 2, this.moduleList)
+    getConfigKey('login_menu').then(res => {
+      this.loginMenuData = JSON.parse(res.data)
+      this.loginMenuData.forEach(item => {
+        item.data = []
+        this.getList(item.parentId, 1, item.data)
+      })
+    })
+  },
+  methods: {
+    adVModuleHeightHeight() {
+      this.vModuleHeight = window.innerHeight * 0.35
+    },
+    // 回调函数示例
+    handleSort(event) {
+      const oldIndex = event.oldIndex
+      const newIndex = event.newIndex
+      const movedItem = this.vModules.splice(oldIndex, 1)[0] // 移除旧位置的项
+      this.vModules.splice(newIndex, 0, movedItem) // 在新位置插入项
+      this.$forceUpdate()
+      console.log(this.vModules)
+    },
+    /** 查询列表 */
+    getList(parentId, type, data) {
+      this.queryParams.parentId = parentId
+      this.queryParams.type = type
+      this.loading = true
+      // 执行查询
+      getLoginPagePopularizeModuleConfigPage(this.queryParams).then(response => {
+        response.data.list.forEach(item => {
+          data.push(item)
+        })
+        this.loading = false
+      })
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        name: undefined,
+        link: undefined,
+        sort: undefined,
+        parentId: undefined,
+        type: undefined,
+        status: undefined,
+        imgUrls: undefined,
+        digest: undefined
+      }
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    /** 新增按钮操作 */
+    handleAdd(type) {
+      this.reset()
+      this.open = true
+      this.title = '添加登录页面推广模块配置'
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row, type) {
+      this.reset()
+      const id = row.id
+      getLoginPagePopularizeModuleConfig(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改登录页面推广模块配置'
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (!valid) {
+          return
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateLoginPagePopularizeModuleConfig(this.form).then(response => {
+            this.$modal.msgSuccess('修改成功')
+            this.open = false
+            this.getList()
+          })
+          return
+        }
+        // 添加的提交
+        createLoginPagePopularizeModuleConfig(this.form).then(response => {
+          this.$modal.msgSuccess('新增成功')
+          this.open = false
+          this.getList()
+        })
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id
+      this.$modal.confirm('是否确认删除登录页面推广模块配置编号为"' + id + '"的数据项?').then(function() {
+        return deleteLoginPagePopularizeModuleConfig(id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {
+      })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams }
+      params.pageNo = undefined
+      params.pageSize = undefined
+      this.$modal.confirm('是否确认导出所有登录页面推广模块配置数据项?').then(() => {
+        this.exportLoading = true
+        return exportLoginPagePopularizeModuleConfigExcel(params)
+      }).then(response => {
+        this.$download.excel(response, '登录页面推广模块配置.xls')
+        this.exportLoading = false
+      }).catch(() => {
+      })
+    }
+  }
+}
+</script>
+
+
+<style scoped>
+
+.sortable-chosen {
+  background: #a5dbfc;
+}
+
+.my-sortable-ghost {
+
+  background: #a5dbfc;
+
+}
+
+.module-item {
+  display: inline-block;
+  width: 30%;
+  border: 1px solid #e3e3e3;
+  border-radius: 10px;
+  margin: 10px 1.5%
+}
+
+.module-item:hover {
+  box-shadow: 0 0 5px #b6aeae;
+}
+
+</style>

+ 109 - 0
src/views/supplier/portalConfig/index.vue

@@ -0,0 +1,109 @@
+<template>
+  <div style="padding: 20px">
+    <div style="font-size: 20px;color: #928c8c;margin-bottom: 10px">
+      店铺门户配置
+    </div>
+    <div>
+      <el-card>
+        <div style="font-size: 15px;color: #727272;">
+          轮播图区域
+        </div>
+        <PortalSlideshowConfig ref="psc" :id="id"></PortalSlideshowConfig>
+      </el-card>
+    </div>
+    <div style="margin-top: 10px">
+      <el-card>
+        <div class="title">
+          左侧广告区域
+        </div>
+        <div style="margin-bottom: 20px">
+          <imageUpload v-model="form.leftAdvertisingImg"/>
+        </div>
+        <el-input placeholder="请输入内容" v-model="form.leftAdvertisingLink">
+          <template slot="prepend">链接</template>
+        </el-input>
+      </el-card>
+      <el-card>
+        <div class="title">
+          右侧广告区域
+        </div>
+        <div style="margin-bottom: 20px">
+          <imageUpload v-model="form.rightAdvertisingImg"/>
+        </div>
+        <el-input placeholder="请输入内容" v-model="form.rightAdvertisingLink">
+          <template slot="prepend">链接</template>
+        </el-input>
+      </el-card>
+    </div>
+  </div>
+</template>
+
+<script>
+import { createPortalConfig, getPortalConfig } from '@/api/supplier/portalConfig'
+import ImageUpload from '@/components/ImageUpload'
+import PortalSlideshowConfig from '@/views/supplier/portalSlideshowConfig'
+
+export default {
+  name: 'PortalConfig',
+  props: {
+    id: null
+  },
+  components: {
+    ImageUpload,
+    PortalSlideshowConfig
+  },
+  data() {
+    return {
+      form: {
+        // slideshowIds:'',
+        leftAdvertisingImg: '',
+        rightAdvertisingImg: '',
+        leftAdvertisingLink: '',
+        rightAdvertisingLink: ''
+      }
+    }
+  },
+  watch: {
+    'form': {
+      handler: function(newValue) {
+        this.update(newValue)
+      },
+      deep: true
+    }
+  },
+  created() {
+    this.getConfig()
+  },
+  methods: {
+    getConfig() {
+      // console.log('getConfig!!')
+      getPortalConfig(this.id).then(res => {
+        if (res.code === 0) {
+          this.form = res.data
+        }
+      })
+      this.$refs.psc.getList()
+    },
+    update(data) {
+      if(!data){
+        return
+      }
+      createPortalConfig(data).then(res => {
+        if (res.code === 0) {
+          this.$modal.msgSuccess('更新成功')
+        }
+      })
+      // console.log('Update!!', JSON.stringify(data))
+    }
+  }
+
+}
+</script>
+
+<style scoped>
+.title {
+  font-size: 15px;
+  color: #727272;
+  margin-bottom: 10px;
+}
+</style>

+ 270 - 0
src/views/supplier/portalManage/index.vue

@@ -0,0 +1,270 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss"
+                        type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                        :default-time="['00:00:00', '23:59:59']"
+        />
+      </el-form-item>
+      <el-form-item label="是否启用" prop="isEnable">
+        <el-select v-model="queryParams.isEnable" placeholder="请选择是否启用" clearable size="small">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                     :key="dict.value" :label="dict.label" :value="dict.value"
+          />
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:portal-manage:create']"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+                   :loading="exportLoading"
+                   v-hasPermi="['supplier:portal-manage:export']"
+        >导出
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="创建时间" align="center" prop="createTime"/>
+      <el-table-column label="配置ID" align="center" prop="configId"/>
+      <el-table-column label="是否启用" align="center" prop="isEnable">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.INFRA_BOOLEAN_STRING" :value="scope.row.isEnable"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-check" @click="updateEnable(scope.row)"
+          >启用
+          </el-button>
+          <el-button size="mini" type="text" icon="el-icon-search" @click="updateConfig(scope.row)"
+          >配置
+          </el-button>
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:portal-manage:update']"
+          >修改
+          </el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:portal-manage:delete']"
+          >删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="配置ID" prop="configId">
+          <el-input v-model="form.configId" placeholder="请输入配置ID"/>
+        </el-form-item>
+        <el-form-item label="是否启用" prop="isEnable">
+          <el-radio-group v-model="form.isEnable">
+            <el-radio v-for="dict in this.getDictDatas(DICT_TYPE.INFRA_BOOLEAN_STRING)"
+                      :key="dict.value" :label="dict.value"
+            >{{ dict.label }}
+            </el-radio>
+          </el-radio-group>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <el-dialog title="配置" :visible.sync="showOne" width="1250px" v-dialogDrag append-to-body>
+      <portalConfig ref="pc" :id="configId"></portalConfig>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+
+import portalConfig from '@/views/supplier/portalConfig'
+import {
+  createPortalManage,
+  updatePortalManage,
+  deletePortalManage,
+  getPortalManage,
+  getPortalManagePage,
+  exportPortalManageExcel
+} from '@/api/supplier/portalManage'
+
+export default {
+  name: 'PortalManage',
+  components: {
+    portalConfig
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      showOne: false,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      configId: 0,
+      // 门户管理列表
+      list: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        createTime: [],
+        configId: null,
+        isEnable: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {}
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true
+      // 执行查询
+      getPortalManagePage(this.queryParams).then(response => {
+        this.list = response.data.list
+        this.total = response.data.total
+        this.loading = false
+      })
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        configId: undefined,
+        isEnable: undefined
+      }
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加门户管理'
+    },
+    /** 修改按钮操作 */
+    updateEnable(row) {
+      row.isEnable = 'true'
+      updatePortalManage(row).then(response => {
+        this.$modal.msgSuccess('启用成功')
+        this.open = false
+        this.getList()
+      })
+    },
+    updateConfig(row) {
+      this.showOne = true
+      this.configId = row.configId
+      this.$refs.pc.getConfig()
+    },
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id
+      getPortalManage(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改门户管理'
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (!valid) {
+          return
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updatePortalManage(this.form).then(response => {
+            this.$modal.msgSuccess('修改成功')
+            this.open = false
+            this.getList()
+          })
+          return
+        }
+        // 添加的提交
+        createPortalManage(this.form).then(response => {
+          this.$modal.msgSuccess('新增成功')
+          this.open = false
+          this.getList()
+        })
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id
+      this.$modal.confirm('是否确认删除门户管理编号为"' + id + '"的数据项?').then(function() {
+        return deletePortalManage(id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {
+      })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams }
+      params.pageNo = undefined
+      params.pageSize = undefined
+      this.$modal.confirm('是否确认导出所有门户管理数据项?').then(() => {
+        this.exportLoading = true
+        return exportPortalManageExcel(params)
+      }).then(response => {
+        this.$download.excel(response, '门户管理.xls')
+        this.exportLoading = false
+      }).catch(() => {
+      })
+    }
+  }
+}
+</script>

+ 254 - 0
src/views/supplier/portalSlideshowConfig/index.vue

@@ -0,0 +1,254 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="排序" prop="sort">
+        <el-input v-model="queryParams.sort" placeholder="请输入排序" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss"
+                        type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                        :default-time="['00:00:00', '23:59:59']"
+        />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:portal-slideshow-config:create']"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+                   :loading="exportLoading"
+                   v-hasPermi="['supplier:portal-slideshow-config:export']"
+        >导出
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <!--      <el-table-column label="id" align="center" prop="id"/>-->
+      <el-table-column label="排序" align="center" prop="sort"/>
+      <el-table-column label="图片" align="center" prop="img">
+        <template v-slot="scope">
+          <el-image
+              style="width: 100px; height: 100px"
+              :src="scope.row.img"
+              :preview-src-list="[scope.row.img]"
+          >
+          </el-image>
+        </template>
+      </el-table-column>
+      <el-table-column label="链接" align="center" prop="link"/>
+      <el-table-column label="创建时间" align="center" prop="createTime"/>
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:portal-slideshow-config:update']"
+          >修改
+          </el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:portal-slideshow-config:delete']"
+          >删除
+          </el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList" :pageSizes="[1]"
+    />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="图片">
+          <imageUpload v-model="form.img"/>
+        </el-form-item>
+        <el-form-item label="链接" prop="link">
+          <el-input v-model="form.link" type="textarea" placeholder="请输入内容"/>
+        </el-form-item>
+        <el-form-item label="排序" prop="sort">
+          <el-input v-model="form.sort" placeholder="请输入排序"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createPortalSlideshowConfig,
+  updatePortalSlideshowConfig,
+  deletePortalSlideshowConfig,
+  getPortalSlideshowConfig,
+  getPortalSlideshowConfigPage,
+  exportPortalSlideshowConfigExcel
+} from '@/api/supplier/portalSlideshowConfig'
+import ImageUpload from '@/components/ImageUpload'
+import Templates from '@/demo/templates'
+
+export default {
+  name: 'PortalSlideshowConfig',
+  props: {
+    id: null
+  },
+  components: {
+    Templates,
+    ImageUpload
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 门户轮播图配置列表
+      list: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 1,
+        img: null,
+        link: null,
+        sort: null,
+        createTime: []
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {}
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true
+      this.queryParams.configId = this.id
+      // 执行查询
+      getPortalSlideshowConfigPage(this.queryParams).then(response => {
+        this.list = response.data.list
+        this.total = response.data.total
+        this.loading = false
+      })
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        img: undefined,
+        link: undefined,
+        sort: undefined
+      }
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加门户轮播图配置'
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id
+      getPortalSlideshowConfig(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改门户轮播图配置'
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (!valid) {
+          return
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updatePortalSlideshowConfig(this.form).then(response => {
+            this.$modal.msgSuccess('修改成功')
+            this.open = false
+            this.getList()
+          })
+          return
+        }
+        // 添加的提交
+        createPortalSlideshowConfig(this.form).then(response => {
+          this.$modal.msgSuccess('新增成功')
+          this.open = false
+          this.getList()
+        })
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id
+      this.$modal.confirm('是否确认删除门户轮播图配置编号为"' + id + '"的数据项?').then(function() {
+        return deletePortalSlideshowConfig(id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {
+      })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams }
+      params.pageNo = undefined
+      params.pageSize = undefined
+      this.$modal.confirm('是否确认导出所有门户轮播图配置数据项?').then(() => {
+        this.exportLoading = true
+        return exportPortalSlideshowConfigExcel(params)
+      }).then(response => {
+        this.$download.excel(response, '门户轮播图配置.xls')
+        this.exportLoading = false
+      }).catch(() => {
+      })
+    }
+  }
+}
+</script>

+ 278 - 0
src/views/supplier/purchaseInfo/index.vue

@@ -0,0 +1,278 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item label="标题" prop="title">
+        <el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="浏览次数" prop="browseNum">
+        <el-input v-model="queryParams.browseNum" placeholder="请输入浏览次数" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="报价次数" prop="quoteNum">
+        <el-input v-model="queryParams.quoteNum" placeholder="请输入报价次数" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="剩余天数" prop="quoteRemainDays">
+        <el-input v-model="queryParams.quoteRemainDays" placeholder="请输入剩余天数" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="收货地址" prop="cneeAddress">
+        <el-input v-model="queryParams.cneeAddress" placeholder="请输入收货地址" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="采购数量" prop="purchaseNum">
+        <el-input v-model="queryParams.purchaseNum" placeholder="请输入采购数量" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="物品单位" prop="purchaseUnit">
+        <el-select v-model="queryParams.purchaseUnit" placeholder="请选择物品单位" clearable size="small">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.UNIT)"
+                       :key="dict.value" :label="dict.label" :value="dict.value"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="期望到货时间" prop="expectationReceiptOfGoodsTime">
+        <el-date-picker v-model="queryParams.expectationReceiptOfGoodsTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:purchase-info:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
+                   v-hasPermi="['supplier:purchase-info:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="主键id" align="center" prop="id" />
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="标题" align="center" prop="title" />
+      <el-table-column label="浏览次数" align="center" prop="browseNum" />
+      <el-table-column label="报价次数" align="center" prop="quoteNum" />
+      <el-table-column label="剩余天数" align="center" prop="quoteRemainDays" />
+      <el-table-column label="收货地址" align="center" prop="cneeAddress" />
+      <el-table-column label="采购数量" align="center" prop="purchaseNum" />
+      <el-table-column label="物品单位" align="center" prop="purchaseUnit">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.UNIT" :value="scope.row.purchaseUnit" />
+        </template>
+      </el-table-column>
+      <el-table-column label="期望到货时间" align="center" prop="expectationReceiptOfGoodsTime" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:purchase-info:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:purchase-info:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"/>
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="标题" prop="title">
+          <el-input v-model="form.title" placeholder="请输入标题" />
+        </el-form-item>
+        <el-form-item label="浏览次数" prop="browseNum">
+          <el-input v-model="form.browseNum" placeholder="请输入浏览次数" />
+        </el-form-item>
+        <el-form-item label="报价次数" prop="quoteNum">
+          <el-input v-model="form.quoteNum" placeholder="请输入报价次数" />
+        </el-form-item>
+        <el-form-item label="剩余天数" prop="quoteRemainDays">
+          <el-input v-model="form.quoteRemainDays" placeholder="请输入剩余天数" />
+        </el-form-item>
+        <el-form-item label="收货地址" prop="cneeAddress">
+          <el-input v-model="form.cneeAddress" placeholder="请输入收货地址" />
+        </el-form-item>
+        <el-form-item label="采购数量" prop="purchaseNum">
+          <el-input v-model="form.purchaseNum" placeholder="请输入采购数量" />
+        </el-form-item>
+        <el-form-item label="物品单位" prop="purchaseUnit">
+          <el-select v-model="form.purchaseUnit" placeholder="请选择物品单位">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.UNIT)"
+                       :key="dict.value" :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="期望到货时间" prop="expectationReceiptOfGoodsTime">
+          <el-date-picker clearable v-model="form.expectationReceiptOfGoodsTime" type="date" value-format="timestamp" placeholder="选择期望到货时间" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { createPurchaseInfo, updatePurchaseInfo, deletePurchaseInfo, getPurchaseInfo, getPurchaseInfoPage, exportPurchaseInfoExcel } from "@/api/supplier/purchaseInfo";
+
+export default {
+  name: "PurchaseInfo",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 采购信息列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        createTime: [],
+        title: null,
+        browseNum: null,
+        quoteNum: null,
+        quoteRemainDays: null,
+        cneeAddress: null,
+        purchaseNum: null,
+        purchaseUnit: null,
+        expectationReceiptOfGoodsTime: [],
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getPurchaseInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        title: undefined,
+        browseNum: undefined,
+        quoteNum: undefined,
+        quoteRemainDays: undefined,
+        cneeAddress: undefined,
+        purchaseNum: undefined,
+        purchaseUnit: undefined,
+        expectationReceiptOfGoodsTime: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加采购信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getPurchaseInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改采购信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updatePurchaseInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createPurchaseInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除采购信息编号为"' + id + '"的数据项?').then(function() {
+          return deletePurchaseInfo(id);
+        }).then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = {...this.queryParams};
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有采购信息数据项?').then(() => {
+          this.exportLoading = true;
+          return exportPurchaseInfoExcel(params);
+        }).then(response => {
+          this.$download.excel(response, '采购信息.xls');
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 257 - 0
src/views/supplier/quoteInfo/index.vue

@@ -0,0 +1,257 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="创建时间" prop="createTime">
+        <el-date-picker v-model="queryParams.createTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item label="供应周期" prop="provisionPeriod">
+        <el-select v-model="queryParams.provisionPeriod" placeholder="请选择供应周期" clearable size="small">
+          <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PROVISION_PERIOD)"
+                       :key="dict.value" :label="dict.label" :value="dict.value"/>
+        </el-select>
+      </el-form-item>
+      <el-form-item label="供应时长" prop="provisionDuration">
+        <el-date-picker clearable v-model="queryParams.provisionDuration" type="date" value-format="yyyy-MM-dd" placeholder="选择供应时长" />
+      </el-form-item>
+      <el-form-item label="预计送达时间" prop="predictDeliveryTime">
+        <el-date-picker v-model="queryParams.predictDeliveryTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                        range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期" :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item label="采购信息ID" prop="purchaseInfoId">
+        <el-input v-model="queryParams.purchaseInfoId" placeholder="请输入采购信息ID" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="采购商品ID" prop="purchaseGoodsId">
+        <el-input v-model="queryParams.purchaseGoodsId" placeholder="请输入采购商品ID" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:quote-info:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport" :loading="exportLoading"
+                   v-hasPermi="['supplier:quote-info:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="主键id" align="center" prop="id" />
+      <el-table-column label="创建时间" align="center" prop="createTime" />
+      <el-table-column label="供应周期" align="center" prop="provisionPeriod">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.PROVISION_PERIOD" :value="scope.row.provisionPeriod" />
+        </template>
+      </el-table-column>
+      <el-table-column label="供应时长" align="center" prop="provisionDuration" />
+      <el-table-column label="发货地址" align="center" prop="shipmentsAddress" />
+      <el-table-column label="预计送达时间" align="center" prop="predictDeliveryTime" />
+      <el-table-column label="采购信息ID" align="center" prop="purchaseInfoId" />
+      <el-table-column label="采购商品ID" align="center" prop="purchaseGoodsId" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:quote-info:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:quote-info:delete']">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"/>
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="供应周期" prop="provisionPeriod">
+          <el-select v-model="form.provisionPeriod" placeholder="请选择供应周期">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PROVISION_PERIOD)"
+                       :key="dict.value" :label="dict.label" :value="dict.value" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="供应时长" prop="provisionDuration">
+          <el-date-picker clearable v-model="form.provisionDuration" type="date" value-format="timestamp" placeholder="选择供应时长" />
+        </el-form-item>
+        <el-form-item label="发货地址" prop="shipmentsAddress">
+          <el-input v-model="form.shipmentsAddress" type="textarea" placeholder="请输入内容" />
+        </el-form-item>
+        <el-form-item label="预计送达时间" prop="predictDeliveryTime">
+          <el-date-picker clearable v-model="form.predictDeliveryTime" type="date" value-format="timestamp" placeholder="选择预计送达时间" />
+        </el-form-item>
+        <el-form-item label="采购信息ID" prop="purchaseInfoId">
+          <el-input v-model="form.purchaseInfoId" placeholder="请输入采购信息ID" />
+        </el-form-item>
+        <el-form-item label="采购商品ID" prop="purchaseGoodsId">
+          <el-input v-model="form.purchaseGoodsId" placeholder="请输入采购商品ID" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { createQuoteInfo, updateQuoteInfo, deleteQuoteInfo, getQuoteInfo, getQuoteInfoPage, exportQuoteInfoExcel } from "@/api/supplier/quoteInfo";
+
+export default {
+  name: "QuoteInfo",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 报价信息列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        createTime: [],
+        provisionPeriod: null,
+        provisionDuration: null,
+        shipmentsAddress: null,
+        predictDeliveryTime: [],
+        purchaseInfoId: null,
+        purchaseGoodsId: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getQuoteInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        provisionPeriod: undefined,
+        provisionDuration: undefined,
+        shipmentsAddress: undefined,
+        predictDeliveryTime: undefined,
+        purchaseInfoId: undefined,
+        purchaseGoodsId: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加报价信息";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getQuoteInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改报价信息";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateQuoteInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createQuoteInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除报价信息编号为"' + id + '"的数据项?').then(function() {
+          return deleteQuoteInfo(id);
+        }).then(() => {
+          this.getList();
+          this.$modal.msgSuccess("删除成功");
+        }).catch(() => {});
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = {...this.queryParams};
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有报价信息数据项?').then(() => {
+          this.exportLoading = true;
+          return exportQuoteInfoExcel(params);
+        }).then(response => {
+          this.$download.excel(response, '报价信息.xls');
+          this.exportLoading = false;
+        }).catch(() => {});
+    }
+  }
+};
+</script>

+ 261 - 0
src/views/supplier/receiveLog/index.vue

@@ -0,0 +1,261 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="订单编号" prop="orderCode">
+        <el-input v-model="queryParams.orderCode" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="账单编号" prop="billCode">
+        <el-input v-model="queryParams.billCode" placeholder="请输入账单编号" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="账单状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入账单状态" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <!-- <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:deal-log:create']">新增</el-button>
+      </el-col> -->
+      <!-- <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:deal-log:export']">导出</el-button>
+      </el-col> -->
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list" row-key="id" @expand-change="expandChange">
+      <el-table-column type="expand">
+        <template slot-scope="props">
+          <el-table :data="props.row.childrenData" v-loading="props.row.loading" border
+            style="margin-left: 60px;width: 95%; height:100%">
+            <el-table-column label="收款方" align="center" prop="payee" />
+            <el-table-column label="收款账号" align="center" prop="receiveAccount" />
+            <el-table-column label="收款金额" align="center" prop="receiveAmount" />
+            <el-table-column label="付款方" align="center" prop="payer" />
+            <el-table-column label="付款账号" align="center" prop="payAccount" />
+            <el-table-column label="付款方式" align="center" prop="payMethod" />
+            <el-table-column label="收款时间" align="center" prop="payTime">
+              <template v-slot="scope">
+                <span>{{ parseTime(scope.row.payTime) }}</span>
+              </template>
+            </el-table-column>
+          </el-table>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单编号" align="center" prop="orderCode" />
+      <el-table-column label="账单编号" align="center" prop="billCode" />
+      <el-table-column label="账单状态" align="center" prop="state">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.BILL_STATE" :value="scope.row.state" />
+        </template>
+      </el-table-column>
+      <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:deal-log:update']">修改</el-button>
+          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:deal-log:delete']">删除</el-button>
+        </template>
+      </el-table-column> -->
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="80px">
+        <el-form-item label="订单编号" prop="orderCode">
+          <el-input v-model="form.orderCode" placeholder="请输入订单编号" />
+        </el-form-item>
+        <el-form-item label="账单编号" prop="billCode">
+          <el-input v-model="form.billCode" placeholder="请输入账单编号" />
+        </el-form-item>
+        <el-form-item label="账单状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择账单状态" clearable>
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.BILL_STATE)" :key="dict.value" :label="dict.label"
+              :value="dict.value" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createReceiveLog,
+  updateReceiveLog,
+  deleteReceiveLog,
+  getReceiveLog,
+  getReceiveLogPage,
+  exportReceiveLogExcel,
+  getReceiveDetailList
+} from "@/api/supplier/receiveLog";
+
+export default {
+  name: "DealLog",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 交易记录列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        orderCode: null,
+        billCode: null,
+        state: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    // 获取子层表格数据并更新allRules数据
+    expandChange(row, expandedRows) {
+      if (!row.children) {
+        // 通过$set属性可设置loading实现实时加载loading效果
+        //(经过测试,通过$set直接给父层数据声明子层数据时会出现报错,所以才在获取父层表格数据时声明子层表格数据)
+        this.$set(row, 'loading', true);
+        getReceiveDetailList(row.id).then((response) => {
+          row.childrenData = response.data || [];
+          this.$set(row, 'loading', false);
+        }, (err) => {
+          this.$set(row, 'loading', false);
+        });
+      }
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getReceiveLogPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        orderCode: undefined,
+        billCode: undefined,
+        state: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加交易记录";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getReceiveLog(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改交易记录";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateReceiveLog(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createReceiveLog(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除交易记录编号为"' + id + '"的数据项?').then(function () {
+        return deleteReceiveLog(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有交易记录数据项?').then(() => {
+        this.exportLoading = true;
+        return exportReceiveLogExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '交易记录.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

+ 798 - 0
src/views/supplier/saleOrder/index.vue

@@ -0,0 +1,798 @@
+<template>
+  <div class="app-container">
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <!--      <el-form-item label="客户联系方式" prop="clientelePhone">-->
+      <!--        <el-input v-model="queryParams.clientelePhone" placeholder="请输入客户联系方式" clearable-->
+      <!--                  @keyup.enter.native="handleQuery"-->
+      <!--        />-->
+      <!--      </el-form-item>-->
+      <!--      <el-form-item label="客户类型" prop="clienteleType">-->
+      <!--        <el-select v-model="queryParams.clienteleType" placeholder="请选择客户类型" clearable size="small">-->
+      <!--          <el-option label="请选择字典生成" value=""/>-->
+      <!--        </el-select>-->
+      <!--      </el-form-item>-->
+      <!--      <el-form-item label="收货地址" prop="cneeAddress">-->
+      <!--        <el-input v-model="queryParams.cneeAddress" placeholder="请输入收货地址" clearable @keyup.enter.native="handleQuery"/>-->
+      <!--      </el-form-item>-->
+      <!--      <el-form-item label="售后状态" prop="afterSale">-->
+      <!--        <el-input v-model="queryParams.afterSale" placeholder="请输入售后状态" clearable @keyup.enter.native="handleQuery"/>-->
+      <!--      </el-form-item>-->
+      <el-form-item label="订单编号" prop="orderNo">
+        <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="客户名称" prop="clienteleName">
+        <el-input v-model="queryParams.clienteleName" placeholder="请输入客户名称" clearable
+                  @keyup.enter.native="handleQuery"
+        />
+      </el-form-item>
+      <el-form-item label="订单状态" prop="orderStatus">
+        <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable size="small">
+          <el-option label="请选择字典生成" value=""/>
+        </el-select>
+      </el-form-item>
+      <el-form-item>
+        <el-popover
+            placement="bottom"
+            width="400"
+            trigger="click"
+        >
+          <el-form-item label="订单编号" prop="orderNo">
+            <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery"/>
+          </el-form-item>
+
+          <el-form-item label="订单类型" prop="orderType">
+            <el-select v-model="queryParams.orderType" placeholder="请选择订单类型">
+              <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SALE_ORDER_TYPE)"
+                         :key="dict.value" :label="dict.label" :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="订单状态" prop="orderStatus">
+            <el-select v-model="queryParams.orderStatus" placeholder="请选择订单状态" clearable size="small">
+              <el-option label="请选择字典生成" value=""/>
+            </el-select>
+          </el-form-item>
+
+          <el-form-item label="客户名称" prop="clienteleName">
+            <el-input v-model="queryParams.clienteleName" placeholder="请输入客户名称" clearable
+                      @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+
+          <el-form-item label="客户类型" prop="clienteleType">
+            <el-select v-model="form.clienteleType" placeholder="请选择客户类型">
+              <el-option label="请选择字典生成" value=""/>
+            </el-select>
+          </el-form-item>
+
+          <el-button slot="reference">复合查询</el-button>
+
+          <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        </el-popover>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:sale-order:create']"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+                   :loading="exportLoading"
+                   v-hasPermi="['supplier:sale-order:export']"
+        >导出
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list" border
+              @expand-change="toggleExpand"
+    >
+      <!--      <el-table-column label="主键id" align="center" prop="id" />-->
+      <el-table-column type="expand">
+        <template slot-scope="props">
+          <el-table :data="props.row.goodslist" border style="margin-left: 50px">
+            <el-table-column label="商品信息" align="center" width="300">
+              <template slot-scope="scope">
+                <el-descriptions :column="1" :contentStyle="{width:'40%'}">
+                  <el-descriptions-item>
+                    <template slot="label">
+                      商品编号
+                    </template>
+                    {{ scope.row.goodsInfo.code }}
+                  </el-descriptions-item>
+                  <el-descriptions-item>
+                    <template slot="label">
+                      商品名称
+                    </template>
+                    {{ scope.row.goodsInfo.name }}
+                  </el-descriptions-item>
+                  <el-descriptions-item>
+                    <template slot="label">
+                      商品品牌
+                    </template>
+                    {{ scope.row.goodsInfo.brand }}
+                  </el-descriptions-item>
+                  <el-descriptions-item>
+                    <template slot="label">
+                      商品型号
+                    </template>
+                    {{ scope.row.goodsInfo.category }}
+                  </el-descriptions-item>
+                  <el-descriptions-item>
+                    <template slot="label">
+                      商品单价
+                    </template>
+                    {{ scope.row.goodsInfo.price }}
+                  </el-descriptions-item>
+                  <el-descriptions-item>
+                    <template slot="label">
+                      商品单位
+                    </template>
+                    {{ scope.row.goodsInfo.unit }}
+                  </el-descriptions-item>
+                </el-descriptions>
+              </template>
+            </el-table-column>
+            <!-- 商品数量 -->
+            <el-table-column label="商品数量" width="100"></el-table-column>
+
+            <!-- 成交单价 -->
+            <el-table-column label="成交单价" width="120"></el-table-column>
+
+            <!-- 成交价格 -->
+            <el-table-column label="成交价格" width="120"></el-table-column>
+
+            <!-- 收款方式 -->
+            <el-table-column label="收款方式" width="150"></el-table-column>
+
+            <!-- 收款状态 -->
+            <el-table-column label="收款状态" width="100"></el-table-column>
+
+            <!-- 发货状态 -->
+            <el-table-column label="发货状态" width="100"></el-table-column>
+
+            <!-- 发货地址 -->
+            <el-table-column label="发货地址" width="200"></el-table-column>
+
+            <!-- 发货时间 -->
+            <el-table-column label="发货时间" width="180"></el-table-column>
+
+            <!-- 发货人 -->
+            <el-table-column label="发货人" width="100"></el-table-column>
+
+          </el-table>
+        </template>
+      </el-table-column>
+      <el-table-column label="序号" align="center" width="50">
+        <template v-slot="scope">
+          <span>{{ scope.$index + 1 }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="订单信息" align="center">
+        <template v-slot="scope">
+          <el-descriptions :column="1" :contentStyle="{width:'40%'}">
+            <el-descriptions-item>
+              <template slot="label">
+                订单编号
+              </template>
+              {{ scope.row.orderNo }}
+            </el-descriptions-item>
+            <el-descriptions-item>
+              <template slot="label">
+                订单类型
+              </template>
+              <dict-tag :type="DICT_TYPE.SALE_ORDER_TYPE" :value="scope.row.orderType"/>
+            </el-descriptions-item>
+            <el-descriptions-item>
+              <template slot="label">
+                订单状态
+              </template>
+              <dict-tag :type="DICT_TYPE.SALE_ORDER_STATUS" :value="scope.row.orderStatus"/>
+            </el-descriptions-item>
+            <el-descriptions-item>
+              <template slot="label">
+                订单总金额
+              </template>
+              {{ scope.row.orderNo }}
+            </el-descriptions-item>
+          </el-descriptions>
+        </template>
+      </el-table-column>
+      <!--      <el-table-column label="客户ID" align="center" prop="clienteleId" />-->
+      <el-table-column label="客户信息" align="center">
+        <template v-slot="scope">
+          <el-descriptions :column="1" :contentStyle="{width:'40%'}">
+            <el-descriptions-item>
+              <template slot="label">
+                <i class="el-icon-user"></i>
+                客户名称
+              </template>
+              {{ scope.row.clienteleName }}
+            </el-descriptions-item>
+            <el-descriptions-item>
+              <template slot="label">
+                <i class="el-icon-mobile-phone"></i>
+                客户联系方式
+              </template>
+              {{ scope.row.clientelePhone }}
+            </el-descriptions-item>
+            <el-descriptions-item>
+              <template slot="label">
+                <i class="el-icon-share"></i>
+                客户类型
+              </template>
+              {{ scope.row.clienteleType }}
+            </el-descriptions-item>
+          </el-descriptions>
+        </template>
+      </el-table-column>
+      <el-table-column label="收货地址" align="center" prop="cneeAddress"/>
+      <!--      <el-table-column label="订单状态" align="center" prop="orderStatus"></el-table-column>-->
+      <el-table-column label="预计发货时间" align="center" prop="predictShipmentsTime">
+        <template v-slot="scope">
+          {{ parseTime(scope.row.predictShipmentsTime, '{y}-{m}-{d}') }}
+        </template>
+      </el-table-column>
+      <el-table-column label="售后状态" align="center" prop="afterSale"/>
+      <el-table-column label="订单生成时间" align="center" prop="createTime">
+        <template v-slot="scope">
+          {{ parseTime(scope.row.createTime, '{y}-{m}-{d} {h}:{i}:{s}') }}
+        </template>
+      </el-table-column>
+      <!--      <el-table-column label="商品ID" align="center" prop="goodsId" />-->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="200">
+        <template v-slot="scope">
+          <div>
+            <el-button size="mini" type="text"
+            >操作记录
+            </el-button>
+          </div>
+          <div>
+            <el-button size="mini" type="text" @click="afterSaleTreatment(scope.row)"
+            >售后处理
+            </el-button>
+          </div>
+          <div>
+            <el-button size="mini" type="text"
+            >评论处理
+            </el-button>
+          </div>
+          <div>
+            <el-button size="mini" type="text" @click="consignment(scope.row)"
+            >发货
+            </el-button>
+          </div>
+          <div>
+            <el-button size="mini" type="text" icon="el-icon-tickets"
+                       v-hasPermi="['supplier:sale-order:update']"
+                       @click="handleUpdate(scope.row)"
+            >详情
+            </el-button>
+          </div>
+          <!--          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"-->
+          <!--                     v-hasPermi="['supplier:sale-order:delete']">删除</el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="650px" v-dialogDrag append-to-body>
+      <div>
+        <div style="font-size: 20px;color: #454545;margin-bottom: 10px;font-weight: bold">
+          订单信息
+        </div>
+        <el-form ref="form" :model="form" :rules="rules" label-width="100px">
+          <el-row :gutter="10">
+            <el-col :span="12">
+              <el-form-item label="订单编号" prop="orderNo">
+                <el-input v-model="form.orderNo" placeholder="请输入订单编号"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="订单类型" prop="orderType">
+                <el-select v-model="form.orderType +''" placeholder="请选择订单类型">
+                  <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SALE_ORDER_TYPE)"
+                             :key="dict.value" :label="dict.label" :value="dict.value"
+                  />
+                </el-select>
+              </el-form-item>
+            </el-col>
+          </el-row>
+
+          <el-row :gutter="10">
+            <el-col :span="12">
+              <el-form-item label="客户名称" prop="clienteleName">
+                <el-input v-model="form.clienteleName" placeholder="请输入客户名称"/>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="客户联系方式" prop="clientelePhone">
+                <el-input v-model="form.clientelePhone" placeholder="请输入客户联系方式"/>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-row :gutter="10">
+            <el-col :span="12">
+              <el-form-item label="客户类型" prop="clienteleType">
+                <el-select v-model="form.clienteleType" placeholder="请选择客户类型">
+                  <el-option label="请选择字典生成" value=""/>
+                </el-select>
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="订单状态" prop="orderStatus">
+                <el-radio-group v-model="form.orderStatus">
+                  <el-radio label="1">请选择字典生成</el-radio>
+                </el-radio-group>
+              </el-form-item>
+            </el-col>
+          </el-row>
+          <el-form-item label="收货地址" prop="cneeAddress">
+            <el-input v-model="form.cneeAddress" placeholder="请输入收货地址" type="textarea" :rows="3"/>
+          </el-form-item>
+          <!--        <el-form-item label="客户ID" prop="clienteleId">-->
+          <!--          <el-input v-model="form.clienteleId" placeholder="请输入客户ID" />-->
+          <!--        </el-form-item>-->
+          <el-row :gutter="10">
+            <el-col :span="12">
+              <el-form-item label="预计发货时间" prop="predictShipmentsTime">
+                <el-date-picker clearable v-model="form.predictShipmentsTime" type="date" value-format="timestamp"
+                                placeholder="选择预计发货时间"
+                />
+              </el-form-item>
+            </el-col>
+            <el-col :span="12">
+              <el-form-item label="售后状态" prop="afterSale">
+                <el-select v-model="form.afterSale +''" placeholder="请选择售后状态">
+                  <el-option label="请选择字典生成" value=""/>
+                </el-select>
+              </el-form-item>
+
+            </el-col>
+          </el-row>
+
+          <!--        <el-form-item label="商品ID" prop="goodsId">-->
+          <!--          <el-input v-model="form.goodsId" placeholder="请输入商品ID" />-->
+          <!--        </el-form-item>-->
+        </el-form>
+      </div>
+      <div>
+        <div style="font-size: 20px;color: #454545;margin-bottom: 10px;font-weight: bold">
+          物流信息
+        </div>
+        <div>
+          <el-form label-width="100px">
+            <el-row :gutter="10">
+              <el-col :span="12">
+                <el-form-item label="运输单位">
+                  <el-input placeholder="请输入运输单位"/>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+                <el-form-item label="物流编号">
+                  <el-input placeholder="请输入物流编号"/>
+                </el-form-item>
+              </el-col>
+            </el-row>
+            <el-row :gutter="10">
+              <el-col :span="12">
+                <el-form-item label="物流状态">
+                  <el-select placeholder="请选择物流状态">
+                    <el-option label="请选择字典生成" value=""/>
+                  </el-select>
+                </el-form-item>
+              </el-col>
+              <el-col :span="12">
+
+              </el-col>
+            </el-row>
+            <el-form-item label="物流信息">
+              <div style="background: #e0f2ff;padding: 10px;border-radius: 10px">
+                <el-steps direction="vertical" :active="1" :space="50">
+                  <el-step title="2024-03-04 10:00:00  承运单位揽件"></el-step>
+                  <el-step title="XXXXXX"></el-step>
+                  <el-step title="派件"></el-step>
+                </el-steps>
+              </div>
+            </el-form-item>
+          </el-form>
+        </div>
+      </div>
+      <!--      <div>-->
+      <!--        <div style="font-size: 20px;color: #454545;margin-bottom: 10px;font-weight: bold">-->
+      <!--          售后信息-->
+      <!--        </div>-->
+      <!--      </div>-->
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 对话框(售后工单) -->
+    <el-dialog title="售后工单" :visible.sync="isOpenAfterSale" width="700px" v-dialogDrag append-to-body>
+      <el-row :gutter="10">
+        <el-form ref="form" :model="formDetail" label-width="105px">
+          <el-col :span="11">
+            <el-form-item label="订单编号" prop="orderNo">
+              <el-input v-model="formDetail.orderNo" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="1">
+            <el-button size="mini" type="text" icon="el-icon-copy-document"></el-button>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="客户名称" prop="orderCode">
+              <el-input v-model="formDetail.clienteleName" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="售后类型" prop="category">
+              <el-select v-model="formDetail.category" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_CATEGORY)" :key="parseInt(dict.value)"
+                           :label="dict.label" :value="parseInt(dict.value)"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="期望处理方式" prop="state">
+              <el-select v-model="formDetail.state" disabled>
+                <el-option v-for="dict in this.getDictDatas(DICT_TYPE.AFTERSALE_STATE)" :key="parseInt(dict.value)"
+                           :label="dict.label" :value="parseInt(dict.value)"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="问题描述" prop="questionDescriptive">
+              <el-input type="textarea" v-model="formDetail.questionDescriptive" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="问题照片" prop="questionPicture">
+              <el-input v-model="formDetail.questionPicture" disabled/>
+            </el-form-item>
+          </el-col>
+          <el-col :span="24">
+            <el-form-item label="处理建议" prop="processRecommendation">
+              <el-input type="textarea" v-model="formDetail.processRecommendation"/>
+            </el-form-item>
+          </el-col>
+        </el-form>
+      </el-row>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+    <!-- 对话框(发货) -->
+    <el-dialog title="发货提交" :visible.sync="isOpenShipments" width="850px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="formDetail2" :rules="rules" label-width="120px">
+        <el-row>
+          <!-- 发货单号 -->
+          <el-col :span="12">
+            <el-form-item label="发货单号" prop="shipmentsNo">
+              <el-input v-model="formDetail2.shipmentsNo" placeholder="请输入发货单号"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 订单编号 -->
+          <el-col :span="12">
+            <el-form-item label="订单编号" prop="orderNo">
+              <el-input v-model="formDetail2.orderNo" placeholder="请输入订单编号" disabled/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="客户名称" prop="clienteleName">
+              <el-input v-model="formDetail2.clienteleName" disabled/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="客户联系方式" prop="clientelePhone">
+              <el-input v-model="formDetail2.clientelePhone" disabled/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="承运单位" prop="sellerInfo">
+              <el-input v-model="formDetail2.sellerInfo" placeholder="请输入卖家信息"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 物流订单号 -->
+          <el-col :span="12">
+            <el-form-item label="运单编号" prop="logisticsOrderNo">
+              <el-input v-model="formDetail2.logisticsOrderNo" placeholder="请输入物流订单号"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 发货状态 -->
+          <el-col :span="12">
+            <el-form-item label="发货状态" prop="shipmentsStatus">
+              <el-select v-model="formDetail2.shipmentsStatus" placeholder="请选择发货状态">
+                <el-option
+                    v-for="dict in this.getDictDatas(DICT_TYPE.SHIPMENTS_STATUS)"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <!-- 发货地址 -->
+          <el-col :span="24">
+            <el-form-item label="发货地址" prop="cneeAddress">
+              <el-input v-model="formDetail2.shipmentsStore" placeholder="请输入收货地址" type="textarea"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 客户地址 -->
+          <el-col :span="24">
+            <el-form-item label="客户地址" prop="cneeAddress">
+              <el-input v-model="formDetail2.cneeAddress" placeholder="请输入客户地址" type="textarea"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <div style="margin-bottom: 20px;margin-left: 50px">
+          <el-table v-loading="loading" :data="list">
+            <el-table-column label="商品编号" align="center" prop="code"/>
+            <el-table-column label="商品名称" align="center" prop="name"/>
+            <el-table-column label="商品品牌" align="center" prop="brand"/>
+            <el-table-column label="商品型号" align="center" prop="model"/>
+            <el-table-column label="单位" align="center" prop="unit"/>
+            <el-table-column label="成交单价" align="center" prop="marketPrice"/>
+            <el-table-column label="应发数量" align="center" prop="num"/>
+            <el-table-column label="实发数量" align="center" prop="num"/>
+            <el-table-column label="操作" align="center">
+              <template v-slot="scope">
+                <el-button size="mini" type="text"
+                >删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="formDetail2.remark" placeholder="请输入备注" type="textarea"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  getGoods
+} from '@/api/supplier/goods'
+
+import {
+  createSaleOrder,
+  updateSaleOrder,
+  deleteSaleOrder,
+  getSaleOrder,
+  getSaleOrderPage,
+  exportSaleOrderExcel
+} from '@/api/supplier/saleOrder'
+
+// import PortalSlideshowConfig from '@/views/supplier/portalSlideshowConfig'
+
+export default {
+  name: 'SaleOrder',
+  components: {},
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 已售订单列表
+      list: [],
+      goodsMap: new Map(),
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      isOpenAfterSale: false,
+      isOpenShipments: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        createTime: [],
+        orderNo: null,
+        orderType: null,
+        clienteleId: null,
+        clienteleName: null,
+        clientelePhone: null,
+        clienteleType: null,
+        cneeAddress: null,
+        orderStatus: null,
+        predictShipmentsTime: [],
+        afterSale: null,
+        goodsId: null
+      },
+      // 表单参数
+      form: {},
+      formDetail: {},
+      formDetail2: {},
+      // 表单校验
+      rules: {}
+    }
+  },
+  watch: {
+    // 'list': {
+    //   handler: function(newValue) {
+    //     console.log(newValue)
+    //   },
+    //   deep: true
+    // }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+
+    toggleExpand(row, expandedRows) {
+      getGoods(row.goodsId).then(res => {
+        row.goodslist.splice(0, 1, {
+          goodsInfo: res.data,
+          id: 'update'
+        })
+      })
+    },
+    afterSaleTreatment(row) {
+      this.isOpenAfterSale = true
+      this.formDetail = row
+    },
+    //发货
+    consignment(row) {
+      this.isOpenShipments = true
+      this.formDetail2 = row
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true
+      // 执行查询
+      getSaleOrderPage(this.queryParams).then(response => {
+        response.data.list.forEach(item => {
+          item.goodslist = []
+          item.goodslist.push({})
+        })
+        this.list = response.data.list
+        this.total = response.data.total
+        this.loading = false
+      })
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false
+      this.isOpenShipments = false
+      this.isOpenAfterSale = false
+      this.reset()
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        orderNo: undefined,
+        orderType: undefined,
+        clienteleId: undefined,
+        clienteleName: undefined,
+        clientelePhone: undefined,
+        clienteleType: undefined,
+        cneeAddress: undefined,
+        orderStatus: undefined,
+        predictShipmentsTime: undefined,
+        afterSale: undefined,
+        goodsId: undefined
+      }
+      this.formDetail = {}
+      this.formDetail2 = {}
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加已售订单'
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id
+      getSaleOrder(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改已售订单'
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (!valid) {
+          return
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateSaleOrder(this.form).then(response => {
+            this.$modal.msgSuccess('修改成功')
+            this.open = false
+            this.getList()
+          })
+          return
+        }
+        // 添加的提交
+        createSaleOrder(this.form).then(response => {
+          this.$modal.msgSuccess('新增成功')
+          this.open = false
+          this.getList()
+        })
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id
+      this.$modal.confirm('是否确认删除已售订单编号为"' + id + '"的数据项?').then(function() {
+        return deleteSaleOrder(id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {
+      })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams }
+      params.pageNo = undefined
+      params.pageSize = undefined
+      this.$modal.confirm('是否确认导出所有已售订单数据项?').then(() => {
+        this.exportLoading = true
+        return exportSaleOrderExcel(params)
+      }).then(response => {
+        this.$download.excel(response, '已售订单.xls')
+        this.exportLoading = false
+      }).catch(() => {
+      })
+    }
+  }
+}
+</script>

+ 255 - 0
src/views/supplier/seek/seekOrder.vue

@@ -0,0 +1,255 @@
+<template>
+
+  <div style="padding: 20px">
+
+    <div>
+      <!-- 搜索工作栏 -->
+      <el-form :model="queryParams" ref="queryForm" size="small" :inline="true">
+        <el-form-item label="标题" prop="title">
+          <el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter.native="handleQuery"/>
+        </el-form-item>
+        <el-form-item label="收货地址" prop="cneeAddress">
+          <el-input v-model="queryParams.cneeAddress" placeholder="请输入收货地址" clearable
+                    @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item label="客户名称" prop="clienteleName">
+          <el-input v-model="queryParams.clienteleName" placeholder="请输入采购数量" clearable
+                    @keyup.enter.native="handleQuery"
+          />
+        </el-form-item>
+        <el-form-item>
+          <el-popover
+              placement="bottom"
+              width="400"
+              trigger="click"
+          >
+            <el-form-item label="标题" prop="title">
+              <el-input v-model="queryParams.title" placeholder="请输入标题" clearable @keyup.enter.native="handleQuery"/>
+            </el-form-item>
+            <el-form-item label="收货地址" prop="cneeAddress">
+              <el-input v-model="queryParams.cneeAddress" placeholder="请输入收货地址" clearable
+                        @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+            <el-form-item label="客户名称" prop="clienteleName">
+              <el-input v-model="queryParams.clienteleName" placeholder="请输入采购数量" clearable
+                        @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+            <el-form-item label="期望到货时间" prop="expectationReceiptOfGoodsTime">
+              <el-date-picker v-model="queryParams.expectationReceiptOfGoodsTime" style="width: 240px"
+                              value-format="yyyy-MM-dd HH:mm:ss" type="daterange"
+                              range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+                              :default-time="['00:00:00', '23:59:59']"
+              />
+            </el-form-item>
+            <el-form-item label="报价剩余天数" prop="quoteRemainDays">
+              <el-input v-model="queryParams.quoteRemainDays" placeholder="请输入剩余天数" clearable
+                        @keyup.enter.native="handleQuery"
+              />
+            </el-form-item>
+            <el-button slot="reference">复合查询</el-button>
+
+            <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+          </el-popover>
+        </el-form-item>
+        <el-form-item>
+          <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+          <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <div v-for="item in list"
+         style="display: inline-block;width: 385px;padding: 10px;position: relative"
+    >
+      <div style="font-size: 20px;font-weight:bold;color: red;position: absolute;top: 0;right:0" class="rotated-text">
+        New
+      </div>
+      <div style="border: 1px #c4c4c4 solid;border-radius: 10px;padding: 10px">
+        <div style="font-size: 25px;font-weight: bold">
+          {{ item.title }}
+        </div>
+        <div>
+          <el-row :gutter="10">
+            <el-col :span="12">
+              采购总量:{{ item.purchaseNum }}1000吨
+            </el-col>
+            <el-col :span="12">
+              浏览次数:{{ item.browseNum }} 次
+            </el-col>
+          </el-row>
+          <el-row :gutter="10">
+            <el-col :span="12">
+              收货地址:{{ item.cneeAddress }}
+            </el-col>
+            <el-col :span="12">
+              报价次数:{{ item.quoteNum }}次
+            </el-col>
+          </el-row>
+          <el-row :gutter="10">
+            <el-col :span="12">
+              期望到货时间:{{ parseTime(item.expectationReceiptOfGoodsTime, '{y}-{m}-{d}') }}
+            </el-col>
+            <el-col :span="12">
+              报价剩余天数:{{ item.quoteRemainDays }}天
+            </el-col>
+          </el-row>
+          <el-row :gutter="10" align="bottom" type="flex" style="margin-top: 5px">
+            <el-col :span="12">
+              {{ parseTime(item.createTime, '{y}-{m}-{d}') }}
+            </el-col>
+            <el-col :span="12">
+              <el-row :gutter="10">
+                <el-col :span="12">
+                  <el-button size="mini" type="primary" @click="demandDetails(item)">查看需求</el-button>
+                </el-col>
+                <el-col :span="12">
+                  <el-button size="mini" @click="quotedPrice(item)">报 价</el-button>
+                </el-col>
+              </el-row>
+            </el-col>
+          </el-row>
+        </div>
+      </div>
+    </div>
+    <el-dialog title="需求详情" :visible.sync="showOne" width="650px" v-dialogDrag append-to-body>
+
+    </el-dialog>
+
+    <el-dialog title="采购报价" :visible.sync="showTow" width="850px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form">
+        <el-form-item label="采购标题" prop="shipmentsAddress">
+          <el-input v-model="title" type="textarea" placeholder="请输入内容" disabled/>
+        </el-form-item>
+        <div style="margin-bottom: 20px">
+          <el-table  border >
+            <el-table-column label="采购信息" align="center" prop="code"/>
+            <el-table-column label="采购单位信息" align="center" prop="name"/>
+            <el-table-column label="其他备注" align="center" prop="brand"/>
+            <el-table-column label="图片" align="center" prop="model"/>
+            <el-table-column label="报价单价(元)" align="center" prop="unit"/>
+            <el-table-column label="报价总金额" align="center" prop="marketPrice"/>
+            <el-table-column label="报价备注" align="center" prop="num"/>
+          </el-table>
+        </div>
+        <el-form-item label="供应周期" prop="provisionPeriod">
+          <el-select v-model="form.provisionPeriod" placeholder="请选择供应周期">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.PROVISION_PERIOD)"
+                       :key="dict.value" :label="dict.label" :value="dict.value"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="供应时长" prop="provisionDuration">
+          <el-date-picker clearable v-model="form.provisionDuration" type="date" value-format="timestamp"
+                          placeholder="选择供应时长"
+          />
+        </el-form-item>
+        <el-form-item label="发货地址" prop="shipmentsAddress">
+          <el-input v-model="form.shipmentsAddress" type="textarea" placeholder="请输入内容"/>
+        </el-form-item>
+        <el-form-item label="预计送达时间" prop="predictDeliveryTime">
+          <el-date-picker clearable v-model="form.predictDeliveryTime" type="date" value-format="timestamp"
+                          placeholder="选择预计送达时间"
+          />
+        </el-form-item>
+        <!--        <el-form-item label="采购商品ID" prop="purchaseGoodsId">-->
+        <!--          <el-input v-model="form.purchaseGoodsId" placeholder="请输入采购商品ID"/>-->
+        <!--        </el-form-item>-->
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import { getPurchaseInfoPage } from '@/api/supplier/purchaseInfo'
+import { createQuoteInfo } from '@/api/supplier/quoteInfo'
+
+export default {
+  name: 'seekOrder',
+  data() {
+    return {
+      showOne: false,
+      showTow: false,
+      list: [],
+      form: {},
+      title: '',
+      queryParams: {
+        pageNo: 1,
+        pageSize: 100,
+        title: null,
+        browseNum: null,
+        quoteNum: null,
+        quoteRemainDays: null,
+        cneeAddress: null,
+        purchaseNum: null,
+        purchaseUnit: null,
+        expectationReceiptOfGoodsTime: []
+      }
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    /** 查询列表 */
+    getList() {
+      this.loading = true
+      // 执行查询
+      getPurchaseInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list
+        this.total = response.data.total
+        this.loading = false
+      })
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    demandDetails(row) {
+      this.showOne = true
+    },
+    quotedPrice(row) {
+      this.showTow = true
+      this.form.purchaseInfoId = row.id
+      this.title = row.title
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.showOne = false
+      this.showTow = false
+      // this.reset()
+    },
+    /** 提交按钮 */
+    submitForm() {
+      // 添加的提交
+      createQuoteInfo(this.form).then(response => {
+        this.$modal.msgSuccess('新增成功')
+        this.open = false
+        this.getList()
+      })
+    }
+  }
+}
+</script>
+
+<style scoped>
+.rotated-text {
+  /* 旋转45度 */
+  transform: rotate(45deg);
+  /* 确保旋转中心为文字的中心 */
+  transform-origin: center;
+  /* 为了看到文字的旋转效果,可以设置一个阴影 */
+  text-shadow: 1px 1px 2px #000;
+}
+</style>

+ 431 - 0
src/views/supplier/shipmentsManage/index.vue

@@ -0,0 +1,431 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
+      <el-form-item label="发货单号" prop="shipmentsNo">
+        <el-input v-model="queryParams.shipmentsNo" placeholder="请输入发货单号" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="订单编号" prop="orderNo">
+        <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item label="卖家信息" prop="sellerInfo">
+        <el-input v-model="queryParams.sellerInfo" placeholder="请输入卖家信息" clearable @keyup.enter.native="handleQuery"/>
+      </el-form-item>
+      <el-form-item>
+        <el-popover
+            placement="bottom"
+            width="400"
+            trigger="click"
+        >
+          <el-form-item label="发货单号" prop="shipmentsNo">
+            <el-input v-model="queryParams.shipmentsNo" placeholder="请输入发货单号" clearable
+                      @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="订单编号" prop="orderNo">
+            <el-input v-model="queryParams.orderNo" placeholder="请输入订单编号" clearable @keyup.enter.native="handleQuery"/>
+          </el-form-item>
+          <el-form-item label="卖家信息" prop="sellerInfo">
+            <el-input v-model="queryParams.sellerInfo" placeholder="请输入卖家信息" clearable
+                      @keyup.enter.native="handleQuery"
+            />
+          </el-form-item>
+          <el-form-item label="发货状态" prop="shipmentsStatus">
+            <el-select v-model="queryParams.shipmentsStatus" placeholder="请选择发货状态" clearable size="small">
+              <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SHIPMENTS_STATUS)"
+                         :key="dict.value" :label="dict.label" :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="物流状态" prop="logisticsStutas">
+            <el-select v-model="queryParams.logisticsStutas" placeholder="请选择物流状态" clearable size="small">
+              <el-option v-for="dict in this.getDictDatas(DICT_TYPE.LOGISTICS_STUTAS)"
+                         :key="dict.value" :label="dict.label" :value="dict.value"
+              />
+            </el-select>
+          </el-form-item>
+          <el-button slot="reference">复合查询</el-button>
+
+          <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        </el-popover>
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+                   v-hasPermi="['supplier:shipments-manage:create']"
+        >新增
+        </el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+                   :loading="exportLoading"
+                   v-hasPermi="['supplier:shipments-manage:export']"
+        >导出
+        </el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list" border
+              @expand-change="toggleExpand"
+    >
+      <!--      <el-table-column label="主键id" align="center" prop="id"/>-->
+      <!--      <el-table-column label="创建时间" align="center" prop="createTime"/>-->
+      <el-table-column type="expand">
+        <template slot-scope="props">
+          <el-table :data="props.row.goodslist" border style="margin-left: 50px">
+            <el-table-column label="商品编号" align="center" prop="code"/>
+            <el-table-column label="商品名称" align="center" prop="name"/>
+            <el-table-column label="商品品牌" align="center" prop="brand"/>
+            <el-table-column label="商品型号" align="center" prop="model"/>
+            <el-table-column label="单位" align="center" prop="unit"/>
+            <el-table-column label="成交单价" align="center" prop="marketPrice"/>
+            <el-table-column label="发货数量" align="center" prop="num"/>
+          </el-table>
+        </template>
+      </el-table-column>
+      <el-table-column label="发货单号" align="center" prop="shipmentsNo"/>
+      <el-table-column label="订单编号" align="center" prop="orderNo"/>
+      <!--      <el-table-column label="订单ID" align="center" prop="orderId"/>-->
+      <el-table-column label="发货状态" align="center" prop="shipmentsStatus">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.SHIPMENTS_STATUS" :value="scope.row.shipmentsStatus"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="收货地址" align="center" prop="cneeAddress"/>
+      <!--      <el-table-column label="卖家ID" align="center" prop="sellerId"/>-->
+      <el-table-column label="卖家信息" align="center" prop="sellerInfo"/>
+      <el-table-column label="发货店铺" align="center" prop="shipmentsStore"/>
+      <el-table-column label="配送方式" align="center" prop="deliveryMode">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.DELIVERY_MODE" :value="scope.row.deliveryMode"/>
+        </template>
+      </el-table-column>
+      <el-table-column label="物流状态" align="center" prop="logisticsStutas">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.LOGISTICS_STUTAS" :value="scope.row.logisticsStutas"/>
+        </template>
+      </el-table-column>
+
+      <el-table-column label="操作员" align="center" prop="creator"/>
+      <!--      <el-table-column label="物流信息" align="center" prop="logisticsInfo"/>-->
+      <!--      <el-table-column label="物流订单号" align="center" prop="logisticsOrderNo"/>-->
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:shipments-manage:update']"
+          >详情
+          </el-button>
+          <!--          <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"-->
+          <!--                     v-hasPermi="['supplier:shipments-manage:delete']"-->
+          <!--          >删除-->
+          <!--          </el-button>-->
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+                @pagination="getList"
+    />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="850px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="120px">
+        <el-row>
+          <!-- 发货单号 -->
+          <el-col :span="12">
+            <el-form-item label="发货单号" prop="shipmentsNo">
+              <el-input v-model="form.shipmentsNo" placeholder="请输入发货单号"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 订单编号 -->
+          <el-col :span="12">
+            <el-form-item label="订单编号" prop="orderNo">
+              <el-input v-model="form.orderNo" placeholder="请输入订单编号" disabled/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="客户名称" prop="clienteleName">
+              <el-input v-model="form.clienteleName" disabled/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="客户联系方式" prop="clientelePhone">
+              <el-input v-model="form.clientelePhone" disabled/>
+            </el-form-item>
+          </el-col>
+
+          <el-col :span="12">
+            <el-form-item label="承运单位" prop="sellerInfo">
+              <el-input v-model="form.sellerInfo" placeholder="请输入卖家信息"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 物流订单号 -->
+          <el-col :span="12">
+            <el-form-item label="运单编号" prop="logisticsOrderNo">
+              <el-input v-model="form.logisticsOrderNo" placeholder="请输入物流订单号"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 发货状态 -->
+          <el-col :span="12">
+            <el-form-item label="发货状态" prop="shipmentsStatus">
+              <el-select v-model="form.shipmentsStatus" placeholder="请选择发货状态">
+                <el-option
+                    v-for="dict in this.getDictDatas(DICT_TYPE.SHIPMENTS_STATUS)"
+                    :key="dict.value"
+                    :label="dict.label"
+                    :value="dict.value"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+
+          <!-- 发货地址 -->
+          <el-col :span="24">
+            <el-form-item label="发货地址" prop="cneeAddress">
+              <el-input v-model="form.shipmentsStore" placeholder="请输入收货地址" type="textarea"/>
+            </el-form-item>
+          </el-col>
+
+          <!-- 客户地址 -->
+          <el-col :span="24">
+            <el-form-item label="客户地址" prop="cneeAddress">
+              <el-input v-model="form.cneeAddress" placeholder="请输入客户地址" type="textarea"/>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <div style="margin-bottom: 20px;margin-left: 50px">
+          <el-table v-loading="loading" :data="goodslist">
+            <el-table-column label="商品编号" align="center" prop="code"/>
+            <el-table-column label="商品名称" align="center" prop="name"/>
+            <el-table-column label="商品品牌" align="center" prop="brand"/>
+            <el-table-column label="商品型号" align="center" prop="model"/>
+            <el-table-column label="单位" align="center" prop="unit"/>
+            <el-table-column label="成交单价" align="center" prop="marketPrice"/>
+            <el-table-column label="应发数量" align="center" prop="num"/>
+            <el-table-column label="实发数量" align="center" prop="num"/>
+            <el-table-column label="操作" align="center">
+              <template v-slot="scope">
+                <el-button size="mini" type="text"
+                >删除
+                </el-button>
+              </template>
+            </el-table-column>
+          </el-table>
+        </div>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="form.remark" placeholder="请输入备注" type="textarea"/>
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createShipmentsManage,
+  updateShipmentsManage,
+  deleteShipmentsManage,
+  getShipmentsManage,
+  getShipmentsManagePage,
+  exportShipmentsManageExcel
+} from '@/api/supplier/shipmentsManage'
+import {
+  getSaleOrder
+} from '@/api/supplier/saleOrder'
+import { getGoods } from '@/api/supplier/goods'
+
+export default {
+  name: 'ShipmentsManage',
+  components: {},
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 发货信息管理列表
+      list: [],
+      goodslist: [],
+      // 弹出层标题
+      title: '',
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        createTime: [],
+        shipmentsNo: null,
+        orderNo: null,
+        orderId: null,
+        shipmentsStatus: null,
+        cneeAddress: null,
+        sellerId: null,
+        sellerInfo: null,
+        shipmentsStore: null,
+        deliveryMode: null,
+        logisticsStutas: null,
+        logisticsInfo: null,
+        logisticsOrderNo: null
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {}
+    }
+  },
+  created() {
+    this.getList()
+  },
+  methods: {
+    toggleExpand(row, expandedRows) {
+      getSaleOrder(row.orderId).then(res => {
+        getGoods(res.data.goodsId).then(res => {
+          row.goodslist.splice(0, 1, res.data)
+        })
+      })
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true
+      // 执行查询
+      getShipmentsManagePage(this.queryParams).then(response => {
+        response.data.list.forEach(item => {
+          item.goodslist = []
+          item.goodslist.push({})
+        })
+        this.list = response.data.list
+        this.total = response.data.total
+        this.loading = false
+      })
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false
+      this.reset()
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        id: undefined,
+        shipmentsNo: undefined,
+        orderNo: undefined,
+        orderId: undefined,
+        shipmentsStatus: undefined,
+        cneeAddress: undefined,
+        sellerId: undefined,
+        sellerInfo: undefined,
+        shipmentsStore: undefined,
+        deliveryMode: undefined,
+        logisticsStutas: undefined,
+        logisticsInfo: undefined,
+        logisticsOrderNo: undefined
+      }
+      this.resetForm('form')
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1
+      this.getList()
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm('queryForm')
+      this.handleQuery()
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset()
+      this.open = true
+      this.title = '添加发货信息管理'
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset()
+      const id = row.id
+      getSaleOrder(row.orderId).then(res => {
+        getGoods(res.data.goodsId).then(res => {
+          this.goodslist.splice(0, 1, res.data)
+        })
+      })
+      getShipmentsManage(id).then(response => {
+        this.form = response.data
+        this.open = true
+        this.title = '修改发货信息管理'
+      })
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs['form'].validate(valid => {
+        if (!valid) {
+          return
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateShipmentsManage(this.form).then(response => {
+            this.$modal.msgSuccess('修改成功')
+            this.open = false
+            this.getList()
+          })
+          return
+        }
+        // 添加的提交
+        createShipmentsManage(this.form).then(response => {
+          this.$modal.msgSuccess('新增成功')
+          this.open = false
+          this.getList()
+        })
+      })
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id
+      this.$modal.confirm('是否确认删除发货信息管理编号为"' + id + '"的数据项?').then(function() {
+        return deleteShipmentsManage(id)
+      }).then(() => {
+        this.getList()
+        this.$modal.msgSuccess('删除成功')
+      }).catch(() => {
+      })
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams }
+      params.pageNo = undefined
+      params.pageSize = undefined
+      this.$modal.confirm('是否确认导出所有发货信息管理数据项?').then(() => {
+        this.exportLoading = true
+        return exportShipmentsManageExcel(params)
+      }).then(response => {
+        this.$download.excel(response, '发货信息管理.xls')
+        this.exportLoading = false
+      }).catch(() => {
+      })
+    }
+  }
+}
+</script>

+ 312 - 0
src/views/supplier/signingInfo/index.vue

@@ -0,0 +1,312 @@
+<template>
+  <div class="app-container">
+
+    <!-- 搜索工作栏 -->
+    <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="88px">
+      <el-form-item label="签约客户" prop="client">
+        <el-input v-model="queryParams.client" placeholder="请输入签约客户" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="签约供应商" prop="supplier">
+        <el-input v-model="queryParams.supplier" placeholder="请输入签约供应商" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item label="签约时间" prop="signTime">
+        <el-date-picker v-model="queryParams.signTime" style="width: 240px" value-format="yyyy-MM-dd HH:mm:ss"
+          type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"
+          :default-time="['00:00:00', '23:59:59']" />
+      </el-form-item>
+      <el-form-item label="签约状态" prop="state">
+        <el-input v-model="queryParams.state" placeholder="请输入签约状态" clearable @keyup.enter.native="handleQuery" />
+      </el-form-item>
+      <el-form-item>
+        <el-button type="primary" icon="el-icon-search" @click="handleQuery">搜索</el-button>
+        <el-button icon="el-icon-refresh" @click="resetQuery">重置</el-button>
+      </el-form-item>
+    </el-form>
+
+    <!-- 操作工具栏 -->
+    <el-row :gutter="10" class="mb8">
+      <el-col :span="1.5">
+        <el-button type="primary" plain icon="el-icon-plus" size="mini" @click="handleAdd"
+          v-hasPermi="['supplier:signing-info:create']">新增</el-button>
+      </el-col>
+      <el-col :span="1.5">
+        <el-button type="warning" plain icon="el-icon-download" size="mini" @click="handleExport"
+          :loading="exportLoading" v-hasPermi="['supplier:signing-info:export']">导出</el-button>
+      </el-col>
+      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
+    </el-row>
+
+    <!-- 列表 -->
+    <el-table v-loading="loading" :data="list">
+      <el-table-column label="签约编号" align="center" prop="code" />
+      <el-table-column label="签约客户" align="center" prop="client" />
+      <el-table-column label="签约供应商" align="center" prop="supplier" />
+      <el-table-column label="签约时间" align="center" prop="signTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.signTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="生效时间" align="center" prop="enableTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.enableTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="开始时间" align="center" prop="startTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.startTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="结束时间" align="center" prop="endTime" width="150">
+        <template v-slot="scope">
+          <span>{{ parseTime(scope.row.endTime) }}</span>
+        </template>
+      </el-table-column>
+      <el-table-column label="签约状态" align="center" prop="state">
+        <template v-slot="scope">
+          <dict-tag :type="DICT_TYPE.SIGNING_STATE" :value="scope.row.state" />
+        </template>
+      </el-table-column>
+      <el-table-column label="签约次数" align="center" prop="number" />
+      <el-table-column label="操作" align="center" class-name="small-padding fixed-width">
+        <template v-slot="scope">
+          <!-- <el-button size="mini" type="text" icon="el-icon-edit" @click="handleUpdate(scope.row)"
+                     v-hasPermi="['supplier:signing-info:update']">修改</el-button> -->
+          <!-- <el-button size="mini" type="text" icon="el-icon-delete" @click="handleDelete(scope.row)"
+                     v-hasPermi="['supplier:signing-info:delete']">删除</el-button> -->
+          <el-button size="mini" type="text" @click="handleEnd(scope.row)">终止签约</el-button>
+          <el-button size="mini" type="text" @click="handleContinue(scope.row)">到期续约</el-button>
+          <el-button size="mini" type="text" @click="handleChange(scope.row)">签约变更</el-button>
+          <el-button size="mini" type="text" @click="handleLog(scope.row)">签约记录</el-button>
+          <el-button size="mini" type="text" @click="handleAttachment(scope.row)">签约附件</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <!-- 分页组件 -->
+    <pagination v-show="total > 0" :total="total" :page.sync="queryParams.pageNo" :limit.sync="queryParams.pageSize"
+      @pagination="getList" />
+
+    <!-- 对话框(添加 / 修改) -->
+    <el-dialog :title="title" :visible.sync="open" width="500px" v-dialogDrag append-to-body>
+      <el-form ref="form" :model="form" :rules="rules" label-width="90px">
+        <el-form-item label="签约编号" prop="code">
+          <el-input v-model="form.code" placeholder="请输入签约编号" />
+        </el-form-item>
+        <el-form-item label="签约客户" prop="client">
+          <el-input v-model="form.client" placeholder="请输入签约客户" />
+        </el-form-item>
+        <el-form-item label="签约供应商" prop="supplier">
+          <el-input v-model="form.supplier" placeholder="请输入签约供应商" />
+        </el-form-item>
+        <el-form-item label="签约时间" prop="signTime">
+          <el-date-picker clearable v-model="form.signTime" type="date" value-format="timestamp" placeholder="选择签约时间" />
+        </el-form-item>
+        <el-form-item label="生效时间" prop="enableTime">
+          <el-date-picker clearable v-model="form.enableTime" type="date" value-format="timestamp"
+            placeholder="选择生效时间" />
+        </el-form-item>
+        <el-form-item label="开始时间" prop="startTime">
+          <el-date-picker clearable v-model="form.startTime" type="date" value-format="timestamp"
+            placeholder="选择开始时间" />
+        </el-form-item>
+        <el-form-item label="结束时间" prop="endTime">
+          <el-date-picker clearable v-model="form.endTime" type="date" value-format="timestamp" placeholder="选择结束时间" />
+        </el-form-item>
+        <el-form-item label="签约状态" prop="state">
+          <el-select v-model="form.state" placeholder="请选择签约状态">
+            <el-option v-for="dict in this.getDictDatas(DICT_TYPE.SIGNING_STATE)" :key="parseInt(dict.value)"
+              :label="dict.label" :value="parseInt(dict.value)" />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="签约次数" prop="number">
+          <el-input-number v-model="form.number" :precision="0" :min="0" placeholder="0" />
+        </el-form-item>
+      </el-form>
+      <div slot="footer" class="dialog-footer">
+        <el-button type="primary" @click="submitForm">确 定</el-button>
+        <el-button @click="cancel">取 消</el-button>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import {
+  createSigningInfo,
+  updateSigningInfo,
+  deleteSigningInfo,
+  getSigningInfo,
+  getSigningInfoPage,
+  exportSigningInfoExcel
+} from "@/api/supplier/signingInfo";
+
+export default {
+  name: "SigningInfo",
+  components: {
+  },
+  data() {
+    return {
+      // 遮罩层
+      loading: true,
+      // 导出遮罩层
+      exportLoading: false,
+      // 显示搜索条件
+      showSearch: true,
+      // 总条数
+      total: 0,
+      // 签约管理列表
+      list: [],
+      // 弹出层标题
+      title: "",
+      // 是否显示弹出层
+      open: false,
+      // 查询参数
+      queryParams: {
+        pageNo: 1,
+        pageSize: 10,
+        code: null,
+        client: null,
+        supplier: null,
+        signTime: [],
+        enableTime: [],
+        startTime: [],
+        endTime: [],
+        state: null,
+        number: null,
+      },
+      // 表单参数
+      form: {},
+      // 表单校验
+      rules: {
+      }
+    };
+  },
+  created() {
+    this.getList();
+  },
+  methods: {
+    /** 终止签约 */
+    handleEnd(row) {
+
+    },
+    /** 到期续约 */
+    handleContinue(row) {
+
+    },
+    /** 签约变更 */
+    handleChange(row) {
+
+    },
+    /** 签约记录 */
+    handleLog(row) {
+
+    },
+    /** 签约附件 */
+    handleAttachment(row) {
+
+    },
+    /** 查询列表 */
+    getList() {
+      this.loading = true;
+      // 执行查询
+      getSigningInfoPage(this.queryParams).then(response => {
+        this.list = response.data.list;
+        this.total = response.data.total;
+        this.loading = false;
+      });
+    },
+    /** 取消按钮 */
+    cancel() {
+      this.open = false;
+      this.reset();
+    },
+    /** 表单重置 */
+    reset() {
+      this.form = {
+        code: undefined,
+        client: undefined,
+        supplier: undefined,
+        signTime: undefined,
+        enableTime: undefined,
+        startTime: undefined,
+        endTime: undefined,
+        state: undefined,
+        number: undefined,
+      };
+      this.resetForm("form");
+    },
+    /** 搜索按钮操作 */
+    handleQuery() {
+      this.queryParams.pageNo = 1;
+      this.getList();
+    },
+    /** 重置按钮操作 */
+    resetQuery() {
+      this.resetForm("queryForm");
+      this.handleQuery();
+    },
+    /** 新增按钮操作 */
+    handleAdd() {
+      this.reset();
+      this.open = true;
+      this.title = "添加签约管理";
+    },
+    /** 修改按钮操作 */
+    handleUpdate(row) {
+      this.reset();
+      const id = row.id;
+      getSigningInfo(id).then(response => {
+        this.form = response.data;
+        this.open = true;
+        this.title = "修改签约管理";
+      });
+    },
+    /** 提交按钮 */
+    submitForm() {
+      this.$refs["form"].validate(valid => {
+        if (!valid) {
+          return;
+        }
+        // 修改的提交
+        if (this.form.id != null) {
+          updateSigningInfo(this.form).then(response => {
+            this.$modal.msgSuccess("修改成功");
+            this.open = false;
+            this.getList();
+          });
+          return;
+        }
+        // 添加的提交
+        createSigningInfo(this.form).then(response => {
+          this.$modal.msgSuccess("新增成功");
+          this.open = false;
+          this.getList();
+        });
+      });
+    },
+    /** 删除按钮操作 */
+    handleDelete(row) {
+      const id = row.id;
+      this.$modal.confirm('是否确认删除签约管理编号为"' + id + '"的数据项?').then(function () {
+        return deleteSigningInfo(id);
+      }).then(() => {
+        this.getList();
+        this.$modal.msgSuccess("删除成功");
+      }).catch(() => { });
+    },
+    /** 导出按钮操作 */
+    handleExport() {
+      // 处理查询参数
+      let params = { ...this.queryParams };
+      params.pageNo = undefined;
+      params.pageSize = undefined;
+      this.$modal.confirm('是否确认导出所有签约管理数据项?').then(() => {
+        this.exportLoading = true;
+        return exportSigningInfoExcel(params);
+      }).then(response => {
+        this.$download.excel(response, '签约管理.xls');
+        this.exportLoading = false;
+      }).catch(() => { });
+    }
+  }
+};
+</script>

Alguns ficheiros não foram mostrados porque muitos ficheiros mudaram neste diff