浏览代码

Merge branch 'develop_szhj' of jianguan-web/jq-repairFusion-html into develop

李磊 3 年之前
父节点
当前提交
804054f8c1
共有 47 个文件被更改,包括 5348 次插入124 次删除
  1. 2 2
      .env
  2. 2 2
      .env.practice
  3. 2 2
      .env.preview
  4. 2 2
      package-lock.json
  5. 15 0
      src/api/OperateJournal.js
  6. 49 0
      src/api/boundRecord.js
  7. 20 0
      src/api/dealer.js
  8. 86 0
      src/api/menu.js
  9. 32 0
      src/api/merchantAccount.js
  10. 7 7
      src/api/power-role.js
  11. 6 6
      src/api/power-user.js
  12. 136 0
      src/api/shelf.js
  13. 20 0
      src/api/store.js
  14. 1 1
      src/components/Select/index.js
  15. 15 23
      src/components/UploadFile/index.vue
  16. 164 6
      src/config/router.config.js
  17. 48 0
      src/libs/exportExcel.js
  18. 12 0
      src/libs/tools.js
  19. 8 3
      src/utils/request.js
  20. 460 0
      src/views/bnSetting/menu/adminMenus.vue
  21. 348 0
      src/views/bnSetting/menu/childModal.vue
  22. 497 0
      src/views/bnSetting/menu/storeMenus.vue
  23. 162 0
      src/views/bnSetting/menusAuth.vue
  24. 41 0
      src/views/bnSetting/menusAuthTab.vue
  25. 42 28
      src/views/common/commonModal.vue
  26. 68 0
      src/views/common/dealerList.vue
  27. 93 0
      src/views/common/shelfList.vue
  28. 68 0
      src/views/common/storeList.vue
  29. 240 0
      src/views/numsGoodsShelves/bondManagement/addbond.vue
  30. 221 0
      src/views/numsGoodsShelves/bondManagement/list.vue
  31. 238 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/addGoodsShelve.vue
  32. 145 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/addHWModal.vue
  33. 103 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/changeStatusModal.vue
  34. 170 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/chooseImportModal.vue
  35. 299 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/goodsAllocationSet.vue
  36. 197 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/importHuoweiModal.vue
  37. 234 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/list.vue
  38. 262 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/settlementModifyModal.vue
  39. 423 0
      src/views/numsGoodsShelves/goodsShelvesAdministration/settlementSet.vue
  40. 159 0
      src/views/numsGoodsShelves/partsDealerManagement/list.vue
  41. 192 0
      src/views/numsGoodsShelves/partsDealerManagement/setSHModal.vue
  42. 19 12
      src/views/power/OperateJournal/OperateJournal.vue
  43. 5 7
      src/views/power/role/roleList.vue
  44. 1 1
      src/views/power/role/roleModal.vue
  45. 30 16
      src/views/power/user/userList.vue
  46. 2 2
      src/views/power/user/userModal.vue
  47. 2 4
      vue.config.js

+ 2 - 2
.env

@@ -1,7 +1,7 @@
 NODE_ENV=production
 VUE_APP_PREVIEW=false
-VUE_APP_API_BASE_URL=https://iscm.360arrow.com/qpls-md
-VUE_APP_WX_BASE_URL=//iscm.360arrow.com/qpls-md/websocket/
+VUE_APP_API_BASE_URL=https://xprh.360arrow.com/xprh-admin
+VUE_APP_WX_BASE_URL=//xprh.360arrow.com/xprh-admin/websocket/
 VUE_APP_ENVTIPS=
 VUE_APP_VERSION=V1.0.0
 VUE_APP_PRO_NAME=修配融合系统

+ 2 - 2
.env.practice

@@ -1,7 +1,7 @@
 NODE_ENV=production
 VUE_APP_PREVIEW=false
-VUE_APP_API_BASE_URL=https://t.qpls.360arrow.com/qpls-md
-VUE_APP_WX_BASE_URL=//t.qpls.360arrow.com/qpls-md/websocket/
+VUE_APP_API_BASE_URL=https://t.xprh.360arrow.com/xprh-admin
+VUE_APP_WX_BASE_URL=//t.xprh.360arrow.com/xprh-admin/websocket/
 VUE_APP_VERSION=V1.0.0
 VUE_APP_ENVTIPS=练习环境
 VUE_APP_PRO_NAME=修配融合系统

+ 2 - 2
.env.preview

@@ -1,7 +1,7 @@
 NODE_ENV=production
 VUE_APP_PREVIEW=true
-VUE_APP_API_BASE_URL=http://p.iscm.360arrow.com/qpls-md
-VUE_APP_WX_BASE_URL=//p.iscm.360arrow.com/qpls-md/websocket/
+VUE_APP_API_BASE_URL=http://p.xprh.360arrow.com/xprh-admin
+VUE_APP_WX_BASE_URL=//p.xprh.360arrow.com/xprh-admin/websocket/
 VUE_APP_VERSION=V1.0.0
 VUE_APP_ENVTIPS=预发布环境
 VUE_APP_PRO_NAME=修配融合系统

+ 2 - 2
package-lock.json

