Browse Source

Merge branch 'develop' of http://code.dashoo.cn/chengjian/opms_frontend into develop

liuyaqi 2 years ago
parent
commit
2eb6d6a112

+ 4 - 0
src/api/index/index.js

@@ -26,6 +26,10 @@ export default {
   getReportList(query) {
     return micro_request.postRequest(basePath, 'Report', 'GetList', query)
   },
+  // 数值指标
+  getHomeNumReportData(query) {
+    return micro_request.postRequest(basePath, 'Home', 'GetHomeNumReportData', query)
+  },
   // 指标图表
   getHomeDataReportData(query) {
     return micro_request.postRequest(basePath, 'Home', 'GetHomeDataReportData', query)

+ 4 - 1
src/api/system/report.js

@@ -2,7 +2,7 @@
  * @Author: niezch@dashoo.cn
  * @Date: 2023-02-16 16:21:14
  * @LastEditors: niezch@dashoo.cn
- * @LastEditTime: 2023-02-17 14:50:54
+ * @LastEditTime: 2023-02-21 15:38:15
  * @Description: file content
  * @FilePath: \opms_frontend\src\api\system\report.js
  */
@@ -32,4 +32,7 @@ export default {
   addRoleReport(query) {
     return micro_request.postRequest(basePath, 'RoleReport', 'Add', query)
   },
+  roleList(query) {
+    return micro_request.postRequest(basePath, 'RoleReport', 'RoleList', query)
+  },
 }

+ 0 - 1
src/views/base/productAuth/index.vue

@@ -89,7 +89,6 @@
           pageNum: 1,
           pageSize: 10,
           keyWords: '',
-          deptId: 1001,
         },
         layout: 'total, sizes, prev, pager, next, jumper',
         listLoading: false,

+ 18 - 17
src/views/base/regionAuth/index.vue

@@ -104,21 +104,23 @@
           <el-checkbox v-model="checkAll" :indeterminate="isIndeterminate" @change="handleCheckAllChange">
             全选
           </el-checkbox>
-          <div v-for="item in options" :key="item.custProvinceId" class="province" :label="item.custProvince">
-            <h3>{{ item.custProvince }}</h3>
-            <div class="check-container">
-              <el-checkbox
-                v-model="item.checkAll"
-                :indeterminate="item.isIndeterminate"
-                @change="(val) => handleSndCheckAllChange(val, item)">
-                全选
-              </el-checkbox>
-              <el-checkbox-group v-model="form.checkList" @change="(val) => handleChange(val, item)">
-                <el-checkbox v-for="city in item.children" :key="city.id" :label="city.custCityId">
-                  {{ city.custCity }}
-                  <span v-if="city.allocator.length">({{ city.allocator.join() }})</span>
+          <div style="height: calc(100% - 5px); overflow: auto">
+            <div v-for="item in options" :key="item.custProvinceId" class="province" :label="item.custProvince">
+              <h3>{{ item.custProvince }}</h3>
+              <div class="check-container">
+                <el-checkbox
+                  v-model="item.checkAll"
+                  :indeterminate="item.isIndeterminate"
+                  @change="(val) => handleSndCheckAllChange(val, item)">
+                  全选
                 </el-checkbox>
-              </el-checkbox-group>
+                <el-checkbox-group v-model="form.checkList" @change="(val) => handleChange(val, item)">
+                  <el-checkbox v-for="city in item.children" :key="city.id" :label="city.custCityId">
+                    {{ city.custCity }}
+                    <span v-if="city.allocator.length">({{ city.allocator.join() }})</span>
+                  </el-checkbox>
+                </el-checkbox-group>
+              </div>
             </div>
           </div>
         </div>
@@ -146,7 +148,6 @@
           pageNum: 1,
           pageSize: 10,
           keyWords: '',
-          deptId: 1001,
         },
         layout: 'total, sizes, prev, pager, next, jumper',
         listLoading: false,
@@ -288,7 +289,7 @@
         this.regionId = data.id
         this.saleRegionName = data.regionDesc
         await this.handleDetail()
-        const [err, res] = await to(regionApi.getRegionDetailList({ regionId: data.id }))
+        const [err, res] = await to(regionApi.getRegionDetailList({ regionId: data.id, pageNum: 1, pageSize: 9999 }))
         if (err) return
         this.flatOptions = res.data.list || []
         this.flatOptions.forEach((item) => (item.saleRegionName = data.regionDesc))
