1004749546@qq.com %!s(int64=4) %!d(string=hai) anos
pai
achega
e767705c3f

+ 3 - 3
src/api/atorg.js

@@ -3,7 +3,7 @@ import { axios } from '@/utils/request'
 // 组织机构列表
 export const findOrgTree = params => {
   return axios({
-    url: '/atorg/findOrgTree',
+    url: '/org/findOrgTree',
     data: {},
     method: 'get'
   })
@@ -11,7 +11,7 @@ export const findOrgTree = params => {
 // 保存
 export const saveAtorg = params => {
   return axios({
-    url: '/atorg/save',
+    url: '/org/save',
     data: params,
     method: 'post'
   })
@@ -19,7 +19,7 @@ export const saveAtorg = params => {
 // 删除
 export const delAtorg = params => {
   return axios({
-    url: `/atorg/delete/${params.id}`,
+    url: `/org/delete/${params.id}`,
     data: {},
     method: 'get'
   })

+ 8 - 0
src/api/supplierManagement.js

@@ -27,3 +27,11 @@ export const supplierEdit = params => {
     method: 'post'
   })
 }
+// 供应商详情
+export const supplierView = params => {
+  return axios.request({
+    url: `/supplier/selectBySn/${params.supplierSn}`,
+    data: {},
+    method: 'post'
+  })
+}

+ 11 - 2
src/config/router.config.js

@@ -128,8 +128,8 @@ export const asyncRouterMap = [{
     component: PageView,
     meta: {
       title: '运营平台权限管理',
-      icon: 'apartment',
-      permission: 'M_power_auth'
+      icon: 'apartment'
+      // permission: 'M_power_auth'
     },
     children: [
       {
@@ -151,6 +151,15 @@ export const asyncRouterMap = [{
           icon: 'solution',
           permission: 'M_power_role_list'
         }
+      },
+      {
+        path: '/auth/menu',
+        name: 'powerMenuList',
+        component: () => import(/* webpackChunkName: "auth" */ '@/views/power/menu/menu.vue'),
+        meta: {
+          title: '菜单管理',
+          icon: 'bars'
+        }
       }
     ]
   }

+ 1 - 1
src/utils/request.js

@@ -16,7 +16,7 @@ const err = (error) => {
   console.log(error.response.data.message, 'error')
   if (error.response) {
     const status = error.response.status
-    if ((status == 503 || status == 500) && window.location.pathname != '/user/login') {
+    if ((status == 503 || status == 500 || status == 900) && window.location.pathname != '/user/login') {
       notification.destroy()
       notification.error({
         message: '提示',

+ 6 - 6
src/views/Home.vue

@@ -30,7 +30,7 @@ export default {
     ResetPwd
   },
   computed: {
-    // ...mapGetters(['mustChangePwd'])
+    ...mapGetters(['mustChangePwd'])
   },
   data () {
     return {
@@ -42,11 +42,11 @@ export default {
   beforeRouteEnter (to, from, next) {
     next(vm => {
       //  判断登录用户是否重置过密码(首次登陆需强制重置密码)
-      // if (vm.mustChangePwd == 0) {
-      //   vm.openResetPwd = false
-      // } else {
-      //   vm.openResetPwd = true
-      // }
+      if (vm.mustChangePwd == 0) {
+        vm.openResetPwd = false
+      } else {
+        vm.openResetPwd = true
+      }
       console.log(vm.mustChangePwd, '-------是否需要重置密码')
     })
   }

+ 302 - 0
src/views/power/menu/childModal.vue

@@ -0,0 +1,302 @@
+<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="请输入名称"
+            v-decorator="['formData.name', {
+              initialValue: formData.name,
+              rules: [{ required: true, message: '请输入名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+          />
+        </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-input
+            placeholder="请输入后台权限编码"
+            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
+            type="number"
+            placeholder="请输入排序值"
+            v-decorator="['formData.sort', {
+              initialValue: formData.sort,
+              rules: [] }]"
+          />
+        </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 { saveMenu } from '@/api/menu.js'
+export default {
+  name: 'ChildModal',
+  components: {
+    STable, VSelect
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
+    },
+    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,
+        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')
+          saveMenu(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.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 = true
+        }
+      } else {
+        this.cancel()
+      }
+    }
+  }
+}
+</script>
+
+<style >
+  .modalBox{
+  }
+  .ant-modal-footer {
+    display: none;
+  }
+</style>

+ 457 - 0
src/views/power/menu/menu.vue

@@ -0,0 +1,457 @@
+<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"
+            showIcon
+          >
+            <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="请输入名称"
+              v-decorator="['formData.name', {
+                initialValue: formData.name,
+                rules: [{ required: true, message: '请输入名称!' },{pattern:'^[^<|>]{1,20}$',message:'请输入不含<或>的字符,最多20个字符'}] }]"
+            />
+          </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
+              type="number"
+              placeholder="请输入排序值"
+              v-decorator="['formData.sort', {
+                initialValue: formData.sort,
+                rules: [] }]"
+            />
+          </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 :visible="showChildModal" @refresh="getMenuList" :data="parentData" @close="showChildModal = false"></childModal>
+  </a-card>
+</template>
+
+<script>
+import { STable, VSelect } from '@/components'
+import childModal from './childModal.vue'
+import { getMenuList, saveMenu, deleteMenu } 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
+      })
+    },
+    // 获取菜单树列表
+    getMenuList () {
+      getMenuList().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 () {
+          deleteMenu({
+            id: _this.formData.id
+          }).then(res => {
+            if (res.status == 200) {
+              _this.$message.success('删除成功')
+              _this.getMenuList()
+            }
+          }).catch(() => {
+            _this.$message.success('删除失败, 请稍后重试')
+          })
+        }
+      })
+    },
+
+    // 保存提交
+    handleSubmit () {
+      const _this = this
+      this.form.validateFields((err, values) => {
+        if (!err) {
+          console.log(values.formData, ' formData.type222222222')
+          saveMenu(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.getMenuList()
+              _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.getMenuList()
+    })
+  },
+  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, 0.85);
+  }
+  .imgSize{
+    color: #2d8cf0;
+    margin-left: 10px;
+    font-size: 14px;
+  }
+
+</style>

+ 24 - 23
src/views/storehouseManagement/storeBind/StoreBindList.vue

@@ -16,39 +16,39 @@
             </a-form-model-item>
           </a-col>
           <a-col :lg="6" :sm="12">
-            <a-form-model-item prop="supplierName" label="供应商名称" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
+            <a-form-model-item prop="supplierSn" label="供应商名称" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
               <a-select
-                id="storeBindList-supplierName"
+                id="storeBindList-supplierSn"
                 show-search
                 allowClear
                 placeholder="请输入供应商名称"
                 option-filter-prop="children"
-                v-model="queryParam.supplierName"
+                v-model="queryParam.supplierSn"
               >
-                <a-select-option v-for="item in supplierList" :key="item.id" :value="item.id">
+                <a-select-option v-for="item in supplierList" :key="item.supplierSn" :value="item.supplierSn">
                   {{ item.name }}
                 </a-select-option>
               </a-select>
             </a-form-model-item>
           </a-col>
           <a-col :lg="6" :sm="12">
-            <a-form-model-item prop="storeName" label="门店名称" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
+            <a-form-model-item prop="storeSn" label="门店名称" :label-col="{ span:4 }" :wrapper-col="{ span:12}">
               <a-select
-                id="storeBindList-storeName"
+                id="storeBindList-storeSn"
                 show-search
                 allowClear
                 placeholder="请输入门店名称"
                 option-filter-prop="children"
-                v-model="queryParam.storeName"
+                v-model="queryParam.storeSn"
               >
-                <a-select-option v-for="item in storeList" :key="item.id" :value="item.id">
+                <a-select-option v-for="item in storeList" :key="item.storeSn" :value="item.storeSn">
                   {{ item.name }}
                 </a-select-option>
               </a-select>
             </a-form-model-item>
           </a-col>
           <a-col :lg="4" :sm="12">
-            <a-button style="margin:0 4px 3px 4px" type="primary" @click="refresh" id="storeBindList-search">查询</a-button>
+            <a-button style="margin:0 4px 3px 4px" type="primary" @click="$refs.table.refresh(true)" id="storeBindList-search">查询</a-button>
             <a-button style="margin: 0 4px 3px 4px" @click="resetSearchForm" id="storeBindList-resetSearchForm">重置</a-button>
           </a-col>
         </a-row>
@@ -97,8 +97,8 @@ export default {
       supplierList: [], // 供应商列表
       storeList: [], // 门店列表
       queryParam: {
-        storeName: undefined, // 门店名称
-        supplierName: undefined, // 供应商名称
+        storeSn: undefined, // 门店名称
+        supplierSn: undefined, // 供应商名称
         beginDate: '',
         endDate: ''
       },
@@ -120,36 +120,36 @@ export default {
       },
       {
         title: '供应商',
-        dataIndex: 'settleNo',
         width: 150,
-        align: 'center'
+        align: 'center',
+        customRender: (text, record, index) => { return record.supplierEntity.name || '--' }
       },
       {
         title: '绑定门店',
-        dataIndex: 'orderNum',
         width: 150,
         align: 'center',
-        scopedSlots: {
-          customRender: 'userInfo'
-        }
+        customRender: (text, record, index) => { return record.storeEntity.name || '--' }
       },
       {
         title: '门店地址',
-        dataIndex: 'realAmount',
         align: 'center',
-        width: 150
+        width: 150,
+        customRender: (text, record, index) => {
+          const data = record.storeEntity
+          return data.addrProvinceName + data.addrCityName + data.addrDistrictName + data.addrDetail
+        }
       },
       {
         title: '门店负责人',
-        dataIndex: 'code',
         align: 'center',
-        width: 150
+        width: 150,
+        customRender: (text, record, index) => { return record.storeEntity.manager || '--' }
       },
       {
         title: '电话',
-        dataIndex: 'status',
         align: 'center',
-        width: 150
+        width: 150,
+        customRender: (text, record, index) => { return record.storeEntity.managerMobile || '--' }
       }
       ],
       loadData: parameter => {
@@ -193,6 +193,7 @@ export default {
     // 查询
     refresh () {
       this.$refs.table.refresh(true)
+      this.getStoreList() // 刷新门店列表更新门店绑定标识
     },
     // 重置
     resetSearchForm () {

+ 11 - 5
src/views/storehouseManagement/storeBind/StoreBindModal.vue

@@ -30,11 +30,13 @@
             allowClear
             placeholder="请选择关联客户"
             option-filter-prop="children"
+            optionLabelProp="value"
             @change="storeChange"
             v-model="form.storeName"
           >
-            <a-select-option v-for="item in storeList" :key="item.storeSn" :value="item.storeSn">
+            <a-select-option :disabled="item.bindFlag=='BIND'" v-for="item in storeList" :key="item.name" :value="item.name">
               {{ item.name }}
+              <span style="float: right;">{{ item.bindFlag=='BIND'?'已绑定':'未绑定' }}</span>
             </a-select-option>
           </a-select>
         </a-form-model-item>
@@ -98,7 +100,7 @@ export default {
     storeChange (val) {
       console.log(val, 'vvvvvvv')
       if (val) {
-        const has = this.storeList.find(item => item.storeSn == val)
+        const has = this.storeList.find(item => item.name == val)
         this.form.storeAddress = has ? has.addrProvinceName + has.addrCityName + has.addrDistrictName + has.addrDetail : ''
       }
     },
@@ -108,13 +110,15 @@ export default {
         if (valid) {
           const params = {
             supplierSn: this.form.supplierName,
-            storeSn: this.form.storeName
+            storeSn: this.storeList.find(item => item.name == this.form.storeName).storeSn
           }
           supplierStoreBind(params).then(res => {
             if (res.status == 200) {
               this.$message.success(res.message)
               this.$emit('refresh')
-              this.cancel()
+              setTimeout(() => {
+                this.cancel()
+              }, 300)
             }
           })
         } else {
@@ -135,9 +139,11 @@ export default {
 	  },
 	  isshow (val) {
 	    if (!val) {
-        this.$refs['ruleForm'].resetFields()
 	      this.$emit('close')
 	    } else {
+        setTimeout(() => {
+          this.$refs['ruleForm'].resetFields()
+        }, 100)
       }
 	  },
 	  settleId (newValue, oldValue) {

+ 19 - 23
src/views/supplierManagement/Organization.vue

@@ -23,7 +23,7 @@
           class="btn-add-s"
           id="organization-addSubItem"
           @click="addOrg(text)"
-          v-hasPermission="'B_basicSettings_organization_add_child'">新增子级</a-button>
+        >新增子级</a-button>
         <a-button
           v-if="record.pid != 0"
           type="link"
@@ -32,7 +32,7 @@
           class="btn-edit-s"
           id="organization-edit"
           @click="editOrg(text)"
-          v-hasPermission="'B_basicSettings_organization_edit'">编辑</a-button>
+        >编辑</a-button>
         <a-button
           v-if="record.pid != 0"
           type="link"
@@ -41,7 +41,7 @@
           class="btn-del-s"
           id="organization-del"
           @click="delOrg(text)"
-          v-hasPermission="'B_basicSettings_organization_del'">删除</a-button>
+        >删除</a-button>
       </template>
     </s-table>
     <!-- 新增子级 -->
@@ -74,7 +74,7 @@
 
 <script>
 import { STable, VSelect } from '@/components'
-// import { findOrgTree, saveAtorg, delAtorg } from '@/api/atorg.js'
+import { findOrgTree, saveAtorg, delAtorg } from '@/api/atorg.js'
 export default {
   components: { STable, VSelect },
   data () {
@@ -92,21 +92,15 @@ export default {
       defaultExpandedRowKeys: [], //  树形数据默认展开项
       columns: [
         { title: '组织机构名称', dataIndex: 'name', width: 200, align: 'left' },
-        { title: '创建时间', dataIndex: 'createDate', width: 150, align: 'center' },
         { title: '操作', scopedSlots: { customRender: 'action' }, width: 150, align: 'center' }
       ],
       // 加载数据方法 必须为 Promise 对象
       loadData: parameter => {
-        // return findOrgTree().then(res => {
-        //   //  递归去除空children
-        //   this.recursionFun(res.data)
-        //   this.defaultExpandedRowKeys[0] = res.data[0].id
-        //   return res.data
-        // })
-        return Promise.resolve().then(data => {
-          return [
-
-          ]
+        return findOrgTree().then(res => {
+          //  递归去除空children
+          this.recursionFun(res.data)
+          this.defaultExpandedRowKeys[0] = res.data[0].id
+          return res.data
         })
       }
     }
@@ -138,17 +132,19 @@ export default {
     },
     //  保存
     onSubmit () {
-      const _this = this
-      _this.$refs.ruleForm.validate(valid => {
+      this.$refs.ruleForm.validate(valid => {
         if (valid) {
-          const formData = JSON.parse(JSON.stringify(_this.form))
-          formData.id = _this.nowId
-          formData.pid = _this.nowPid
+          const formData = this.form
+          if(this.nowId) {
+            formData.id = this.nowId
+          } else {
+            formData.pid = this.nowPid
+          }
           saveAtorg(formData).then(res => {
             if (res.status == 200) {
-              _this.$message.success(res.message)
-              _this.$refs.table.refresh(true)
-              _this.visible = false
+              this.$message.success(res.message)
+              this.$refs.table.refresh(true)
+              this.visible = false
             }
           })
         } else {

+ 5 - 16
src/views/supplierManagement/SupplierList.vue

@@ -5,12 +5,12 @@
       <a-form-model ref="queryForm" :model="queryParam" layout="inline" @keyup.enter.native="$refs.table.refresh(true)">
         <a-row :gutter="48">
           <a-col :span="6">
-            <a-form-model-item class="search-item" label="供应商名称">
+            <a-form-model-item prop="name" class="search-item" label="供应商名称">
               <a-input id="supplier-name" v-model.trim="queryParam.name" placeholder="请输入供应商名称" allowClear />
             </a-form-model-item>
           </a-col>
           <a-col :span="6">
-            <a-form-model-item class="search-item" label="组织机构">
+            <a-form-model-item prop="orgCode" class="search-item" label="组织机构">
               <a-tree-select
                 showSearch
                 id="supplier-orgCode"
@@ -64,7 +64,7 @@
     </s-table>
 
     <!-- 编辑 门店所属组织 -->
-    <supplier-modal :openModal="openModal" :supplierId="supplierId" :supplierName="supplierName" @success="storeSubmit" @close="openModal=false" />
+    <supplier-modal :openModal="openModal" :supplierSn="supplierSn" @success="storeSubmit" @close="openModal=false" />
   </a-card>
 </template>
 
@@ -113,19 +113,9 @@ export default {
             return res.data
           }
         })
-        // return Promise.resolve().then(data => {
-        //   return {
-        //     list: [
-        //       { no: '1', id: '1', codeNameArr: ['陕西省公司', '西安分公司'], name: '箭冠汽配南京分公司', managerName: '张三', managerMobile: '18792701236' }
-        //     ],
-        //     pageNo: 1,
-        //     pageSize: 10,
-        //     count: 1
-        //   }
-        // })
       },
       openModal: false, //  编辑 门店所属组织  弹框展示状态
-      supplierId: '', // 供应商id
+      supplierSn: '', // 供应商信息
       supplierName: '', // 供应商名称
       treeData: [] //  组织机构
     }
@@ -143,8 +133,7 @@ export default {
     },
     // 编辑供应商
     handleEdit (item) {
-      this.supplierId = item.id
-      this.supplierName = item.name
+      this.supplierSn = item.supplierSn
       this.openModal = true
     },
     // 编辑  提交成功

+ 18 - 20
src/views/supplierManagement/SupplierModal.vue

@@ -20,7 +20,7 @@
         label="供应商名称"
         :label-col="{ span: 5 }"
         :wrapper-col="{ span: 17 }">
-        <div>{{ supplierName }}</div>
+        <div>{{ supplierInfo?supplierInfo.name:'' }}</div>
       </a-form-model-item>
       <a-form-model-item
         class="form-label"
@@ -51,6 +51,8 @@
 </template>
 
 <script>
+import { findOrgTree } from '@/api/atorg.js'
+import { supplierEdit, supplierView } from '@/api/supplierManagement.js'
 export default {
   name: 'SupplierModal',
   props: {
@@ -59,13 +61,8 @@ export default {
       type: Boolean,
       default: false
     },
-    // 供应商id
-    supplierId: {
-      type: [String || Number],
-      default: ''
-    },
-    // 供应商名称
-    supplierName: {
+    // 供应商编码
+    supplierSn: {
       type: String,
       default: ''
     }
@@ -82,15 +79,16 @@ export default {
       treeData: [], //  组织机构
       parentCodePaths: '', //  机构编码父路径
       orgPid: '', //  父级id
-      storeInfo: null //  门店详情
+      supplierInfo: null //  供应商详情
     }
   },
   methods: {
-    //  门店详情
-    getStoreInfo (id) {
-      findStoreDetail({ id: id }).then(res => {
+    //  供应商详情
+    getSupplierInfo () {
+      supplierView({ supplierSn: this.supplierSn }).then(res => {
         if (res.status == 200) {
-          this.storeInfo = res.data
+          this.supplierInfo = res.data
+          console.log(this.supplierInfo, 'this.supplierInfo')
           this.form.orgCode = res.data.orgCode
           this.parentCodePaths = res.data.orgCodePaths
           this.orgPid = res.data.orgPid
@@ -120,7 +118,7 @@ export default {
           formData.id = this.storeId
           formData.orgCodePaths = this.parentCodePaths
           formData.orgPid = this.orgPid
-          saveStoreOrg(formData).then(res => {
+          supplierEdit(formData).then(res => {
             if (res.status == 200) {
               this.$message.success(res.message)
               this.$emit('success')
@@ -132,6 +130,9 @@ export default {
       })
     }
   },
+  mounted () {
+    this.getOrgList()
+  },
   watch: {
     //  父页面传过来的弹框状态
     openModal (newValue, oldValue) {
@@ -144,12 +145,9 @@ export default {
       } else {
         //  重置表单数据
         this.form.orgCode = null
-      }
-    },
-    supplierId (newValue, oldValue) {
-      if (newValue && this.isShow) {
-        // this.getOrgList()
-        // this.getStoreInfo(newValue)
+        if (this.supplierSn) {
+          this.getSupplierInfo()
+        }
       }
     }
   }