yxh
昨天 0e5553e2390bb336e589e5b7f0fa890d59aed735
统计、绩效模块
已修改9个文件
784 ■■■■■ 文件已修改
package.json 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/project/statistics.js 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donateorgan/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/donationdetails/index.vue 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/fund/performancedetails/index.vue 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/statistics/applyStatistics/index.vue 191 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/statistics/caseStatistics/index.vue 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/statistics/chargeStatistics/index.vue 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/project/statistics/performanceStaristics/index.vue 214 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json
@@ -5,7 +5,7 @@
  "author": "浙江亥尔时信息科技有限公司",
  "license": "MIT",
  "scripts": {
    "serve": "vue-cli-service serve",
    "dev": "vue-cli-service serve",
    "build": "vue-cli-service build",
    "build:stage": "vue-cli-service build --mode staging",
    "preview": "node build/index.js --preview",
src/api/project/statistics.js
@@ -8,6 +8,14 @@
    data: query
  })
}
// 导出案例统计
export function exportCaseStatistics(query) {
  return request({
    url: '/project/spstatcase/export',
    method: 'get',
    params: query
  })
}
// 查询绩效统计
export function listjixstatistics(query) {
    return request({
@@ -16,6 +24,14 @@
      data: query
    })
  }
  // 导出绩效统计
export function exportPerformanceStatistics(query) {
    return request({
      url: '/project/funddetail/exportBonus',
      method: 'get',
      params: query
    })
  }
  // 查询报销统计
export function listbxiaostatistics(query) {
    return request({
@@ -24,6 +40,14 @@
      data: query
    })
  }
  // 导出费用统计
export function exportExpenseStatistics(query) {
    return request({
      url: '/project/spstatexpense/export',
      method: 'get',
      params: query
    })
  }
  // 查询收费统计
