<template>
  <div class="box">
    <div>
      <div class="middlebox">
        <div class="contenttitle">
          收费 /
          <span class="contenttitleBold">项目收费汇总</span>
        </div>
      </div>
      <div :style="'display: block;'">
        <div
          style="
            background-color: #fff;
            padding: 15px;
            border-radius: 8px;
            display: flex;
            flex-wrap: wrap;
            margin-bottom: 10px;
            height: 35px;
            margin-top: 7px;
          "
        >
          <div class="query">
            <span>科室：</span>
            <el-cascader
              v-model="username"
              :options="registrardata"
              ref="example"
              popper-class="example"
              @change="ischangsItemTypeId"
              style="width: 100px"
              :props="{
                value: 'id',
                label: 'displayName',
                children: 'treeChildren',
                checkStrictly: true,
                expandTrigger: 'hover',
              }"
              size="small"
            >
            </el-cascader>
            <!-- <el-select
              v-model="username"
              placeholder="请选择"
              size="small"
              multiple
            >
              <el-option
                v-for="item in registrardata"
                :key="item.id"
                :label="item.surname"
                :value="item.id"
              >
              </el-option>
            </el-select> -->
          </div>
          <div class="query">
            <span>组合项目：</span>
            <el-input
              placeholder="请选择组合项目"
              v-model="patientRegister.query.asbitemOCX"
              style="width: 200px"
              size="small"
              disabled
            >
              <el-button
                slot="append"
                icon="el-icon-search"
                @click="report.dialogAsbitemOCX = true"
                style="font-size: 20px"
              ></el-button>
            </el-input>
          </div>
          <div class="query">
            <span>开始日期：</span>
            <el-date-picker
              type="date"
              placeholder="选择开始日期"
              size="small"
              v-model="startDate"
              value-format="yyyy-MM-dd"
              editable
              style="width:150px"
            >
            </el-date-picker>
          </div>
          <div class="query">
            <span>结束日期：</span>
            <el-date-picker
              type="date"
              placeholder="选择结束日期"
              size="small"
              v-model="endDate"
              value-format="yyyy-MM-dd"
              editable
              style="width:150px"
            >
            </el-date-picker>
          </div>
          <div class="query">
            <el-button size="small" @click="onSubmit" class="commonbutton"
              >查询</el-button
            >
          </div>
          <div class="query">
            <el-button size="small" @click="handleExport" class="commonbutton"
              >导出excel</el-button
            >
          </div>
          <div class="query">
            <el-button size="small" @click="onPrint" class="commonbutton"
              >打印</el-button
            >
          </div>
          <div class="query">
            <el-button size="small" @click="columnarChart" class="commonbutton"
              >柱状图</el-button
            >
          </div>
          <div class="query">
            <el-button size="small" @click="peiChart" class="commonbutton"
              >饼图</el-button
            >
          </div>
        </div>
        <div
          style="
            display: flex;
            justify-content: space-between;
            position: relative;
          "
          id="domTable"
        >
          <div
            style="
              width: 47.7%;
              background-color: #fff;
              padding: 15px;
              border-radius: 8px;
            "
            ref="imageDom"
          >
            <!-- <h3 align="center">登记员工作量统计</h3>
            - 53-18
            <h5 align="right" style="margin-bottom: 5px;">
              时间：<span>{{ startDate }}</span
              >至<span>{{ endDate }}</span>
            </h5> -->
            <el-table
              border
              show-summary
              :summary-method="summarizeRegisterCount"
              :span-method="objectStandardSpanMethod"
              :height="
                flag
                  ? window.pageHeight < 600
                    ? 415
                    : window.pageHeight - 185 - 20
                  : ''
              "
              :data="tableData"
              id="table"
              ref="table"
              style="width: 100%"
              :header-cell-class-name="headerStyle"
              :cell-style="tableRowClassName"
            >
              <el-table-column label="项目收费汇总">
                <el-table-column :label="'时间：' + startDate + '至' + endDate">
                  <el-table-column
                    :label="
                      '应收总金额：' +
                      sumChargeMoney +
                      '折扣金额：' +
                      sumDiscountMoney +
                      '实收总金额：' +
                      sumReceivedChargeMoney
                    "
                  >
                    <el-table-column
                      prop="itemTypeName"
                      label="科室"
                    ></el-table-column>
                    <el-table-column
                      prop="asbitemName"
                      label="组合项目"
                    ></el-table-column>
                    <el-table-column
                      prop="chargeMoney"
                      label="应收金额"
                    ></el-table-column>
                    <el-table-column prop="discountMoney" label="折扣金额">
                    </el-table-column>
                    <el-table-column prop="receivedChargeMoney" label="实收金额">
                    </el-table-column>
                  </el-table-column>
                </el-table-column>
              </el-table-column>
            </el-table>
          </div>
          <div
            :style="
              'width: 47.7%;overflow: hidden;height:' +
              (window.pageHeight < 600 ? 415 : window.pageHeight - 185 - 20) +
              'px;background-color: #fff; padding: 15px; border-radius: 8px;'
            "
          >
            <div
              style="
                font-size: 20px;
                font-weight: 700;
                color: #232748;
                font-family: 'NotoSansSC-Bold';
                text-align: center;
              "
            >
              项目收费汇总
            </div>
            <div
              :style="
                'height:' +
                (window.pageHeight < 600 ? 387 : window.pageHeight - 185 - 48) +
                'px;'
              "
            >
              <ChartBlock ref="chart2"></ChartBlock>
            </div>
          </div>
        </div>
      </div>
    </div>
        <!--通用选组合项目的控件-->
    <el-dialog
      title="组合项目选择"
      :visible.sync="report.dialogAsbitemOCX"
      :close-on-click-modal="false"
      width="700px"
      height="600px"
    >
      <AsbitemOCX />
    </el-dialog>
  </div>