@@ -381,7 +382,7 @@
         params.saleRegionName = this.saleRegionName
         let arr = []
         for (const item of params.checkList) {
-          const obj = this.flatOptions.find((each) => each.id == item)
+          const obj = this.flatOptions.find((each) => each.custCityId == item)
           if (obj)
             arr.push({
               saleRegionId: obj.regionId,

+ 51 - 1
src/views/index/index.vue

@@ -39,7 +39,7 @@
               <div class="board-container">
                 <vab-icon class="icon" :icon="item.report_icon" />
                 <div class="text">
-                  <p class="num">{{ item.id }}</p>
+                  <p class="num">{{ item.report_data }}</p>
                   <p>{{ item.report_name }}</p>
                 </div>
                 <vab-icon v-show="editFlag" class="close" icon="close-fill" @click.stop="handleDel(index)" />
@@ -200,6 +200,7 @@
   import to from 'await-to-js'
   import indexApi from '@/api/index'
   import messageApi from '@/api/system/message'
+
   export default {
     name: 'Index',
     components: {
@@ -312,6 +313,25 @@
       window.addEventListener('resize', this.handleResize)
     },
     methods: {
+      async getHomeNumReportData() {
+        let ids = this.privateBoard.map((item) => {
+          return item.id
+        })
+        const {
+          data: { num_report_response },
+        } = await indexApi.getHomeNumReportData({ ids: ids })
+        let privateBoardData = []
+        this.privateBoard.forEach((item, index) => {
+          num_report_response.forEach((val) => {
+            if (item.id === val.id) {
+              this.privateBoard[index].report_data = val.data
+              privateBoardData.push(this.privateBoard[index])
+            }
+          })
+        })
+        this.privateBoard = privateBoardData
+        console.log(this.privateBoard)
+      },
       // 布局信息
       async init() {
         const [err, res] = await to(indexApi.getHomeReport({ module_code: 'HomePage' }))
@@ -332,6 +352,7 @@
         })
         await this.$nextTick()
         this.initChart()
+        this.getHomeNumReportData()
       },
       initChart() {
         // console.log(this.layout, 'layout')
@@ -594,6 +615,7 @@
       display: flex;
       justify-content: space-between;
       align-items: center;
+
       i {
         font-weight: normal;
         cursor: pointer;
@@ -609,19 +631,23 @@
       margin-right: 10px;
       overflow-x: hidden;
       overflow-y: auto;
+
       .board {
         display: flex;
         flex-direction: column;
         margin-bottom: 2px;
+
         ::v-deep .el-card__body {
           flex: 1;
           display: flex;
           flex-direction: column;
           justify-content: space-around;
         }
+
         .el-row {
           height: 100%;
           flex-wrap: wrap;
+
           > div,
           > div span {
             display: flex;
@@ -630,12 +656,15 @@
             flex-wrap: wrap;
             width: 100%;
           }
+
           .ghost {
             background: #ecf5ff;
           }
+
           .drag {
             background: pink;
           }
+
           .el-col {
             display: flex;
             height: 60px;
@@ -695,6 +724,7 @@
           height: 48px;
           display: flex;
           align-items: center;
+
           ul {
             flex: 1;
             display: flex;
@@ -708,6 +738,7 @@
               justify-content: center;
               user-select: none;
               cursor: pointer;
+
               &.active span:last-child {
                 background: rgb(34, 76, 218);
                 color: #fff;
@@ -797,6 +828,7 @@
   ::v-deep .el-timeline-item__tail {
     border-left: 2px dashed #e4e7ed;
   }
+
   // #funnel,
   // #bar {
   //   height: 100%;
@@ -804,18 +836,21 @@
   .vue-grid-layout {
     margin-left: -10px;
     margin-right: -10px;
+
     &.grid {
       background: linear-gradient(90deg, #fff 10px, transparent 0), linear-gradient(#fff 10px, transparent 0);
       background-size: calc((100% - 10px) / 24) 40px;
       background-position: top 0px left 0px;
     }
   }
+
   .vue-grid-item {
     background: #fff;
     border: 1px solid #ebeef5;
     border-radius: 4px;
     box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
     overflow: hidden;
+
     h4 {
       line-height: 22px;
       height: 54px;
@@ -825,16 +860,19 @@
       justify-content: space-between;
       align-items: center;
       border-bottom: 1px solid #ebeef5;
+
       i {
         font-size: 24px;
         font-weight: bold;
         cursor: pointer;
+
         &:hover {
           color: #1d66dc;
         }
       }
     }
   }
+
   .board-container {
     display: flex;
     height: 60px;
@@ -845,9 +883,11 @@
     flex: 1;
     cursor: pointer;
     user-select: none;
+
     &:hover {
       box-shadow: 0 2px 12px 0 rgb(0 0 0 / 10%);
     }
+
     .icon {
       font-size: 32px;
       border-radius: 4px;
@@ -855,34 +895,42 @@
       height: 40px;
       color: #1d66dc;
       background: #ecf5ff;
+
       &.ri-money-cny-circle-line {
         color: #e6a23c;
         background: #fdf6ec;
       }
+
       &.ri-exchange-cny-fill {
         color: #f56c6c;
         background: #fef0f0;
       }
     }
+
     .full-icon {
       flex: 1;
       font-size: 32px;
     }
+
     .close {
       font-size: 32px;
       transition: 0.3s all;
+
       &:hover {
         color: #1d66dc;
       }
     }
+
     .check {
       font-size: 32px;
       color: #67c23a;
     }
+
     .text {
       padding-left: 10px;
       color: #9499a0;
       flex: 1;
+
       .num {
         font-size: 22px;
         font-weight: bold;
@@ -890,9 +938,11 @@
       }
     }
   }
+
   .add-board {
     height: 500px;
     overflow: auto;
+
     li + li {
       margin-top: 10px;
     }

+ 4 - 1
src/views/proj/business/components/BusinessGradation.vue

@@ -206,6 +206,8 @@
           id: undefined,
           distributorId: undefined,
           distributorName: undefined,
+          custId: undefined,
+          custName: undefined,
           makerId: undefined,
           makerName: undefined,
           makerDept: undefined,
@@ -297,7 +299,8 @@
         this.form.technicalSupportContent = undefined
         this.form.technicalSupportTime = undefined
         this.form.remark = undefined
-        console.log(this.form)
+        this.customerInfo = { custId: this.form.custId, custName: this.form.custName }
+        this.queryContact = { custId: this.form.custId, isDecision: '10' }
         this.dialogFormVisible = true
       },
       open(row) {

+ 6 - 6
src/views/system/report/components/ReportEdit.vue

@@ -2,7 +2,7 @@
  * @Author: niezch@dashoo.cn
  * @Date: 2023-02-16 15:55:15
  * @LastEditors: niezch@dashoo.cn
- * @LastEditTime: 2023-02-17 15:53:42
+ * @LastEditTime: 2023-02-17 18:12:20
  * @Description: file content
  * @FilePath: \opms_frontend\src\views\system\report\components\ReportEdit.vue
 -->
@@ -26,16 +26,14 @@
       <el-form-item label="报表代码" prop="reportCode">
         <el-input v-model="form.reportCode" placeholder="请输入报表代码" />
       </el-form-item>
-      <el-form-item label="报表图标" prop="reportIcon">
+      <el-form-item label="报表图标" prop="icon">
         <el-popover popper-class="icon-selector-popper" trigger="hover" width="292">
           <template #reference>
             <el-input v-model="form.reportIcon" />
           </template>
           <vab-icon-selector @handle-icon="handleIcon" />
         </el-popover>
-        <!-- <el-input v-model="form.reportIcon" placeholder="请输入报表图标" /> -->
       </el-form-item>
-
       <el-form-item label="备注" prop="remark">
         <el-input v-model="form.remark" placeholder="请输入内容" type="textarea" />
       </el-form-item>
@@ -50,9 +48,11 @@
 <script>
   import reportApi from '@/api/system/report'
   import roleApi from '@/api/system/role'
-
+  import VabIconSelector from '@/extra/VabIconSelector'
+  import '@riophae/vue-treeselect/dist/vue-treeselect.css'
   export default {
     name: 'PostEdit',
+    components: { VabIconSelector },
     data() {
       return {
         form: { reportType: '10', reportIcon: undefined },
@@ -74,7 +74,7 @@
     },
     methods: {
       handleIcon(item) {
-        this.form.icon = item
+        this.form.reportIcon = item
       },
       showEdit(row) {
         if (!row) {

+ 40 - 27
src/views/system/report/components/ReportList.vue

@@ -2,26 +2,28 @@
  * @Author: niezch@dashoo.cn
  * @Date: 2023-02-16 15:55:15
  * @LastEditors: niezch@dashoo.cn
- * @LastEditTime: 2023-02-17 15:41:28
+ * @LastEditTime: 2023-02-21 17:37:39
  * @Description: file content
  * @FilePath: \opms_frontend\src\views\system\report\components\ReportList.vue
 -->
 <template>
   <el-dialog :title="title" :visible.sync="dialogFormVisible" width="700px" @close="close">
-    <el-table v-loading="listLoading" border :data="list" :height="height" @selection-change="setSelectRows">
+    <el-table
+      ref="RoleReportTable"
+      v-loading="listLoading"
+      border
+      :data="list"
+      height="500px"
+      @selection-change="setSelectRows">
+      <el-table-column align="center" show-overflow-tooltip type="selection" />
       <el-table-column align="center" label="角色Id" prop="id" show-overflow-tooltip />
       <el-table-column align="center" label="角色名称" prop="roleName" show-overflow-tooltip />
-      <!-- <el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip /> -->
+      <el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
       <el-table-column align="center" label="创建时间" prop="createdTime">
         <template #default="scope">
           <span>{{ parseTime(scope.row.createdTime) }}</span>
         </template>
       </el-table-column>
-      <el-table-column align="center" label="操作" show-overflow-tooltip>
-        <template #default="{ row }">
-          <el-button type="text" @click="handleApplication(row)">应用</el-button>
-        </template>
-      </el-table-column>
       <template #empty>
         <el-image class="vab-data-empty" :src="require('@/assets/empty_images/data_empty.png')" />
       </template>
@@ -47,13 +49,13 @@
         form: { reportType: '10' },
         rules: {
           reportName: [{ required: true, message: '报表名称不能为空', trigger: 'blur' }],
-          // reportType: [{ required: true, message: '报表类型不能为空', trigger: 'blur' }],
           reportDesc: [{ required: true, message: '报表描述不能为空', trigger: 'blur' }],
         },
         title: '',
         dialogFormVisible: false,
         // 角色选项
         roleOptions: [],
+        //权限表
         listLoading: true,
         list: [],
         rid: '',
@@ -76,13 +78,7 @@
         return this.$baseTableHeight(1)
       },
     },
-    mounted() {
-      // 获取角色
-      // roleApi.getList({ status: '10' }).then((response) => {
-      //   this.roleOptions = response.data.list
-      //   console.log( this.roleOptions)
-      // })
-    },
+    mounted() {},
     methods: {
       //应用
       async handleApplication(row) {
@@ -96,10 +92,20 @@
       },
       setSelectRows(val) {
         this.selectRows = val
+        if (!this.rid) return this.$baseMessage('报表数据有误', 'error', 'vab-hey-message-error')
+        reportApi
+          .addRoleReport({ reportId: this.rid, roleList: val })
+          .then((res) => {
+            console.log(res)
+          })
+          .catch((error) => {
+            console.log(error)
+          })
       },
       showEdit(row) {
         this.title = '应用'
-        this.getRoleList()
+
+        this.getRoleList(row.id)
         this.rid = row.id
         this.dialogFormVisible = true
       },
@@ -109,17 +115,24 @@
         this.total = data.total
         this.listLoading = false
       },
-      async getRoleList() {
-        roleApi.getList({ status: '10' }).then((response) => {
-          this.roleOptions = response.data.list
-          console.log(this.roleOptions)
+      async getRoleList(rid) {
+        roleApi.getList({ status: '10' }).then(async (response) => {
+          this.list = response.data.list
+          this.total = response.data.total
+          this.listLoading = false
+          const { data: data } = await reportApi.roleList({ reportId: rid })
+          this.$refs.RoleReportTable.clearSelection()
+          if (this.list && this.list.length && data.list && data.list.length) {
+            for (let item of this.list) {
+              for (let it of data.list) {
+                console.log(it, item)
+                if (item.id == it.roleId) {
+                  this.$refs.RoleReportTable.toggleRowSelection(item, true)
+                }
+              }
+            }
+          }
         })
-        const { data: data } = await roleApi.getList({ status: '10' })
-
-        console.log(data)
-        this.list = data.list
-        this.total = data.total
-        this.listLoading = false
       },
       close() {
         this.dialogFormVisible = false

+ 13 - 6
src/views/system/report/index.vue

@@ -2,8 +2,16 @@
   <div class="user-management-container">
     <vab-query-form>
       <vab-query-form-left-panel :span="5">
-        <el-button icon="el-icon-plus" type="primary" @click="handleEdit($event)">添加</el-button>
-        <el-button icon="el-icon-delete" type="danger" @click="handleDelete($event)">删除</el-button>
+        <el-button v-permissions="['system:report:add']" icon="el-icon-plus" type="primary" @click="handleEdit($event)">
+          添加
+        </el-button>
+        <el-button
+          v-permissions="['system:report:delete']"
+          icon="el-icon-delete"
+          type="danger"
+          @click="handleDelete($event)">
+          删除
+        </el-button>
       </vab-query-form-left-panel>
       <vab-query-form-right-panel :span="19">
         <el-form :inline="true" :model="queryForm" @submit.native.prevent>
@@ -36,7 +44,7 @@
       <el-table-column align="center" label="报表代码" prop="reportCode" show-overflow-tooltip />
       <el-table-column align="center" label="报表图标" prop="reportIcon" show-overflow-tooltip />
       <el-table-column align="center" label="报表名称" prop="reportName" show-overflow-tooltip />
-      <el-table-column align="center" label="正在使用的角色" prop="" show-overflow-tooltip />
+      <!-- <el-table-column align="center" label="正在使用的角色" prop="" show-overflow-tooltip /> -->
       <el-table-column align="center" label="报表描述" prop="reportDesc" show-overflow-tooltip />
       <el-table-column align="center" label="备注" prop="remark" show-overflow-tooltip />
 
@@ -48,8 +56,8 @@
       <el-table-column align="center" label="操作" show-overflow-tooltip width="125">
         <template #default="{ row }">
           <el-button type="text" @click="handleApplication(row)">应用</el-button>
-          <el-button type="text" @click="handleEdit(row)">编辑</el-button>
-          <el-button type="text" @click="handleDelete(row)">删除</el-button>
+          <el-button v-permissions="['system:report:edit']" type="text" @click="handleEdit(row)">编辑</el-button>
+          <el-button v-permissions="['system:report:delete']" type="text" @click="handleDelete(row)">删除</el-button>
         </template>
       </el-table-column>
       <template #empty>
@@ -128,7 +136,6 @@
           })
         } else {
           if (this.selectRows.length > 0) {
-            // const ids = this.selectRows.map((item) => item.id).join()
             let ids = []
             for (let item of this.selectRows) {
               ids.push(item.id)

+ 1 - 1
src/views/system/user/components/RestPwd.vue

@@ -2,7 +2,7 @@
   <!-- 添加或修改参数配置对话框 -->
   <el-dialog :title="title" :visible.sync="dialogFormVisible" width="600px" @close="close">
     <el-form ref="form" label-width="80px" :model="form" :rules="rules">
-      <el-form-item prop="password">
+      <el-form-item label="新密码" prop="password">
         <el-input v-model="form.password" placeholder="请输入新密码" show-password />
       </el-form-item>
     </el-form>

+ 8 - 3
src/views/system/user/components/UserEdit.vue

@@ -182,13 +182,18 @@
     methods: {
       // 获取角色和岗位
       getRoleAndPost() {
-        roleApi.getList({ status: '10' }).then((response) => {
+        let query = {
+          pageNum: 1,
+          pageSize: 999,
+          status: '10',
+        }
+        roleApi.getList(query).then((response) => {
           this.roleOptions = response.data.list
         })
-        postApi.getList({ status: '10' }).then((response) => {
+        postApi.getList(query).then((response) => {
           this.postOptions = response.data.list
         })
-        groupApi.getList({ status: '10' }).then((response) => {
+        groupApi.getList(query).then((response) => {
           this.groupOptions = response.data.list
         })
       },