yxh
14 小时以前 ad5e7a527167a86ca7969e874df9950a5c4e2ff9
src/views/project/statistics/caseStatistics/index.vue
@@ -1,27 +1,502 @@
<!--  -->
<template>
  <div>
案例
  <div class="app-container">
    <el-form
      class="opo-query-form"
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      v-show="showSearch"
      label-width="70px"
    >
      <el-row >
        <el-col :span="8">
          <el-form-item label="月份范围">
            <el-date-picker
              style="width: 100%"
              v-model="selecttime"
              type="monthrange"
              range-separator="至"
              start-placeholder="开始月份"
              end-placeholder="结束月份"
              value-format="yyyy-MM-dd"
              @change="getTimeList"
            >
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item align="left" label="业务组" prop="treatmenthospitalno">
            <el-select
              v-model="queryParams.padeptno"
              placeholder="请选择业务组"
            >
              <el-option
                v-for="item in deptList"
                :label="item.deptName"
                :value="item.deptId"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item label="业务人员" prop="name">
            <el-input
              v-model="queryParams.pausername"
              placeholder="请输入姓名"
              clearable
              size="small"
              @keyup.enter.native="handleQuery"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item>
            <el-button
              type="primary"
              icon="el-icon-search"
              size="mini"
              @click="handleQuery"
              >搜索</el-button
            >
            <el-button icon="el-icon-refresh" size="mini" @click="resetQuery"
              >重置</el-button
            >
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>
    <el-row :gutter="10" class="mb8">
      <el-col :span="1.5">
        <el-button
          type="warning"
          plain
          icon="el-icon-download"
          size="mini"
          :loading="exportLoading"
          @click="handleExport"
          >导出</el-button
        >
      </el-col>
      <right-toolbar
        :showSearch.sync="showSearch"
        @queryTable="getList"
      ></right-toolbar>
    </el-row>
    <el-tabs v-model="activeTab">
      <el-tab-pane label="按业务组" name="dept">
        <el-table
          v-loading="loading"
          :data="deptData"
          ref="deptTable"
          border
          max-height="700"
          highlight-current-row
          :summary-method="getDeptSummaries"
          show-summary
        >
          <el-table-column label="序号" align="center" prop="id" width="50" />
          <el-table-column label="业务组" align="center" prop="deptname" width="250" />
          <el-table-column label="累计案例" align="center" prop="caseTotal" width="150" />
          <el-table-column label="终止案例" align="center" prop="terminationTotal" width="150" />
        </el-table>
      </el-tab-pane>
      <el-tab-pane label="按人员" name="person">
        <el-table
          v-loading="loading"
          :data="jxidata"
          ref="personTable"
          border
          max-height="700"
          highlight-current-row
          :summary-method="getSummaries"
          show-summary
        >
          <el-table-column label="序号" align="center" prop="id" width="50" />
          <el-table-column label="业务组" align="center" prop="deptname" width="250" >      </el-table-column>
          <el-table-column label="专职人员" align="center" prop="reportername" width="150" />
          <!-- <el-table-column label="登记案例累计" align="center" prop="casesum" width="100" /> -->
          <!-- <el-table-column label="潜在捐献" align="center" prop="workflow0" width="100" />
          <el-table-column label="医学评估" align="center" prop="workflow1" width="100" />
          <el-table-column label="家属确认" align="center" prop="workflow2" width="100" />
          <el-table-column label="伦理审查" align="center" prop="workflow3" width="100" />
          <el-table-column label="器官分配" align="center" prop="workflow4" width="100" />
          <el-table-column label="获取见证" align="center" prop="workflow5" width="100" />
          <el-table-column label="捐献完成" align="center" prop="workflow6" width="100" />
          <el-table-column label="归档撤销" align="center" prop="workflow7" width="100" />
          <el-table-column label="案例归档" align="center" prop="workflow8" width="100" /> -->
          <el-table-column label="案例累计" align="center" prop="workflowsum" width="200" />
          <el-table-column label="终止案例" align="center" prop="terminationcase" width="100" />
          <!-- <el-table-column
            label="操作"
            align="center"
            class-name="small-padding fixed-width"
            fixed="right"
          >
            <template slot-scope="scope">
              <el-button size="mini" type="text" icon="el-icon-edit"
                >明细</el-button
              >
            </template>
          </el-table-column> -->
        </el-table>
      </el-tab-pane>
    </el-tabs>
    <div style="margin: 10px;text-align: right;">
      <div>
        共 <span style="color:#1890FF ;">{{ tableTotal }}</span> 条数据
      </div>
    </div>
    <!-- 添加或修改家属确认对话框 -->
  </div>