</template>
<script>
import { mapState, mapActions } from "vuex";
import { getapi, postapi, putapi, deletapi } from "@/api/api";
import ChartBlock from "../../components/workload/chartsBlock";
import AsbitemOCX from "../../components/report/AsbitemOCX.vue";
import { exportToExcel } from "../../utlis/Export2Excel";
import html2canvas from "html2canvas";
import printJs from "print-js";
import { projectlist } from "@/request/commonapi";
import {
  tcdate,
} from "@/utlis/proFunc";
export default {
  components: {
    ChartBlock,
    AsbitemOCX
  },
  data() {
    return {
      registrardata: [],
      username: [],
      startDate: "",
      endDate: "",
      tableData: [],
      seriesData: [],
      yAxisData: [],
      flag: true,
      pieData: [],
      sumChargeMoney: "",
      sumDiscountMoney: "",
      sumReceivedChargeMoney: "",
    };
  },
  created() {
    this.getList();
    this.dictInit()
  },
  mounted() {
    this.getNowTime();
  },
  methods: {
    //数据初始化
    dictInit() {

      //   //体检类别
    //   getapi("/api/app/medical-type/in-filter").then((res) => {
    //     if (res.code == 1) {
    //       this.dict.medicalType = res.data.items;
    //     }
    //   });

      //   //体检类别 树结构
      getapi("/api/app/item-type/by-code-all").then((res) => {
        if (res.code == 1) {
          this.dict.itemTypeTree = res.data;
          tcdate(this.dict.itemTypeTree);
        }
      });
    },
    ischangsItemTypeId(v) {
        if (v.length > 1) {
        this.username = this.username.slice(-1)[0];
      } else {
        this.username = this.username[0];
      }
      this.$refs.example.toggleDropDownVisible();
    },
    headerStyle({ row, column, rowIndex, columnIndex }) {
      if (rowIndex === 1) {
        return "left-align";
      }
      if (rowIndex === 2) {
        return "left-align";
      }
    },
    summarizeRegisterCount(param) {
      const { columns, data } = param;
      const sums = [];
      columns.forEach((column, index) => {
        if (index === 0) {
          sums[index] = "合计";
          return;
        }
        if (index === 4) {
          sums[index] = this.sumReceivedChargeMoney+"元";
          return;
        }
      });

      return sums;
    },
    onPrint() {
      this.flag = false;
      this.$nextTick(() => {
        let width = this.$refs.imageDom.style.width;
        let cloneDom = this.$refs.imageDom.cloneNode(true);
        let imageDom = this.$refs.imageDom;
        cloneDom.style.position = "absolute";
        cloneDom.style.top = "0px";
        cloneDom.style.zIndex = "-1";
        cloneDom.style.width = width;
        imageDom.appendChild(cloneDom);
        html2canvas(cloneDom).then((canvas) => {
          // 转成图片，生成图片地址
          const url = canvas.toDataURL("image/png");
          printJs({
            printable: url,
            type: "image",
            documentTitle: "", // 标题
            style: "@page{size:auto;margin: 0cm 1cm 0cm 1cm;}", // 去除页眉页脚
          });
        });
        cloneDom.style.display = "none";
        this.flag = true;
      });
    },
    columnarChart() {
      let option2 = {
        // title: {
        //   text: "登记员工作量统计",
        //   left: "center",
        // },
        tooltip: {
          trigger: "axis",
          confine: true,
        },
        legend: {
          type: "scroll",
          orient: "horizontal", // 垂直
          right: "3%", // 左对齐
          top: "0%", // 位于顶部
        },
        grid: {
          show: false,
          left: "0%",
          right: "0%",
          top: "0%",
          bottom: "0%",
          containLabel: true,
        },
        xAxis: {
          type: "value",
          axisLabel: {
            textStyle: {
              fontSize: "14",
            },
          },
          axisLine: {
            show: true,
          },
        },
        yAxis: {
          type: "category",
          data: this.yAxisData,
          axisLabel: {
            textStyle: {
              fontSize: "14",
            },
          },
        },
        series: [
          {
            name: "实收金额",
            type: "bar",
            data: this.seriesData,
          },
        ],
      };
      this.$refs.chart2.setOption(option2);
    },
    peiChart() {
      let option2 = {
        // title: {
        //   text: "登记员工作量统计",
        //   left: "center",
        // },
        tooltip: {
          trigger: "item",
          confine: true,
        },
        legend: {
          data: this.yAxisData,
          orient: "horizontal",
          right: "3%",
          top: "0%",
        },
        grid: {
          show: false,
          left: "0%",
          right: "0%",
          top: "0%",
          bottom: "0%",
          containLabel: true,
        },
        series: [
          {
            type: "pie",
            label: {
              show: true,
              formatter: "{b} : {c} ({d}%)", // b代表名称，c代表对应值，d代表百分比
            },
            data: this.pieData,
          },
        ],
      };
      this.$refs.chart2.setOption(option2);
    },
    onSubmit() {
      let that = this;
      if (this.username == "" || this.username == []) {
        return this.$message({
          message: "请先选择科室",
          type: "error",
        });
      }
      if (this.startDate == "") {
        return this.$message({
          message: "请先选择开始日期",
          type: "error",
        });
      }
      if (this.endDate == "") {
        return this.$message({
          message: "请先选择结束日期",
          type: "error",
        });
      }
      let asbitemIds = [];
      if (this.report.dataAsbitemOCX.length > 0) {
        this.report.dataAsbitemOCX.forEach((e) => {
          asbitemIds.push(e.id);
        });
      }
      postapi(
        "/api/app/charge-report/get-project-fees-report",
        {
          itemTypeId: that.username,
          asbitems:asbitemIds,
          startDate: that.startDate,
          endDate: that.endDate,
        }
      ).then((res) => {
        if (res.code != -1) {
        //   that.tableData = [...res.data.details];
          that.sumChargeMoney = res.data.sumChargeMoney;
          that.sumDiscountMoney = res.data.sumDiscountMoney;
          that.sumReceivedChargeMoney = res.data.sumReceivedChargeMoney;
          this.yAxisData = [];
          this.seriesData = [];
          this.pieData = [];
          that.computedStandardTableData(res.data.details)
          let pies = {
            name: "",
            value: 0,
          };
          for (let i = 0; i < res.data.details.length; i++) {
            let pie = JSON.parse(JSON.stringify(pies));
            this.yAxisData.push('('+res.data.details[i].itemTypeName+')'+res.data.details[i].asbitemName);
            this.seriesData.push(res.data.details[i].receivedChargeMoney);
            pie.name = '('+res.data.details[i].itemTypeName+')'+res.data.details[i].asbitemName
            pie.value = res.data.details[i].receivedChargeMoney;
            this.pieData.push(pie);
          }
          this.columnarChart();
        }
      });
    },
    computedStandardTableData(tableData) {
      const newData = [...tableData]; // 创建一个新的数组，避免修改原始数据
      const totalRows = {
        itemTypeName: "",
        asbitemName: "合计",
        chargeMoney: 0,
        discountMoney: 0,
        receivedChargeMoney: 0,
      }; // 合计行的数据
    //   let pies = {
    //     name: "",
    //     value: 0,
    //   };
      let obj = {};
      for (let i = 0; i < tableData.length; i++) {
        var item = tableData[i].itemTypeName;
        obj[item] = obj[item] + 1 || 1;
      }

      Object.keys(obj).forEach((key) => {
        let totalRow = JSON.parse(JSON.stringify(totalRows));
        // let pie = JSON.parse(JSON.stringify(pies));
        tableData.forEach((item) => {
          if (item.itemTypeName == key) {
            totalRow.itemTypeName = item.itemTypeName;
            totalRow.chargeMoney =(Number(totalRow.chargeMoney)+Number(item.chargeMoney)).toFixed(2)
            totalRow.discountMoney =(Number(totalRow.discountMoney)+Number(item.discountMoney)).toFixed(2)
            totalRow.receivedChargeMoney =(Number(totalRow.receivedChargeMoney)+Number(item.receivedChargeMoney)).toFixed(2)
          }
            // pie.name = '('+item.itemTypeName+')'+item.asbitemName;
            // pie.value = item.receivedChargeMoney;
            // this.yAxisData.push('('+item.itemTypeName+')'+item.asbitemName);
            // this.seriesData.push(item.receivedChargeMoney);
        });
        newData.push(totalRow);
        // this.pieData.push(pie);
      });
      this.ForwardStandardRanking(newData, "itemTypeName");
      this.columnarChart();
    },
    ForwardStandardRanking(data, p) {
      for (var i = 0; i < data.length - 1; i++) {
        for (var j = 0; j < data.length - 1 - i; j++) {
          var dd = data[j][p].localeCompare(data[j + 1][p], "zh"); //1---前者往后移，-1===位置不变
          if (dd > 0) {
            var temp = data[j];
            data[j] = data[j + 1];
            data[j + 1] = temp;
          }
        }
      }
      this.tableData = data;
      this.setStandardDates(this.tableData);
    },
    setStandardDates(arr) {
      var obj = {},
        k,
        arr1 = [];
      this.arr1 = [];
      for (var i = 0, len = arr.length; i < len; i++) {
        k = arr[i].itemTypeName; //需要合并的字段
        if (obj[k]) obj[k]++;
        else obj[k] = 1;
      }
      //保存结果{el-'元素'，count-出现次数}
      for (var o in obj) {
        for (let i = 0; i < obj[o]; i++) {
          if (i === 0) {
            this.arr1.push(obj[o]);
          } else {
            this.arr1.push(0);
          }
        }
      }
    },
    objectStandardSpanMethod({ row, column, rowIndex, columnIndex }) {
      if (columnIndex === 0) {
        let _row = this.arr1[rowIndex];
        let _col = this.arr1[rowIndex] > 0 ? 1 : 0;
        return [_row, _col];
      }
    },
     tableRowClassName({ row, column, rowIndex, columnIndex }) {
      if (row.asbitemName == "合计") {
        return { backgroundColor: "#F5F7FA" };
      }
    },
    getList() {
      projectlist().then((res) => {
        if (res.code != -1) {
          this.registrardata = [...res.data];
          this.registrardata = this.formatData(this.registrardata);
        }
      });
    },
    formatData(dataList) {
      for (let i = 0; i < dataList.length; i++) {
        if (dataList[i].treeChildren.length < 1) {
          dataList[i].treeChildren = undefined;
        } else {
          this.formatData(dataList[i].treeChildren);
        }
      }
      return dataList;
    },
    getNowTime() {
      var now = new Date();
      var year = now.getFullYear(); // 得到年份
      var month = now.getMonth(); // 得到月份
      var date = now.getDate(); // 得到日期
      month = month + 1;
      month = month.toString().padStart(2, "0");
      date = date.toString().padStart(2, "0");
      var defaultDate = `${year}-${month}-${date}`;
      this.startDate = defaultDate;
      this.endDate = defaultDate;
    },
    handleExport() {
      exportToExcel("#table", "项目收费汇总", false);
    },
  },
  computed: {
    ...mapState(["window", "dict", "patientRegister", "report"]),
  },
  updated() {
    this.$nextTick(() => {
      this.$refs.table.doLayout();
    });
  },
};
</script>
<style scoped>
@import "../../assets/css/global_button.css";
@import "../../assets/css/global_dialog.css";
@import "../../assets/css/global_table.css";
@import "../../assets/css/global_form.css";
@import "../../assets/css/global_input.css";
@import "../../assets/css/global.css";
.query {
  margin-right: 10px;
  display: flex;
  justify-content: center;
  align-items: center;
  font-size: 14px;
  color: #232748;
  font-size: 400;
  font-family: "NotoSansSC-Regular";
}
.box {
  display: flex;
  flex-direction: column;
}
:deep .left-align .cell {
  text-align: left !important;
}
.query:last-child{
  margin-right: 0;
}
</style>