value
2023-08-24 d94af68ec3f6317124df81296b08c7c110641fca
Merge remote-tracking branch 'origin/master'
已修改5个文件
已添加2个文件
717 ■■■■ 文件已修改
src/api/laboratory/organizational.js 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/laboratory/role.js 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/standardLibrary.js 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/chart/work/index.vue 210 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/laboratory/organizational/index.vue 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/laboratory/role/index.vue 287 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/standardLibrary/index.vue 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/laboratory/organizational.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,11 @@
import request from '@/utils/request'
const Api = {
    getOrganizational: "/organizational/list", // å››çº§æ ‘
}
export function getOrganizationalApi() {
    return request({
        url: Api.getOrganizational,
        method: 'get'
    })
}
src/api/laboratory/role.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,9 @@
import request from '@/utils/request'
export function getMenusTree(params) {
    return request({
      url: '/role-manager/getMenusTree',
      method: 'get',
      params
    })
  }
src/api/standardLibrary.js
@@ -1,12 +1,9 @@
import request from '@/utils/request'
export function getMaterialList(params) {
export function getMaterialList() {
  return request({
    url: '/material/list',
    method: 'get',
    params: {
      specificationName: params
    }
  })
}
src/views/chart/work/index.vue
@@ -1,13 +1,219 @@
<template>
  <div>工作统计图</div>
  <div class="work-main" style="overflow: scroll;width:100%;height:100vh">
      <div class="work-head">
          <el-row :gutter="10">
            <el-col :span="24">
                <el-card>
                  <el-form :inline="true" :model="formInline" class="demo-form-inline">
                    <el-form-item>
                      <p><span>*</span>检测日期:</p>
                      <el-date-picker
                        v-model="dateTime"
                        type="daterange"
                        range-separator="至"
                        start-placeholder="开始日期"
                        end-placeholder="结束日期">
                      </el-date-picker>
                    </el-form-item>
                    <el-form-item>
                      <p><span>*</span>检验类型:</p>
                      <el-select v-model="formInline.region" placeholder="采购入库">
                        <el-option label="区域一" value="shanghai"></el-option>
                        <el-option label="区域二" value="beijing"></el-option>
                      </el-select>
                    </el-form-item>
                    <el-form-item class="buttons">
                      <el-button>清空</el-button>
                      <el-button type="primary" @click="onSubmit">查询</el-button>
                    </el-form-item>
                  </el-form>
                </el-card>
            </el-col>
          </el-row>
      </div>
      <div class="work-center" >
        <el-row :gutter="20">
          <el-col :span="12">
              <el-card>
                <p>负责人统计</p>
                <div id="leaderStati" style="width:100%;height:400px;"></div>
              </el-card>
          </el-col>
          <el-col :span="12">
              <el-card>
                <p>实验员统计</p>
                <div id="testerStati" style="width:100%;height:400px;"></div>
              </el-card>
          </el-col>
          <el-col :span="12">
              <el-card>
                <p>负责人及时率</p>
                <div id="leaderTimly" style="width:100%;height:400px;"></div>
              </el-card>
          </el-col>
          <el-col :span="12">
              <el-card>
                <p>实验员及时率</p>
                <div id="testerTimly" style="width:100%;height:400px;"></div>
              </el-card>
          </el-col>
        </el-row>
      </div>
      <div class="work-foot"></div>
  </div>
</template>
<script>
import * as echarts from 'echarts';
export default {
  data() {
      return {
        formInline: {
          user: '',
          region: ''
        },
        dateTime: '',
      }
    },
    mounted(){
      this.initLeaderStatiChart('leaderStati');
      this.initLeaderTimlyChart();
      this.initLeaderStatiChart('testerStati');
      this.initTesterTimlyChart();
    },
    methods: {
      onSubmit() {
        console.log('submit!');
      },
      initLeaderStatiChart(id){
        var chartDom = document.getElementById(id);
        var myChart = echarts.init(chartDom);
        var option;
        let xAxisData = [];
        let data1 = [];
        let data2 = [];
        let data3 = [];
        let data4 = [];
        for (let i = 0; i < 10; i++) {
          xAxisData.push('Class' + i);
          data1.push(+(Math.random() * 2).toFixed(2));
          data2.push(+(Math.random() * 5).toFixed(2));
          data3.push(+(Math.random() + 0.3).toFixed(2));
          data4.push(+Math.random().toFixed(2));
        }
        var emphasisStyle = {
          itemStyle: {
            shadowBlur: 10,
            shadowColor: 'rgba(0,0,0,0.3)'
          }
        };
        option = {
          legend: {
            data: ['bar', 'bar2'],
            left: 'center'
          },
          tooltip: {},
          xAxis: {
            data: xAxisData,
            name: '姓名',
            axisLine: { onZero: true },
            splitLine: { show: false },
            splitArea: { show: false }
          },
          yAxis: {},
          grid: {
            bottom: 100
          },
          series: [
            {
              name: 'bar',
              type: 'bar',
              stack: 'one',
              emphasis: emphasisStyle,
              data: data1
            },
            {
              name: 'bar2',
              type: 'bar',
              stack: 'one',
              emphasis: emphasisStyle,
              data: data2
            }
          ]
        };
        myChart.on('brushSelected', function (params) {
          var brushed = [];
          var brushComponent = params.batch[0];
          for (var sIdx = 0; sIdx < brushComponent.selected.length; sIdx++) {
            var rawIndices = brushComponent.selected[sIdx].dataIndex;
            brushed.push('[Series ' + sIdx + '] ' + rawIndices.join(', '));
          }
          myChart.setOption({
            title: {
              backgroundColor: '#333',
              text: 'SELECTED DATA INDICES: \n' + brushed.join('\n'),
              bottom: 0,
              right: '10%',
              width: 100,
              textStyle: {
                fontSize: 12,
                color: '#fff'
              }
            }
          });
        });
        option && myChart.setOption(option);
      },
      initTesterStatiChart(){
      },
      initLeaderTimlyChart(){
      },
      initTesterTimlyChart(){
      },
    }
}
</script>
<style lang="scss" scoped>
  .work-main{
    width:100%;
    margin:0;
    padding: 0;
    .work-head{
      width:94%;
      height:100;
      margin: 5px 10px;
      position: fixed;
      z-index: 10;
      .demo-form-inline{
        margin: 0px 10px;
        p{
          margin: 0;
          font-size: 16px;
          font-weight: bold;
          span{
            font-size: 16px;
            font-weight: bold;
            color: red;
          }
        }
        .buttons{
          margin: 40px 0px 0px 900px;
        }
      }
    }
    .work-center{
      margin: 0px 0px 5px 10px;
      padding: 18vh 0px 5px 0px;
      .el-card{
        margin: 5px 0px;
        height:500px;
      }
    }
  }
</style>
src/views/laboratory/organizational/index.vue
@@ -1,11 +1,190 @@
<template>
  <div>131</div>
  <div class="main-div">
    <div class="side_div">
      <el-input placeholder="输入关键字进行过滤" v-model="filterText">
      </el-input>
      <el-tree
        class="filter-tree"
        :data="data"
        node-key="id"
        :props="defaultProps"
        default-expand-all
        :filter-node-method="filterNode"
        ref="tree"
        @node-click="handleNodeClick"
      >
      </el-tree>
    </div>
    <div class="table_div">
      <div class="table_top_div">
        <span class="top_span" v-if="msg !== ''">{{ msg }}</span>
        <div style="text-align: right; float: right">
          <el-button
            type="primary"
            size="small"
            icon="el-icon-circle-plus-outline"
            >新增</el-button
          >
          <el-button size="small" icon="el-icon-delete-solid">删除</el-button>
        </div>
      </div>
      <div class="table-main-div">
        <el-table
          ref="multipleTable"
          :data="tableData"
          border
          height="100%"
          tooltip-effect="dark"
          style="width: 100%"
          @selection-change="handleSelectionChange"
        >
          <el-table-column type="selection" width="55"> </el-table-column>
          <el-table-column label="日期" width="120">
            <template slot-scope="scope">{{ scope.row.date }}</template>
          </el-table-column>
          <el-table-column prop="name" label="姓名" width="120">
          </el-table-column>
          <el-table-column prop="address" label="地址" show-overflow-tooltip>
          </el-table-column>
        </el-table>
      </div>
    </div>
  </div>
</template>
<script>
import { getOrganizationalApi } from "@/api/laboratory/organizational";
export default {
  name: "Organizational",
  data() {
    return {
      filterText: "",
      msg: "",
      data: [],
      // tree树默认值配置
      defaultProps: {
        children: "children",
        label: "department",
        id: "id",
      },
      tableData: [
        {
          date: "2016-05-02",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1518 å¼„",
        },
        {
          date: "2016-05-04",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1517 å¼„",
        },
        {
          date: "2016-05-01",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1519 å¼„",
        },
        {
          date: "2016-05-03",
          name: "王小虎",
          address: "上海市普陀区金沙江路 1516 å¼„",
        },
      ],
    };
  },
  methods: {
    // æ ‘上方搜索框过滤器
    filterNode(value, data) {
      if (!value) return true;
      return data.department.indexOf(value) !== -1;
    },
    // åˆå§‹åŒ–获取树数据
    treeInitialization() {
      getOrganizationalApi().then((res) => {
        this.data = res.data;
      });
    },
    // èŽ·å–æ ‘è·¯å¾„
    getParentData(node, department) {
      if (node !== null) {
        if (node.data.department !== undefined) {
          this.msg = node.data.department + " > " + department;
        }
        this.getParentData(node.parent, this.msg);
      }
    },
    // ç‚¹å‡»æ ‘节点
    handleNodeClick(data, node, element) {
      this.getParentData(node.parent, node.data.department);
      console.log(`output->this.msg`, this.msg);
      console.log(`output->data`, data);
      console.log(`output->node`, node);
      console.log(`output->element`, element);
    },
    // æ”¹å˜å¤šé€‰æ¡†çŠ¶æ€
    toggleSelection(rows) {
      if (rows) {
        rows.forEach((row) => {
          this.$refs.multipleTable.toggleRowSelection(row);
        });
      } else {
        this.$refs.multipleTable.clearSelection();
      }
    },
    // ç‚¹å‡»å¤šé€‰æ¡†ä»¥åŽçš„æ“ä½œ
    handleSelectionChange(val) {
      this.multipleSelection = val;
    },
  },
  mounted() {
    this.treeInitialization();
  },
  watch: {
    filterText(val) {
      this.$refs.tree.filter(val);
    },
  },
};
</script>
<style></style>
<style lang="scss">
.main-div {
  width: 99.2% !important;
  height: 94vh !important;
  margin: 5px 5px 5px 5px;
}
.side_div {
  float: left;
  width: 300px;
  height: 95%;
  margin-bottom: 5px;
  background-color: #ffffff;
  padding: 15px;
}
.table_div {
  margin-left: 6px;
  float: left;
  width: calc(100% - 306px);
  height: 95%;
  background-color: #ffffff;
}
.filter-tree {
  margin-top: 6px;
}
.table_top_div {
  height: 80px;
  width: 100%;
  padding-top: 23px;
  padding-right: 50px;
}
.table-main-div {
  width: 100%;
  height: 90.3%;
  padding: 10px;
}
.top_span {
  margin-left: 12px;
  font-size: 16px;
  font-weight: 500;
  color: #999999;
}
</style>
src/views/laboratory/role/index.vue
@@ -1,140 +1,105 @@
<template>
  <div>
      <div class="content-main">
          <div class="top-bar">
              <el-form ref="form" :inline="true" :model="searchData">
              <el-form-item label="角色名称:" class="sermargin">
                <el-input
                  v-model="searchData.roleName"
                  class="input-form"
                  placeholder="请输入角色名称"
                  style="width:250px"
                >
                </el-input>
              </el-form-item>
              <el-form-item label="权限:" class="sermargin">
                <el-input
                  v-model="searchData.permission"
                  class="input-form"
                  placeholder="请输入权限"
                  style="width:250px"
                >
                </el-input>
              </el-form-item>
              <el-form-item class="rightBtn">
                <el-button type="primary" @click="search">查询</el-button>
                <el-button type="primary" plain @click="reset">重置</el-button>
              </el-form-item>
              </el-form>
              <el-form>
                <el-form-item class="rightBtn">
                  <el-button type="primary" @click="addRole" icon="el-icon-plus">新增权限</el-button>
                </el-form-item>
              </el-form>
              </el-form>
          </div>
          <div class="library-table">
            <div class="table-box">
              <el-table
                :max-height="800"
                :cell-style="{textAlign: 'center'}"
                :header-cell-style="{border:'0px',background:'#f5f7fa',color:'#606266',boxShadow: 'inset 0 1px 0 #ebeef5',textAlign: 'center'}"
                :data="roleTable"
                style="width: 100%"
              >
                <el-table-column
                  type="selection"
                  min-width="8%"
                />
                <el-table-column
                  prop="rolename"
                  label="角色名称"
                  min-width="20%"
                />
                <el-table-column
                  prop="permission"
                  label="权限"
                  min-width="20%"
                />
                <el-table-column
                  prop="create_time"
                  label="创建时间"
                  min-width="20%"
                />
                <el-table-column
                  prop="update_time"
                  label="更新时间"
                  min-width="20%"
                />
                <el-table-column
                  label="操作"
                  min-width="12%"
                >
                  <template slot-scope="scope">
                    <el-button type="text" size="small" >编辑</el-button>
                    <el-button type="text" size="small" >删除</el-button>
                  </template>
                </el-table-column>
              </el-table>
              <!-- åˆ†é¡µå™¨ -->
              <div class="pagination">
                <el-pagination
                  @size-change="handleSizeChange"
                  @current-change="handleCurrentChange"
                  :current-page="currentPage"
                  :page-sizes="[5, 10, 20]"
                  :page-size="pageSize"
                  layout="total, sizes, prev, pager, next, jumper"
                  :total="total">
                </el-pagination>
              </div>
            </div>
          </div>
      </div>
      <el-dialog title="修改密码" :visible.sync="dialogTableVisible" width="30%">
        <el-form :model="updateData" ref="updateData" label-position="right" label-width="100px">
          <el-form-item label="原密码:">
            <el-input style="width: 300px" v-model="updateData.oldPassWord" placeholder="请输入原密码" >
    <div class="content-main">
      <div class="top-bar">
        <el-form ref="form" :inline="true" :model="searchData">
          <el-form-item label="角色名称:" class="sermargin">
            <el-input v-model="searchData.roleName" class="input-form" placeholder="请输入角色名称" style="width:250px">
            </el-input>
          </el-form-item>
          <el-form-item label="新密码:">
            <el-input style="width: 300px" v-model="updateData.newPassWord" placeholder="请输入新密码">
          <el-form-item label="权限:" class="sermargin">
            <el-input v-model="searchData.permission" class="input-form" placeholder="请输入权限" style="width:250px">
            </el-input>
          </el-form-item>
          <el-form-item label="确认密码:">
            <el-input style="width: 300px" v-model="updateData.confirmPassWord" placeholder="再次输入密码">
            </el-input>
          <el-form-item class="rightBtn">
            <el-button type="primary">查询</el-button>
            <el-button type="primary" plain>重置</el-button>
          </el-form-item>
        </el-form>
        <span slot="footer" class="dialog-footer">
          <el-button @click="dialogTableVisible = false">取 æ¶ˆ</el-button>
          <el-button type="primary" @click="changePassword">ç¡® å®š</el-button>
        </span>
      </el-dialog>
        <el-form>
          <el-form-item class="rightBtn">
            <el-button type="primary" @click="addClickRole" icon="el-icon-plus">新增角色</el-button>
          </el-form-item>
        </el-form>
        </el-form>
      </div>
      <div class="library-table">
        <div class="table-box">
          <el-table :max-height="800" :cell-style="{ textAlign: 'center' }"
            :header-cell-style="{ border: '0px', background: '#f5f7fa', color: '#606266', boxShadow: 'inset 0 1px 0 #ebeef5', textAlign: 'center' }"
            :data="roleTable" style="width: 100%">
            <el-table-column type="selection" min-width="8%" />
            <el-table-column prop="rolename" label="角色名称" min-width="20%" />
            <el-table-column prop="permission" label="权限" min-width="20%" />
            <el-table-column prop="create_time" label="创建时间" min-width="20%" />
            <el-table-column prop="update_time" label="更新时间" min-width="20%" />
            <el-table-column label="操作" min-width="12%">
              <template slot-scope="scope">
                <el-button type="text" size="small">编辑</el-button>
                <el-button type="text" size="small">删除</el-button>
              </template>
            </el-table-column>
          </el-table>
          <!-- åˆ†é¡µå™¨ -->
          <div class="pagination">
            <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
              :current-page="currentPage" :page-sizes="[5, 10, 20]" :page-size="pageSize"
              layout="total, sizes, prev, pager, next, jumper" :total="total">
            </el-pagination>
          </div>
        </div>
      </div>
    </div>
    <el-dialog title="新增角色" :visible.sync="dialogTableVisible" width="60%">
      <el-form :model="roleAdd" ref="roleAdd" label-position="right" label-width="100px">
        <el-form-item label="角色名:">
          <el-input style="width: 300px" v-model="roleAdd.roleName" placeholder="请输入角色名">
          </el-input>
        </el-form-item>
        <el-form-item label="功能选择:">
          <el-cascader size="medium " v-model="roleAdd.menuData" :options="menuInfo">
            <template slot-scope="{ node, data }">
              <span>{{ data.label }}</span>
              <span v-if="!node.isLeaf"> ({{  }}) </span>
            </template>
          </el-cascader>
        </el-form-item>
      </el-form>
      <span slot="footer" class="dialog-footer">
        <el-button @click="dialogTableVisible = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="addRole">ç¡® å®š</el-button>
      </span>
    </el-dialog>
  </div>
</template>
<script>
import { getPlanPageList, getStandingPageList } from '@/api/laboratory/measure'
import { getMenusTree } from '@/api/laboratory/role'
export default {
  data() {
    return {
      searchData:{
      props: { multiple: true },
      roleAdd: {
        roleName: null,
        menuData: null
      },
      searchData: {
        roleName: '',
        permission: ''
      },
      roleTable:[{
      menuInfo: [],
      roleTable: [{
        rolename: '部长',
        permission: 'ROOT',
        create_time: '2023-07-04 12:12:12',
        update_time: '2023-07-04 12:12:12'
      },{
      }, {
        rolename: '组长',
        permission: '--',
        create_time: '2023-07-04 12:12:12',
        update_time: '2023-07-04 12:12:12'
      }],
      updateData:{
      updateData: {
        oldPassWord: '',
        newPassWord: '',
        confirmPassWord: ''
@@ -145,13 +110,37 @@
      total: 20
    }
  },
  created(){
  created() {
  },
  methods: {
    addRole(){
    async addClickRole() {
      let res = await getMenusTree();
      this.menuInfo = res.data
      this.menuInfo.forEach(item => {
        item.select = false
        item.add = false
        item.update = false
        item.delete = false
        if (item.children.length == 0) {
          delete item['children']
        } else {
          item.children.forEach(c => {
            c.select = false
            c.add = false
            c.update = false
            c.delete = false
            if (c.children.length == 0) {
              delete c['children']
            }
          })
        }
      })
      this.dialogTableVisible = true
      // console.log(this.dialogTableVisible)
    },
    addRole() {
      console.log(this.roleAdd);
    },
    // search(){},
    // reset(){},
@@ -170,44 +159,48 @@
</script>
<style scoped>
.top-bar {
  margin: -25px -15px;
  background: #fff;
  display: flex;
  justify-content: space-between;
  padding: 5px 24px 0px 24px;
.top-bar{
    margin: -25px -15px;
  .sermargin {
    margin-right: 60px;
  }
}
.rightBtn {
  margin-right: 50px
}
.library-table {
  background-color: #fff;
  flex: 1;
  margin: 0px -15px;
  margin-top: 40px;
  display: flex;
  flex-direction: column;
  .table-box {
    padding: 10px 20px;
    margin-top: 0px;
    flex: 1;
    background: #fff;
    /* padding: 20px 20px 10px 20px; */
    display: flex;
    justify-content: space-between;
    padding: 5px 24px 0px 24px;
    .sermargin{
      margin-right: 60px;
    flex-direction: column;
    .el-table {
      flex: 1;
    }
  }
.rightBtn{
    margin-right: 50px
}
.library-table{
      background-color: #fff;
      flex: 1;
      margin: 0px -15px;
      margin-top: 40px;
      display: flex;
      flex-direction: column;
      .table-box{
          padding: 10px 20px;
          margin-top: 0px;
          flex: 1;
          background: #fff;
          /* padding: 20px 20px 10px 20px; */
          display: flex;
          flex-direction: column;
          .el-table {
            flex: 1;
          }
      }
      .pagination{
        display:flex;
        justify-content:end;
        margin-top: 20px
      }
    }
  .pagination {
    display: flex;
    justify-content: end;
    margin-top: 20px
  }
}
</style>
src/views/standardLibrary/index.vue
@@ -201,11 +201,10 @@
  methods: {
    filterNode(value, data) {
      if (!value) return true;
      return data.label.indexOf(value) !== -1;
      return data.name.indexOf(value) !== -1;
    },
    // èŽ·å–bom树的标准数据
    async getStandardTree() {
      console.log(`output->执行力`, "执行力");
      const { data } = await getMaterialList();
      this.standardTree = data.map((item) => {
        let name = null;
@@ -228,14 +227,11 @@
      const treeOptions = JSON.parse(JSON.stringify(this.standardTree));
      this.getDefault(treeOptions, 0);
      this.formTypeOptions = treeOptions;
      console.log(`output->===========`, "===========");
      this.$nextTick().then(() => {
        const firstNode = document.querySelector(
          ".el-tree-node .el-tree-node__children .el-tree-node .el-tree-node__children .el-tree-node .el-tree-node__children .el-tree-node"
        );
        console.log(`output->firstNode`, firstNode);
        firstNode.click();
        // console.log(firstNode);
      });
    },
    getDefault(arr, index) {
@@ -254,10 +250,8 @@
      // æ˜¯å­èŠ‚ç‚¹
      if (node.level === 4) {
        this.getParentData(node.parent, node.data.name);
        console.log(`output->this.msg`, this.msg);
        // å­˜ä¸‹é€‰ä¸­èŠ‚ç‚¹
        this.selectData = data;
        // eslint-disable-next-line prefer-const
        this.getTableByClick(data);
      }
      if (!("children" in data)) {
@@ -289,7 +283,6 @@
          }
        });
        this.tableData = res.data;
        console.log(`output->this.tableData`, this.tableData);
        this.selectDataList();
      });
    },
@@ -361,7 +354,6 @@
      this.getTableByClick(this.selectData);
    },
    changeCascader(data) {
      console.log(`output->----------`, data);
      this.addTreeForm.addTypeArr = data;
    },
    closeAddTreeForm() {
@@ -422,7 +414,6 @@
      } else {
        this.deleteList.splice(0, this.deleteList.length);
      }
      console.log(`output->this.`, this.deleteList);
    },
    //选择某行
    selectTr(selection, row) {
@@ -458,7 +449,6 @@
          }
        });
      }
      console.log(`output->this.deleteList`, this.deleteList);
    },
    //递归子级
    toggleSelect(data, flag, type) {