</template>
<script>
export default {
  data () {
    return {
//这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
//例如:import 《组件名称》 from '《组件路径》';
import {
  listsfeistatistics,
  listbxiaostatistics,
  listjixstatistics,
  listanlstatistics,
  exportCaseStatistics,
  exportCaseDeptStatistics
} from "@/api/project/statistics";
import { listUser } from "@/api/project/organization";
import Li_area_select from "@/components/Address";
import OrgSelecter from "@/views/project/components/orgselect";
import AnnexUpload from "@/views/project/components/annexupload";
import { listDept } from "@/api/system/dept";
export default {
  //import引入的组件需要注入到对象中才能使用
  components: {
    Li_area_select,
    OrgSelecter,
    AnnexUpload
  },
  name: "Medicalevaluation",
  dicts: [],
  data() {
    //这里存放数据
    return {
      starttime: "",
      endtime: "",
      countyname: "",
      cuuntry: "",
      selecttime: "",
      reportervalue: "",
      //省市区
      //默认值设置,可为空
      searchAddress: {
        sheng: "",
        shi: "",
        qu: "",
        organizationname: null
      },
      provinceData: [
        { label: "全部", value: "" },
        { label: "杭州市", value: "1" },
        { label: "宁波市", value: "2" },
        { label: "温州市", value: "3" },
        { label: "嘉兴市", value: "4" },
        { label: "湖州市", value: "5" },
        { label: "绍兴市", value: "6" },
        { label: "金华市", value: "7" },
        { label: "衢州市", value: "8" },
        { label: "舟山市", value: "9" },
        { label: "台州市", value: "A" },
        { label: "丽水市", value: "B" }
      ],
      residenceAddresss: {
        sheng: "浙江省",
        shi: "",
        qu: ""
      },
      registerAddresss: {
        sheng: "浙江省",
        shi: "",
        qu: ""
      },
      defultAddresss: {
        sheng: "浙江省",
        shi: "",
        qu: ""
      },
      // 遮罩层
      loading: false,
      // 导出遮罩层
      exportLoading: false,
      // 选中数组
      ids: [],
      // 非单个禁用
      single: true,
      // 非多个禁用
      multiple: true,
      // 显示搜索条件
      showSearch: true,
      // 总条数
      total: 0,
      // 捐献基础表格数据
      donatebaseinfoList: [],
      // 捐献基础表格数据
      jxidata: [],
      // 当前页签:dept=按业务组,person=按人员
      activeTab: "dept",
      // 按业务组聚合数据
      deptData: [],
      // 弹出层标题
      title: "",
      // 是否显示弹出层
      open: false,
      // 获取组织名称时间范围
      daterangeReporttime: [],
      // 查询参数
      queryParams: {
        pabegtime: null,
        paendtime: null
      },
      deptList: [],
      // 表单参数
      form: {},
      // 表单校验
      rules: {},
      //当前选中捐献案例
      curCase: {},
      //流程名称
      flowname: "捐献医学评估",
      //流程名称-伦理审查
      annexno: "",
      confirmationform: {},
      //是否显示确认登记表
      isShowConfirmationDialog: false,
      //确认登记表title
      confirmationTitle: ""
    };
  },
  //监听属性 类似于data概念
  computed: {
    tableTotal() {
      return this.activeTab === "dept" ? this.deptData.length : this.jxidata.length;
    }
  },
  activated() {},
  mounted() {},
  //监控data中的数据变化
  watch: {},
  //方法集合
  methods: {
    getTimeList(e) {
      if (this.selecttime != 0) {
        this.queryParams.pabegtime = this.selecttime[0];
        this.queryParams.paendtime = this.selecttime[1];
        // if (this.queryParams.paendtime == this.queryParams.pabegtime) {
        // 结束时间取"所选结束月的次月 1 号",以包含整个结束月。
        // 原实现把月份 +1 后直接拼字符串,12 月会得到 13 月(2026-13-01),
        // MySQL 报 Incorrect datetime value,存储过程直接 500。
        this.queryParams.paendtime = this.$moment(this.queryParams.paendtime)
          .startOf("month")
          .add(1, "month")
          .format("YYYY-MM")
          .concat("-01 00:00:00");
        this.queryParams.pabegtime =
          this.queryParams.pabegtime + " " + "00" + ":" + "00" + ":" + "00";
        // }
      } else {
        // this.queryParams.pabegtime = "1998-01-01 00:00:00";
        // this.queryParams.paendtime = "2998-01-01 00:00:00";
      }
    },
    listDept() {
      // 只取业务办公室(dept_id=102)下的业务组,供“业务组”下拉使用
      listDept({ parentId: 102 }).then(response => {
        this.deptList = response.data;
        this.loading = false;
      });
    },
    resetArr(Arr) {
      var hash = {};
      Arr = Arr.reduce(function(arr, current) {
        hash[current.reporterno]
          ? ""
          : (hash[current.reporterno] = true && arr.push(current));
        return arr;
      }, []);
      return Arr;
    },
    /** 查询捐献基础列表 */
    getList() {
      listanlstatistics(this.queryParams).then(res => {
        this.jxidata = res.rows;
        this.jxidata.forEach(($obj, $index) => {
          $obj.id = $index + 1;
        });
        this.total = res.total;
        this.buildDeptData();
      });
    },
    /** 按业务组聚合:累计案例 = Σworkflowsum,终止案例 = Σterminationcase */
    buildDeptData() {
      const map = new Map();
      this.jxidata.forEach(row => {
        const key = row.deptid || row.deptname || "未分组";
        if (!map.has(key)) {
          map.set(key, {
            deptname: row.deptname || "未分组",
            caseTotal: 0,
            terminationTotal: 0
          });
        }
        const item = map.get(key);
        item.caseTotal += Number(row.workflowsum) || 0;
        item.terminationTotal += Number(row.terminationcase) || 0;
      });
      this.deptData = Array.from(map.values()).map((item, index) => {
        item.id = index + 1;
        return item;
      });
    },
    /** 导出按钮操作 */
    handleExport() {
      const queryParams = {
        pabegtime: this.queryParams.pabegtime,
        paendtime: this.queryParams.paendtime,
        padeptno: this.queryParams.padeptno,
        pausername: this.queryParams.pausername
      };
      const exportApi =
        this.activeTab === "dept"
          ? exportCaseDeptStatistics
          : exportCaseStatistics;
      this.$modal
        .confirm("是否确认导出当前列表的案例统计数据?")
        .then(() => {
          this.exportLoading = true;
          return exportApi(queryParams);
        })
        .then(response => {
          this.$download.name(response.msg);
          this.exportLoading = false;
        })
        .catch(() => {
          this.exportLoading = false;
        });
    },
    getSummaries(param) {
      const { columns, data } = param;
      const sums = [];
      var columnnames = ["deptname", "reportername"];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = "合计";
          return;
        }
        //去除部分字段计算
        if (columnnames.indexOf(column.property) > -1) {
          return;
        }
        const values = data.map(item => Number(item[column.property]));
        if (!values.every(value => isNaN(value))) {
          sums[index] = values.reduce((prev, curr) => {
            const value = Number(curr);
            if (!isNaN(value)) {
              return prev + curr;
            } else {
              return prev;
            }
          }, 0);
          sums[index] = sums[index]; // 保留2位小数,解决小数合计列;
        } else {
          sums[index] = "";
        }
      });
      return sums;
    },
    /** 按业务组表格合计 */
    getDeptSummaries(param) {
      const { columns, data } = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = "合计";
          return;
        }
        if (column.property === "deptname") {
          return;
        }
        const total = data.reduce(
          (prev, item) => prev + (Number(item[column.property]) || 0),
          0
        );
        sums[index] = data.length === 0 ? "" : total;
      });
      return sums;
    },
    // 表单重置
    reset() {
      this.form = {};
    },
    /** 搜索按钮操作 */
    handleQuery() {
      this.queryParams.pageNum = 1;
      this.getList();
    },
    /** 重置按钮操作 */
    resetQuery() {
      this.daterangeReporttime = [];
      this.reportervalue = "";
      this.form.treatmenthospitalno = "";
      this.queryParams = {
        pabegtime: null,
        paendtime: null
      };
      this.selecttime = [];
      this.getTimeList();
      this.searchAddress = {
        sheng: "",
        shi: "",
        qu: "",
        organizationname: null
      };
      this.resetForm("queryForm");
      this.handleQuery();
    }
  },
  created () {
  },
  methods: {
  //生命周期 - 创建完成(可以访问当前this实例)
  created() {
    //获取列表
    this.getList();
    this.listDept();
  }
}
  // //生命周期 - 挂载完成(可以访问DOM元素)
  //    mounted() {},
  // beforeCreate() {}, //生命周期 - 创建之前
  // beforeMount() {}, //生命周期 - 挂载之前
  // beforeUpdate() {}, //生命周期 - 更新之前
  // updated() {}, //生命周期 - 更新之后
  // beforeDestroy() {}, //生命周期 - 销毁之前
  // destroyed() {}, //生命周期 - 销毁完成
  // activated() {}, //如果页面有keep-alive缓存功能,这个函数会触发
};
</script>
<style lang='scss' scoped>
</style>