@@ -1,6 +1,6 @@
 {
-  "name": "qpls-md",
-  "version": "2.0.0",
+  "name": "jq-repairFusion",
+  "version": "1.0.0",
   "lockfileVersion": 1,
   "requires": true,
   "dependencies": {

+ 15 - 0
src/api/OperateJournal.js

@@ -0,0 +1,15 @@
+import { axios } from '@/utils/request'
+
+// 操作日志列表
+export const journalList = (params) => {
+  let url = `/sysLog/queryLike/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios.request({
+    url: url,
+    data: params,
+    method: 'post'
+  })
+}
+
+

+ 49 - 0
src/api/boundRecord.js

@@ -0,0 +1,49 @@
+import { axios } from '@/utils/request'
+
+// 获取货架列表数据
+export const bondRecordByPage = params => {
+  const url = `/shelf/bondRecord/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 保证金详情
+export const bondRecordDetail = params => {
+  return axios({
+    url: `/shelf/bondRecord/queryBySn/${params.bondRecordSn}`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 新增/编辑保证金接口
+export const saveBondRecord = params => {
+  return axios({
+    url: '/shelf/bondRecord/save',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 保证金列表(无分页)
+export const bondRecordList = params => {
+  const url = `/shelf/bondRecord/queryListByShelfSn/${params.shelfSn}`
+  return axios({
+    url: url,
+    data: {},
+    method: 'get'
+  })
+}
+// 删除保证金
+export const bondRecordDel = params => {
+  return axios({
+    url: `/shelf/bondRecord/deleteBySn/${params.bondRecordSn}`,
+    data: params,
+    method: 'post'
+  })
+}

+ 20 - 0
src/api/dealer.js

@@ -0,0 +1,20 @@
+import { axios } from '@/utils/request'
+// 获取经销商列表(带分页)
+export const dealerListByPage = params => {
+  const url = `/dealer/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+// 获取经销商列表(无分页)
+export const dealerList = params => {
+  return axios({
+    url: '/dealer/queryList',
+    data: params,
+    method: 'POST'
+  })
+}

+ 86 - 0
src/api/menu.js

@@ -0,0 +1,86 @@
+import { axios } from '@/utils/request'
+
+// 获取菜单树数据
+export const getMenuList = params => {
+  const url = `/menu/findAll`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 保存
+export const saveMenu = params => {
+  const url = `/menu/save`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 删除
+export const deleteMenu = params => {
+  const url = `/menu/delete/${params.id}`
+  return axios({
+    url: url,
+    method: 'get'
+  })
+}
+
+// 获取门店菜单树数据
+export const getMdMenuList = params => {
+  const url = `/mdmenu/findAll`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 门店菜单保存
+export const saveMdMenu = params => {
+  const url = `/mdmenu/save`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+// 门店菜单删除
+export const deleteMdMenu = params => {
+  const url = `/mdmenu/delete/${params.id}`
+  return axios({
+    url: url,
+    method: 'get'
+  })
+}
+
+// 获取运营菜单树数据
+export const getYyMenuList = params => {
+  const url = `/yymenu/findAll`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 运营菜单保存
+export const saveYyMenu = params => {
+  const url = `/yymenu/save`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+// 运营菜单删除
+export const deleteYyMenu = params => {
+  const url = `/yymenu/delete/${params.id}`
+  return axios({
+    url: url,
+    method: 'get'
+  })
+}

+ 32 - 0
src/api/merchantAccount.js

@@ -0,0 +1,32 @@
+import { axios } from '@/utils/request'
+
+// 获取配件经销商列表数据
+export const merchantAccountByPage = params => {
+  const url = `/merchantAccount/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 新增/编辑接口
+export const saveMerchantAccount = params => {
+  return axios({
+    url: '/merchantAccount/save',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 详情
+export const merchantAccountDetail = params => {
+  const url = `/merchantAccount/queryBySnType/${params.merchantSn}/${params.merchantType}`
+  return axios({
+    url: url,
+    data: {},
+    method: 'get'
+  })
+}

+ 7 - 7
src/api/power-role.js

@@ -2,7 +2,7 @@ import { axios } from '@/utils/request'
 
 // 获取列表数据
 export const getPowerRoleList = params => {
-  const url = `/role/queryLike/${params.pageNo}/${params.pageSize}`
+  const url = `/yyrole/queryLike/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
   return axios({
@@ -15,7 +15,7 @@ export const getPowerRoleList = params => {
 // 改变权限状态接口 flag 0:禁用 1:启用
 export const updateEnableStatus = params => {
   return axios({
-    url: `/role/enable/${params.id}/${params.flag}`,
+    url: `/yyrole/enable/${params.id}/${params.flag}`,
     data: {},
     method: 'get'
   })
@@ -24,7 +24,7 @@ export const updateEnableStatus = params => {
 // 删除用户接口
 export const delectRolePower = params => {
   return axios({
-    url: `/role/delete/${params.id}`,
+    url: `/yyrole/delete/${params.id}`,
     data: {},
     method: 'get'
   })
@@ -33,7 +33,7 @@ export const delectRolePower = params => {
 // 新增/编辑保存接口
 export const saveRolePower = params => {
   return axios({
-    url: '/role/save',
+    url: '/yyrole/save',
     data: params,
     method: 'POST'
   })
@@ -41,7 +41,7 @@ export const saveRolePower = params => {
 
 // 获取菜单树数据
 export const getMenuList = params => {
-  const url = `/role/findAllMenu/${params.id}`
+  const url = `/yyrole/findAllMenu/${params.id}`
   return axios({
     url: url,
     method: 'get'
@@ -50,10 +50,10 @@ export const getMenuList = params => {
 
 // 保存权限分配
 export const addMenuPower = params => {
-  const url = `/role/saveRoleMenu`
+  const url = `/yyrole/saveRoleMenu`
   return axios({
     url: url,
     data: params,
     method: 'post'
   })
-}
+}

+ 6 - 6
src/api/power-user.js

@@ -3,7 +3,7 @@ import { axios } from '@/utils/request'
 // 重置密码
 export const resetPSD = params => {
   return axios({
-    url: '/mduser/resetPwd',
+    url: '/yyuser/resetPwd',
     data: params,
     method: 'POST'
   })
@@ -11,7 +11,7 @@ export const resetPSD = params => {
 
 // 获取列表数据
 export const getPowerUserList = params => {
-  const url = `/mduser/queryLike/${params.pageNo}/${params.pageSize}`
+  const url = `/yyuser/queryLike/${params.pageNo}/${params.pageSize}`
   delete params.pageNo
   delete params.pageSize
   return axios({
@@ -34,7 +34,7 @@ export const getUserAllList = params => {
 // 改变权限状态接口
 export const updateEnableStatus = params => {
   return axios({
-    url: `/mduser/enable/${params.id}/${params.flag}`,
+    url: `/yyuser/enable/${params.id}/${params.flag}`,
     data: {},
     method: 'get'
   })
@@ -43,7 +43,7 @@ export const updateEnableStatus = params => {
 // 删除用户接口
 export const delectUserPower = params => {
   return axios({
-    url: `/mduser/delete/${params.id}`,
+    url: `/yyuser/delete/${params.id}`,
     data: {},
     method: 'get'
   })
@@ -52,7 +52,7 @@ export const delectUserPower = params => {
 // 新增/编辑保存接口
 export const saveUserPower = params => {
   return axios({
-    url: '/mduser/save',
+    url: '/yyuser/save',
     data: params,
     method: 'POST'
   })
@@ -61,7 +61,7 @@ export const saveUserPower = params => {
 // 获取角色列表接口
 export const getRoleList = params => {
   return axios({
-    url: '/mdrole/findAll',
+    url: '/yyrole/findAll',
     data: params,
     method: 'POST'
   })

+ 136 - 0
src/api/shelf.js

@@ -0,0 +1,136 @@
+import { axios } from '@/utils/request'
+
+// 获取货架列表数据
+export const getShelfList = params => {
+  const url = `/shelf/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 改变数字货架状态接口
+export const updateEnableStatus = params => {
+  return axios({
+    url: `/shelf/updateState`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 货架详情
+export const shelfDetail = params => {
+  return axios({
+    url: `/shelf/queryBySn/${params.shelfSn}`,
+    data: {},
+    method: 'post'
+  })
+}
+
+// 新增/编辑保存货架接口
+export const saveShelf = params => {
+  return axios({
+    url: '/shelf/save',
+    data: params,
+    method: 'POST'
+  })
+}
+
+// 下载货位模板
+export const shelfHWExport = (params) => {
+  return axios({
+    url: '/shelf/place/downloadExcel',
+    data: params,
+    method: 'post',
+    responseType: 'blob'
+  })
+}
+// 解析货位模板
+export const shelfHWreadExcel = params => {
+  const url = `/shelf/place/readExcel`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+// 货位列表
+export const shelfHWList = params => {
+  const url = `/shelf/place/queryList`
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+// 批量保存货位
+export const shelfAllSave = params => {
+  return axios({
+    url: '/shelf/place/saveBatch',
+    data: params,
+    method: 'POST'
+  })
+}
+// 货位详情
+export const shelfHWDetail = params => {
+  return axios({
+    url: `/shelf/place/queryBySn/${params.shelfPlaceSn}`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 保存结算方式
+export const shelfSettleRuleSave = params => {
+  return axios({
+    url: `/shelf/settleRule/save`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 结算方式详情
+export const settleRuleDetail = params => {
+  return axios({
+    url: `/shelf/settleRule/queryBySnType/${params.shelfSn}/${params.settleType}`,
+    method: 'get'
+  })
+}
+
+// 导入货位
+export const exportExcelData = params => {
+  return axios({
+    url: `/shelf/place/readExcel`,
+    data: params,
+    method: 'post'
+  })
+}
+
+// 保存货位
+export const saveBatchExcel = params => {
+  return axios({
+    url: `/shelf/place/saveBatchExcel`,
+    data: params,
+    method: 'post'
+  })
+}
+// 单个保存货位
+export const saveHw = params => {
+  return axios({
+    url: `/shelf/place/save`,
+    data: params,
+    method: 'post'
+  })
+}
+
+/* 货位删除 */
+export const delHw = params => {
+  return axios({
+    url: `/shelf/place/deleteBySn/${params.shelfPlaceSn}`,
+    data: params,
+    method: 'post'
+  })
+}

+ 20 - 0
src/api/store.js

@@ -0,0 +1,20 @@
+import { axios } from '@/utils/request'
+// 获取门店列表(带分页)
+export const storeListByPage = params => {
+  const url = `/store/queryPage/${params.pageNo}/${params.pageSize}`
+  delete params.pageNo
+  delete params.pageSize
+  return axios({
+    url: url,
+    data: params,
+    method: 'POST'
+  })
+}
+// 获取门店列表(无分页)
+export const storeList = params => {
+  return axios({
+    url: '/store/queryList',
+    data: params,
+    method: 'POST'
+  })
+}

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

@@ -98,7 +98,7 @@ export default {
       <Select vModel={props.value} {...{ props, on: on }}>
         {
           this.dataList.map(item => {
-            return (<a-select-option value={item.code} key={item.code}>{item['dispName']}</a-select-option>)
+            return (<a-select-option value={item.code} key={item.code} disabled={false}>{item['dispName']}</a-select-option>)
           })
         }
       </Select>

+ 15 - 23
src/components/UploadFile/index.vue

@@ -10,7 +10,6 @@
       :remove="handleRemove"
       :beforeUpload="beforeUpload"
       :data="params"
-      :headers="headers"
       :value="comVal"
     >
       <div v-if="fileList.length < maxNums && listType=='picture-card'">
@@ -45,7 +44,9 @@ export default {
     },
     previewFile: {
       type: Function,
-      default: function () {}
+      default: function () {
+
+      }
     },
     action: {
       type: String,
@@ -93,10 +94,7 @@ export default {
       previewImage: '',
       fileList: [],
       comVal: this.value,
-      params: this.uploadParams,
-      headers: {
-        'access-token': this.$store.getters.token
-      }
+      params: this.uploadParams
     }
   },
   methods: {
@@ -152,6 +150,11 @@ export default {
     },
     handleChange ({ file, fileList }) {
       // console.log(file, fileList, '-----change')
+      // if (file.status == 'error' || (file.response && (file.response.status == 500 || file.response.status == 900))) {
+      //   this.$message.error('上传失败,请重试!')
+      //   this.$emit('remove')
+      //   return
+      // }
       if (file.response && (file.response.status == 500 || file.response.status == 900)) {
         if (file.status == 'error' || file.status == 'done') {
           this.$message.error(file.response.message || '上传失败,请重试!')
@@ -165,7 +168,6 @@ export default {
     },
     // 格式化文件列表数据,给表单
     formatFile () {
-      const _this = this
       const a = this.fileList
       let temp = []
       let obj = null
@@ -180,11 +182,7 @@ export default {
         } else if (this.uploadType == 'attach') { // 附件    将接口的返回数据返回页面
           a.map(item => {
             if (item.response && item.status == 'done') {
-              if (_this.maxNums == 1) {
-                temp = [item.response.data]
-              } else {
-                temp = [...temp, ...item.response.data]
-              }
+              temp = [...temp, ...item.response.data]
             }
           })
           obj = JSON.stringify(temp)
@@ -219,28 +217,22 @@ export default {
         return true
       }
       const isType = this.fileType.indexOf(file.type) >= 0 && file.type != ''
-      // 文件格式限制为.xls、.xlsx时,上传.csv文件的type为application/vnd.ms-excel,与.xls一致,无法限制,因此更改为:
-      if (!isType || file.name.indexOf('.csv') >= 0) {
+      if (!isType) {
         if (tip != 0) {
           this.$message.error('请上传正确的格式!')
         }
-        return isType && !(file.name.indexOf('.csv') >= 0)
+        return isType
       }
-      // if (!isType) {
-      //   if (tip != 0) {
-      //     this.$message.error('请上传正确的格式!')
-      //   }
-      //   return isType
-      // }
 
       // 文件大小
       const isLt2M = file.size / 1024 / 1024 < this.fileSize
+      // const isMaxsize=file.size / 1024/1024 < this.fileSize
       if (!isLt2M) {
         if (tip != 0) {
           if (this.fileType != 'video/mp4') {
-            this.$message.error('图片不能超过 ' + this.fileSize + 'MB!')
+            this.$message.error('图片不能超过 ' + this.fileSize * 1024 + 'KB!')
           } else {
-            this.$message.error('视频不能超过 ' + this.fileSize + 'MB!')
+            this.$message.error('视频不能超过 ' + this.fileSize + ' MB!')
           }
         }
         return isLt2M

+ 164 - 6
src/config/router.config.js

@@ -48,6 +48,85 @@ export const asyncRouterMap = [
         },
         hidden: true
       },
+      // 货架管理
+      {
+        path: '/numsGoodsShelves',
+        redirect: '/numsGoodsShelves/goodsShelvesAdministration',
+        component: PageView,
+        meta: {
+          title: '数字货架',
+          icon: 'hdd'
+          // permission: 'M_salesManagement'
+        },
+        children: [
+          {
+            path: '/numsGoodsShelves/goodsShelvesAdministration',
+            redirect: '/numsGoodsShelves/goodsShelvesAdministration/list',
+            name: 'goodsShelvesAdministration',
+            component: BlankLayout,
+            meta: {
+              title: '货架管理',
+              icon: 'monitor'
+              // permission: 'M_salesQueryList'
+            },
+            hideChildrenInMenu: true,
+            children: [
+              {
+                path: 'list',
+                name: 'goodsShelvesAdministrationList',
+                component: () => import('@/views/numsGoodsShelves/goodsShelvesAdministration/list.vue'),
+                meta: {
+                  title: '货架管理列表',
+                  icon: 'monitor',
+                  hidden: true
+                  // permission: 'M_salesQueryList'
+                }
+              },
+              {
+                path: 'hwSet/:id',
+                name: 'goodsAllocationSet',
+                component: () => import('@/views/numsGoodsShelves/goodsShelvesAdministration/goodsAllocationSet.vue'),
+                meta: {
+                  title: '货位设置',
+                  hidden: true
+                  // permission: 'M_salesNew'
+                }
+              },
+              {
+                path: 'jsSet/:id',
+                name: 'settlementSet',
+                component: () => import('@/views/numsGoodsShelves/goodsShelvesAdministration/settlementSet.vue'),
+                meta: {
+                  title: '结算设置',
+                  hidden: true
+                  // permission: 'M_salesNew'
+                }
+              }
+            ]
+          },
+          {
+            path: '/numsGoodsShelves/bondManagement',
+            name: 'bondManagementList',
+            component: () => import('@/views/numsGoodsShelves/bondManagement/list.vue'),
+            meta: {
+              title: '保证金管理',
+              icon: 'user'
+              // permission: 'M_powerMD_user_list'
+            }
+          },
+          {
+            path: '/numsGoodsShelves/partsDealerManagement',
+            name: 'partsDealerManagementList',
+            component: () => import('@/views/numsGoodsShelves/partsDealerManagement/list.vue'),
+            meta: {
+              title: '配件经销商管理',
+              icon: 'user'
+              // permission: 'M_powerMD_user_list'
+            }
+          }
+        ]
+      },
+      // 系统设置
       // auth
       {
         path: '/auth',
@@ -55,8 +134,8 @@ export const asyncRouterMap = [
         component: PageView,
         meta: {
           title: '权限管理',
-          icon: 'lock',
-          permission: 'M_powerMD_0'
+          icon: 'lock'
+          // permission: 'M_powerMD_0'
         },
         children: [
           {
@@ -65,8 +144,8 @@ export const asyncRouterMap = [
             component: () => import(/* webpackChunkName: "auth" */ '@/views/power/user/userList.vue'),
             meta: {
               title: '用户管理',
-              icon: 'user',
-              permission: 'M_powerMD_user_list'
+              icon: 'user'
+              // permission: 'M_powerMD_user_list'
             }
           },
           {
@@ -75,10 +154,89 @@ export const asyncRouterMap = [
             component: () => import(/* webpackChunkName: "auth" */ '@/views/power/role/roleList.vue'),
             meta: {
               title: '角色管理',
-              icon: 'solution',
-              permission: 'M_powerMD_role_list'
+              icon: 'solution'
+              // permission: 'M_powerMD_role_list'
+            }
+          },
+          {
+            path: '/menusAuth/adminMenus',
+            name: 'adminMenus',
+            component: () => import(/* webpackChunkName: "auth" */ '@/views/bnSetting/menu/adminMenus.vue'),
+            meta: {
+              title: '菜单管理',
+              icon: 'appstore'
+              // permission: 'M_menuList'
+            }
+          }
+        ]
+      },
+      {
+        path: '/setting',
+        redirect: '/setting/userList',
+        component: PageView,
+        meta: {
+          title: '系统设置',
+          icon: 'setting'
+          // permission: 'M_systemSet'
+        },
+        children: [
+          {
+            path: '/setting/dataDictionary',
+            name: 'powerDD',
+            component: () => import(/* webpackChunkName: "setting" */
+              '@/views/power/dataDictionary/dataDictionary.vue'),
+            meta: {
+              title: '数据字典管理',
+              icon: 'database'
+              // permission: 'M_dataD_lookup'
+            }
+          },
+          // {
+          //   path: '/setting/register',
+          //   name: 'powerRegister',
+          //   component: () => import(/* webpackChunkName: "setting" */ '@/views/power/register/register.vue'),
+          //   meta: {
+          //     title: '参数管理',
+          //     icon: 'key',
+          //     permission: 'M_sys_register'
+          //   }
+          // },
+          {
+            path: '/setting/OperateJournal',
+            name: 'powerOperateJournal',
+            component: () => import(/* webpackChunkName: "setting" */
+              '@/views/power/OperateJournal/OperateJournal.vue'),
+            meta: {
+              title: '操作日志',
+              icon: 'read'
+              // permission: 'M_OperateJournalList'
             }
           }
+          // {
+          //   path: '/setting/noticeManagement',
+          //   redirect: '/setting/noticeManagement/list',
+          //   name: 'noticeManagement',
+          //   component: BlankLayout,
+          //   meta: {
+          //     title: '公告管理',
+          //     icon: 'sketch',
+          //     permission: 'M_noticeManagementList'
+          //   },
+          //   hideChildrenInMenu: true,
+          //   children: [
+          //     {
+          //       path: 'list',
+          //       name: 'noticeManagementList',
+          //       component: () => import(/* webpackChunkName: "setting" */ '@/views/setting/noticeManagement/list.vue'),
+          //       meta: {
+          //         title: '公告列表',
+          //         icon: 'sketch',
+          //         hidden: true,
+          //         permission: 'M_noticeManagementList'
+          //       }
+          //     }
+          //   ]
+          // }
         ]
       }
     ]

+ 48 - 0
src/libs/exportExcel.js

@@ -0,0 +1,48 @@
+import notification from 'ant-design-vue/es/notification'
+import moment from 'moment'
+
+// 导出excel
+/*
+  *url: 数据请求接口
+  *params: 请求参数
+  *fileName: 导出文件名称
+  *callback: 回调函数
+*/
+export const hdExportExcel = function (url, params, fileName, callback) {
+  url(params).then(res => {
+    if (res.type == 'application/json') {
+      var reader = new FileReader()
+      reader.addEventListener('loadend', function () {
+        const obj = JSON.parse(reader.result)
+        notification.error({
+          message: '提示',
+          description: obj.message
+        })
+      })
+      reader.readAsText(res)
+    } else {
+      downloadExcel(res, fileName)
+    }
+    callback()
+  })
+}
+// 导出下载excel
+export const downloadExcel = function (data, fileName) {
+  if (!data) { return }
+  const a = moment().format('YYYYMMDDHHmmss')
+  const fname = fileName + a
+  const blob = new Blob([data], { type: 'application/vnd.ms-excel' })
+  if (window.navigator && window.navigator.msSaveOrOpenBlob) {
+    navigator.msSaveBlob(blob, fname + '.xlsx')
+  } else {
+    const link = document.createElement('a')
+    link.style.display = 'none'
+    var href = URL.createObjectURL(blob)
+    link.href = href
+    link.setAttribute('download', fname + '.xlsx')
+    document.body.appendChild(link)
+    link.click()
+    document.body.removeChild(link)
+    window.URL.revokeObjectURL(href) // 释放掉blob对象
+  }
+}

+ 12 - 0
src/libs/tools.js

@@ -13,6 +13,18 @@ export const forEach = (arr, fn) => {
   }
 }
 
+// 处理数字千位分隔符(带小数)
+export const toThousands = (num, decimal) => {
+  if (decimal) {
+    num = formatDecimal(num, decimal)
+  }
+  return num.toString().replace(/\d+/, function (n) { // 先提取整数部分
+    return n.replace(/(\d)(?=(\d{3})+$)/g, function ($1) {
+      return $1 + ','
+    })
+  })
+}
+
 /**
  * @param {Array} arr1
  * @param {Array} arr2

+ 8 - 3
src/utils/request.js

@@ -38,10 +38,8 @@ const err = (error) => {
 // request interceptor
 service.interceptors.request.use(config => {
   const token = store.getters.token
-  const changeOrg = store.getters.changeOrg
   if (token) {
     config.headers['access-token'] = token // 让每个请求携带自定义 token 请根据实际情况自行修改
-    config.headers['access-org'] = changeOrg // 当前要切换的账号 sn
   }
   return config
 }, err)
@@ -64,13 +62,20 @@ service.interceptors.response.use((response) => {
       }
     })
   }
-  if ((response.data.status == '401' || response.data.status == '900' || response.data.status == '500') && window.location.pathname != '/user/login') {
+  if ((response.data.status == '401' || response.data.status == '500') && window.location.pathname != '/user/login') {
     notification.destroy()
     notification.error({
       message: '提示',
       description: response.data.message
     })
   }
+  if (response.data.status == '900' && window.location.pathname != '/user/login') {
+    notification.destroy()
+    notification.error({
+      message: response.data.message,
+      description: response.data.code
+    })
+  }
   return response.data
 }, err)
 

+ 460 - 0
src/views/bnSetting/menu/adminMenus.vue

@@ -0,0 +1,460 @@
+<template>
+  <a-card :bordered="false" :bodyStyle="{overflowY: 'auto'}">
+    <a-row :gutter="24">
+      <a-button style="margin-right: 10px;" type="primary" icon="plus" @click="addChild">添加子菜单</a-button>
+      <a-button style="margin-right: 10px;background-color: #19be6b;color: #fff;" type="" icon="plus" @click="addTitle">添加顶部菜单</a-button>
+      <a-button style="margin-right: 10px;background-color: red;color: #fff;" type="" icon="delete" @click="delect()">删除</a-button>
+    </a-row>
+    <a-row :gutter="24">
+      <!-- 左侧菜单树列表 -->
+      <a-col :span="8">
+        <a-row :gutter="24" class="textCount">
+          <a-icon type="info-circle" style="color: #1890FF;margin-right: 10px;" />
+          <span>当前选择:<span style="color: #40a9ff;font-weight: 600;">{{ selectedMenu }}</span><span v-if="selectedKeys.length" class="imgSize" @click="cancelSel">取消选择</span></span>
+        </a-row>
+        <a-row :gutter="24" >
+          <a-input-search placeholder="输入搜索菜单名搜索" style="width: 100%" @change="onChange" />
+          <a-tree
+            @expand="onExpand"
+            :treeData="getMenus"
+            :expandedKeys="expandedKeys"
+            :autoExpandParent="autoExpandParent"
+            @select="onSelect"
+            :selectedKeys="selectedKeys"
+          >
+            <template slot="title" slot-scope="{title}">
+              <span v-if="title.indexOf(searchValue) > -1">
+                {{ title.substr(0, title.indexOf(searchValue)) }}
+                <span style="color: #f50">{{ searchValue }}</span>
+                {{ title.substr(title.indexOf(searchValue) + searchValue.length) }}
+              </span>
+              <span v-else>{{ title }}</span>
+            </template>
+            <a-icon slot="file" type="file" />
+            <a-icon slot="pushpin" type="pushpin" />
+          </a-tree>
+        </a-row>
+      </a-col>
+      <!-- 右侧 -->
+      <a-col :span="16" >
+        <a-form :form="form" @submit="handleSubmit">
+          <!-- 类型 -->
+          <a-form-item label="类型" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <div v-if="!formData.type||formData.type=='0'">
+              <a-icon type="file" style="margin-right: 10px;" /><span >页面菜单</span>
+            </div>
+            <div v-if="formData.type=='1'">
+              <a-icon type="pushpin" style="margin-right: 10px;" /><span >操作按钮</span>
+            </div>
+          </a-form-item>
+          <!-- 名称 -->
+          <a-form-item label="名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入名称(最多30个字符)"
+              v-decorator="['formData.name', {
+                initialValue: formData.name,
+                getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入名称!' }] }]"
+            />
+          </a-form-item>
+          <!-- 路由英文名 -->
+          <!-- <a-form-item v-if="!formData.type||formData.type=='0'" label="路由英文名" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入路由英文名"
+              v-decorator="['formData.routeName', {
+                initialValue: formData.routeName,
+                rules: [{ required: true, message: '请输入路由英文名!' }] }]"
+            />
+          </a-form-item> -->
+          <!-- 路径 -->
+          <!-- <a-form-item v-if="!formData.type||formData.type=='0'" label="路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入路径"
+              v-decorator="['formData.routePath', {
+                initialValue: formData.routePath,
+                rules: [{ required: true, message: '请输入路径!' }] }]"
+            />
+          </a-form-item> -->
+          <!-- 请求路径 -->
+          <!-- <a-form-item v-if="formData.type==1" label="请求路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入请求路径"
+              v-decorator="['formData.urlPath', {
+                initialValue: formData.urlPath,
+                rules: [{ required: true, message: '请输入请求路径!' }] }]"
+            />
+          </a-form-item> -->
+          <!-- 前端权限编码 -->
+          <a-form-item label="前端权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入前端权限编码"
+              v-decorator="[
+                'formData.code',
+                {
+                  initialValue: formData.code,
+                  rules: [{ required: true, message: '请输入前端权限编码!' }] },
+              ]"
+            />
+          </a-form-item>
+          <!-- 后台权限编码 -->
+          <a-form-item label="后台权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-textarea
+              placeholder="请输入后台权限编码"
+              :auto-size="{ minRows: 2, maxRows: 6 }"
+              v-decorator="[
+                'formData.permission',
+                {
+                  initialValue: formData.permission,
+                  rules: [{ required: formData.isLeaf, message: '请输入后台权限编码!' }] },
+              ]"
+            />
+          </a-form-item>
+          <!-- 图标 -->
+          <!-- <a-form-item v-if="!formData.type ||formData.type=='0' " label="图标" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入图标名称"
+              v-decorator="['formData.icon', {
+                initialValue: formData.icon,
+                rules: [] }]"
+            />
+          </a-form-item> -->
+          <!-- 前端组件 -->
+          <!-- <a-form-item v-if="!formData.type ||formData.type=='0'" label="前端组件" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入前端组件路径"
+              v-decorator="['formData.componentPath', {
+                initialValue: formData.componentPath,
+                rules: [{ required: true, message: '请输入前端组件路径!' }] }]"
+            />
+          </a-form-item> -->
+
+          <!-- 第三方链接 -->
+          <!-- <a-form-item v-if="!formData.type ||formData.type=='0'" label="第三方链接" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入第三方链接地址"
+              v-decorator="['formData.urlPath', {
+                initialValue: formData.urlPath,
+                rules: [] }]"
+            />
+          </a-form-item> -->
+
+          <!-- 排序值 -->
+          <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input-number
+              style="width: 100%;"
+              type="number"
+              placeholder="请输入排序值(0~999999)"
+              v-decorator="['formData.sort', {
+                initialValue: formData.sort,
+                rules: [] }]"
+              :max="999999"
+              :min="0"
+            />
+          </a-form-item>
+          <!-- 状态 -->
+          <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-radio-group
+              name="radioGroup"
+              v-decorator="[
+                'formData.status',
+                {
+                  initialValue: formData.status,
+                  rules: [{ required: true, message: '请选择状态!' }] },
+              ]"
+            >
+              <a-radio :value="1">是</a-radio>
+              <a-radio :value="0">否</a-radio>
+            </a-radio-group>
+          </a-form-item>
+
+          <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+            <a-button type="primary" @click="handleSubmit()">
+              保存
+            </a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="clear">
+              重置
+            </a-button>
+          </a-form-item>
+        </a-form>
+
+      </a-col>
+    </a-row>
+    <childModal parentType="admin" :visible="showChildModal" @refresh="getYyMenuList" :data="parentData" @close="showChildModal = false"></childModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import childModal from './childModal.vue'
+import { getYyMenuList, saveYyMenu, deleteYyMenu } from '@/api/menu.js'
+
+export default {
+  name: 'Menu',
+  components: {
+    STable, VSelect, childModal
+  },
+  props: {},
+  data () {
+    return {
+      treeData: [],
+      dataList: [],
+      searchValue: '',
+      expandedKeys: [],
+      autoExpandParent: true,
+      selectedKeys: [],
+      selectedMenu: '', // 选择的树节点名
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'menu' }),
+      showChildModal: false,
+      parentData: {}, // 父级菜单
+      formData: {
+        id: '',
+        name: '',
+        routePath: '',
+        icon: '',
+        routeName: '',
+        componentPath: '',
+        urlPath: '',
+        code: '',
+        permission: '',
+        sort: '',
+        type: '0',
+        isLeaf: true,
+        status: '' // 活动状态
+      }
+    }
+  },
+  computed: {
+    getMenus () {
+      this.generateList(this.treeData)
+      return this.treeData
+    }
+  },
+  methods: {
+    onExpand (expandedKeys) {
+      // console.log('onExpand', expandedKeys)
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+    onSelect (selectedKeys, info) {
+      console.log('onSelect', info)
+      this.selectedKeys = selectedKeys
+      if (info.selected) {
+        const data = info.selectedNodes[0].data.props
+        const isLeaf = data.dataRef.children
+        // this.formData = Object.assign({}, this.formData, info.selectedNodes[0].data.props)
+        this.formData = {
+          id: data.id,
+          name: data.name,
+          routePath: data.routePath,
+          icon: data.icon,
+          routeName: data.routeName,
+          componentPath: data.componentPath,
+          urlPath: data.urlPath,
+          code: data.code,
+          permission: data.permission,
+          sort: data.sort,
+          type: data.type,
+          status: data.status,
+          isLeaf: !(isLeaf && isLeaf.length)
+        }
+
+        this.selectedMenu = this.formData.name
+        this.formData.status = Number(this.formData.status)
+      } else {
+        this.selectedMenu = ''
+        this.clear()
+      }
+    },
+    generateList (data) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        const key = node.title
+        this.dataList.push({ key, title: key })
+        node.scopedSlots = { title: 'title' }
+        node.slots = { icon: node.type == '0' ? 'file' : 'pushpin' }
+
+        if (node.children) {
+          this.generateList(node.children)
+        }
+      }
+    },
+    getParentKey (key, tree) {
+      let parentKey
+      for (let i = 0; i < tree.length; i++) {
+        const node = tree[i]
+        if (node.children) {
+          if (node.children.some(item => item.title == key)) {
+            parentKey = node.key
+          } else if (this.getParentKey(key, node.children)) {
+            parentKey = this.getParentKey(key, node.children)
+          }
+        }
+      }
+      return parentKey
+    },
+    onChange (e) {
+      const value = e.target.value
+      const expandedKeys = this.dataList
+        .map(item => {
+          if (item.title.indexOf(value) > -1) {
+            return this.getParentKey(item.title, this.treeData)
+          }
+          return null
+        })
+        .filter((item, i, self) => item && self.indexOf(item) === i)
+      Object.assign(this, {
+        expandedKeys,
+        searchValue: value,
+        autoExpandParent: true
+      })
+    },
+    // 获取菜单树列表
+    getYyMenuList () {
+      getYyMenuList().then(res => {
+        console.log(res, 'res1111111')
+        if (res.status == 200) {
+          this.treeData = res.data
+          console.log(this.treeData, 'this.treeData')
+        }
+      })
+    },
+    // 添加子节点
+    addChild () {
+      if (!this.selectedMenu) {
+        return this.$message.warning('请先选择一个父级菜单')
+      } else if (this.formData.type == '1') {
+        return this.$message.warning('请选择一个页面级菜单')
+      }
+      this.showChildModal = true
+      this.parentData = this.formData
+    },
+    // 添加顶部菜单
+    addTitle () {
+      this.showChildModal = true
+      this.parentData = {}
+    },
+
+    //  取消选择
+    cancelSel () {
+      this.selectedKeys = []
+      this.selectedMenu = ''
+      this.clear()
+    },
+    // 清空列表
+    clear () {
+      this.form.resetFields()
+      this.formData.id = ''
+      this.formData.name = ''
+      this.formData.routePath = ''
+      this.formData.icon = ''
+      this.formData.routeName = ''
+      this.formData.componentPath = ''
+      this.formData.urlPath = ''
+      this.formData.sort = ''
+      this.formData.type = ''
+      this.formData.status = ''
+      this.formData.code = ''
+      this.formData.permission = ''
+      this.formData.isLeaf = true
+    },
+
+    // 删除数据
+    delect () {
+      if (!this.selectedKeys.length) {
+        return this.$message.warning('您还未选择要删除的数据')
+      }
+      const _this = this
+      console.log(_this.formData.id, '_this.formData.id')
+      this.$confirm({
+        title: '警告',
+        content: `确定要删除您选择的 ${_this.formData.name} 的数据吗?`,
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          deleteYyMenu({
+            id: _this.formData.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.getYyMenuList()
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          if (values.formData.permission) {
+            values.formData.permission = values.formData.permission.replace(/\//g, '_')
+          }
+          saveYyMenu(Object.assign({ id: this.formData.id }, values.formData)).then(res => {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              _this.getYyMenuList()
+              _this.clear()
+            } else {
+              // this.$message.warning(res.message)
+            }
+          })
+        }
+      })
+    },
+    handleCancel () {
+      this.clear()
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'menu' })
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.getYyMenuList()
+    })
+  },
+  watch: {
+
+  }
+}
+</script>
+
+<style>
+  .menu-box::-webkit-scrollbar{
+    width: 6px;
+    height: 6px ;
+  }
+
+  .menu-box::-webkit-scrollbar-thumb{
+    width: 6px;
+    height: 6px ;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 0 2px #d1d1d1;
+    background: #e4e4e4;
+  }
+
+  .textCount{
+    border: 1px solid #91d5ff;
+    background-color: #e6f7ff;
+    border-radius: 5px;
+    padding: 5px 10px 5px 20px;
+    margin: 10px 0;
+    color: rgba(0, 0, 0);
+  }
+  .imgSize{
+    color: #2d8cf0;
+    margin-left: 10px;
+    font-size: 14px;
+  }
+
+</style>

+ 348 - 0
src/views/bnSetting/menu/childModal.vue

@@ -0,0 +1,348 @@
+<template>
+  <div>
+    <a-modal class="modalBox" :title="titleText" v-model="isshow" @cancle="cancel">
+      <a-form :form="form" @submit="handleSubmit">
+        <!-- 上级菜单 -->
+        <a-form-item label="上级菜单" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <div >
+            <span >{{ parentTitle }}</span>
+          </div>
+
+        </a-form-item>
+        <!-- 类型 -->
+        <a-form-item label="类型" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-select
+            @change="selectChange"
+            :disabled="disabled"
+            v-decorator="[
+              'formData.type',
+              {
+                initialValue: formData.type,
+                rules: [{ required: true, message: '请选择状态!' }] },
+            ]"
+            style="width: 100%"
+            placeholder="请选择菜单类型"
+          >
+            <a-select-option :value="0">页面类型</a-select-option>
+            <a-select-option :value="1">按钮类型</a-select-option>
+          </a-select>
+        </a-form-item>
+
+        <!-- 名称 -->
+        <a-form-item label="名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入名称(最多30个字符)"
+            :maxLength="30"
+            v-decorator="['formData.name', {
+              initialValue: formData.name,
+              getValueFromEvent: $filterEmpty,
+              rules: [{ required: true, message: '请输入名称!' }] }]"
+          />
+        </a-form-item>
+        <!-- 路由英文名 -->
+        <!-- <a-form-item v-if="!formData.type" label="路由英文名" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入路由英文名"
+            v-decorator="['formData.routeName', {
+              initialValue: formData.routeName,
+              rules: [{ required: true, message: '请输入路由英文名!' }] }]"
+          />
+        </a-form-item> -->
+        <!-- 路径 -->
+        <!-- <a-form-item v-if="!formData.type" label="路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+             <a-input placeholder="请输入路径"
+                      v-decorator="['formData.routePath', {
+                        initialValue: formData.routePath,
+                        rules: [{ required: true, message: '请输入路径!' }] }]"
+             />
+           </a-form-item> -->
+        <!-- 请求路径 -->
+        <!-- <a-form-item v-if="formData.type==1" label="请求路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+             <a-input placeholder="请输入请求路径"
+                      v-decorator="['formData.urlPath', {
+                        initialValue: formData.urlPath,
+                        rules: [{ required: true, message: '请输入请求路径!' }] }]"
+             />
+           </a-form-item> -->
+        <!-- 前端权限编码 -->
+        <a-form-item label="前端权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入前端权限编码"
+            v-decorator="[
+              'formData.code',
+              {
+                initialValue: formData.code,
+                rules: [{ required: true, message: '请输入前端权限编码!' }] },
+            ]"
+          />
+
+        </a-form-item>
+        <!-- 后台权限编码 -->
+        <a-form-item label="后台权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-textarea
+            placeholder="请输入后台权限编码"
+            :auto-size="{ minRows: 2, maxRows: 6 }"
+            v-decorator="[
+              'formData.permission',
+              {initialValue: formData.permission},
+            ]"
+          />
+
+        </a-form-item>
+
+        <!-- 图标 -->
+        <!-- <a-form-item v-if="!formData.type" label="图标" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入图标名称"
+            v-decorator="['formData.icon', {
+              initialValue: formData.icon,
+              rules: [] }]"
+          />
+        </a-form-item> -->
+        <!-- 前端组件 -->
+        <!-- <a-form-item v-if="!formData.type" label="前端组件" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入前端组件路径"
+            v-decorator="['formData.componentPath', {
+              initialValue: formData.componentPath,
+              rules: [{ required: true, message: '请输入前端组件路径!' }] }]"
+          />
+        </a-form-item> -->
+
+        <!-- 第三方链接 -->
+        <!-- <a-form-item v-if="!formData.type" label="第三方链接" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input
+            placeholder="请输入第三方链接地址"
+            v-decorator="['formData.urlPath', {
+              initialValue: formData.urlPath,
+              rules: [] }]"
+          />
+        </a-form-item> -->
+
+        <!-- 排序值 -->
+        <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-input-number
+            style="width: 100%;"
+            type="number"
+            placeholder="请输入排序值(0~999999)"
+            v-decorator="['formData.sort', {
+              initialValue: formData.sort,
+              rules: [] }]"
+            :max="999999"
+            :min="0"
+          />
+        </a-form-item>
+        <!-- 连锁可用 -->
+        <a-form-item v-if="parentType=='store'" label="连锁可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-radio-group
+            name="radioGroup"
+            v-decorator="[
+              'formData.chainOrgUse',
+              {
+                initialValue: formData.chainOrgUse,
+                rules: [{ required: true, message: '请选择!' }] },
+            ]"
+          >
+            <a-radio :value="1">是</a-radio>
+            <a-radio :value="0">否</a-radio>
+          </a-radio-group>
+        </a-form-item>
+        <!-- 单店可用 -->
+        <a-form-item v-if="parentType=='store'" label="单店可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-radio-group
+            name="radioGroup"
+            v-decorator="[
+              'formData.singleOrgUse',
+              {
+                initialValue: formData.singleOrgUse,
+                rules: [{ required: true, message: '请选择!' }] },
+            ]"
+          >
+            <a-radio :value="1">是</a-radio>
+            <a-radio :value="0">否</a-radio>
+          </a-radio-group>
+        </a-form-item>
+        <!-- 状态 -->
+        <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+          <a-radio-group
+            name="radioGroup"
+            v-decorator="[
+              'formData.status',
+              {
+                initialValue: formData.status,
+                rules: [{ required: true, message: '请选择状态!' }] },
+            ]"
+          >
+            <a-radio :value="1">是</a-radio>
+            <a-radio :value="0">否</a-radio>
+          </a-radio-group>
+        </a-form-item>
+
+        <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+          <a-button type="primary" @click="handleSubmit()">
+            保存
+          </a-button>
+          <a-button :style="{ marginLeft: '8px' }" @click="handleCancel()">
+            取消
+          </a-button>
+        </a-form-item>
+      </a-form>
+
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { saveYyMenu, saveMdMenu } from '@/api/menu.js'
+export default {
+  name: 'ChildModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    parentType: {
+      type: String,
+      default: ''
+    },
+    data: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      isshow: this.visible,
+      titleText: '',
+      disabled: false,
+      parentTitle: '',
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'childModal' }),
+      formData: {
+        parentId: '',
+        name: '',
+        routePath: '',
+        icon: '',
+        routeName: '',
+        code: '',
+        permission: '',
+        componentPath: '',
+        urlPath: '',
+        sort: '',
+        type: undefined,
+        chainOrgUse: 1,
+        singleOrgUse: 1,
+        status: 1 // 活动状态
+      }
+    }
+  },
+  methods: {
+    cancel (e) {
+      this.clear()
+      this.$emit('close')
+    },
+
+    selectChange (val) {
+      this.formData.type = val
+      console.log(val)
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          values.formData.permission = values.formData.permission.replace(/\//g, '_')
+          const saveRequest = this.parentType == 'store' ? saveMdMenu : saveYyMenu
+          saveRequest(Object.assign(this.formData, values.formData)).then(res => {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              this.$emit('refresh')
+              setTimeout(function () {
+                _this.cancel()
+              }, 300)
+            } else {
+              // this.$message.warning(res.message)
+            }
+          })
+        }
+      })
+    },
+    // 取消
+    handleCancel () {
+      const _this = this
+      this.$confirm({
+        title: '提示',
+        content: '确定取消吗?',
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          _this.clear()
+          _this.cancel()
+        }
+      })
+    },
+    clear () {
+      this.form.resetFields()
+      this.parentTitle = ''
+      this.formData.parentId = ''
+      this.formData.name = ''
+      this.formData.routePath = ''
+      this.formData.icon = ''
+      this.formData.routeName = ''
+      this.formData.componentPath = ''
+      this.formData.urlPath = ''
+      this.formData.sort = ''
+      this.formData.type = ''
+      this.formData.status = 1
+      this.formData.chainOrgUse = 1
+      this.formData.singleOrgUse = 1
+      this.formData.code = ''
+      this.formData.permission = ''
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'childModal' })
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (newValue) {
+        if (this.data.id) { // 添加子菜单
+          this.titleText = '添加子菜单'
+          // this.disabled = false
+          console.log(this.data, 'this.data')
+          this.formData.parentId = this.data.id
+          this.parentTitle = this.data.name
+        } else { // 添加顶菜单
+          this.titleText = '添加顶菜单'
+          this.formData.type = 0
+          // this.disabled = false
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 497 - 0
src/views/bnSetting/menu/storeMenus.vue

@@ -0,0 +1,497 @@
+<template>
+  <a-card :bordered="false">
+    <a-row :gutter="24">
+      <a-button style="margin-right: 10px;" type="primary" icon="plus" @click="addChild">添加子菜单</a-button>
+      <a-button style="margin-right: 10px;background-color: #19be6b;color: #fff;" type="" icon="plus" @click="addTitle">添加顶部菜单</a-button>
+      <a-button style="margin-right: 10px;background-color: red;color: #fff;" type="" icon="delete" @click="delect()">删除</a-button>
+
+    </a-row>
+    <a-row :gutter="24">
+      <!-- 左侧菜单树列表 -->
+      <a-col :span="8">
+        <a-row :gutter="24" class="textCount">
+          <a-icon type="info-circle" style="color: #1890FF;margin-right: 10px;" />
+          <span>当前选择:<span style="color: #40a9ff;font-weight: 600;">{{ selectedMenu }}</span><span v-if="selectedKeys.length" class="imgSize" @click="cancelSel">取消选择</span></span>
+        </a-row>
+
+        <a-row :gutter="24" >
+          <a-input-search placeholder="输入搜索菜单名搜索" style="width: 100%" @change="onChange" />
+          <a-tree
+            @expand="onExpand"
+            :treeData="getMenus"
+            :expandedKeys="expandedKeys"
+            :autoExpandParent="autoExpandParent"
+            @select="onSelect"
+            :selectedKeys="selectedKeys"
+          >
+            <template slot="title" slot-scope="{title}">
+              <span v-if="title.indexOf(searchValue) > -1">
+                {{ title.substr(0, title.indexOf(searchValue)) }}
+                <span style="color: #f50">{{ searchValue }}</span>
+                {{ title.substr(title.indexOf(searchValue) + searchValue.length) }}
+              </span>
+              <span v-else>{{ title }}</span>
+            </template>
+            <a-icon slot="file" type="file" />
+            <a-icon slot="pushpin" type="pushpin" />
+          </a-tree>
+        </a-row>
+      </a-col>
+      <!-- 右侧 -->
+      <a-col :span="16" >
+        <a-form :form="form" @submit="handleSubmit">
+          <!-- 类型 -->
+          <a-form-item label="类型" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <div v-if="!formData.type||formData.type=='0'">
+              <a-icon type="file" style="margin-right: 10px;" /><span >页面菜单</span>
+            </div>
+            <div v-if="formData.type=='1'">
+              <a-icon type="pushpin" style="margin-right: 10px;" /><span >操作按钮</span>
+            </div>
+          </a-form-item>
+
+          <!-- 名称 -->
+          <a-form-item label="名称" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入名称(最多30个字符)"
+              :maxLength="30"
+              v-decorator="['formData.name', {
+                initialValue: formData.name,
+                getValueFromEvent: $filterEmpty,
+                rules: [{ required: true, message: '请输入名称!' }] }]"
+            />
+          </a-form-item>
+          <!-- 路由英文名 -->
+          <!-- <a-form-item v-if="!formData.type||formData.type=='0'" label="路由英文名" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入路由英文名"
+              v-decorator="['formData.routeName', {
+                initialValue: formData.routeName,
+                rules: [{ required: true, message: '请输入路由英文名!' }] }]"
+            />
+          </a-form-item> -->
+          <!-- 路径 -->
+          <!-- <a-form-item v-if="!formData.type||formData.type=='0'" label="路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入路径"
+              v-decorator="['formData.routePath', {
+                initialValue: formData.routePath,
+                rules: [{ required: true, message: '请输入路径!' }] }]"
+            />
+          </a-form-item> -->
+          <!-- 请求路径 -->
+          <!-- <a-form-item v-if="formData.type==1" label="请求路径" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入请求路径"
+              v-decorator="['formData.urlPath', {
+                initialValue: formData.urlPath,
+                rules: [{ required: true, message: '请输入请求路径!' }] }]"
+            />
+          </a-form-item> -->
+          <!-- 前端权限编码 -->
+          <a-form-item label="前端权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入前端权限编码"
+              v-decorator="[
+                'formData.code',
+                {
+                  initialValue: formData.code,
+                  rules: [{ required: true, message: '请输入前端权限编码!' }] },
+              ]"
+            />
+          </a-form-item>
+          <!-- 后台权限编码 -->
+          <a-form-item label="后台权限编码" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入后台权限编码"
+              v-decorator="[
+                'formData.permission',
+                {
+                  initialValue: formData.permission,
+                  rules: [{ required: formData.isLeaf, message: '请输入后台权限编码!' }] },
+              ]"
+            />
+          </a-form-item>
+          <!-- 图标 -->
+          <!-- <a-form-item v-if="!formData.type ||formData.type=='0' " label="图标" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入图标名称"
+              v-decorator="['formData.icon', {
+                initialValue: formData.icon,
+                rules: [] }]"
+            />
+          </a-form-item> -->
+          <!-- 前端组件 -->
+          <!-- <a-form-item v-if="!formData.type ||formData.type=='0'" label="前端组件" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入前端组件路径"
+              v-decorator="['formData.componentPath', {
+                initialValue: formData.componentPath,
+                rules: [{ required: true, message: '请输入前端组件路径!' }] }]"
+            />
+          </a-form-item> -->
+
+          <!-- 第三方链接 -->
+          <!-- <a-form-item v-if="!formData.type ||formData.type=='0'" label="第三方链接" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input
+              placeholder="请输入第三方链接地址"
+              v-decorator="['formData.urlPath', {
+                initialValue: formData.urlPath,
+                rules: [] }]"
+            />
+          </a-form-item> -->
+
+          <!-- 排序值 -->
+          <a-form-item label="排序值" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-input-number
+              style="width: 100%;"
+              placeholder="请输入排序值(0~999999)"
+              v-decorator="['formData.sort', {
+                initialValue: formData.sort,
+                rules: [] }]"
+              :max="999999"
+              :min="0"
+            />
+          </a-form-item>
+          <!-- 连锁可用 -->
+          <a-form-item label="连锁可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-radio-group
+              name="radioGroup"
+              v-decorator="[
+                'formData.chainOrgUse',
+                {
+                  initialValue: formData.chainOrgUse,
+                  rules: [{ required: true, message: '请选择!' }] },
+              ]"
+            >
+              <a-radio :value="1">是</a-radio>
+              <a-radio :value="0">否</a-radio>
+            </a-radio-group>
+          </a-form-item>
+          <!-- 单店可用 -->
+          <a-form-item label="单店可用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-radio-group
+              name="radioGroup"
+              v-decorator="[
+                'formData.singleOrgUse',
+                {
+                  initialValue: formData.singleOrgUse,
+                  rules: [{ required: true, message: '请选择!' }] },
+              ]"
+            >
+              <a-radio :value="1">是</a-radio>
+              <a-radio :value="0">否</a-radio>
+            </a-radio-group>
+          </a-form-item>
+          <!-- 状态 -->
+          <a-form-item label="启用" :label-col="{ span: 5 }" :wrapper-col="{ span: 14 }">
+            <a-radio-group
+              name="radioGroup"
+              v-decorator="[
+                'formData.status',
+                {
+                  initialValue: formData.status,
+                  rules: [{ required: true, message: '请选择状态!' }] },
+              ]"
+            >
+              <a-radio :value="1">是</a-radio>
+              <a-radio :value="0">否</a-radio>
+            </a-radio-group>
+          </a-form-item>
+
+          <a-form-item :wrapper-col="{ span: 12, offset: 5 }">
+            <a-button type="primary" @click="handleSubmit()">
+              保存
+            </a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="clear">
+              重置
+            </a-button>
+          </a-form-item>
+        </a-form>
+
+      </a-col>
+    </a-row>
+    <childModal parentType="store" :visible="showChildModal" @refresh="getMdMenuList" :data="parentData" @close="showChildModal = false"></childModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import childModal from './childModal.vue'
+import { getMdMenuList, saveMdMenu, deleteMdMenu } from '@/api/menu.js'
+
+export default {
+  name: 'Menu',
+  components: {
+    STable, VSelect, childModal
+  },
+  props: {},
+  data () {
+    return {
+      treeData: [],
+      dataList: [],
+      searchValue: '',
+      expandedKeys: [],
+      autoExpandParent: true,
+      selectedKeys: [],
+      selectedMenu: '', // 选择的树节点名
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'menu' }),
+      showChildModal: false,
+      parentData: {}, // 父级菜单
+      formData: {
+        id: '',
+        name: '',
+        routePath: '',
+        icon: '',
+        routeName: '',
+        componentPath: '',
+        urlPath: '',
+        code: '',
+        permission: '',
+        sort: '',
+        type: '0',
+        isLeaf: true,
+        chainOrgUse: '',
+        singleOrgUse: '',
+        status: '' // 活动状态
+      }
+    }
+  },
+  computed: {
+    getMenus () {
+      this.generateList(this.treeData)
+      return this.treeData
+    }
+  },
+  methods: {
+    onExpand (expandedKeys) {
+      // console.log('onExpand', expandedKeys)
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+
+    onSelect (selectedKeys, info) {
+      console.log('onSelect', info)
+      this.selectedKeys = selectedKeys
+      if (info.selected) {
+        const data = info.selectedNodes[0].data.props
+        const isLeaf = data.dataRef.children
+        // this.formData = Object.assign({}, this.formData, info.selectedNodes[0].data.props)
+        this.formData = {
+          id: data.id,
+          name: data.name,
+          routePath: data.routePath,
+          icon: data.icon,
+          routeName: data.routeName,
+          componentPath: data.componentPath,
+          urlPath: data.urlPath,
+          code: data.code,
+          permission: data.permission,
+          sort: data.sort,
+          type: data.type,
+          chainOrgUse: data.chainOrgUse,
+          singleOrgUse: data.singleOrgUse,
+          status: data.status,
+          isLeaf: !(isLeaf && isLeaf.length)
+        }
+
+        this.selectedMenu = this.formData.name
+        this.formData.status = Number(this.formData.status)
+        this.formData.chainOrgUse = Number(this.formData.chainOrgUse)
+        this.formData.singleOrgUse = Number(this.formData.singleOrgUse)
+      } else {
+        this.selectedMenu = ''
+        this.clear()
+      }
+    },
+    generateList (data) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        const key = node.title
+        this.dataList.push({ key, title: key })
+        node.scopedSlots = { title: 'title' }
+        node.slots = { icon: node.type == '0' ? 'file' : 'pushpin' }
+
+        if (node.children) {
+          this.generateList(node.children)
+        }
+      }
+    },
+    getParentKey (key, tree) {
+      let parentKey
+      for (let i = 0; i < tree.length; i++) {
+        const node = tree[i]
+        if (node.children) {
+          if (node.children.some(item => item.title == key)) {
+            parentKey = node.key
+          } else if (this.getParentKey(key, node.children)) {
+            parentKey = this.getParentKey(key, node.children)
+          }
+        }
+      }
+      return parentKey
+    },
+    onChange (e) {
+      const value = e.target.value
+      const expandedKeys = this.dataList
+        .map(item => {
+          if (item.title.indexOf(value) > -1) {
+            return this.getParentKey(item.title, this.treeData)
+          }
+          return null
+        })
+        .filter((item, i, self) => item && self.indexOf(item) === i)
+      Object.assign(this, {
+        expandedKeys,
+        searchValue: value,
+        autoExpandParent: true
+      })
+    },
+    // 获取菜单树列表
+    getMdMenuList () {
+      getMdMenuList().then(res => {
+        console.log(res, 'res1111111')
+        if (res.status == 200) {
+          this.treeData = res.data
+          console.log(this.treeData, 'this.treeData')
+        }
+      })
+    },
+    // 添加子节点
+    addChild () {
+      if (!this.selectedMenu) {
+        return this.$message.warning('请先选择一个父级菜单')
+      } else if (this.formData.type == '1') {
+        return this.$message.warning('请选择一个页面级菜单')
+      }
+      this.showChildModal = true
+      this.parentData = this.formData
+    },
+    // 添加顶部菜单
+    addTitle () {
+      this.showChildModal = true
+      this.parentData = {}
+    },
+    //  取消选择
+    cancelSel () {
+      this.selectedKeys = []
+      this.selectedMenu = ''
+      this.clear()
+    },
+    // 清空列表
+    clear () {
+      this.form.resetFields()
+      this.formData.id = ''
+      this.formData.name = ''
+      this.formData.routePath = ''
+      this.formData.icon = ''
+      this.formData.routeName = ''
+      this.formData.componentPath = ''
+      this.formData.urlPath = ''
+      this.formData.sort = ''
+      this.formData.type = ''
+	    this.formData.chainOrgUse = ''
+	    this.formData.singleOrgUse = ''
+      this.formData.status = ''
+      this.formData.code = ''
+      this.formData.permission = ''
+      this.formData.isLeaf = true
+    },
+
+    // 删除数据
+    delect () {
+      if (!this.selectedKeys.length) {
+        return this.$message.warning('您还未选择要删除的数据')
+      }
+      const _this = this
+      console.log(_this.formData.id, '_this.formData.id')
+      this.$confirm({
+        title: '警告',
+        content: `确定要删除您选择的 ${_this.formData.name} 的数据吗?`,
+        okText: '确定',
+        cancelText: '取消',
+        onOk () {
+          deleteMdMenu({
+            id: _this.formData.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.getMdMenuList()
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          saveMdMenu(Object.assign({ id: this.formData.id }, values.formData)).then(res => {
+            console.log(res, 'res--save')
+            if (res.status + '' === '200') {
+              this.$message.success(res.message ? res.message : '保存成功')
+              _this.getMdMenuList()
+              _this.clear()
+            } else {
+              // this.$message.warning(res.message)
+            }
+          })
+        }
+      })
+    },
+    handleCancel () {
+      this.clear()
+    }
+
+  },
+  mounted () {
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'menu' })
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.getMdMenuList()
+    })
+  },
+  watch: {
+
+  }
+}
+</script>
+
+<style>
+  .menu-box::-webkit-scrollbar{
+    width: 6px;
+    height: 6px ;
+  }
+
+  .menu-box::-webkit-scrollbar-thumb{
+    width: 6px;
+    height: 6px ;
+    border-radius: 4px;
+    -webkit-box-shadow: inset 0 0 2px #d1d1d1;
+    background: #e4e4e4;
+  }
+
+  .textCount{
+    border: 1px solid #91d5ff;
+    background-color: #e6f7ff;
+    border-radius: 5px;
+    padding: 5px 10px 5px 20px;
+    margin: 10px 0;
+    color: rgba(0, 0, 0);
+  }
+  .imgSize{
+    color: #2d8cf0;
+    margin-left: 10px;
+    font-size: 14px;
+  }
+
+</style>

+ 162 - 0
src/views/bnSetting/menusAuth.vue

@@ -0,0 +1,162 @@
+<template>
+  <div>
+    <a-form class="form-box" style="height: 500px;overflow: auto;margin-bottom: 15px;" :form="form" @submit="handleSubmit">
+      <a-tree
+        checkable
+        @check="onCheck"
+        @expand="onExpand"
+        :autoExpandParent="autoExpandParent"
+        v-model="checkedKeys"
+        :treeData="treeData"
+      />
+    </a-form>
+    <a-form-item :wrapper-col="{ offset: 3 }">
+      <a-button type="primary" @click="handleSubmit()">
+        保存
+      </a-button>
+    </a-form-item>
+  </div>
+</template>
+
+<script>
+import { findLsMenu, saveLsMouldMenu, findDdMenu, saveDdMouldMenu } from '@/api/menuSet'
+export default {
+  name: 'MenusAuth',
+  props: {
+    types: {
+      type: String,
+      default: 'dd'
+    }
+  },
+  data () {
+    return {
+      menuIds: '',
+      treeData: [],
+      expandedKeys: [],
+      autoExpandParent: false,
+      checkedKeys: [],
+      checkedData: [],
+      formLayout: 'horizontal',
+      form: this.$form.createForm(this, { name: 'menuModal' })
+    }
+  },
+  methods: {
+    tabChange (v) {
+      console.log(v)
+    },
+    // 初始化树
+    treeInit (dr) {
+      this.treeData = dr.menuList
+      this.menuIds = dr.mould.menuIds
+      if (this.menuIds) {
+        const arr = this.menuIds.split(',')
+        const temp = []
+        arr.map(item => {
+          temp.push(Number(item))
+        })
+        this.checkedData = temp
+        this.expandedKeys = temp
+        // 找出叶子节点
+        this.findLeaf(this.treeData, temp)
+      }
+    },
+    // 获取连锁树数据
+    getfindLsMenu () {
+      findLsMenu().then(res => {
+        console.log(res, '+++++++++连锁+++++++++')
+        if (res.status == 200) {
+          this.treeInit(res.data)
+        }
+      })
+    },
+    // 获取单店树数据
+    getfindDdMenu () {
+      findDdMenu().then(res => {
+        console.log(res, '+++++++++单店+++++++++')
+        if (res.status == 200) {
+          this.treeInit(res.data)
+        }
+      })
+    },
+    onExpand (expandedKeys) {
+      console.log('onExpand', expandedKeys)
+      this.expandedKeys = expandedKeys
+      this.autoExpandParent = false
+    },
+    onCheck (checkedKeys, info) {
+      this.checkedData = [...checkedKeys, ...info.halfCheckedKeys]
+      this.checkedKeys = checkedKeys
+    },
+    // 勾选已选的菜单
+    findLeaf (data, arr) {
+      for (let i = 0; i < data.length; i++) {
+        const node = data[i]
+        if (node.children) {
+          this.findLeaf(node.children, arr)
+        } else {
+          const hasNode = arr.find(item => {
+            return item == node.id
+          })
+          if (hasNode) {
+            this.checkedKeys.push(node.id)
+          }
+        }
+      }
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          // console.log(this.checkedData)
+          if (this.checkedData.length == 0) {
+            return this.$message.warning('请先选择菜单')
+          }
+          const arr = this.checkedData.join(',')
+          if (this.types == 'dd') {
+            this.ddSave({ menuIds: arr })
+          } else {
+            this.lsSave({ menuIds: arr })
+          }
+        }
+      })
+    },
+    // 保存单店
+    ddSave (pars) {
+      saveDdMouldMenu(pars).then(res => {
+        console.log(res, 'res--save')
+        if (res.status + '' === '200') {
+          this.$message.success(res.message ? res.message : '保存成功')
+        } else {
+          // this.$message.warning(res.message)
+        }
+      })
+    },
+    // 保存连锁
+    lsSave (pars) {
+      saveLsMouldMenu(pars).then(res => {
+        console.log(res, 'res--save')
+        if (res.status + '' === '200') {
+          this.$message.success(res.message ? res.message : '保存成功')
+        } else {
+          // this.$message.warning(res.message)
+        }
+      })
+    }
+  },
+  mounted () {
+    // 单店
+    if (this.types == 'dd') {
+      this.getfindDdMenu()
+    } else {
+      this.getfindLsMenu()
+    }
+  },
+  beforeCreate () {
+    this.form = this.$form.createForm(this, { name: 'menu' })
+  }
+}
+</script>
+
+<style>
+</style>

+ 41 - 0
src/views/bnSetting/menusAuthTab.vue

@@ -0,0 +1,41 @@
+<template>
+  <div class="menusAuth-cons">
+    <a-tabs @change="tabChange" type="card">
+      <a-tab-pane tab="单店菜单设置" key="1">
+        <menusAuth types="dd"></menusAuth>
+      </a-tab-pane>
+      <a-tab-pane tab="连锁店菜单设置" key="2">
+        <menusAuth types="ls"></menusAuth>
+      </a-tab-pane>
+    </a-tabs>
+  </div>
+</template>
+
+<script>
+  import menusAuth from './menusAuth.vue'
+  export default {
+    name: 'menusAuthTab',
+    components: {
+      menusAuth
+    },
+    data() {
+      return {}
+    },
+    methods: {
+      tabChange(v) {
+        console.log(v)
+      },
+    },
+    beforeRouteEnter (to, from, next) {
+      next(vm => {
+      })
+    },
+  }
+</script>
+
+<style>
+  .menusAuth-cons{
+    background: #fff;
+    padding: 10px;
+  }
+</style>

+ 42 - 28
src/views/common/auditModal.vue → src/views/common/commonModal.vue

@@ -1,23 +1,19 @@
 <template>
   <a-modal
     centered
-    class="audit-modal"
+    class="common-modal"
     :footer="null"
     :maskClosable="false"
     v-model="isShow"
+    :title="modalTit"
+    :bodyStyle="{padding: modalTit?'25px 32px 20px':'50px 32px 15px'}"
     @cancle="isShow=false"
     :width="416">
     <a-spin :spinning="spinning" tip="Loading...">
-      <div class="audit-main">
-        <a-icon type="question-circle" style="color: #faad14;font-size: 22px;margin-right: 16px;" />
-        <div class="audit-cont">
-          <p class="audit-tit">提示</p>
-          <p class="audit-txt">请点击下方按钮确认操作?</p>
-        </div>
-      </div>
+      <div class="common-main" v-html="modalHtml"></div>
       <div class="btn-box">
-        <a-button type="primary" class="button-error" @click="handleAuditFail">审核不通过</a-button>
-        <a-button type="primary" class="button-info" @click="handleAuditOk">审核通过</a-button>
+        <a-button type="primary" class="button-warning" @click="handleCommonCancel" v-if="isCancel">{{ cancelText }}</a-button>
+        <a-button type="primary" class="button-info" @click="handleCommonOk">{{ okText }}</a-button>
       </div>
     </a-spin>
   </a-modal>
@@ -25,13 +21,33 @@
 
 <script>
 export default {
-  name: 'AuditModal',
+  name: 'CommonModal',
   props: {
     openModal: { //  弹框显示状态
       type: Boolean,
       default: false
     },
-    spinning: {
+    modalTit: { // 弹框标题
+      type: String,
+      default: null
+    },
+    modalHtml: {
+      type: String,
+      default: ''
+    },
+    okText: { // 确定 按钮文字
+      type: String,
+      default: '确定'
+    },
+    cancelText: { // 取消 按钮文字
+      type: String,
+      default: '取消'
+    },
+    isCancel: { // 是否显示  取消 按钮
+      type: Boolean,
+      default: true
+    },
+    spinning: { // 加载中
       type: Boolean,
       default: false
     }
@@ -42,13 +58,13 @@ export default {
     }
   },
   methods: {
-    // 审核通过
-    handleAuditOk () {
+    // 确定
+    handleCommonOk () {
       this.$emit('ok')
     },
-    // 审核不通过
-    handleAuditFail () {
-      this.$emit('fail')
+    // 取消
+    handleCommonCancel () {
+      this.$emit('cancel')
     }
   },
   watch: {
@@ -67,23 +83,21 @@ export default {
 </script>
 
 <style lang="less">
-  .audit-modal{
-    .ant-modal-body{
-      padding: 32px 32px 24px;
-    }
-    .audit-main{
+  .common-modal{
+    .common-main{
       display: flex;
-      .audit-cont{
-        .audit-tit{
-          color: rgba(0, 0, 0, 0.85);
+      line-height: 20px;
+      .common-cont{
+        .common-tit{
+          color: rgba(0, 0, 0);
           font-weight: 500;
           font-size: 16px;
           line-height: 1.4;
           margin: 0;
         }
-        .audit-txt{
+        .common-txt{
           margin: 8px 0 0;
-          color: rgba(0, 0, 0, 0.65);
+          color: rgba(0, 0, 0);
           font-size: 14px;
           line-height: 1.5;
         }
@@ -91,7 +105,7 @@ export default {
     }
     .btn-box{
       text-align: right;
-      margin-top: 24px;
+      margin-top: 20px;
     }
   }
 </style>

+ 68 - 0
src/views/common/dealerList.vue

@@ -0,0 +1,68 @@
+<template>
+  <!-- 经销商 -->
+  <a-select
+    show-search
+    label-in-value
+    :value="dealerName"
+    :disabled="disabled"
+    placeholder="请输入名称搜索"
+    style="width: 100%"
+    :filter-option="false"
+    :dropdownMatchSelectWidth="false"
+    :not-found-content="fetching ? undefined : null"
+    @search="fetchUser"
+    @change="handleChange"
+    allowClear>
+    <a-spin v-if="fetching" slot="notFoundContent" size="small" />
+    <a-select-option v-for="item in data" :key="item.dealerSn" :value="item.dealerSn">{{ item.dealerName }}</a-select-option>
+  </a-select>
+</template>
+<script>
+import debounce from 'lodash/debounce'
+import { dealerListByPage } from '@/api/dealer'
+export default {
+  props: {
+    disabled: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    this.lastFetchId = 0
+    this.fetchUser = debounce(this.fetchUser, 800)
+    return {
+      data: [],
+      dealerName: [],
+      fetching: false
+    }
+  },
+  methods: {
+    fetchUser (dealerName) {
+      console.log('fetching user', dealerName)
+      if (dealerName == '') return
+      this.lastFetchId += 1
+      const fetchId = this.lastFetchId
+      this.data = []
+      this.fetching = true
+      dealerListByPage({ dealerName: dealerName, pageNo: 1, pageSize: 20 }).then(res => {
+        if (fetchId !== this.lastFetchId) {
+          return
+        }
+        this.data = res.data && res.data.list ? res.data.list : []
+        this.fetching = false
+      })
+    },
+    handleChange (value) {
+      Object.assign(this, {
+        dealerName: value,
+        data: [],
+        fetching: false
+      })
+      this.$emit('change', value || { key: undefined, label: '' })
+    },
+    resetForm () {
+      this.dealerName = []
+    }
+  }
+}
+</script>

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

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

+ 68 - 0
src/views/common/storeList.vue

@@ -0,0 +1,68 @@
+<template>
+  <!-- 经销商 -->
+  <a-select
+    show-search
+    label-in-value
+    :value="name"
+    placeholder="请输入名称搜索"
+    style="width: 100%"
+    :disabled="disabled"
+    :filter-option="false"
+    :dropdownMatchSelectWidth="false"
+    :not-found-content="fetching ? undefined : null"
+    @search="fetchUser"
+    @change="handleChange"
+    allowClear>
+    <a-spin v-if="fetching" slot="notFoundContent" size="small" />
+    <a-select-option v-for="item in data" :key="item.storeSn" :value="item.storeSn">{{ item.name }}</a-select-option>
+  </a-select>
+</template>
+<script>
+import debounce from 'lodash/debounce'
+import { storeListByPage } from '@/api/store'
+export default {
+  props: {
+    disabled: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data () {
+    this.lastFetchId = 0
+    this.fetchUser = debounce(this.fetchUser, 800)
+    return {
+      data: [],
+      name: [],
+      fetching: false
+    }
+  },
+  methods: {
+    fetchUser (name) {
+      console.log('fetching user', name)
+      if (name == '') return
+      this.lastFetchId += 1
+      const fetchId = this.lastFetchId
+      this.data = []
+      this.fetching = true
+      storeListByPage({ name: name, pageNo: 1, pageSize: 20, enableFlag: 1 }).then(res => {
+        if (fetchId !== this.lastFetchId) {
+          return
+        }
+        this.data = res.data && res.data.list ? res.data.list : []
+        this.fetching = false
+      })
+    },
+    handleChange (value) {
+      Object.assign(this, {
+        name: value,
+        data: [],
+        fetching: false
+      })
+      this.$emit('change', value || { key: undefined, label: '' })
+    },
+    resetForm () {
+      this.name = []
+    }
+  }
+}
+</script>

+ 240 - 0
src/views/numsGoodsShelves/bondManagement/addbond.vue

@@ -0,0 +1,240 @@
+<template>
+  <div>
+    <a-modal
+      centered
+      wrapClassName="addbond-modal"
+      :footer="null"
+      :maskClosable="false"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="isshow=false"
+      :width="650">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <a-form-model
+          id="addbond-form"
+          ref="ruleForm"
+          :model="form"
+          :rules="rules"
+          :label-col="formItemLayout.labelCol"
+          :wrapper-col="formItemLayout.wrapperCol"
+        >
+          <a-row :gutter="24">
+            <a-col :span="20">
+              <a-form-model-item label="货架名称" prop="shelfSn" >
+                <shelfList ref="shelfList" @change="shelfChange" v-if="!nowData" id="addbond-shelfName"></shelfList>
+                <span v-if="nowData">{{ form.shelfName||'--' }}</span>
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="20" v-if="form.shelfSn||nowData">
+              <a-form-model-item label="配件经销商" prop="dealerSn" >
+                <span>{{ dealerName||'' }}</span>
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="20" v-if="form.shelfSn||nowData">
+              <a-form-model-item label="汽车修理厂" prop="storeSn">
+                <span>{{ storeName ||'' }}</span>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24">
+            <a-col :span="20">
+              <a-form-model-item label="保证金缴纳金额" prop="bondAmount" >
+                <a-input-number
+                  id="addbond-bondAmount"
+                  v-model="form.bondAmount"
+                  :precision="2"
+                  :min="0.01"
+                  :max="999999"
+                  placeholder="请输入正数(最多允许两位小数)"
+                  style="width: 100%;display: inline-block;" />
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="2"> <span style="display: inline-block; padding-top: 10px;">元</span></a-col>
+          </a-row>
+          <a-form-model-item :label-col="{span: 0}" :wrapper-col="{span: 24}" style="text-align: center;">
+            <a-button type="primary" @click="handleSubmit()" :style="{ marginRight: '8px' }" id="addbond-handleSubmit">保存</a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="isshow=false" id="addbond-close">取消</a-button>
+          </a-form-model-item>
+        </a-form-model>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect, Upload } from '@/components'
+import { shelfDetail } from '@/api/shelf.js'
+import { bondRecordDetail, saveBondRecord } from '@/api/boundRecord.js'
+import dealerList from '@/views/common/dealerList.vue'
+import storeList from '@/views/common/storeList.vue'
+import shelfList from '@/views/common/shelfList.vue'
+export default {
+  name: 'Addbond',
+  components: { STable, VSelect, Upload, dealerList, storeList, shelfList },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    nowData: {
+      type: Object,
+      default: function () {
+        return null
+      }
+    }
+  },
+
+  data () {
+    return {
+      spinning: false,
+      titleText: '新增保证金',
+      isshow: this.visible,
+      roleList: [],
+      pageInfo: null,
+      formItemLayout: {
+        labelCol: { span: 10 },
+        wrapperCol: { span: 14 }
+      },
+      dealerName: '',
+      shelfName: '',
+      storeName: '',
+      form: {
+        dealerSn: undefined, // 经销商sn
+        bondAmount: '', // 保证金金额
+        storeSn: undefined, // 汽车修理厂sn
+        shelfSn: '' // 货架名称
+      },
+      rules: {
+        shelfSn: [ { required: true, message: '请选择货架名称', trigger: 'change' } ],
+        dealerSn: [ { required: true, message: '请选择配件经销商', trigger: 'change' } ],
+        storeSn: [ { required: true, message: '请选择汽车修理厂', trigger: 'change' } ],
+        bondAmount: [ { required: true, message: '请输入保证金金额', trigger: 'blur' } ]
+      }
+    }
+  },
+  methods: {
+    // 过滤空格
+    filterEmpty () {
+      let str = this.form.name
+      str = str.replace(/\ +/g, '')
+      str = str.replace(/[ ]/g, '')
+      str = str.replace(/[\r\n]/g, '')
+      this.form.name = str
+    },
+    // 货架名称 change
+    shelfChange (obj) {
+      this.spinning = true
+      this.form.shelfSn = obj.key || undefined
+      if (this.form.shelfSn) {
+        setTimeout(() => {
+          this.getShelfDetail(this.form.shelfSn)
+        }, 300)
+      }
+    },
+    // 经销商 change
+    dealerChange (obj) {
+      this.form.dealerSn = obj.key || undefined
+    },
+    // 汽车修理厂 change
+    storeChange (obj) {
+      this.form.storeSn = obj.key || undefined
+    },
+    // 查询货架详情
+    getShelfDetail (val) {
+      this.spinning = true
+      shelfDetail({ shelfSn: val }).then(res => {
+        if (res.status == 200) {
+          this.dealerName = res.data.dealerName
+          this.shelfName = res.data.shelfName
+          this.storeName = res.data.storeName
+          this.form = Object.assign({}, res.data)
+          console.log(this.dealerName, this.storeName, this.form, 'this.form ')
+        } else {
+          this.form = { }
+        }
+        this.spinning = false
+      })
+    },
+    // 保证金详情
+    getBoundDetail () {
+      this.spinning = true
+      bondRecordDetail({ bondRecordSn: this.nowData ? this.nowData.bondRecordSn : '' }).then(res => {
+        if (res.status == 200) {
+          this.form = Object.assign({}, res.data)
+          this.dealerName = res.data.dealerName
+          this.shelfName = res.data.shelfName
+          this.storeName = res.data.storeName
+          this.form.bondAmount = res.data.bondAmount
+          // this.form = Object.assign({}, res.data)
+        } else {
+        }
+        this.spinning = false
+      })
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = JSON.parse(JSON.stringify(_this.form))
+          params.id = _this.nowData && _this.nowData.id ? _this.nowData.id : null
+          _this.spinning = true
+          saveBondRecord(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('refresh')
+              setTimeout(function () {
+                _this.isshow = false
+                _this.spinning = false
+              }, 300)
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (!newValue) {
+        if (!this.nowData) {
+          this.$refs.shelfList.resetForm()
+        }
+        this.dealerName = ''
+        this.shelfName = ''
+        this.storeName =
+        this.$refs.ruleForm.resetFields()
+        this.titleText = '新增保证金'
+        this.$emit('close')
+      }
+    },
+    nowData: {
+      handler (newValue, oldValue) {
+        if (this.isshow && newValue) {
+          if (this.nowData.id) { //  编辑
+            this.titleText = '编辑保证金'
+            this.getBoundDetail()
+          } else {
+            this.titleText = '新增保证金'
+          }
+        }
+      },
+      deep: true
+    }
+  }
+}
+</script>
+<style lang="less">
+  .addbond-modal{
+    .ant-input-number-handler-wrap{
+      display: none;
+    }
+  }
+</style>

+ 221 - 0
src/views/numsGoodsShelves/bondManagement/list.vue

@@ -0,0 +1,221 @@
+<template>
+  <a-card size="small" :bordered="false">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="货架名称">
+                <a-input id="bondManagementList-shelfName" allowClear v-model.trim="queryParam.shelfName" placeholder="请输入货架名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="配件经销商">
+                <dealerList ref="dealerList" @change="dealerChange" id="bondManagementList-dealerChange"></dealerList>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="汽车修理厂">
+                <storeList ref="storeList" @change="storeChange" id="bondManagementList-storeChange"></storeList>
+              </a-form-item>
+            </a-col>
+            <template v-if="advanced">
+              <a-col :md="6" :sm="24">
+                <a-form-item label="状态">
+                  <v-select id="bondManagementList-state" code="BOND_RECORD_STATE" v-model="queryParam.state" allowClear placeholder="请选择状态"></v-select>
+                </a-form-item>
+              </a-col>
+            </template>
+            <a-col :md="4" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" id="bondManagementList-refresh">查询</a-button>
+              <a-button type="" @click="reset" style="margin-left: 10px;" id="bondManagementList-reset">重置</a-button>
+              <a @click="advanced=!advanced" style="margin-left: 8px">
+                {{ advanced ? '收起' : '展开' }}
+                <a-icon :type="advanced ? 'up' : 'down'"/>
+              </a>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <div class="table-operator">
+        <a-button size="small" type="primary" class="button-error" @click="handleEdit()" id="bondManagementList-handleEdit">新增保证金</a-button>
+      </div>
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px', wordBreak: 'break-all' }"
+        size="small"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+        <template slot="action" slot-scope="text, record" >
+          <a-button
+            size="small"
+            type="link"
+            class="button-info"
+            @click="handleEdit(record)"
+            v-if="record.state=='WAIT'"
+            id="bondManagementList-handleEdit">编辑</a-button>
+          <a-button
+            size="small"
+            type="link"
+            class="button-info"
+            @click="handleDel(record)"
+            v-if="record.state=='WAIT'"
+            id="bondManagementList-handleDel">删除</a-button>
+          <span style="display:inline-block;padding-left:7px" v-if="record.state=='FINISH'">--</span>
+          <!-- <span v-if="!($hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1) && !(record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')) && !(record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del'))" style="display:inline-block;padding-left:7px">--</span> -->
+        </template>
+      </s-table>
+    </a-spin>
+    <!--新增/编辑数字货架 -->
+    <addbond :visible="showModal" @refresh="$refs.table.refresh(true)" :nowData="itemData" @close="handleUserCancel"></addbond>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import addbond from './addbond.vue'
+import { bondRecordByPage, bondRecordDel } from '@/api/boundRecord.js'
+import dealerList from '@/views/common/dealerList.vue'
+import storeList from '@/views/common/storeList.vue'
+import { toThousands } from '@/libs/tools.js'
+export default {
+  name: 'UserList',
+  components: { STable, VSelect, dealerList, storeList, addbond },
+  data () {
+    return {
+      spinning: false,
+      advanced: false,
+      tableHeight: 0,
+      // 查询参数
+      queryParam: {
+        shelfName: '',
+        state: undefined
+      },
+      showModal: false,
+      itemData: null, // 编辑行数据
+      openStatusModal: false, // 货架状态弹窗初始状态
+      // 表头
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '货架名称', dataIndex: 'shelfName', width: '15%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '配件经销商', dataIndex: 'dealerName', width: '15%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '汽车修理厂', dataIndex: 'storeName', width: '15%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '保证金金额', dataIndex: 'bondAmount', width: '10%', align: 'right', customRender: function (text) { return toThousands(text, 2) || '--' } },
+        { title: '状态', dataIndex: 'stateDictValue', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '创建时间', dataIndex: 'createDate', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '操作', width: '10%', align: 'left', scopedSlots: { customRender: 'action' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        return bondRecordByPage(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (let i = 0; i < data.list.length; i++) {
+              const _item = data.list[i]
+              _item.no = no + i + 1
+            }
+          }
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  methods: {
+    // 经销商 change
+    dealerChange (obj) {
+      this.queryParam.dealerSn = obj.key || undefined
+    },
+    // 汽车修理厂 change
+    storeChange (obj) {
+      this.queryParam.storeSn = obj.key || undefined
+    },
+    // 新增/编辑
+    handleEdit (row) {
+      if (row) {
+        this.itemData = row
+      } else {
+        this.itemData = null
+      }
+      this.showModal = true
+    },
+    // 关闭弹框
+    handleUserCancel () {
+      this.showModal = false
+      this.itemData = null
+    },
+    // 重置
+    reset () {
+      this.queryParam = {
+        shelfName: '',
+        state: undefined
+      }
+      this.$refs.dealerList.resetForm()
+      this.$refs.storeList.resetForm()
+      this.$refs.table.refresh(true)
+    },
+    // 删除
+    handleDel (row) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '删除后无法恢复,确认删除?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          bondRecordDel({
+            bondRecordSn: row.bondRecordSn
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$refs.table.refresh()
+              _this.spinning = false
+            } else {
+              _this.spinning = false
+            }
+          })
+        }
+      })
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 215
+    }
+  },
+  watch: {
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.reset()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.reset()
+    }
+  }
+}
+</script>
+<style lang="less">
+
+</style>

+ 238 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/addGoodsShelve.vue

@@ -0,0 +1,238 @@
+<template>
+  <div>
+    <a-modal
+      centered
+      wrapClassName="addGoodsShelve-modal"
+      :footer="null"
+      :maskClosable="false"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="isshow=false"
+      :width="800">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <a-form-model
+          id="addGoodsShelve-form"
+          ref="ruleForm"
+          :model="form"
+          :rules="rules"
+          :label-col="formItemLayout.labelCol"
+          :wrapper-col="formItemLayout.wrapperCol"
+        >
+          <a-row :gutter="24">
+            <a-col :span="12">
+              <a-form-model-item label="配件经销商" prop="dealerSn">
+                <dealerList ref="dealerList" @change="dealerChange" v-if="!nowData" id="addGoodsShelve-dealerChange"></dealerList>
+                <span v-else>{{ form.dealerName }}</span>
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="12">
+              <a-form-model-item label="汽车修理厂" prop="storeSn">
+                <storeList ref="storeList" @change="storeChange" v-if="!nowData" id="addGoodsShelve-storeChange"></storeList>
+                <span v-else>{{ form.storeName }}</span>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="20">
+            <a-col :span="24">
+              <a-form-model-item label="货架名称" prop="shelfName" :label-col="{span: 3}" :wrapper-col="{span: 20}">
+                <a-input id="addGoodsShelve-shelfName" v-model.trim="form.shelfName" :maxLength="30" allowClear placeholder="请输入货架名称(最多30个字符)"/>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24">
+            <!-- 状态 -->
+            <a-col :span="12">
+              <a-form-model-item label="货架归属" prop="ownerType">
+                <a-radio-group name="radioGroup" v-model="form.ownerType" @change="changeRadio" id="addGoodsShelve-changeRadio">
+                  <a-radio :value="1">平台</a-radio>
+                  <a-radio :value="0">自有</a-radio>
+                </a-radio-group>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24" v-if="form.ownerType===0">
+            <a-col :span="24">
+              <a-form-model-item label="产品图片" prop="images" help="说明:请上传清晰、完整的图片,支持jpg/jpeg/png格式,不超过500KB(最多5张)。" :label-col="{span:3}" :wrapper-col="{span:20}">
+                <Upload
+                  class="upload"
+                  id="addGoodsShelve-images"
+                  v-model="form.images"
+                  :fileSize="500/1024"
+                  ref="images"
+                  @change="changeImage"
+                  :maxNums="5"
+                  listType="picture-card" ></Upload>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-row :gutter="24">
+            <a-col :span="24">
+              <a-form-model-item label="备注" prop="remarks" :label-col="{span: 3}" :wrapper-col="{span: 20}">
+                <a-textarea id="addGoodsShelve-remarks" v-model.trim="form.remarks":maxLength="500" allowClear placeholder="请输入备注(最多500个字符)"/>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-form-model-item :label-col="{span: 0}" :wrapper-col="{span: 24}" style="text-align: center;">
+            <a-button type="primary" @click="handleSubmit()" :style="{ marginRight: '8px' }" id="addGoodsShelve-handleSubmit">保存</a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="isshow=false" id="addGoodsShelve-close">取消</a-button>
+          </a-form-model-item>
+        </a-form-model>
+      </a-spin>
+    </a-modal>
+
+  </div>
+</template>
+
+<script>
+import { STable, VSelect, Upload } from '@/components'
+import { saveShelf, shelfDetail } from '@/api/shelf.js'
+import dealerList from '@/views/common/dealerList.vue'
+import storeList from '@/views/common/storeList.vue'
+export default {
+  name: 'AddGoodsShelve',
+  components: { STable, VSelect, Upload, dealerList, storeList },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    nowData: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+
+  data () {
+    return {
+      spinning: false,
+      titleText: '新增数字货架',
+      isshow: this.visible,
+      roleList: [],
+      pageInfo: null,
+      formItemLayout: {
+        labelCol: { span: 6 },
+        wrapperCol: { span: 16 }
+      },
+      form: {
+        dealerSn: undefined, // 经销商sn
+        ownerType: 1, // 平台
+        storeSn: undefined, // 汽车修理厂sn
+        shelfName: '', // 货架名称
+        images: '', // 图片
+        remarks: ''// 备注
+      },
+      rules: {
+        shelfName: [ { required: true, message: '请输入用户名称', trigger: 'blur' }, { pattern: '^[^<|>]{1,30}$', message: '请输入不含<或>的字符,最多30个字符' } ],
+        dealerSn: [ { required: true, message: '请选择配件经销商', trigger: 'change' } ],
+        ownerType: [ { required: true, message: '请选择货架归属', trigger: 'change' } ],
+        storeSn: [ { required: true, message: '请选择汽车修理厂', trigger: 'change' } ],
+        images: [{ required: true, message: '请上传品牌图片', trigger: 'change' } ]
+      }
+    }
+  },
+  methods: {
+    // 经销商 change
+    dealerChange (obj) {
+      this.form.dealerSn = obj.key || undefined
+    },
+    // 汽车修理厂 change
+    storeChange (obj) {
+      this.form.storeSn = obj.key || undefined
+    },
+    // 产品图片上传
+    changeImage (file) {
+      this.form.images = file
+    },
+    // 改变货架归属
+    changeRadio (e) {
+      this.form.ownerType = e.target.value
+      console.log(e.target.value, '=========')
+    },
+    // 查询货架详情
+    getShelfDetail () {
+      this.spinning = true
+      shelfDetail({ shelfSn: this.nowData.shelfSn }).then(res => {
+        if (res.status == 200) {
+          this.form = Object.assign({}, res.data)
+          this.form.ownerType = Number(this.form.ownerType)
+          if (this.form.ownerType == 0) {
+            this.$nextTick(() => {
+              this.$refs.images.setFileList(this.form.images)
+            })
+          }
+        } else {
+          this.form = {}
+          this.$refs.images.setFileList('')
+        }
+        this.spinning = false
+      })
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = JSON.parse(JSON.stringify(_this.form))
+          if (params.images == '') {
+            delete params.images
+          }
+          if (_this.nowData && _this.nowData.id) {
+            params.id = _this.nowData.id
+          }
+          _this.spinning = true
+          saveShelf(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('refresh')
+              setTimeout(function () {
+                _this.isshow = false
+              }, 300)
+            }
+            _this.spinning = false
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (!newValue) {
+        if (!this.nowData) {
+          this.$refs.storeList.resetForm()
+          this.$refs.dealerList.resetForm()
+        }
+
+        this.$refs.ruleForm.resetFields()
+        this.titleText = '新增数字货架'
+        this.$emit('close')
+      }
+    },
+    nowData: {
+      handler (newValue, oldValue) {
+        if (this.isshow && newValue) {
+          if (this.nowData.id) { //  编辑
+            this.titleText = '编辑数字货架'
+            this.getShelfDetail()
+          } else {
+            this.$refs.storeList.resetForm()
+            this.$refs.dealerList.resetForm()
+            this.titleText = '新增数字货架'
+          }
+        }
+      },
+      deep: true
+    }
+  }
+}
+</script>
+<style lang="less">
+
+</style>

+ 145 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/addHWModal.vue

@@ -0,0 +1,145 @@
+<template>
+  <div>
+    <a-modal
+      centered
+      wrapClassName="addHWModal-modal"
+      :footer="null"
+      :maskClosable="false"
+      :title="textTitle"
+      v-model="isshow"
+      @cancle="isshow=false"
+      :width="500">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <a-form-model
+          id="addHWModal-form"
+          ref="ruleForm"
+          :model="form"
+          :rules="rules"
+        >
+          <a-row :gutter="20">
+            <a-col :span="24">
+              <a-form-model-item label="货位号" prop="shelfPlaceCode" :label-col="{span: 5}" :wrapper-col="{span: 18}">
+                <a-input id="addHWModal-shelfPlaceCode" v-model.trim="form.shelfPlaceCode" allowClear placeholder="请输入货位号"/>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-form-model-item :label-col="{span: 0}" :wrapper-col="{span: 24}" style="text-align: center;">
+            <a-button type="primary" @click="handleSubmit()" :style="{ marginRight: '8px' }" id="addHWModal-handleSubmit">保存</a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="isshow=false" id="addHWModal-close">取消</a-button>
+          </a-form-model-item>
+        </a-form-model>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { saveHw, shelfHWDetail } from '@/api/shelf.js'
+export default {
+  name: 'AddHWModal',
+  props: {
+    openHWModal: {
+      type: Boolean,
+      default: false
+    },
+    shelfSn: {
+      type: [String, Number],
+      default: ''
+    },
+    shelfPlaceSn: {
+      type: [String, Number],
+      default: ''
+    }
+  },
+
+  data () {
+    return {
+      spinning: false,
+      isshow: this.openHWModal,
+      textTitle: '新增货位',
+      roleList: [],
+      pageInfo: null,
+      form: {
+        shelfPlaceCode: '' // 货位号
+      },
+      rules: {
+        shelfPlaceCode: [ { required: true, message: '请输入货位编号', trigger: 'blur' }]
+      }
+    }
+  },
+  methods: {
+    // 过滤空格
+    filterEmpty () {
+      let str = this.form.name
+      str = str.replace(/\ +/g, '')
+      str = str.replace(/[ ]/g, '')
+      str = str.replace(/[\r\n]/g, '')
+      this.form.name = str
+    },
+    // 查询货位详情
+    getShelfHWDetail () {
+      this.spinning = true
+      shelfHWDetail({ shelfPlaceSn: this.shelfPlaceSn }).then(res => {
+        if (res.status == 200) {
+          this.form = Object.assign({}, res.data)
+        }
+        this.spinning = false
+      })
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = JSON.parse(JSON.stringify(_this.form))
+          params.shelfSn = _this.shelfSn ? _this.shelfSn : null
+          console.log(params.id, params.shelfSn, '------------编辑新增')
+          _this.spinning = true
+          saveHw(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('refresh')
+              setTimeout(function () {
+                _this.isshow = false
+                _this.spinning = false
+              }, 300)
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  },
+  watch: {
+    openHWModal (newValue, oldValue) {
+      console.log(newValue, 'newValue')
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (!newValue) {
+        this.$refs.ruleForm.resetFields()
+        this.form = {}
+        this.textTitle = '新增货位'
+        this.$emit('close')
+      }
+    },
+    shelfPlaceSn: {
+      handler (newValue, oldValue) {
+        if (this.isshow && newValue) {
+          if (this.shelfPlaceSn) { //  编辑
+            this.textTitle = '编辑货位'
+            this.getShelfHWDetail()
+          }
+        }
+      },
+      deep: true
+    }
+  }
+}
+</script>
+<style lang="less">
+</style>

+ 103 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/changeStatusModal.vue

@@ -0,0 +1,103 @@
+<template>
+  <div>
+    <a-modal
+      centered
+      wrapClassName="changeStatusModal-modal"
+      :footer="null"
+      :maskClosable="false"
+      :title="titleText"
+      v-model="isshow"
+      @cancle="isshow=false"
+      :width="600">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <div style="text-align: center;">
+          <h3 style="padding: 15px 0; font-weight: bold;">{{ nowData?nowData.shelfName:'' }}</h3>
+          <div style="padding-bottom: 15px">
+            <p>此数字货架当前状态为<span style="display:inline-block;padding:0 3px">"{{ nowData&&nowData.stateDictValue }}"</span>,确定流转到下一个状态<span style="display:inline-block;padding:0 3px;color:red">"{{ nextState }}"</span>吗?</p>
+            <p v-if="nowData&&nowData.state=='ENABLE'">暂停后汽车修理厂无法再使用数字货架</p>
+            <p v-if="nowData&&nowData.state=='SUSPEND'">关闭后,该数字货架的所有数据都不可见</p>
+            <p>状态流转后无法再回退,请谨慎操作!</p>
+          </div>
+          <div>
+            <a-button type="primary" @click="handleSubmit()" :style="{ marginRight: '8px' }" id="changeStatusModal-handleSubmit">保存</a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="isshow=false" id="changeStatusModal-close">取消</a-button>
+          </div>
+        </div>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { updateEnableStatus } from '@/api/shelf.js'
+export default {
+  name: 'ChangeStatusModal',
+  props: {
+    openStatusModal: {
+      type: Boolean,
+      default: false
+    },
+    nowData: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      spinning: false,
+      titleText: '更改数字货架状态',
+      isshow: this.openStatusModal,
+      nextState: ''
+    }
+  },
+  methods: {
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      _this.spinning = true
+      updateEnableStatus({ shelfSn: this.nowData.shelfSn }).then(res => {
+        if (res.status == 200) {
+          _this.$message.success(res.message)
+          _this.$emit('refresh')
+          setTimeout(function () {
+            _this.isshow = false
+            _this.spinning = false
+          }, 300)
+        } else {
+          _this.spinning = false
+        }
+      })
+    }
+  },
+  watch: {
+    openStatusModal (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+      }
+    },
+    nowData: {
+      handler (newValue, oldValue) {
+        if (this.isshow && newValue) {
+          if (this.nowData.id) { //  编辑
+            if (this.nowData.state == 'NOT_ENABLE') {
+              this.nextState = '已启用'
+            } else if (this.nowData.state == 'ENABLE') {
+              this.nextState = '已暂停'
+            } else if (this.nowData.state == 'SUSPEND') {
+              this.nextState = '已关闭'
+            }
+          }
+        }
+      },
+      deep: true
+    }
+  }
+}
+</script>
+<style lang="less">
+</style>

+ 170 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/chooseImportModal.vue

@@ -0,0 +1,170 @@
+<template>
+  <a-modal
+    centered
+    class="chooseImport-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="确认导入"
+    v-model="isShow"
+    @cancle="isShow=false"
+    :width="900">
+    <div class="chooseImport-con">
+      <!-- 可导入数据 -->
+      <p class="">可导入数据{{ loadData.length }}条</p>
+      <p class="red">注意:成功导入后,现有的货位将会被全部删除,即覆盖导入的方式,您所看到的货位就是可导入的数据,请谨慎操作</p>
+      <a-table
+        class="sTable"
+        ref="table"
+        size="small"
+        :rowKey="(record) => record.allocateSn"
+        :columns="nowColumns"
+        :dataSource="loadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <a-divider />
+      <!-- 不可导入数据 -->
+      <p class="red">不可导入数据{{ unLoadData.length }}条</p>
+      <a-table
+        class="unTable"
+        ref="unTable"
+        size="small"
+        :rowKey="(record) => record.errorDesc"
+        :columns="nowUnColumns"
+        :dataSource="unLoadData"
+        :loading="loading"
+        :scroll="{ y: 200 }"
+        :pagination="false"
+        bordered>
+      </a-table>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="chooseImport-submit"
+          size="large"
+          :class="loadData.length==0?'button-grey':'button-primary'"
+          @click="handleSubmit"
+          style="padding: 0 40px;">确认导入</a-button>
+        <a-button
+          id="chooseImport-cancel"
+          size="large"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 40px;margin-left: 15px;">取消</a-button>
+      </div>
+    </div>
+  </a-modal>
+</template>
+
+<script>
+// import { hdExportExcel } from '@/libs/exportExcel'
+import { saveBatchExcel, exportExcelData } from '@/api/shelf'
+export default {
+  name: 'ChooseImportModal',
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    paramsData: {
+      type: Object,
+      default: () => {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      nowColumns: [
+        { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
+        { title: '货位号', dataIndex: 'shelfPlaceCode', width: '90%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      loadData: [],
+      nowUnColumns: [
+        { title: '序号', dataIndex: 'no', width: '10%', align: 'center' },
+        { title: '货位号', dataIndex: 'shelfPlaceCode', width: '40%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '错误原因', dataIndex: 'remarks', width: '50%', align: 'center', customRender: function (text) { return text || '--' } }
+      ],
+      unLoadData: [],
+      loading: false
+    }
+  },
+  methods: {
+    getData () {
+      const _this = this
+      this.loading = true
+      const params = {
+        shelfSn: this.paramsData.shelfSn,
+        path: this.paramsData.path
+      }
+      exportExcelData(params).then(res => {
+        this.loading = false
+        if (res.status == 200) {
+          if (res.data.successList && res.data.successList.length > 0) {
+            res.data.successList.map((item, index) => {
+              item.no = index + 1
+            })
+          }
+          if (res.data.failList && res.data.failList.length > 0) {
+            res.data.failList.map((item, index) => {
+              item.no = index + 1
+            })
+          }
+          _this.loadData = res.data.successList || []
+          _this.unLoadData = res.data.failList || []
+        }
+      })
+    },
+    // 确认导入
+    handleSubmit () {
+      if (this.loadData.length == 0) {
+        this.$message.warning('无可导入产品!')
+      } else {
+        saveBatchExcel(this.loadData).then(res => {
+          if (res.status == 200) {
+            this.$emit('ok', this.loadData)
+            this.isShow = false
+          }
+        })
+      }
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.loadData = []
+        this.unLoadData = []
+      } else {
+        this.getData()
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .chooseImport-modal{
+    .chooseImport-con{
+      .red{
+        color: #f30;
+      }
+      .btn-con{
+        text-align: center;
+        margin: 30px 0 20px;
+        .button-cancel,.button-error{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 299 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/goodsAllocationSet.vue

@@ -0,0 +1,299 @@
+<template>
+  <div class="goodsAllocationSet-page">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <a-page-header :ghost="false" :backIcon="false" class="goodsAllocationSet-baseInfo">
+        <template slot="subTitle">
+          <a href="javascript:;" @click="handleBack" id="goodsAllocationSet-handleBack">
+            <a-icon type="left"></a-icon> 返回列表
+          </a>
+          <span style="margin: 0 15px;color: #666;font-weight: bold;">{{ pageInfo&&pageInfo.shelfName?pageInfo.shelfName:'--' }}</span>
+        </template>
+      </a-page-header>
+      <a-card :bordered="false" size="small" class="goodsAllocationSet-baseInfo">
+        <a-collapse :activeKey="['1']">
+          <a-collapse-panel key="1" header="基础信息">
+            <a-descriptions size="small" :column="3">
+              <a-descriptions-item label="配件经销商">{{ pageInfo&&pageInfo.dealerName?pageInfo.dealerName:'--' }}</a-descriptions-item>
+              <a-descriptions-item label="汽车修理厂">{{ pageInfo&&pageInfo.storeName?pageInfo.storeName:'--' }}</a-descriptions-item>
+              <a-descriptions-item label="货架归属">{{ pageInfo&&pageInfo.ownerType==1?'自有':'平台' }}</a-descriptions-item>
+              <a-descriptions-item label="货架图片" v-if="pageInfo&&pageInfo.ownerType==1">
+                <div v-if="pageInfo && pageInfo.images&&pageInfo.images.length>0">
+                  <img :src="pageInfo.images[0]|| ''" width="30" height="30" class="imageUrl" @click="inited(pageInfo.images)" /> {{ '共'+pageInfo?pageInfo.images.length+'张':'' }}
+                </div>
+                <span v-else>--</span>
+              </a-descriptions-item>
+              <a-descriptions-item label="备注">{{ pageInfo&&pageInfo.remarks?pageInfo.remarks:'--' }}</a-descriptions-item>
+            </a-descriptions>
+          </a-collapse-panel>
+        </a-collapse>
+      </a-card>
+      <a-card :bordered="false" size="small" class="pages-wrap">
+        <div class="goodsAllocationSet-baseInfo">
+          <a-button id="goodsAllocationSet-addHW" @click="pageInfo&&pageInfo.state=='NOT_ENABLE'? addHW(0,pageInfo):addHW(1,pageInfo)" type="primary">{{ pageInfo&&pageInfo.state=='NOT_ENABLE'? '批量导入货位':'新增货位' }}</a-button>
+        </div>
+        <a-table
+          class="sTable fixPagination"
+          ref="table"
+          size="small"
+          :pagination="false"
+          :columns="pageInfo&&pageInfo.state=='NOT_ENABLE'?columns:columnsDat"
+          :data-source="loadData"
+          bordered>
+          <template slot="status" slot-scope="text, record">
+            <a-button size="small" type="link" id="goodsAllocationSet-handleEdit" @click="handleEdit(record)" v-if=" !record.shelfProductEntity">编辑</a-button>
+            <a-button size="small" type="link" id="goodsAllocationSet-handleDel" @click="handleDel(record)" v-if=" !record.shelfProductEntity">删除</a-button>
+            <span v-if="record.shelfProductEntity" style="display: inline-block;padding-left: 7px;">--</span>
+            <!-- <span v-if="!($hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1) && !(record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')) && !(record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del'))">--</span> -->
+          </template>
+        </a-table>
+      </a-card>
+      <!-- 导入货位模板 -->
+      <importHuoweiModal :openModal="openModal" @close="openModal=false" @refresh="getHwList" :shelfSn="shelfSn" @ok="handleOk"></importHuoweiModal>
+      <!-- 新增货位 -->
+      <addHWModal :openHWModal="openHWModal" @refresh="getHwList" :shelfSn="shelfSn" :shelfPlaceSn="shelfPlaceSn" @close="openHWModal=false"></addHWModal>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import {
+  STable
+} from '@/components'
+import { shelfDetail, shelfHWList, delHw } from '@/api/shelf.js'
+import importHuoweiModal from './importHuoweiModal.vue'
+import addHWModal from './addHWModal.vue'
+export default {
+  components: {
+    STable, importHuoweiModal, addHWModal },
+  data () {
+    return {
+      spinning: false,
+      openModal: false, // 货位模板弹窗初始状态(批量导入)
+      openHWModal: false, // 新增货位初始弹窗
+      pageInfo: null,
+      itemData: null,
+      shelfSn: '', // 货架sn
+      shelfPlaceSn: '', // 当前行huoweisn
+      // 表头
+      columns: [{
+        title: '序号',
+        width: '4%',
+        align: 'center',
+        customRender: function (text, record, index) {
+          return index + 1
+        }
+      },
+      {
+        title: '货位号',
+        dataIndex: 'shelfPlaceCode',
+        width: '11%',
+        align: 'center',
+        customRender: function (text) {
+          return text || '--'
+        }
+      },
+      {
+        title: '创建时间',
+        dataIndex: 'createDate',
+        width: '13%',
+        align: 'center',
+        customRender: function (text) {
+          return text || '--'
+        }
+      },
+      {
+        title: '最后修改时间',
+        dataIndex: 'updateDate',
+        width: '18%',
+        align: 'center',
+        customRender: function (text) {
+          return text || '--'
+        },
+        ellipsis: true
+      },
+      {
+        title: '操作',
+        width: '9%',
+        align: 'left',
+        scopedSlots: {
+          customRender: 'status'
+        }
+      }
+      ],
+      columnsDat: [
+        {
+          title: '序号',
+          width: '4%',
+          align: 'center',
+          customRender: function (text, record, index) {
+            return index + 1
+          }
+        },
+        {
+          title: '货位号',
+          dataIndex: 'shelfPlaceCode',
+          width: '11%',
+          align: 'center',
+          customRender: function (text) {
+            return text || '--'
+          }
+        },
+        {
+          title: '绑定产品编码',
+          dataIndex: 'shelfProductEntity.productCode',
+          width: '10%',
+          align: 'center',
+          customRender: function (text) {
+            return text || ''
+          }
+        },
+        {
+          title: '绑定产品',
+          dataIndex: 'shelfProductEntity.productName',
+          width: '16%',
+          align: 'left',
+          customRender: function (text) {
+            return text || ''
+          }
+        },
+        {
+          title: '创建时间',
+          dataIndex: 'createDate',
+          width: '18%',
+          align: 'center',
+          customRender: function (text) {
+            return text || '--'
+          },
+          ellipsis: true
+        },
+        {
+          title: '操作',
+          width: '9%',
+          align: 'left',
+          scopedSlots: {
+            customRender: 'status'
+          }
+        }
+      ],
+      loadData: []
+    }
+  },
+  methods: {
+    handleBack () {
+      this.$router.go(-1)
+    },
+    // 查看图片
+    inited (viewer) {
+      if (viewer) {
+        const imageUrl = []
+        viewer.map(item => {
+          imageUrl.push(item.imageUrl)
+        })
+        this.$viewerApi({
+          images: imageUrl
+        })
+      }
+    },
+    // 导入或新增
+    addHW (type, val) {
+      console.log(type, val, '=========val')
+      this.shelfSn = val.shelfSn
+      if (type == 0) {
+        this.openModal = true
+      } else {
+        this.openHWModal = true
+      }
+    },
+    // 获取货位列表
+    getHwList () {
+      this.spinning = true
+      shelfHWList(Object.assign({ shelfSn: this.$route.params.shelfSn, shelfProductEntity: {} })).then(res => {
+        if (res.status == 200) {
+          this.loadData = res.data
+        }
+        this.spinning = false
+      })
+    },
+    // 删除
+    handleDel (row) {
+      const _this = this
+      this.$confirm({
+        title: '警告',
+        content: '删除后无法恢复,确认删除?',
+        centered: true,
+        onOk () {
+          _this.spinning = true
+          delHw({
+            shelfPlaceSn: row.shelfPlaceSn
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.getHwList()
+            }
+            _this.spinning = false
+          })
+        }
+      })
+    },
+    // 编辑
+    handleEdit (row) {
+      this.shelfPlaceSn = row.shelfPlaceSn
+      this.shelfSn = row.shelfSn
+      this.openHWModal = true
+    },
+    // 货架详情
+    getShelfDetail () {
+      this.spinning = true
+      shelfDetail({
+        shelfSn: this.$route.params.shelfSn
+      }).then(res => {
+        if (res.status == 200) {
+          this.pageInfo = Object.assign({}, res.data)
+          if (this.pageInfo.ownerType == 1 && this.pageInfo.images) {
+            this.pageInfo.images = this.pageInfo.images.split(',')
+          }
+        } else {
+          this.pageInfo = null
+        }
+        this.spinning = false
+      })
+    },
+    // 货位导入成功
+    handleOk (obj) {
+      console.log(obj, 'obj')
+      this.getHwList()
+    },
+    pageInit () {
+      this.getShelfDetail()
+      this.getHwList()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {})
+  }
+}
+</script>
+
+<style lang="less">
+  .goodsAllocationSet-page {
+    position: relative;
+    height: 100%;
+    padding-bottom: 51px;
+    box-sizing: border-box;
+
+    .goodsAllocationSet-baseInfo {
+      margin-bottom: 10px;
+    }
+  }
+</style>

+ 197 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/importHuoweiModal.vue

@@ -0,0 +1,197 @@
+<template>
+  <a-modal
+    centered
+    class="importHuoweiModal-modal"
+    :footer="null"
+    :maskClosable="false"
+    title="批量导入货位"
+    v-model="isShow"
+    @cancle="isShow=false"
+    :width="750">
+    <div class="importHuoweiModal-con">
+      <div class="explain-con">
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>1</span>下载导入模板
+            <p>请按照下载的Excel模板填写数据</p>
+            <a :href="filePath" style="padding: 5px 0 0 23px;display: block;">
+              <a-icon type="download" style="padding-right: 5px;" />下载导入模板
+            </a>
+          </div>
+        </div>
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>1</span>准备导入数据
+          </div>
+          <ul>
+            <li>1) 导入的Excel文件中必须包含名为“货位号”的列,且名称必须相同</li>
+            <li>2) 除了“货位号”一列,其他列可自定义,不影响数据导入</li>
+            <li>3) 注意:使用此功能时,现有的货位将会被全部删除,即覆盖导入的方式,请谨慎操作</li>
+          </ul>
+
+        </div>
+        <div class="explain-item">
+          <div class="explain-tit">
+            <span>2</span>上传数据文件
+          </div>
+          <p>目前支持的文件类型*.xls,*.xlsx.</p>
+          <div style="overflow: hidden;padding-left: 23px;">
+            <Upload
+              id="importHuoweiModal-attachList"
+              ref="importUpload"
+              :maxNums="1"
+              fileType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,application/vnd.ms-excel"
+              uploadType="import"
+              :action="attachAction"
+              :uploadParams="uploadParams"
+              upText="添加文件"
+              @change="changeImport"></Upload>
+          </div>
+        </div>
+      </div>
+      <!-- 按钮 -->
+      <div class="btn-con">
+        <a-button
+          type="primary"
+          id="importHuoweiModal-nextStep"
+          size="large"
+          class="button-primary"
+          @click="handlerNextStep"
+          style="padding: 0 60px;">下一步</a-button>
+        <a-button
+          id="importHuoweiModal-cancel"
+          size="large"
+          class="button-cancel"
+          @click="isShow=false"
+          style="padding: 0 60px;margin-left: 15px;">取消</a-button>
+      </div>
+    </div>
+    <!-- 导入 -->
+    <chooseImportModal :openModal="openImportModal" :paramsData="paramsData" @close="handleClose" @ok="hanldeOk" />
+  </a-modal>
+</template>
+
+<script>
+import ChooseImportModal from './chooseImportModal.vue'
+import { Upload } from '@/components'
+export default {
+  name: 'ImportHuoweiModalModal',
+  components: { ChooseImportModal, Upload },
+  props: {
+    openModal: { //  弹框显示状态
+      type: Boolean,
+      default: false
+    },
+    shelfSn: {
+      type: [String, Number],
+      default: ''
+    }
+  },
+  data () {
+    return {
+      isShow: this.openModal, //  是否打开弹框
+      openImportModal: false, //  导入
+      filePath: 'https://jg-ocs-test.oss-cn-beijing.aliyuncs.com/test/%E6%95%B0%E5%AD%97%E8%B4%A7%E6%9E%B6%E8%B4%A7%E4%BD%8D%E5%AF%BC%E5%85%A5%E6%A8%A1%E6%9D%BF.xlsx', // 文件地址
+      attachAction: process.env.VUE_APP_API_BASE_URL + '/upload',
+      paramsData: null,
+      uploadParams: {
+        savePathType: 'local'
+      }
+    }
+  },
+  methods: {
+    // 下一步
+    handlerNextStep () {
+      if (this.paramsData) {
+        this.openImportModal = true
+      } else {
+        this.$message.warning('添加文件后再进行下一步操作!')
+      }
+    },
+    // 上传文件  change
+    changeImport (file) {
+      if (file) {
+        this.paramsData = {
+          shelfSn: this.shelfSn || '',
+          path: file
+        }
+        console.log(this.paramsData, 'this.paramsData')
+      }
+    },
+    // 导入
+    hanldeOk (obj) {
+      if (obj && obj.length > 0) {
+        this.$emit('ok', obj)
+        this.isShow = false
+      }
+    },
+    // 关闭
+    handleClose () {
+      this.openImportModal = false
+      this.isShow = false
+    }
+  },
+  watch: {
+    //  父页面传过来的弹框状态
+    openModal (newValue, oldValue) {
+      this.isShow = newValue
+    },
+    //  重定义的弹框状态
+    isShow (newValue, oldValue) {
+      if (!newValue) {
+        this.$emit('close')
+        this.paramsData = null
+        this.$refs.importUpload.setFileList('')
+      }
+    }
+  }
+}
+</script>
+
+<style lang="less" scoped>
+  .importHuoweiModal-modal{
+    .importHuoweiModal-con{
+      .explain-con{
+        .explain-item{
+          margin-bottom: 10px;
+          .explain-tit{
+            font-weight: bold;
+            span{
+              display: inline-block;
+              width: 18px;
+              height: 18px;
+              line-height: 16px;
+              text-align: center;
+              margin-right: 5px;
+              border-radius: 50%;
+              border: 1px solid rgba(0, 0, 0, 0.3);
+            }
+          }
+          p{
+            margin: 8px 0;
+            padding-left: 23px;
+          }
+          ul{
+            list-style: none;
+            padding: 0;
+            padding-left: 23px;
+            margin: 0;
+            li{
+              line-height: 26px;
+            }
+          }
+        }
+        #importHuoweiModal-attachList{
+          width: 100%;
+        }
+      }
+      .btn-con{
+        margin: 10px 0 20px;
+        text-align: center;
+        .button-cancel{
+          font-size: 12px;
+        }
+      }
+    }
+  }
+</style>

+ 234 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/list.vue

@@ -0,0 +1,234 @@
+<template>
+  <a-card size="small" :bordered="false">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="货架名称">
+                <a-input id="goodsShelvesAdministrationList-shelfName" allowClear v-model.trim="queryParam.shelfName" placeholder="请输入货架名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="配件经销商">
+                <dealerList ref="dealerList" @change="dealerChange" id="goodsShelvesAdministrationList-dealerChange"></dealerList>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="汽车修理厂">
+                <storeList ref="storeList" @change="storeChange" id="goodsShelvesAdministrationList-storeChange"></storeList>
+              </a-form-item>
+            </a-col>
+            <template v-if="advanced">
+              <a-col :md="6" :sm="24">
+                <a-form-item label="货架状态">
+                  <v-select id="goodsShelvesAdministrationList-state" code="SHELF_STATE" v-model="queryParam.state" allowClear placeholder="请选择状态"></v-select>
+                </a-form-item>
+              </a-col>
+              <a-col :md="6" :sm="24">
+                <a-form-item label="结算状态">
+                  <v-select id="goodsShelvesAdministrationList-settleType" code="SHELF_SETTLE_TYPE" v-model="queryParam.settleType" allowClear placeholder="请选择状态"></v-select>
+                </a-form-item>
+              </a-col>
+            </template>
+            <a-col :md="4" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" id="goodsShelvesAdministrationList-search">查询</a-button>
+              <a-button type="" @click="reset" id="goodsShelvesAdministrationList-reset" style="margin-left: 10px;">重置</a-button>
+              <a @click="advanced=!advanced" style="margin-left: 8px">
+                {{ advanced ? '收起' : '展开' }}
+                <a-icon :type="advanced ? 'up' : 'down'"/>
+              </a>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <div class="table-operator">
+        <a-button size="small" type="primary" class="button-error" @click="handleEdit()" id="goodsShelvesAdministrationList-handleEdit">新增数字货架</a-button>
+      </div>
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px', wordBreak: 'break-all' }"
+        size="small"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+        <template slot="state" slot-scope="text, record">
+          <div @click="changeFlagHandle(record)" style="cursor:pointer;" id="goodsShelvesAdministrationList-changeFlagHandle">{{ record.stateDictValue }}<a-icon v-if="record.state!='CLOSE'" type="edit" title="编辑" :style="{color:' #1890FF',paddingLeft: '5px'}"/></div>
+        </template>
+        <template slot="action" slot-scope="text, record">
+          <a-button size="small" type="link" class="button-info" @click="handleEdit(record)" id="goodsShelvesAdministrationList-handleEdit">编辑</a-button>
+          <a-button size="small" type="link" class="button-info" @click="handleSet(record)" id="goodsShelvesAdministrationList-handleSet">货位设置</a-button>
+          <a-button size="small" type="link" class="button-info" @click="handleSettlement(record)" id="goodsShelvesAdministrationList-handleSettlement">结算设置</a-button>
+          <!-- <span v-if="!($hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1) && !(record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')) && !(record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del'))">--</span> -->
+        </template>
+      </s-table>
+    </a-spin>
+    <!--新增/编辑数字货架 -->
+    <addGoodsShelve :visible="showModal" @refresh="$refs.table.refresh(true)" :nowData="itemData" @close="handleUserCancel"></addGoodsShelve>
+    <!-- 货架状态更改 -->
+    <changeStatusModal :openStatusModal="openStatusModal" :nowData="itemData" @refresh="$refs.table.refresh()" @close="openStatusModal=false"></changeStatusModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import addGoodsShelve from './addGoodsShelve.vue'
+import changeStatusModal from './changeStatusModal.vue'
+import { getShelfList } from '@/api/shelf.js'
+import dealerList from '@/views/common/dealerList.vue'
+import storeList from '@/views/common/storeList.vue'
+export default {
+  name: 'UserList',
+  components: { STable, VSelect, addGoodsShelve, changeStatusModal, storeList, dealerList },
+  data () {
+    return {
+      spinning: false,
+      advanced: false,
+      tableHeight: 0,
+      // 查询参数
+      queryParam: {
+        dealerSn: undefined, // 配件经销商sn
+        shelfName: '', // 货架名称
+        state: '', // 货架状态
+        settleType: '', // 结算状态
+        storeSn: undefined, // 汽车修理厂
+        state: undefined// 货架状态
+      },
+      showModal: false,
+      itemData: null, // 编辑行数据
+      openStatusModal: false, // 货架状态弹窗初始状态
+      // 表头
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '货架名称', dataIndex: 'shelfName', width: '17%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '配件经销商', dataIndex: 'dealerName', width: '17%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '汽车修理厂', dataIndex: 'storeName', width: '17%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '货位数量', dataIndex: 'shelfPlaceNum', width: '7%', align: 'center', customRender: function (text) { return (text || text == 0) ? text : '--' } },
+        { title: '结算方式', dataIndex: 'settleTypeDictValue', width: '7%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: <div>货架状态&nbsp;<a-tooltip placement='top' title='货架状态'><a-icon type="question-circle" /></a-tooltip></div>, width: '7%', align: 'center', scopedSlots: { customRender: 'state' } },
+        { title: '创建时间', dataIndex: 'createDate', width: '8%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '操作', width: '15%', align: 'left', scopedSlots: { customRender: 'action' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        return getShelfList(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (let i = 0; i < data.list.length; i++) {
+              const _item = data.list[i]
+              _item.no = no + i + 1
+            }
+          }
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  methods: {
+    // 经销商 change
+    dealerChange (obj) {
+      this.queryParam.dealerSn = obj.key || undefined
+    },
+    // 汽车修理厂 change
+    storeChange (obj) {
+      this.queryParam.storeSn = obj.key || undefined
+    },
+    // 新增
+    openModal () {
+      this.itemData = null
+      this.showModal = true
+    },
+    // 关闭弹框
+    handleUserCancel () {
+      this.showModal = false
+      this.itemData = null
+    },
+    // 重置
+    reset () {
+      this.queryParam = {
+        dealerSn: undefined, // 配件经销商sn
+        shelfName: '', // 货架名称
+        settleType: '', // 结算状态
+        storeSn: undefined, // 汽车修理厂
+        state: undefined// 货架状态
+      }
+      this.$refs.dealerList.resetForm()
+      this.$refs.storeList.resetForm()
+      this.$refs.table.refresh(true)
+    },
+    // 编辑
+    handleEdit (row) {
+      console.log(row, 'row')
+      this.showModal = true
+      if (row) { //  编辑
+        this.itemData = row
+      }
+    },
+    // 货位设置
+    handleSet (row) {
+      this.$router.push({ name: 'goodsAllocationSet', params: { shelfSn: row.shelfSn } })
+    },
+    // 结算设置
+    handleSettlement (row) {
+      this.$router.push({ name: 'settlementSet', params: { shelfSn: row.shelfSn } })
+    },
+    // 修改状态
+    changeFlagHandle (row) {
+      console.log(row, '------------状态')
+      this.itemData = row
+      if (row.state != 'CLOSE') {
+        this.openStatusModal = true
+      }
+    },
+    pageInit () {
+      const _this = this
+      _this.$refs.table.refresh()
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 215
+    }
+  },
+  watch: {
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  mounted () {
+    this.pageInit()
+    // this.reset()
+    // if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+    //   this.pageInit()
+    //   this.reset()
+    // }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+      vm.$refs.table.refresh()
+    })
+  }
+  // activated () {
+  //   // 如果是新页签打开,则重置当前页面
+  //   if (this.$store.state.app.isNewTab) {
+  //     this.pageInit()
+  //     this.resetSearchForm()
+  //   }
+  //   // 仅刷新列表,不重置页面
+  //   if (this.$store.state.app.updateList) {
+  //     this.pageInit()
+  //     this.$refs.table.refresh()
+  //   }
+  // }
+}
+</script>

+ 262 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/settlementModifyModal.vue

@@ -0,0 +1,262 @@
+<template>
+  <div>
+    <a-modal
+      centered
+      wrapClassName="settlementModifyModal-modal"
+      :footer="null"
+      :maskClosable="false"
+      title="修改结算方式"
+      v-model="isshow"
+      @cancle="handleBack"
+      :width="650">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <a-form-model
+          id="settlementModifyModal-form"
+          ref="ruleForm"
+          :model="form"
+          :rules="rules"
+          :label-col="formItemLayout.labelCol"
+          :wrapper-col="formItemLayout.wrapperCol"
+        >
+          <a-row :gutter="24">
+            <a-col :span="20">
+              <a-form-model-item label="当前结算方式">
+                {{ settleInfo&&settleInfo.settleType=='CREDIT'?'授信结算':'按月结算' }}
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="20">
+              <a-form-model-item label="结算方式" prop="settleType">
+                <a-select
+                  style="background-color: none;"
+                  placeholder="请选择结算方式"
+                  id="settlementModifyModal-settleType"
+                  allowClear
+                  v-model="form.settleType"
+                >
+                  <a-select-option v-for="item in settlementTypeList" :key="item.code" :value="item.code" :disabled="settleInfo&&settleInfo.settleType==item.code?true:false">{{ item.name }}</a-select-option>
+                </a-select>
+              </a-form-model-item>
+            </a-col>
+            <a-row v-if="form.settleType=='CREDIT'">
+              <a-col :span="20">
+                <a-form-model-item label="授信额度" prop="creditLimit">
+                  <a-input-number
+                    id="settlementModifyModal-creditLimit"
+                    v-model="form.creditLimit"
+                    :precision="2"
+                    :min="0.01"
+                    :max="999999"
+                    placeholder="请输入正数(最多允许两位小数)"
+                    style="width: 100%;display: inline-block;" />
+                </a-form-model-item>
+              </a-col>
+              <a-col :span="4"> <span style="display: inline-block; padding: 10px;">元</span></a-col>
+            </a-row>
+            <a-col :span="20" v-if="form.settleType=='MONTH'">
+              <a-form-model-item label="结算日期" prop="settleDay" >
+                <div style="display: flex;padding: 0;align-items: center;">
+                  <span style="display: inline-block;margin-right: 10px;">每月</span>
+                  <a-select
+                    style="background-color: none;width: 65%"
+                    placeholder="请选择结算日期"
+                    id="settlementModifyModal-settleDay"
+                    allowClear
+                    v-model="form.settleDay"
+                  >
+                    <a-select-option v-for="item in dateList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                  </a-select>
+                  <span style="display: inline-block;margin-left: 10px;">号</span>
+                </div>
+              </a-form-model-item>
+            </a-col>
+            <a-row v-if="form.settleType=='CREDIT'">
+              <a-col :span="20">
+                <a-form-model-item label="结算提醒金额" prop="creditWarnLimit" >
+                  <a-input-number
+                    id="settlementModifyModal-creditWarnLimit"
+                    v-model="form.creditWarnLimit"
+                    :precision="2"
+                    :min="0.01"
+                    :max="form.creditLimit-0.1"
+                    placeholder="请输入正数(最多允许两位小数)"
+                    style="width: 100%;display: inline-block;" />
+                </a-form-model-item>
+              </a-col>
+              <a-col :span="4"> <span style="display: inline-block; padding: 10px;">元</span></a-col>
+            </a-row>
+            <a-col :span="20" v-if="form.settleType=='MONTH'">
+              <a-form-model-item label="结算提醒" prop="warnBeforeDays" >
+                <div style="display: flex;padding: 0;align-items: center;">
+                  <span style="display: inline-block;margin-right: 10px;">提前</span>
+                  <a-select
+                    style="background-color: none;width: 65%;"
+                    placeholder="请选择结算提醒日期"
+                    id="settlementModifyModal-warnBeforeDays"
+                    allowClear
+                    v-model="form.warnBeforeDays"
+                  >
+                    <a-select-option v-for="item in dateTXList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                  </a-select>
+                  <span style="display: inline-block;margin-left: 10px;">天开始提醒</span>
+                </div>
+              </a-form-model-item>
+            </a-col>
+            <a-col :span="20">
+              <a-form-model-item :label="form.settleType=='CREDIT'?'超过授信额度':'超期未结算'" v-if="form.settleType">
+                <a-checkbox id="settlementModifyModal-onChange" :checked="form.limitFlag==1">
+                  限制汽车修理厂无法使用数字货架
+                </a-checkbox>
+              </a-form-model-item>
+            </a-col>
+          </a-row>
+          <a-form-model-item :label-col="{span: 0}" :wrapper-col="{span: 24}" style="text-align: center;">
+            <a-button type="primary" @click="handleSubmit()" :style="{ marginRight: '8px' }" id="settlementModifyModal-handleSubmit">保存</a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="handleBack" id="settlementModifyModal-handleBack">取消</a-button>
+          </a-form-model-item>
+        </a-form-model>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect, Upload } from '@/components'
+import { shelfSettleRuleSave } from '@/api/shelf.js'
+export default {
+  name: 'SettlementModifyModal',
+  components: {
+    STable, VSelect, Upload
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    shelfInfo: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    },
+    settleInfo: {
+      type: Object,
+      default: function () {
+        return {}
+      }
+    }
+  },
+  data () {
+    return {
+      spinning: false,
+      isshow: this.visible,
+      roleList: [],
+      formItemLayout: {
+        labelCol: { span: 10 },
+        wrapperCol: { span: 14 }
+      },
+      settlementTypeList: [{ code: 'MONTH', name: '按月结算' }, { code: 'CREDIT', name: '授信结算' }],
+      dateList: [{ id: 1, name: 1 }, { id: 2, name: 2 }, { id: 3, name: 3 }, { id: 4, name: 4 }, { id: 5, name: 5 }, { id: 6, name: 6 }, { id: 7, name: 7 }, { id: 8, name: 8 }, { id: 9, name: 9 }, { id: 10, name: 10 }, { id: 11, name: 11 }, { id: 12, name: 12 }, { id: 13, name: 13 }, { id: 14, name: 14 }, { id: 15, name: 15 }, { id: 16, name: 16 }, { id: 17, name: 17 }, { id: 18, name: 18 }, { id: 19, name: 19 }, { id: 20, name: 20 }, { id: 21, name: 21 }, { id: 22, name: 22 }, { id: 23, name: 23 }, { id: 24, name: 24 }, { id: 25, name: 25 }],
+      dateTXList: [{ id: 1, name: 1 }, { id: 2, name: 2 }, { id: 3, name: 3 }, { id: 4, name: 4 }, { id: 5, name: 5 }, { id: 6, name: 6 }, { id: 7, name: 7 }, { id: 8, name: 8 }, { id: 9, name: 9 }, { id: 10, name: 10 }],
+      form: {
+        settleType: undefined, // 结算方式
+        creditLimit: '', // 授信额度
+        creditWarnLimit: '', // 结算提醒金额
+        settleDay: undefined, // 每月结算日
+        warnBeforeDays: undefined, // 结算提醒提前天数
+        limitFlag: ''// 是否限制使用
+      },
+      rules: {
+        settleType: [ { required: true, message: '请选择结算方式', trigger: 'change' } ],
+        creditLimit: [ { required: true, message: '请输入授信额度', trigger: 'blur' } ],
+        creditWarnLimit: [{ required: true, message: '请输入结算提醒金额', trigger: 'blur' }],
+        settleDay: [ { required: true, message: '请选择每月结算日期', trigger: 'change' } ],
+        warnBeforeDays: [ { required: true, message: '请选择每月结算提醒提前的日期', trigger: 'change' } ]
+      }
+    }
+  },
+  methods: {
+    // 过滤空格
+    filterEmpty () {
+      let str = this.form.name
+      str = str.replace(/\ +/g, '')
+      str = str.replace(/[ ]/g, '')
+      str = str.replace(/[\r\n]/g, '')
+      this.form.name = str
+    },
+    // 改变货架归属
+    changeRadio (e) {
+      this.form.loginFlag = e.target.value
+      console.log(e.target.value, '=========')
+    },
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = Object.assign({}, _this.form)
+          if (params.limitFlag == '') {
+            params.limitFlag = 0
+          }
+          if (this.shelfInfo) {
+            console.log(this.shelfInfo, 'this.nowData')
+            params.shelfSn = this.shelfInfo.shelfSn
+            params.storeSn = this.shelfInfo.storeSn
+            params.dealerSn = this.shelfInfo.dealerSn
+          }
+          if (this.settleInfo) {
+            params.bondAmount = this.settleInfo.bondAmount
+            params.bondFlag = this.settleInfo.bondFlag
+            params.id = this.settleInfo.id
+          }
+          _this.spinning = true
+          shelfSettleRuleSave(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('close', params.settleType)
+              setTimeout(function () {
+                _this.isshow = false
+                _this.spinning = false
+              }, 300)
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    handleBack () {
+      this.form = {
+        settleType: undefined, // 结算方式
+        creditLimit: '', // 授信额度
+        creditWarnLimit: '', // 结算提醒金额
+        settleDay: undefined, // 每月结算日
+        warnBeforeDays: undefined, // 结算提醒提前天数
+        limitFlag: 0 // 是否限制使用
+      }
+      this.$refs.ruleForm.resetFields()
+      this.$emit('close')
+    }
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (!newValue) {
+        this.$refs.ruleForm.resetFields()
+        this.$emit('close')
+      }
+    }
+  }
+}
+</script>
+<style lang="less">
+.settlementModifyModal-modal{
+  .ant-input-number-handler-wrap{
+    display: none;
+  }
+}
+</style>

+ 423 - 0
src/views/numsGoodsShelves/goodsShelvesAdministration/settlementSet.vue

@@ -0,0 +1,423 @@
+<template>
+  <div class="settlementSet-page">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <a-page-header :ghost="false" :backIcon="false" class="settlementSet-baseInfo">
+        <template slot="subTitle">
+          <a href="javascript:;" @click="handleBack" id="settlementSet-handleBack">
+            <a-icon type="left"></a-icon> 返回列表
+          </a>
+          <span style="margin: 0 15px;color: #666;font-weight: bold;">{{ pageInfo&&pageInfo.shelfName?pageInfo.shelfName:'--' }}</span>
+        </template>
+      </a-page-header>
+      <a-card :bordered="false" size="small" class="settlementSet-baseInfo">
+        <a-collapse :activeKey="['1']">
+          <a-collapse-panel key="1" header="基础信息">
+            <a-descriptions size="small" :column="3">
+              <a-descriptions-item label="配件经销商">{{ pageInfo&&pageInfo.dealerName?pageInfo.dealerName:'--' }}</a-descriptions-item>
+              <a-descriptions-item label="汽车修理厂">{{ pageInfo&&pageInfo.storeName?pageInfo.storeName:'--' }}</a-descriptions-item>
+              <a-descriptions-item label="货架归属">{{ pageInfo&&pageInfo.ownerType==1?'自有':'平台' }}</a-descriptions-item>
+              <a-descriptions-item label="货架图片" v-if="pageInfo&&pageInfo.ownerType==1">
+                <div v-if="pageInfo && pageInfo.images&&pageInfo.images.length>0">
+                  <img :src="pageInfo.images[0]|| ''" width="30" height="30" class="imageUrl" @click="inited(pageInfo.images)" /> {{ '共'+pageInfo.images.length+'张' }}
+                </div>
+                <span v-else>--</span>
+              </a-descriptions-item>
+              <a-descriptions-item label="备注">{{ pageInfo&&pageInfo.remarks?pageInfo.remarks:'--' }}</a-descriptions-item>
+            </a-descriptions>
+          </a-collapse-panel>
+        </a-collapse>
+        <a-collapse :activeKey="['1']" class="bzj-collapse" v-if="pageInfo&&pageInfo.settleType">
+          <a-collapse-panel key="1" header="保证金 ( 保证金的新增/编辑/删除请在左侧菜单“保证金管理”功能中操作 )">
+            <s-table
+              class="sTable fixPagination"
+              ref="table"
+              size="small"
+              rowKey="id"
+              :showPagination="false"
+              :columns="columns"
+              :data="loadData"
+              :defaultLoadData="true"
+              bordered>
+              <template slot="status" slot-scope="text, record">
+                <a-button type="link" @click="handleEdit(record)" id="settlementSet-handleEdit">编辑</a-button>
+                <a-button type="link" @click="handleDel(record)" id="settlementSet-handleDel">删除</a-button>
+              <!-- <span v-if="!($hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1) && !(record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')) && !(record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del'))">--</span> -->
+              </template>
+            </s-table>
+          </a-collapse-panel>
+        </a-collapse>
+      </a-card>
+      <a-card :bordered="false" size="small" class="pages-wrap">
+        <div class="settlementSet-baseInfo">
+          <a-form-model
+            id="settlementSet-form"
+            ref="ruleForm"
+            :model="form"
+            :rules="rules"
+            :label-col="formItemLayout.labelCol"
+            :wrapper-col="formItemLayout.wrapperCol"
+          >
+            <a-row :gutter="24">
+              <a-row>
+                <a-col :span="15">
+                  <a-form-model-item label="结算方式" prop="settleType">
+                    <v-select
+                      id="settlementSet-settleType"
+                      code="SHELF_SETTLE_TYPE"
+                      v-model="form.settleType"
+                      allowClear
+                      placeholder="请选择结算方式"
+                      :disabled="pageInfo&&pageInfo.settleType?true:false">
+                    </v-select>
+                  </a-form-model-item>
+                </a-col>
+                <a-col :span="1"><a-button
+                  size="small"
+                  type="link"
+                  id="settlementSet-handleModify"
+                  @click="handleModify(pageInfo,settleInfo)"
+                  v-if="pageInfo&&pageInfo.settleType"
+                  style="padding-top: 10px;">修改</a-button></a-col>
+              </a-row>
+              <a-row v-if="form.settleType=='CREDIT'">
+                <a-col :span="15">
+                  <a-form-model-item label="授信额度" prop="creditLimit">
+                    <a-input-number
+                      id="settlementSet-creditLimit"
+                      v-model="form.creditLimit"
+                      :precision="2"
+                      :min="0.01"
+                      :max="999999"
+                      placeholder="请输入正数(最多允许两位小数)"
+                      style="width: 100%;display: inline-block;" />
+                  </a-form-model-item>
+                </a-col>
+                <a-col :span="1"> <span style="display: inline-block; padding: 10px;">元</span></a-col>
+              </a-row>
+              <a-col :span="15">
+                <a-form-model-item label="结算日期" prop="settleDay" v-if="form.settleType=='MONTH'">
+                  <div style="display: flex;padding: 0;align-items: center;">
+                    <span style="display: inline-block;margin-right: 10px;">每月</span>
+                    <a-select
+                      style="background-color: none;width: 65%;"
+                      placeholder="请选择结算日期"
+                      id="settlementSet-settleDay"
+                      allowClear
+                      v-model="form.settleDay"
+                    >
+                      <a-select-option v-for="item in dateList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                    </a-select>
+                    <span style="display: inline-block;margin-left: 10px;">号</span>
+                  </div>
+
+                </a-form-model-item>
+              </a-col>
+              <a-row v-if="form.settleType=='CREDIT'">
+                <a-col :span="15">
+                  <a-form-model-item label="结算提醒金额" prop="creditWarnLimit" >
+                    <a-input-number
+                      id="settlementSet-creditWarnLimit"
+                      v-model="form.creditWarnLimit"
+                      :precision="2"
+                      :min="0.01"
+                      :max="form.creditLimit-0.1"
+                      placeholder="请输入正数(最多允许两位小数)"
+                      style="width: 100%;display: inline-block;" />
+                  </a-form-model-item>
+                </a-col>
+                <a-col :span="1"> <span style="display: inline-block; padding: 10px;">元</span></a-col>
+              </a-row>
+              <a-col :span="15">
+                <a-form-model-item label="结算提醒" prop="warnBeforeDays" v-if="form.settleType=='MONTH'">
+                  <div style="display: flex;padding: 0;align-items: center;">
+                    <span style="display: inline-block;margin-right: 10px;">提前</span>
+                    <a-select
+                      style="background-color: none;width: 65%;"
+                      placeholder="请选择结算提醒日期"
+                      id="settlementSet-warnBeforeDays"
+                      allowClear
+                      v-model="form.warnBeforeDays"
+                    >
+                      <a-select-option v-for="item in dateTXList" :key="item.id" :value="item.id">{{ item.name }}</a-select-option>
+                    </a-select>
+                    <span style="display: inline-block;margin-left: 10px;">天开始提醒</span>
+                  </div>
+                </a-form-model-item>
+              </a-col>
+              <a-col :span="15" v-if="form.settleType">
+                <a-form-model-item :label="form.settleType=='CREDIT'?'超过授信额度':'超期未结算'">
+                  <a-checkbox @change="onChange" id="settlementSet-settleType" :checked="form.limitFlag==1">
+                    限制汽车修理厂无法使用数字货架
+                  </a-checkbox>
+                </a-form-model-item>
+              </a-col>
+              <a-col :span="15" v-if="pageInfo&&!pageInfo.settleType &&form.settleType ">
+                <a-form-model-item label="是否需要缴纳保证金" prop="bondFlag" >
+                  <a-radio-group name="radioGroup" v-model="form.bondFlag" @change="changeRadio" id="settlementSet-bondFlag">
+                    <a-radio :value="1">是</a-radio>
+                    <a-radio :value="0">否</a-radio>
+                  </a-radio-group>
+                </a-form-model-item>
+              </a-col>
+              <a-row v-if="form.settleType&&form.bondFlag&&isEdit">
+                <a-col :span="15">
+                  <a-form-model-item label="保证金缴纳金额" prop="bondAmount" >
+                    <a-input-number
+                      id="settlementSet-bondAmount"
+                      v-model="form.bondAmount"
+                      :precision="2"
+                      :min="0.01"
+                      :max="999999"
+                      placeholder="请输入正数(最多允许两位小数)"
+                      style="width: 100%;display: inline-block;" />
+                  </a-form-model-item>
+                </a-col>
+                <a-col :span="1"> <span style="display: inline-block; padding: 10px;">元</span></a-col>
+              </a-row>
+            </a-row>
+            <a-form-model-item :label-col="{span: 0}" :wrapper-col="{span: 24}" style="text-align: center;">
+              <a-button type="primary" @click="handleSubmit" id="settlementSet-handleSubmit">保存</a-button>
+            </a-form-model-item>
+          </a-form-model>
+        </div>
+      </a-card>
+      <!-- 修改结算方式弹窗 -->
+      <settlementModifyModal :visible="openModal" :settleInfo="settleInfo" :shelfInfo="pageInfo" @close="close"></settlementModifyModal>
+    </a-spin>
+  </div>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import { shelfDetail, shelfSettleRuleSave, settleRuleDetail } from '@/api/shelf.js'
+import { bondRecordList } from '@/api/boundRecord.js'
+import settlementModifyModal from './settlementModifyModal.vue'
+import { toThousands } from '@/libs/tools.js'
+export default {
+  components: { STable, settlementModifyModal, VSelect },
+  data () {
+    return {
+      spinning: false,
+      isEdit: false, // 货位号是否为编辑
+      openModal: false, // 货位模板弹窗初始状态
+      formItemLayout: {
+        labelCol: { span: 13 },
+        wrapperCol: { span: 11 }
+      },
+      settleInfo: null, // 结算详情
+      // shelfInfo: null, // 数字货架详情
+      settlementType: '', // 结算方式
+      pageInfo: null,
+      form: {
+        settleType: undefined, // 结算方式
+        creditLimit: '', // 授信额度
+        creditWarnLimit: '', // 结算提醒金额
+        settleDay: undefined, // 每月结算日
+        warnBeforeDays: undefined, // 结算提醒提前天数
+        limitFlag: '', // 是否限制使用
+        bondFlag: '', // 是否缴纳保证金
+        bondAmount: '' // 保证金金额
+      },
+      dateList: [{ id: 1, name: 1 }, { id: 2, name: 2 }, { id: 3, name: 3 }, { id: 4, name: 4 }, { id: 5, name: 5 }, { id: 6, name: 6 }, { id: 7, name: 7 }, { id: 8, name: 8 }, { id: 9, name: 9 }, { id: 10, name: 10 }, { id: 11, name: 11 }, { id: 12, name: 12 }, { id: 13, name: 13 }, { id: 14, name: 14 }, { id: 15, name: 15 }, { id: 16, name: 16 }, { id: 17, name: 17 }, { id: 18, name: 18 }, { id: 19, name: 19 }, { id: 20, name: 20 }, { id: 21, name: 21 }, { id: 22, name: 22 }, { id: 23, name: 23 }, { id: 24, name: 24 }, { id: 25, name: 25 }],
+      dateTXList: [{ id: 1, name: 1 }, { id: 2, name: 2 }, { id: 3, name: 3 }, { id: 4, name: 4 }, { id: 5, name: 5 }, { id: 6, name: 6 }, { id: 7, name: 7 }, { id: 8, name: 8 }, { id: 9, name: 9 }, { id: 10, name: 10 }],
+      rules: {
+        settleType: [ { required: true, message: '请选择结算方式', trigger: 'change' } ],
+        creditLimit: [ { required: true, message: '请输入授信额度', trigger: 'blur' } ],
+        creditWarnLimit: [{ required: true, message: '请输入结算提醒金额', trigger: 'blur' }],
+        settleDay: [ { required: true, message: '请选择每月结算日期', trigger: 'change' } ],
+        warnBeforeDays: [ { required: true, message: '请选择每月结算提醒提前的日期', trigger: 'change' } ],
+        bondFlag: [ { required: true, message: '请选择是否缴纳保证金', trigger: 'change' }],
+        bondAmount: [ { required: true, message: '请输入保证金金额', trigger: 'blur' }]
+      },
+      // 表头
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '10%', align: 'center', customRender: function (text, record, index) { return index + 1 || '--' } },
+        { title: '创建时间', dataIndex: 'createDate', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '保证金金额', dataIndex: 'bondAmount', width: '30%', align: 'right', customRender: function (text) { return toThousands(text, 2) || '--' } },
+        { title: '状态', dataIndex: 'stateDictValue', width: '20%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '支付时间', width: '20%', align: 'center', dataIndex: 'payDate' }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        return bondRecordList(Object.assign({ shelfSn: this.$route.params.shelfSn })).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (let i = 0; i < data.length; i++) {
+              const _item = data[i]
+              _item.no = no + i + 1
+            }
+          }
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  methods: {
+    handleBack () {
+      this.isEdit = false
+      this.form = {}
+      this.$refs.ruleForm.resetFields()
+      this.$router.push({ path: '/numsGoodsShelves/goodsShelvesAdministration/list' })
+      // this.$router.go(-1)
+    },
+    // 查看图片
+    inited (viewer) {
+      if (viewer) {
+        const imageUrl = []
+        viewer.map(item => {
+          imageUrl.push(item.imageUrl)
+        })
+        this.$viewerApi({
+          images: imageUrl
+        })
+      }
+    },
+    onChange (e) {
+      console.log(e.target.checked)
+      if (e.target.checked) {
+        this.form.limitFlag = 1
+      } else {
+        this.form.limitFlag = 0
+      }
+    },
+    //
+    changeRadio (e) {
+      this.isEdit = e.target.value
+    },
+    // 数字货架详情
+    getShelfDetail () {
+      this.spinning = true
+      shelfDetail({
+        shelfSn: this.$route.params.shelfSn
+      }).then(res => {
+        if (res.status == 200) {
+          this.pageInfo = Object.assign({}, res.data)
+          if (this.pageInfo.ownerType == 1 && this.pageInfo.images) {
+            this.pageInfo.images = this.pageInfo.images.split(',')
+          }
+          this.settlementType = this.pageInfo.settleType
+          console.log(this.form, 'this.form')
+          this.$nextTick(() => {
+            this.getSettleDetail()
+          })
+        } else {
+          this.pageInfo = null
+        }
+        this.spinning = false
+      })
+    },
+    // 结算详情
+    getSettleDetail () {
+      if (this.settlementType) {
+        console.log(this.settlementType, 'this.settlementType')
+        settleRuleDetail({ shelfSn: this.pageInfo.shelfSn, settleType: this.settlementType }).then(res => {
+          if (res.status == 200) {
+            this.form = Object.assign({}, res.data)
+            this.form.limitFlag = Number(this.form.limitFlag)
+
+            this.settleInfo = res.data
+          } else {
+            this.form = {}
+          }
+        })
+      }
+    },
+    close (type) {
+      console.log(type, 'type')
+      this.settlementType = type
+      this.openModal = false
+      this.getSettleDetail()
+      console.log(this.settlementType, 'this.settlementType')
+    },
+    handleEdit (row) {
+      this.isEdit = true
+    },
+    // 修改
+    handleModify (shelfVal, settleVal) {
+      console.log(shelfVal, settleVal, '----------修改')
+      this.pageInfo = shelfVal
+      this.settleInfo = settleVal
+      this.openModal = true
+      console.log('----------修改')
+    },
+    // 保存
+    handleSubmit () {
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        if (valid) {
+          const params = Object.assign({}, _this.form)
+          console.log(params, 'params')
+          if (params.limitFlag == '') {
+            params.limitFlag = 0
+          }
+          if (this.pageInfo) {
+            params.shelfSn = this.pageInfo.shelfSn
+            params.storeSn = this.pageInfo.storeSn
+            params.dealerSn = this.pageInfo.dealerSn
+          }
+          _this.spinning = true
+          shelfSettleRuleSave(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              setTimeout(function () {
+                _this.isshow = false
+                _this.spinning = false
+                _this.handleBack()
+              }, 300)
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    },
+    pageInit () {
+      this.getShelfDetail()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+    }
+  },
+  activated () {
+    // 如果是新页签打开或者进入新的子页(例:存在列表第2条数据编辑页页签时再打开第4条数据的编辑页),则重置当前页面
+    if (this.$store.state.app.isNewTab || !this.$store.state.app.isNewSubTab) {
+      this.pageInit()
+    }
+  },
+  beforeRouteEnter (to, from, next) {
+    next(vm => {
+    })
+  }
+}
+</script>
+
+<style lang="less">
+  .settlementSet-page{
+    position: relative;
+    height: 100%;
+    padding-bottom: 51px;
+    box-sizing: border-box;
+    .settlementSet-baseInfo{
+      margin-bottom: 10px;
+      .ant-input-number-handler-wrap{
+        display: none;
+      }
+    }
+    .bzj-collapse{
+      margin-top: 10px;
+      .ant-collapse-content-box{
+        padding: 10px !important;
+      }
+    }
+
+  }
+</style>

+ 159 - 0
src/views/numsGoodsShelves/partsDealerManagement/list.vue

@@ -0,0 +1,159 @@
+<template>
+  <a-card size="small" :bordered="false">
+    <a-spin :spinning="spinning" tip="Loading...">
+      <div ref="tableSearch" class="table-page-search-wrapper">
+        <a-form layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
+          <a-row :gutter="15">
+            <a-col :md="6" :sm="24">
+              <a-form-item label="配件经销商">
+                <dealerList ref="dealerList" @change="dealerChange"></dealerList>
+              </a-form-item>
+            </a-col>
+            <a-col :md="6" :sm="24">
+              <a-form-item label="平台商户号">
+                <a-input id="userList-name" allowClear v-model.trim="queryParam.merchantNo" placeholder="请输入货架名称"/>
+              </a-form-item>
+            </a-col>
+            <a-col :md="4" :sm="24" style="margin-bottom: 10px;">
+              <a-button type="primary" @click="$refs.table.refresh(true)" id="userList-search">查询</a-button>
+              <a-button type="" @click="reset" id="userList-reset" style="margin-left: 10px;">重置</a-button>
+            </a-col>
+          </a-row>
+        </a-form>
+      </div>
+      <s-table
+        class="sTable fixPagination"
+        ref="table"
+        :style="{ height: tableHeight+84.5+'px', wordBreak: 'break-all' }"
+        size="small"
+        rowKey="id"
+        :columns="columns"
+        :data="loadData"
+        :scroll="{ y: tableHeight }"
+        :defaultLoadData="false"
+        bordered>
+        <template slot="action" slot-scope="text, record" >
+          <a-button size="small" type="link" class="button-info" @click="handleEdit(record)">设置结算账户</a-button>
+          <!-- <span style="display:inline-block;padding-left:7px">--</span> -->
+        </template>
+      </s-table>
+    </a-spin>
+    <!--新增/编辑数字货架 -->
+    <setSHModal :visible="showModal" @refresh="$refs.table.refresh(true)" :nowData="itemData" @close="showModal=false"></setSHModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import setSHModal from './setSHModal.vue'
+import { merchantAccountByPage } from '@/api/merchantAccount.js'
+import dealerList from '@/views/common/dealerList.vue'
+import storeList from '@/views/common/storeList.vue'
+export default {
+  name: 'UserList',
+  components: { STable, VSelect, dealerList, storeList, setSHModal },
+  data () {
+    return {
+      spinning: false,
+      tableHeight: 0,
+      // 查询参数
+      queryParam: {
+        merchantNo: '',
+        bondRecordState: undefined
+      },
+      showModal: false,
+      itemData: null, // 编辑行数据
+      openStatusModal: false, // 货架状态弹窗初始状态
+      // 表头
+      columns: [
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '配件经销商(商户名称)', dataIndex: 'dealerEntity.dealerName', width: '25%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '联系人', dataIndex: 'dealerEntity.contact', width: '20%', align: 'left', customRender: function (text) { return text || '--' } },
+        { title: '联系电话', dataIndex: 'dealerEntity.dealerTelephone', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '合作状态', dataIndex: 'dealerEntity.cooperateFlagDictValue', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '平台商户号', dataIndex: 'merchantNo', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '操作', width: '10%', align: 'left', scopedSlots: { customRender: 'action' } }
+      ],
+      // 加载数据方法 必须为 Promise 对象
+      loadData: parameter => {
+        this.spinning = true
+        return merchantAccountByPage(Object.assign(parameter, this.queryParam)).then(res => {
+          let data
+          if (res.status == 200) {
+            data = res.data
+            const no = (data.pageNo - 1) * data.pageSize
+            for (let i = 0; i < data.list.length; i++) {
+              const _item = data.list[i]
+              _item.no = no + i + 1
+            }
+          }
+          this.spinning = false
+          return data
+        })
+      }
+    }
+  },
+  methods: {
+    // 经销商 change
+    dealerChange (obj) {
+      this.queryParam.merchantSn = obj.key || undefined
+    },
+    // 汽车修理厂 change
+    storeChange (obj) {
+      this.queryParam.storeSn = obj.key || undefined
+    },
+    // 新增/编辑
+    handleEdit (row) {
+      if (row) {
+        this.itemData = row
+      } else {
+        this.itemData = null
+      }
+      this.showModal = true
+      console.log(this.itemData, 'this.itemData')
+    },
+    // 重置
+    reset () {
+      this.queryParam = {
+        shelfName: '',
+        bondRecordState: undefined
+      }
+      this.$refs.dealerList.resetForm()
+      this.$refs.table.refresh(true)
+    },
+    pageInit () {
+      const _this = this
+      this.$nextTick(() => { // 页面渲染完成后的回调
+        _this.setTableH()
+      })
+    },
+    setTableH () {
+      const tableSearchH = this.$refs.tableSearch.offsetHeight
+      this.tableHeight = window.innerHeight - tableSearchH - 215
+    }
+  },
+  watch: {
+    '$store.state.app.winHeight' (newValue, oldValue) { //  窗口变更时,需同时更改表格高度
+      this.setTableH()
+    }
+  },
+  mounted () {
+    if (!this.$store.state.app.isNewTab) { // 页签刷新时调用
+      this.pageInit()
+      this.reset()
+    }
+  },
+  activated () {
+    // 如果是新页签打开,则重置当前页面
+    if (this.$store.state.app.isNewTab) {
+      this.pageInit()
+      this.reset()
+    }
+  }
+}
+</script>
+<style lang="less">
+  .ant-statistic-content-value-decimal{
+    font-size: 12px;
+  }
+</style>

+ 192 - 0
src/views/numsGoodsShelves/partsDealerManagement/setSHModal.vue

@@ -0,0 +1,192 @@
+<template>
+  <div>
+    <a-modal
+      centered
+      wrapClassName="setSHModal-modal"
+      :footer="null"
+      :maskClosable="false"
+      title="设置结算账户"
+      v-model="isshow"
+      @cancle="close"
+      :width="550">
+      <a-spin :spinning="spinning" tip="Loading...">
+        <a-alert :message="message" type="info" />
+        <a-form-model
+          id="setSHModal-form"
+          ref="ruleForm"
+          :model="form"
+          :rules="rules"
+          :labelCol="{span:5}"
+          :wrapperCol="{span:15}"
+        >
+          <a-form-model-item label="配件经销商" >
+            <span>{{ form.dealerEntity?form.dealerEntity.dealerName:'--' }}</span>
+          </a-form-model-item>
+          <a-form-model-item label="平台商户号" prop="merchantNo" >
+            <a-input id="setSHModal-merchantNo" allowClear v-model.trim="form.merchantNo" placeholder="请输入平台商户号"/>
+          </a-form-model-item>
+          <a-form-model-item label="结算账户名" prop="bankAccount">
+            <a-input id="setSHModal-bankAccount" allowClear v-model.trim="form.bankAccount" placeholder="请输入结算账户名"/>
+          </a-form-model-item>
+          <a-form-model-item label="结算账户号" prop="bankCard">
+            <a-input id="setSHModal-bankCard" allowClear v-model.trim="form.bankCard" placeholder="请输入结算账户号"/>
+          </a-form-model-item>
+          <a-form-model-item label="开户银行" prop="bankName">
+            <a-input id="setSHModal-bankName" allowClear v-model.trim="form.bankName" placeholder="请输入开户银行"/>
+          </a-form-model-item>
+          <a-form-model-item :label-col="{span: 0}" :wrapper-col="{span: 24}" style="text-align: center;">
+            <a-button type="primary" @click="handleSubmit()" :style="{ marginRight: '8px' }" id="setSHModal-handleSubmit">保存</a-button>
+            <a-button :style="{ marginLeft: '8px' }" @click="close" id="setSHModal-close">取消</a-button>
+          </a-form-model-item>
+        </a-form-model>
+      </a-spin>
+    </a-modal>
+  </div>
+</template>
+
+<script>
+import { saveMerchantAccount, merchantAccountDetail } from '@/api/merchantAccount.js'
+export default {
+  name: 'SetSHModal',
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    nowData: {
+      type: Object,
+      default: function () {
+        return null
+      }
+    }
+  },
+
+  data () {
+    return {
+      spinning: false,
+      isshow: this.visible,
+      message: '以下结算账户信息需要与进件时填写的资料保持一直否则将无法体现成功',
+      pageInfo: null,
+      form: {
+        dealerEntity: {
+          dealerName: ''
+        },
+        bankName: '', // 开户行
+        bankAccount: '', // 账户名
+        bankCard: '', // 账户号
+        merchantNo: '' // 商户号
+      },
+      rules: {
+        merchantNo: [ { required: true, message: '请输入保证金金额', trigger: 'blur' } ],
+        bankName: [ { required: true, message: '请输入开户银行', trigger: 'blur' } ],
+        bankAccount: [ { required: true, message: '请输入结算账户名', trigger: 'blur' } ],
+        bankCard: [ { required: true, message: '请输入结算账户号', trigger: 'blur' } ]
+      }
+    }
+  },
+  methods: {
+    close (e) {
+      this.form = {
+        dealerEntity: {
+          dealerName: ''
+        },
+        bankName: '', // 开户行
+        bankAccount: '', // 账户名
+        bankCard: '', // 账户号
+        merchantNo: '' // 保证金金额
+      }
+      this.$refs.ruleForm.resetFields()
+      this.$emit('close')
+    },
+    // 详情
+    getMerchantAccountDetail () {
+      this.spinning = true
+      merchantAccountDetail({ merchantSn: this.nowData.merchantSn, merchantType: this.nowData.merchantType }).then(res => {
+        if (res.status == 200) {
+          this.form.merchantNo = res.data.merchantNo
+          this.form.dealerEntity.dealerName = res.data.dealerEntity.dealerName
+          this.form.bankName = res.data.merchantBankAccountEntity.bankName
+          this.form.bankAccount = res.data.merchantBankAccountEntity.bankAccount
+          this.form.bankCard = res.data.merchantBankAccountEntity.bankCard
+          this.pageInfo = Object.assign({}, res.data)
+        } else {
+        }
+        this.spinning = false
+      })
+    },
+    // 保存提交
+    handleSubmit () {
+      console.log('保存', 'handleSubmit')
+      const _this = this
+      this.$refs.ruleForm.validate(valid => {
+        console.log(valid, 'console.log(valid)')
+        if (valid) {
+          const params = JSON.parse(JSON.stringify(_this.pageInfo))
+          console.log(params, 'params')
+          if (params) {
+            params.merchantBankAccountEntity.bankName = _this.form.bankName
+            params.merchantBankAccountEntity.bankAccount = _this.form.bankAccount
+            params.merchantBankAccountEntity.bankCard = _this.form.bankCard
+            params.dealerEntity.dealerName = _this.form.dealerEntity.dealerName
+            params.merchantNo = _this.form.merchantNo
+          }
+          console.log(params, 'params')
+          params.id = _this.nowData && _this.nowData.id ? _this.nowData.id : null
+          params.dealerEntity.dealerSn = _this.nowData && _this.nowData.dealerEntity ? _this.nowData.dealerEntity.dealerSn : null
+          _this.spinning = true
+          console.log(params, 'params')
+          saveMerchantAccount(params).then(res => {
+            if (res.status == 200) {
+              _this.$message.success(res.message)
+              _this.$emit('refresh')
+              setTimeout(function () {
+                _this.isshow = false
+                _this.spinning = false
+              }, 300)
+            } else {
+              _this.spinning = false
+            }
+          })
+        } else {
+          console.log('error submit!!')
+          return false
+        }
+      })
+    }
+  },
+  watch: {
+    visible (newValue, oldValue) {
+      this.isshow = newValue
+    },
+    isshow (newValue, oldValue) {
+      if (!newValue) {
+        this.form = {
+          dealerEntity: {
+            dealerName: ''
+          },
+          bankName: '', // 开户行
+          bankAccount: '', // 账户名
+          bankCard: '', // 账户号
+          merchantNo: '' // 保证金金额
+        }
+        this.$refs.ruleForm.resetFields()
+        this.close()
+      } else {
+        this.getMerchantAccountDetail()
+      }
+    },
+    nowData: {
+      handler (newValue, oldValue) {
+        if (this.isshow && newValue) {
+          if (this.nowData.id) { //  编辑
+
+          }
+        }
+      },
+      deep: true
+    }
+  }
+}
+</script>
+<style lang="less">
+</style>

+ 19 - 12
src/views/power/OperateJournal/OperateJournal.vue

@@ -7,7 +7,7 @@
           <a-row :gutter="48">
             <a-col :md="8" :sm="24">
               <a-form-item label="操作时间">
-                <a-range-picker :format="dateFormat" show-time :placeholder="['开始时间', '结束时间']" v-model="time" @change="onChange" />
+                <a-range-picker  show-time :placeholder="['开始时间', '结束时间']" v-model="time" @change="onChange" />
               </a-form-item>
             </a-col>
             <a-col :md="6" :sm="24">
@@ -45,14 +45,15 @@ export default {
   components: { STable },
   data () {
     return {
+      disabled:false,
       // 列表
       form: this.$form.createForm(this, {
         name: 'OperateJournal'
       }),
-      time: [moment(getDate.getToday().starttime, this.dateFormat), moment(getDate.getToday().endtime, this.dateFormat)],
+      time: [getDate.getTodayTime().starttime, getDate.getTodayTime().endtime],
       searchData: {
-        beginDate: null, // 查询的开始时间
-        endDate: null, // 查询的结束时间
+        beginDate: getDate.getTodayTime().starttime, // 查询的开始时间
+        endDate: getDate.getTodayTime().endtime, // 查询的结束时间
         queryWord: '' // 操作人
       },
       dateFormat: 'YYYY-MM-DD HH:mm:ss',
@@ -86,15 +87,21 @@ export default {
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
-        this.searchData.beginDate == null ? (this.searchData.beginDate = getDate.getToday().starttime) : null
-        this.searchData.endDate == null ? (this.searchData.endDate = getDate.getToday().endtime) : null
+        this.disabled = true
+        // this.searchData.beginDate = this.queryParam.beginDate + ' 00:00:00'
+        // this.searchData.endDate = this.queryParam.endDate + ' 23:59:59'
         return journalList(Object.assign(parameter, this.searchData)).then(res => {
-          const no = (res.data.data.pageNo - 1) * res.data.data.pageSize
-          for (let i = 0; i < res.data.data.list.length; i++) {
-            const _item = res.data.data.list[i]
-            _item.no = no + i + 1
-          }
-          return res.data.data
+           let data
+           if (res.status == 200) {
+             data = res.data
+             const no = (data.pageNo - 1) * data.pageSize
+             for (var i = 0; i < data.list.length; i++) {
+               data.list[i].no = no + i + 1
+             }
+             this.disabled = false
+           }
+          
+          return data
         })
       }
     }

+ 5 - 7
src/views/power/role/roleList.vue

@@ -28,7 +28,7 @@
         </a-form>
       </div>
       <div class="table-operator">
-        <a-button v-if="$hasPermissions('B_powerMD_role_add')" type="primary" class="button-error" @click="openModal" id="roleList-openModal">新增</a-button>
+        <a-button type="primary" class="button-error" @click="openModal" id="roleList-openModal">新增</a-button>
       </div>
       <s-table
         class="sTable fixPagination"
@@ -44,13 +44,12 @@
         <!-- 启用禁用 -->
         <span slot="status" slot-scope="text, record">
           <a-switch
-            v-if="$hasPermissions('B_powerMD_role_enable')"
             checkedChildren="启用"
             unCheckedChildren="禁用"
             id="roleList-isEnable"
             v-model="record.isEnable"
             @change="changeFlagHandle(text, record)" />
-          <span v-else>{{ record.isEnable==1?'已启用':'已禁用' }}</span>
+          <!-- <span v-else>{{ record.isEnable==1?'已启用':'已禁用' }}</span> -->
         </span>
         <!-- 角色描述 -->
         <template slot="remarks" slot-scope="text, record">
@@ -58,13 +57,12 @@
         </template>
         <!-- 操作 -->
         <span slot="action" slot-scope="text, record">
-          <a-icon v-if="$hasPermissions('M_powerMD_role_menu')" type="setting" title="菜单权限" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" @click="openMenuModal(record)" />
-          <a-icon v-if="$hasPermissions('B_powerMD_role_edit')" type="edit" title="编辑" :style="{fontSize: '20px',color:' #1890FF',padding:' 0 10px'}" @click="handleEdit(record)" />
+          <a-icon type="setting" title="菜单权限" :style="{ fontSize: '20px', color: '#e29e14', padding: '0 10px' }" @click="openMenuModal(record)" />
+          <a-icon type="edit" title="编辑" :style="{fontSize: '20px',color:' #1890FF',padding:' 0 10px'}" @click="handleEdit(record)" />
           <a-icon
             type="delete"
             title="删除"
             :style="{fontSize: '20px',color: '#f00',padding: '0 10px'}"
-            v-if="!record.isEnable && $hasPermissions('B_powerMD_role_del')"
             @click="delect(record)" />
         </span>
       </s-table>
@@ -86,7 +84,7 @@ import {
   updateEnableStatus,
   delectRolePower,
   getMenuList
-} from '@/api/powerRole-md.js'
+} from '@/api/power-role.js'
 export default {
   name: 'RoleList',
   components: {

+ 1 - 1
src/views/power/role/roleModal.vue

@@ -67,7 +67,7 @@
 
 <script>
 import { STable, VSelect } from '@/components'
-import { saveRolePower } from '@/api/powerRole-md.js'
+import { saveRolePower } from '@/api/power-role.js'
 export default {
   name: 'RoleModal',
   components: {

+ 30 - 16
src/views/power/user/userList.vue

@@ -27,7 +27,7 @@
         </a-form>
       </div>
       <div class="table-operator">
-        <a-button v-if="$hasPermissions('B_powerMD_user_add')" type="primary" class="button-error" @click="openModal">新增</a-button>
+        <a-button type="primary" class="button-error" @click="openModal">新增</a-button>
       </div>
       <s-table
         class="sTable fixPagination"
@@ -41,30 +41,27 @@
         :defaultLoadData="false"
         bordered>
         <span slot="status" slot-scope="text, record">
-          <a-switch v-if="$hasPermissions('B_powerMD_user_enable') && record.superAdmin!=1" checkedChildren="启用" unCheckedChildren="禁用" v-model="record.loginFlag" @change="changeFlagHandle(text, record)"/>
-          <span v-else>{{ record.loginFlag==1?'已启用':'已禁用' }}</span>
+          <a-switch checkedChildren="启用" unCheckedChildren="禁用" v-model="record.loginFlag" @change="changeFlagHandle(text, record)"/>
+          <!-- <span v-else>{{ record.loginFlag==1?'已启用':'已禁用' }}</span> -->
         </span>
         <span slot="action" slot-scope="text, record">
           <a-icon
             type="edit"
             title="编辑"
             :style="{fontSize: '20px',color:' #1890FF',padding:' 0 10px'}"
-            v-if="$hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1"
             @click="handleEdit(record)"
           />
           <a-icon
             type="unlock"
             title="重置密码"
-            v-if="record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')"
             :style="{fontSize: '20px',color:' #ffaa00',padding: '0 10px'}"
             @click="resetPassword(record)" />
           <a-icon
             type="delete"
             title="删除"
             :style="{fontSize: '20px',color: '#f00',padding: '0 10px'}"
-            v-if="record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del')"
             @click="delect(record)"/>
-          <span v-if="!($hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1) && !(record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')) && !(record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del'))">--</span>
+          <!-- <span v-if="!($hasPermissions('B_powerMD_user_edit') && record.superAdmin!=1) && !(record.loginFlag==1 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_restPwd')) && !(record.loginFlag==0 && record.ownerOrgFlag==1 && $hasPermissions('B_powerMD_user_del'))">--</span> -->
         </span>
       </s-table>
     </a-spin>
@@ -98,15 +95,15 @@ export default {
       itemData: null, // 编辑行数据
       // 表头
       columns: [
-        { title: '序号', dataIndex: 'no', width: '4%', align: 'center' },
-        { title: '创建时间', dataIndex: 'createDate', width: '11%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '来源', dataIndex: 'org.name', width: '13%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '用户名称', dataIndex: 'name', width: '18%', align: 'center', customRender: function (text) { return text || '--' }, ellipsis: true },
-        { title: '手机号码', dataIndex: 'phone', width: '12%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '用户账号', dataIndex: 'loginName', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
-        { title: '角色', width: '13%', align: 'center', dataIndex: 'roleNames', customRender: function (text) { return text || '--' } },
-        { title: '状态', width: '9%', align: 'center', scopedSlots: { customRender: 'status' } },
-        { title: '操作', width: '10%', align: 'center', scopedSlots: { customRender: 'action' } }
+        { title: '序号', dataIndex: 'no', width: '5%', align: 'center' },
+        { title: '创建时间', dataIndex: 'createDate', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        // { title: '来源', dataIndex: 'org.name', width: '13%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '用户名称', dataIndex: 'name', width: '25%', align: 'left', customRender: function (text) { return text || '--' }, ellipsis: true },
+        { title: '手机号码', dataIndex: 'phone', width: '15%', align: 'center', customRender: function (text) { return text || '--' } },
+        // { title: '用户账号', dataIndex: 'loginName', width: '10%', align: 'center', customRender: function (text) { return text || '--' } },
+        { title: '角色', width: '15%', align: 'center', dataIndex: 'roleNames', customRender: function (text) { return text || '--' } },
+        { title: '状态', width: '10%', align: 'center', scopedSlots: { customRender: 'status' } },
+        { title: '操作', width: '15%', align: 'left', scopedSlots: { customRender: 'action' } }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
@@ -209,6 +206,23 @@ export default {
       this.showSyncModal = false
     },
     // 修改状态
+    // changeFlagHandle (text, record) {
+    //   const _data = {
+    //     id: record.id,
+    //     flag: record.isEnable ? '1' : '0'
+    //   }
+    //   this.spinning = true
+    //   updateEnableStatus(_data).then(res => {
+    //     if (res.status == 200) {
+    //       this.$message.success(res.message)
+    //       this.$refs.table.refresh()
+    //       this.spinning = false
+    //     } else {
+    //       this.$refs.table.refresh()
+    //       this.spinning = false
+    //     }
+    //   })
+    // },
     changeFlagHandle (text, record) {
       const _data = {
         id: record.id,

+ 2 - 2
src/views/power/user/userModal.vue

@@ -36,13 +36,13 @@
               </a-form-model-item>
             </a-col>
           </a-row>
-          <a-row :gutter="20">
+          <!-- <a-row :gutter="20">
             <a-col :span="24">
               <a-form-model-item label="用户账号" prop="loginName" :label-col="{span: 3}" :wrapper-col="{span: 20}">
                 <a-input id="userEdit-loginName" v-model.trim="form.loginName":maxLength="50" allowClear placeholder="请输入用户账号(最多50个字符)"/>
               </a-form-model-item>
             </a-col>
-          </a-row>
+          </a-row> -->
           <a-row :gutter="24">
             <!-- 性别 -->
             <a-col :span="12">

+ 2 - 4
vue.config.js

@@ -108,10 +108,8 @@ const vueConfig = {
     // If you want to turn on the proxy, please remove the mockjs /src/main.jsL11
     proxy: {
       '/api': {
-        // target: 'http://192.168.16.103:8503/qpls-md',
-        target: 'https://t.qpls.360arrow.com/qpls-md', //  Á·Ï°
-        // target: 'http://p.iscm.360arrow.com/qpls-md', //  Ô¤·¢²¼
-        // target: 'http://qpls-md.360arrow.com/qpls-md', //  Éú²ú
+        // target: ' http://192.168.16.107:7300/mock/61aeb88e4b9f94168035f9e0/xprh-admin',
+        target: 'http://192.168.16.151:8701/xprh-admin',
         // ws: false,
         ws: true,
         changeOrigin: true,