export function listsfeistatistics(query) {
    return request({
src/views/project/donateorgan/index.vue
@@ -11,7 +11,6 @@
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="器官状态" prop="organstate">
            <el-select v-model="queryParams.organstate" placeholder="请选择" clearable size="small">
@@ -20,7 +19,6 @@
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="移植机构" prop="gainhospitalname">
            <org-selecter ref="tranHosSelect" :org-type="'4'" v-model="queryParams.gainhospitalname" />
@@ -37,7 +35,6 @@
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="6">
          <el-form-item label="捐献者" prop="name">
            <el-input v-model="queryParams.name" placeholder="请输入捐献者" />
@@ -54,7 +51,6 @@
             <org-selecter ref="tranHosSelect" :org-type="'4'" v-model="queryParams.gainhospitalname2" />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="归属地区" prop="businessarea">
             <el-select v-model="queryParams.businessarea" placeholder="请选择地市">
@@ -66,15 +62,10 @@
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row>
        <el-col :span="9">
          <el-form-item label="获取时间" prop="organgettime">
            <el-date-picker style="width: 100%" v-model="queryParams.organgettime" type="monthrange" range-separator="至"
@@ -85,17 +76,13 @@
            </el-date-picker> -->
          </el-form-item>
        </el-col>
        <el-col :span="9">
          <el-form-item label="移植时间" prop="transplanttime">
             <el-date-picker style="width: 100%" v-model="queryParams.transplanttime" type="monthrange" range-separator="至"
              start-placeholder="开始月份" end-placeholder="结束月份" value-format="yyyy-MM-dd">
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item>
            <el-button type="primary" icon="el-icon-search" style="margin-right: 20px" size="mini" @click="handleQuery">
@@ -108,8 +95,6 @@
        <el-col :span="6">
          <el-form-item label="组长" prop="zuzhang">
            <el-input
              v-model="queryParams.zuzhang"
            />
          </el-form-item>
@@ -128,12 +113,7 @@
        </el-date-picker>
      </el-form-item>
        </el-col>
      </el-row> -->
    </el-form>
    <el-row :gutter="10" class="mb8">
@@ -143,8 +123,6 @@
      </el-col>
      <right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
    </el-row>
    <!--<el-table v-loading="loading" :data="donateorganList" @selection-change="handleSelectionChange" label-width="96px">-->
    <el-table border v-loading="loading" :data="newdonateorganList" @selection-change="handleSelectionChange"
      label-width="96px">
src/views/project/donationdetails/index.vue
@@ -2811,18 +2811,6 @@
        contacttime: "",
        reporttime: ""
      },
      organOrder: [
        "肝脏",
        "左肾",
        "右肾",
        "心脏",
        "左肺",
        "右肺",
        "胰腺",
        "小肠",
        "左眼角膜",
        "右眼角膜"
      ], // 指定的器官顺序
      isSorting: false, // 标志位,表示是否正在排序
      tableKey: 0,
      istb: false,
@@ -3182,7 +3170,8 @@
    // 监听 procureddata 的变化,数据更新后重新排序
    procureddata: {
      handler(newVal) {
        if (this.procureddata[0].organgettime) {
        // 判空:取消最后一个器官时数组会变成空,直接取 [0] 会抛 TypeError
        if (this.procureddata[0] && this.procureddata[0].organgettime) {
          this.organgettimetrue = true;
        }
        if (this.isSorting) {
@@ -3342,7 +3331,8 @@
        listDonateorgan(searchParam).then(res => {
          if (res.code == 200) {
            if (res.rows[0]) {
              this.allocateddata = res.rows;
              // 2026-10-23:按器官排队序号排序后再渲染
              this.allocateddata = this.sortOrganRows(res.rows);
              console.log("this.allocateddata", this.allocateddata);
              this.allocateddataform.allocateddata = this.allocateddata;
            }
@@ -3383,6 +3373,8 @@
              });
              // this.procureddata.infoid = this.infoid;
            }
            // 2026-10-23:按器官排队序号排序后再渲染
            this.procureddata = this.sortOrganRows(this.procureddata);
            this.organList.organprocured = [];
            for (let i = 0; i < this.procureddata.length; i++) {
              this.organList.organprocured.push(this.procureddata[i].organno);
@@ -3437,6 +3429,8 @@
              this.transplantdata.infoid = this.infoid;
            }
            // 2026-10-23:按器官排队序号排序后再渲染
            this.transplantdata = this.sortOrganRows(this.transplantdata);
            for (let i = 0; i < this.transplantdata.length; i++) {
              this.organList.organtransplant.push(
                this.transplantdata[i].organno
@@ -3703,6 +3697,8 @@
              item.transplanthospitalname = objs.organizationname;
            }
          });
          // 2026-10-23:提交前按器官排队序号排序,保证入库顺序与展示一致
          this.sortOrganRows(this.allocateddata);
          saveDonateorgan(this.allocateddata).then(res => {
            // 回填主键:后端已按"同一案例同一器官"做 upsert,回填后前端不会再误判为新增
            if (res && res.data && res.data.length === this.allocateddata.length) {
@@ -3757,6 +3753,8 @@
                  }
                });
                //保存器官获取表数据
                // 2026-10-23:提交前按器官排队序号排序
                this.sortOrganRows(this.procureddata);
                saveDonationwitnessorgan(this.procureddata).then(res => {
                  if (res && res.data && res.data.length === this.procureddata.length) {
                    res.data.forEach((row, i) => {
@@ -3793,6 +3791,8 @@
                    this.Processvalidation();
                  });
                  //保存器官获取表数据
                  // 2026-10-23:提交前按器官排队序号排序
                  this.sortOrganRows(this.procureddata);
                  saveDonationwitnessorgan(this.procureddata).then(res => {
                    if (res && res.data && res.data.length === this.procureddata.length) {
                      res.data.forEach((row, i) => {
@@ -3833,6 +3833,8 @@
            if (this.accomplishform.id) {
              updateDonatecompletioninfo(this.accomplishform).then(response => {
                this.$modal.msgSuccess("完成登记信息修改成功");
                // 2026-10-23:提交前按器官排队序号排序
                this.sortOrganRows(this.transplantdata);
                saveDonatecomporgan(this.transplantdata).then(res => {
                  if (res && res.data && res.data.length === this.transplantdata.length) {
                    res.data.forEach((row, i) => {
@@ -3854,6 +3856,8 @@
                  this.accomplishform.id = response.data.id;
                }
                this.$modal.msgSuccess("完成登记成功");
                // 2026-10-23:提交前按器官排队序号排序
                this.sortOrganRows(this.transplantdata);
                saveDonatecomporgan(this.transplantdata).then(res => {
                  if (res && res.data && res.data.length === this.transplantdata.length) {
                    res.data.forEach((row, i) => {
@@ -3886,35 +3890,48 @@
      }
    },
    customOrganSort() {
      console.log("调用");
    /**
     * 取器官的排队序号:字典 sys_Organ 的 dict_sort 原值
     * 字典里没有该器官时返回 null(排序时排最后)
     */
    getOrganSort(organno) {
      const list =
        (this.dict && this.dict.type && this.dict.type.sys_Organ) || [];
      const item = list.find(d => d.value === organno);
      if (item && item.raw) {
        const s = item.raw.dictSort;
        if (s !== null && s !== undefined && s !== "") {
          return Number(s);
        }
      }
      return null;
    },
    /**
     * 按器官排队序号升序排序(原地)
     * sort 为空/0 视为未知,排最后;相同序号按 id 兜底,保证顺序稳定
     */
    sortOrganRows(rows) {
      if (!rows || !rows.length) {
        return rows;
      }
      const weight = r => {
        const s = Number(r.sort);
        if (r.sort === null || r.sort === undefined || isNaN(s) || s === 0) {
          return 999999;
        }
        return s;
      };
      rows.sort((a, b) => weight(a) - weight(b) || (a.id || 0) - (b.id || 0));
      return rows;
    },
    customOrganSort() {
      // 1. 加锁,阻止监听器执行
      this.isSorting = true;
      this.loading = true;
      // 自定义排序函数
      this.procureddata.sort((a, b) => {
        const indexA = this.organOrder.indexOf(a.organname);
        const indexB = this.organOrder.indexOf(b.organname);
        // 如果两个都在列表中,按列表中的顺序排序
        if (indexA !== -1 && indexB !== -1) {
          return indexA - indexB;
        }
        // 如果 a 在列表中,b 不在,a 排前面
        if (indexA !== -1) {
          return -1;
        }
        // 如果 b 在列表中,a 不在,b 排前面
        if (indexB !== -1) {
          return 1;
        }
        // 两个都不在列表中,保持原顺序(或按其他规则,比如按字母排序,这里按原始顺序)
        return 0;
      });
      console.log(this.procureddata, "顺序");
      this.sortOrganRows(this.procureddata);
      this.tableKey += 1; // 改变 key 迫使表格重新渲染
      // 你可以使用 this.$forceUpdate() 或者重新赋值数组来触发更新
      this.procureddata = [...this.procureddata];
      this.$nextTick(() => {
        this.isSorting = false;
@@ -3922,33 +3939,10 @@
      });
    },
    allocateddataSort() {
      console.log("调用");
      // 1. 加锁,阻止监听器执行
      this.isSorting = true;
      // 自定义排序函数
      this.allocateddata.sort((a, b) => {
        const indexA = this.organOrder.indexOf(a.organname);
        const indexB = this.organOrder.indexOf(b.organname);
        // 如果两个都在列表中,按列表中的顺序排序
        if (indexA !== -1 && indexB !== -1) {
          return indexA - indexB;
        }
        // 如果 a 在列表中,b 不在,a 排前面
        if (indexA !== -1) {
          return -1;
        }
        // 如果 b 在列表中,a 不在,b 排前面
        if (indexB !== -1) {
          return 1;
        }
        // 两个都不在列表中,保持原顺序(或按其他规则,比如按字母排序,这里按原始顺序)
        return 0;
      });
      console.log(this.allocateddata, "顺序");
      this.sortOrganRows(this.allocateddata);
      this.tableKey += 1; // 改变 key 迫使表格重新渲染
      // 你可以使用 this.$forceUpdate() 或者重新赋值数组来触发更新
      this.allocateddata = [...this.allocateddata];
      this.$nextTick(() => {
        this.isSorting = false;
@@ -4028,6 +4022,8 @@
            this.allocateddata.push({
              organname: temporganname,
              organno: value,
              // 2026-10-23:写入器官排队序号(字典 dict_sort)
              sort: this.getOrganSort(value),
              id: null,
              infoid: this.infoid,
              donorno: this.form.donorno,
@@ -4098,6 +4094,8 @@
            this.procureddata.push({
              organname: temporganname,
              organno: value,
              // 2026-10-23:写入器官排队序号(字典 dict_sort)
              sort: this.getOrganSort(value),
              id: null,
              infoid: this.infoid,
              donorno: this.form.donorno,
@@ -4174,12 +4172,17 @@
            this.transplantdata.push({
              organname: temporganname,
              organno: value,
              // 2026-10-23:写入器官排队序号(字典 dict_sort)
              sort: this.getOrganSort(value),
              id: null,
              infoid: this.infoid,
              donorno: this.form.donorno,
              organstate: 1,
              transplantstate: 1
            });
            // 2026-10-23:完成登记原先没有 watch,新增器官会停在表格最后;
            // 这里立即按排队序号归位(原地排序后必须重新赋值,否则表格不重渲染)
            this.transplantdata = this.sortOrganRows([...this.transplantdata]);
          }
        } else {
          this.$modal.msgWarning("该器官已经选择,请勿重复选择!");
src/views/project/fund/performancedetails/index.vue
@@ -59,9 +59,17 @@
          </el-col>
        </el-row>
        <el-row>
          <el-col :span="5">
            <el-form-item label="联系电话" prop="phone">
              <el-input v-model="form.phone" placeholder="请输入联系电话" />
           <el-col :span="5">
            <el-form-item label="绩效日期" prop="jxrq">
              <el-date-picker
                clearable
                style="width: 100%"
                v-model="form.jxrq"
                type="date" format="yyyy-MM-dd"
                value-format="yyyy-MM-dd HH:mm:ss"
                placeholder="绩效日期"
              >
              </el-date-picker>
            </el-form-item>
          </el-col>
          <el-col :span="5">
@@ -90,9 +98,14 @@
              </el-select>
            </el-form-item>
          </el-col>
          <el-col :span="5">
            <el-form-item label="联系电话" prop="phone">
              <el-input v-model="form.phone" placeholder="请输入联系电话" />
            </el-form-item>
          </el-col>
        </el-row>
        <el-row style="text-align: left">
          <el-col :span="8">
          <el-col :span="12">
            <el-form-item label="申请说明" prop="remark">
              <el-input v-model="form.remark" placeholder="申请说明" />
            </el-form-item>
src/views/project/statistics/applyStatistics/index.vue
@@ -6,54 +6,12 @@
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      v-show="showSearch"
      label-width="70px"
    >
      <el-row :gutter="8">
        <el-col :span="6">
          <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 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="6">
          <el-form-item label="费用类型">
            <el-select
              v-model="queryParams.paexpensetype"
              placeholder="请选择案例状态"
            >
              <el-option
                v-for="item in reportlist"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="8">
        <el-col :span="12">
          <el-form-item label="统计日期">
        <el-col :span="8">
          <el-form-item label="月份范围">
            <el-date-picker
              style="width: 100%"
              v-model="selecttime"
@@ -67,7 +25,57 @@
            </el-date-picker>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="费用类型">
            <el-select
              v-model="queryParams.paexpensetype"
              placeholder="请选择费用类型"
            >
              <el-option
                v-for="item in reportlist"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item align="left" label="报销部门" prop="padeptno">
            <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-row>
      <el-row :gutter="8">
        <el-col :span="6">
          <el-form-item label="报销人员" prop="pauserno">
            <el-select
              v-model="queryParams.pauserno"
              placeholder="请选择报销人员"
              clearable
              filterable
              style="width: 100%"
            >
              <el-option
                v-for="item in userList"
                :key="item.username"
                :label="item.nickname"
                :value="item.username"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item>
            <el-button
@@ -85,6 +93,24 @@
      </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-table v-loading="loading" border :data="donatebaseinfoList">     -->
    <el-table
      :data="jxidata"
@@ -95,23 +121,24 @@
      :summary-method="getSummaries"
      show-summary
    >
      <el-table-column label="序号" align="center" prop="id" width="100">
      </el-table-column>
      <el-table-column label="序号" align="center" prop="id" width="50" />
      <el-table-column label="统计月份" align="center" prop="applymonth" />
      <el-table-column label="业务组" align="center" prop="deptmentName">
      </el-table-column>
      <el-table-column label="业务组" align="center" prop="deptmentName" />
      <el-table-column label="专职人员" align="center" prop="username" />
      <el-table-column label="报销总金额" align="center" prop="amount" width="180" :formatter="amountFormatter" />
      <el-table-column label="专家费" align="center" prop="expertfee" width="160" :formatter="amountFormatter" />
      <el-table-column label="伦理专家费" align="center" prop="ethicalistfee" width="160" :formatter="amountFormatter" />
      <el-table-column label="医学成本" align="center" prop="medicalcost" width="160" :formatter="amountFormatter" />
      <el-table-column label="办公费" align="center" prop="officecost" width="160" :formatter="amountFormatter" />
      <el-table-column label="差旅费" align="center" prop="reimcost" width="160" :formatter="amountFormatter" />
      <el-table-column label="金额" align="center" prop="amount" />
      <el-table-column label="操作" align="center">
      <!-- <el-table-column label="操作" align="center">
        <template slot-scope="scope">
          <el-button size="mini" type="text" icon="el-icon-edit"
            >明细</el-button
          >
        </template>
      </el-table-column>
      </el-table-column> -->
    </el-table>
    <div style="margin: 10px;text-align: right;">
@@ -132,7 +159,8 @@
  listsfeistatistics,
  listbxiaostatistics,
  listjixstatistics,
  listanlstatistics
  listanlstatistics,
  exportExpenseStatistics
} from "@/api/project/statistics";
import { listUser } from "@/api/project/organization";
@@ -161,7 +189,7 @@
      selecttime: "",
      reportervalue: "",
      reportlist: [
        { label: "差旅费", value: "0" },
        { label: "差旅费", value: "5" },
        { label: "专家费", value: "1" },
        { label: "伦理专家费", value: "2" },
        { label: "医学成本", value: "3" },
@@ -205,6 +233,7 @@
        qu: ""
      },
      deptList: [],
      userList: [],
      // 遮罩层
      loading: false,
      // 导出遮罩层
@@ -288,6 +317,11 @@
        this.loading = false;
      });
    },
    getUserList() {
      listUser().then(res => {
        this.userList = res.data;
      });
    },
    resetArr(Arr) {
      var hash = {};
      Arr = Arr.reduce(function(arr, current) {
@@ -308,6 +342,29 @@
          $obj.id = $index + 1;
        });
      });
    },
    /** 导出按钮操作 */
    handleExport() {
      const queryParams = {
        pabegtime: this.queryParams.pabegtime,
        paendtime: this.queryParams.paendtime,
        padeptno: this.queryParams.padeptno,
        pauserno: this.queryParams.pauserno,
        paexpensetype: this.queryParams.paexpensetype
      };
      this.$modal
        .confirm("是否确认导出当前筛选条件下的费用统计数据?")
        .then(() => {
          this.exportLoading = true;
          return exportExpenseStatistics(queryParams);
        })
        .then(response => {
          this.$download.name(response.msg);
          this.exportLoading = false;
        })
        .catch(() => {
          this.exportLoading = false;
        });
    },
    // 表单重置
@@ -338,6 +395,20 @@
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** 金额显示:保留两位小数,0.00 不显示 */
    formatAmount(value) {
      if (value === null || value === undefined || value === "") {
        return "";
      }
      const num = Number(value);
      if (!Number.isFinite(num) || num === 0) {
        return "";
      }
      return num.toFixed(2);
    },
    amountFormatter(row, column, cellValue) {
      return this.formatAmount(cellValue);
    },
    getSummaries(param) {
      const { columns, data } = param;
      const sums = [];
@@ -354,7 +425,7 @@
        const values = data.map(item => Number(item[column.property]));
        if (!values.every(value => isNaN(value))) {
          sums[index] = values.reduce((prev, curr) => {
          const total = values.reduce((prev, curr) => {
            const value = Number(curr);
            if (!isNaN(value)) {
              return prev + curr;
@@ -362,7 +433,8 @@
              return prev;
            }
          }, 0);
          sums[index] = sums[index].toFixed(2); // 保留2位小数,解决小数合计列;
          // 合计保留 2 位小数;0.00 不显示
          sums[index] = total === 0 ? "" : Number(total).toFixed(2);
        } else {
          sums[index] = "";
        }
@@ -376,6 +448,7 @@
    //获取列表
    this.getList();
    this.listDept();
    this.getUserList();
  }
  // //生命周期 - 挂载完成(可以访问DOM元素)
src/views/project/statistics/caseStatistics/index.vue
@@ -6,54 +6,12 @@
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      v-show="showSearch"
      label-width="70px"
    >
      <el-row :gutter="8">
        <el-col :span="6">
          <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 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="6">
          <el-form-item label="案例状态">
            <el-select
              v-model="queryParams.pacasestate"
              placeholder="请选择案例状态"
            >
              <el-option
                v-for="item in reportlist"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="8">
        <el-col :span="12">
          <el-form-item label="统计日期">
      <el-row >
        <el-col :span="8">
          <el-form-item label="月份范围">
            <el-date-picker
              style="width: 100%"
              v-model="selecttime"
@@ -66,8 +24,33 @@
            >
            </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
@@ -85,6 +68,24 @@
      </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-table v-loading="loading" border :data="donatebaseinfoList">     -->
    <el-table
      v-loading="loading"
@@ -96,31 +97,35 @@
      :summary-method="getSummaries"
      show-summary
    >
      <el-table-column label="序号" align="center" prop="id" width="100">
      </el-table-column>
      <el-table-column label="序号" align="center" prop="id" width="50" />
      <el-table-column label="统计月份" align="center" prop="donationmonth" />
      <el-table-column label="业务组" align="center" prop="deptname">
      </el-table-column>
      <el-table-column label="业务组" align="center" prop="deptname">      </el-table-column>
      <el-table-column label="专职人员" align="center" prop="reportername" />
      <el-table-column label="案例累计" align="center" prop="casesum" />
      <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="workflow9" width="90" /> -->
      <el-table-column label="终止案例" align="center" prop="terminationcase" width="100" />
      <el-table-column label="案例数量" align="center" prop="casesum" />
      <el-table-column
      <!-- <el-table-column
        label="操作"
        align="center"
        class-name="small-padding fixed-width"
        fixed="right"
      >
        <template slot-scope="scope">
          <!--           v-if="scope.row.recordstate==2"
 -->
          <el-button size="mini" type="text" icon="el-icon-edit"
            >明细</el-button
          >
        </template>
      </el-table-column>
      </el-table-column> -->
    </el-table>
    <div style="margin: 10px;text-align: right;">
      <div>
@@ -140,7 +145,8 @@
  listsfeistatistics,
  listbxiaostatistics,
  listjixstatistics,
  listanlstatistics
  listanlstatistics,
  exportCaseStatistics
} from "@/api/project/statistics";
import { listUser } from "@/api/project/organization";
@@ -169,10 +175,6 @@
      selecttime: "",
      reportervalue: "",
      reportlist: [
        { label: "正常", value: "0" },
        { label: "终止", value: "1" }
      ],
      //省市区
      //默认值设置,可为空
      searchAddress: {
@@ -236,7 +238,6 @@
      daterangeReporttime: [],
      // 查询参数
      queryParams: {
        pacasestate: "0",
        pabegtime: null,
        paendtime: null
      },
@@ -289,7 +290,8 @@
      }
    },
    listDept() {
      listDept({}).then(response => {
      // 只取业务办公室(dept_id=102)下的业务组,供“业务组”下拉使用
      listDept({ parentId: 102 }).then(response => {
        this.deptList = response.data;
        this.loading = false;
      });
@@ -316,10 +318,32 @@
        this.total = res.total;
      });
    },
    /** 导出按钮操作 */
    handleExport() {
      const queryParams = {
        pabegtime: this.queryParams.pabegtime,
        paendtime: this.queryParams.paendtime,
        padeptno: this.queryParams.padeptno,
        pausername: this.queryParams.pausername
      };
      this.$modal
        .confirm("是否确认导出当前筛选条件下的案例统计数据?")
        .then(() => {
          this.exportLoading = true;
          return exportCaseStatistics(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 = ["applymonth", "deptmentName", "username"];
      var columnnames = ["donationmonth", "deptname", "reportername"];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = "合计";
@@ -366,7 +390,8 @@
      this.form.treatmenthospitalno = "";
      this.queryParams = {
        pacasestate: "0"
        pabegtime: null,
        paendtime: null
      };
      this.selecttime = [];
      this.getTimeList();
src/views/project/statistics/chargeStatistics/index.vue
@@ -10,16 +10,7 @@
    >
      <el-row :gutter="8">
        <el-col :span="8">
          <el-form-item label="医院名称">
            <org-selecter
              ref="orgSelecter"
              :org-type="'4'"
              v-model="queryParams.pahospitalno"
            />
          </el-form-item>
        </el-col>
        <el-col :span="12">
          <el-form-item label="统计日期">
          <el-form-item label="月份范围">
            <el-date-picker
              style="width: 100%"
              v-model="selecttime"
@@ -33,8 +24,15 @@
            </el-date-picker>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="8">
        <el-col :span="8">
          <el-form-item label="医院名称">
            <org-selecter
              ref="orgSelecter"
              :org-type="'4'"
              v-model="queryParams.pahospitalno"
            />
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item>
            <el-button
src/views/project/statistics/performanceStaristics/index.vue
@@ -1,30 +1,13 @@
<!--  -->
<template>
  <div class="app-container">
    <el-form
      class="opo-query-form"
      :model="queryParams"
      ref="queryForm"
      :inline="true"
      label-width="70px"
    >
      <el-row :gutter="8">
        <el-col :span="6">
          <el-form-item label="业务人员" prop="pauserno">
            <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 class="opo-query-form" :model="queryParams" ref="queryForm" :inline="true" v-show="showSearch" label-width="70px">
      <el-row :gutter="4">
        <!-- <el-col :span="6">
          <el-form-item align="left" label="业务组" prop="padeptno">
            <el-select
              v-model="queryParams.padeptno"
              placeholder="请选择案例状态"
              placeholder="请选择部门、业务组"
            >
              <el-option
                v-for="item in deptList"
@@ -34,93 +17,58 @@
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
        <el-col :span="6">
          <el-form-item label="绩效类型">
            <el-select
              v-model="queryParams.pabonustype"
              placeholder="请选择案例状态"
            >
              <el-option
                v-for="item in reportlist"
                :label="item.label"
                :value="item.value"
              >
              </el-option>
            </el-select>
          </el-form-item>
        </el-col>
      </el-row>
      <el-row :gutter="8">
        <el-col :span="12">
        </el-col> -->
        <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 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 label="绩效类型">
            <el-radio-group v-model="queryParams.pabonustype">
              <el-radio v-for="item in reporttype" :key="item.value" :label="item.value">{{ item.label }}</el-radio>
            </el-radio-group>
          </el-form-item>
        </el-col>
        <el-col :span="5">
          <el-form-item label="绩效人员" prop="pauserno">
            <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-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-table v-loading="loading" border :data="donatebaseinfoList">     -->
    <el-table
      v-loading="loading"
      :data="jxidata"
      ref="table"
      border
      max-height="700"
      highlight-current-row
      :summary-method="getSummaries"
      show-summary
    >
    <el-table v-loading="loading" :data="jxidata" ref="table" border max-height="700" highlight-current-row
      :summary-method="getSummaries" show-summary>
      <el-table-column label="序号" align="center" prop="id" width="100">
      </el-table-column>
      <el-table-column label="统计月份" align="center" prop="bonusmonth" />
      <el-table-column label="业务组" align="center" prop="deptName">
      </el-table-column>
      <el-table-column label="专职人员" align="center" prop="beneficiaryname" />
      <el-table-column label="金额" align="center" prop="amount" />
      <el-table-column
        label="操作"
        align="center"
        class-name="small-padding fixed-width"
        fixed="right"
      >
      <el-table-column label="科室业务组" align="center" prop="deptName">      </el-table-column>
      <el-table-column label="绩效人员/医院" align="center" prop="beneficiaryname" />
      <el-table-column label="绩效金额" align="center" prop="amount" :formatter="amountFormatter" />
      <!-- <el-table-column label="操作" align="center" class-name="small-padding fixed-width" fixed="right">
        <template slot-scope="scope">
          <!--           v-if="scope.row.recordstate==2"
 -->
          <el-button size="mini" type="text" icon="el-icon-edit"
            >明细</el-button
          >
          <el-button size="mini" type="text" icon="el-icon-edit">明细</el-button>
        </template>
      </el-table-column>
      </el-table-column> -->
    </el-table>
    <div style="margin: 10px;text-align: right;">
      <div>
@@ -141,7 +89,8 @@
  listsfeistatistics,
  listbxiaostatistics,
  listjixstatistics,
  listanlstatistics
  listanlstatistics,
  exportPerformanceStatistics
} from "@/api/project/statistics";
import { listUser } from "@/api/project/organization";
@@ -171,10 +120,11 @@
      selecttime: "",
      reportervalue: "",
      reportlist: [
        { label: "月度", value: 1 },
        { label: "季度", value: 2 },
        { label: "年度", value: 3 }
      reporttype: [
        { label: "全部", value: "0" },
        { label: "月度", value: "68" },
        { label: "季度", value: "69" },
        { label: "年度", value: "70" }
      ],
      //省市区
      //默认值设置,可为空
@@ -213,7 +163,7 @@
        shi: "",
        qu: ""
      },
      deptList:[],
      deptList: [],
      // 遮罩层
      loading: false,
      // 导出遮罩层
@@ -240,10 +190,10 @@
      daterangeReporttime: [],
      // 查询参数
      queryParams: {
        pabonustype:'',
        pabonustype: "0",
        pabegtime: null,
        paendtime: null,
        pauserno: null,
        pausername: "",
        padeptno: null,
      },
@@ -266,8 +216,8 @@
  },
  //监听属性 类似于data概念
  computed: {},
  activated() {},
  mounted() {},
  activated() { },
  mounted() { },
  //监控data中的数据变化
  watch: {},
@@ -297,7 +247,7 @@
    resetArr(Arr) {
      var hash = {};
      Arr = Arr.reduce(function(arr, current) {
      Arr = Arr.reduce(function (arr, current) {
        hash[current.reporterno]
          ? ""
          : (hash[current.reporterno] = true && arr.push(current));
@@ -306,15 +256,46 @@
      return Arr;
    },
    /** 组装查询参数:未选择统计日期时查全部,绩效类型为空按全部 */
    buildQueryParams() {
      const query = { ...this.queryParams };
      if (!query.pabegtime || !query.paendtime) {
        // 新 SP 默认取近 6 个月,而绩效 jxrq 数据集中在 2023-08~2024-01,默认会查不到
        query.pabegtime = "2000-01-01 00:00:00";
        query.paendtime = "2999-12-31 23:59:59";
      }
      if (!query.pabonustype) {
        query.pabonustype = "0";
      }
      return query;
    },
    /** 查询捐献基础列表 */
    getList() {
      listjixstatistics(this.queryParams).then(res => {
      listjixstatistics(this.buildQueryParams()).then(res => {
        this.jxidata = res.rows;
        this.jxidata.forEach(($obj, $index) => {
          $obj.id = $index + 1;
        });
        this.total=res.total;
        this.total = res.total;
      });
    },
    /** 导出按钮操作 */
    handleExport() {
      const queryParams = this.buildQueryParams();
      this.$modal
        .confirm("是否确认导出当前筛选条件下的绩效统计数据?")
        .then(() => {
          this.exportLoading = true;
          return exportPerformanceStatistics(queryParams);
        })
        .then(response => {
          this.$download.name(response.msg);
          this.exportLoading = false;
        })
        .catch(() => {
          this.exportLoading = false;
        });
    },
    listDept() {
      listDept({}).then(response => {
@@ -339,10 +320,10 @@
      this.queryParams = {
        pabonustype:'',
        pabonustype: "0",
        pabegtime: null,
        paendtime: null,
        pauserno: null,
        pausername: "",
        padeptno: null
      };
      this.selecttime = [];
@@ -357,10 +338,24 @@
      this.resetForm("queryForm");
      this.handleQuery();
    },
    /** 金额显示:保留两位小数,0.00 不显示 */
    formatAmount(value) {
      if (value === null || value === undefined || value === "") {
        return "";
      }
      const num = Number(value);
      if (!Number.isFinite(num) || num === 0) {
        return "";
      }
      return num.toFixed(2);
    },
    amountFormatter(row, column, cellValue) {
      return this.formatAmount(cellValue);
    },
    getSummaries(param) {
      const { columns, data } = param;
      const sums = [];
      var columnnames = ["applymonth", "deptmentName", "username",'deptName'];
      var columnnames = ["applymonth", "deptmentName", "username", "deptName", "beneficiaryname"];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = "合计";
@@ -373,7 +368,7 @@
        const values = data.map(item => Number(item[column.property]));
        if (!values.every(value => isNaN(value))) {
          sums[index] = values.reduce((prev, curr) => {
          const total = values.reduce((prev, curr) => {
            const value = Number(curr);
            if (!isNaN(value)) {
              return prev + curr;
@@ -381,7 +376,8 @@
              return prev;
            }
          }, 0);
          sums[index] = sums[index].toFixed(2); // 保留2位小数,解决小数合计列;
          // 合计保留 2 位小数;0.00 不显示
          sums[index] = total === 0 ? "" : Number(total).toFixed(2);
        } else {
          sums[index] = "";
        }