paper.vue 7.85 KB
<script setup lang="ts">
import { reactive, ref, getCurrentInstance, onMounted } from "vue";
import { parseTime, globalFilters } from "@/utils/tool";
import { bankType } from "./config";
/**
 * @description 组件属性
 * @prop {string | null} paperData 回单详情数据
 */
interface Props {
  paperData: {};
}
const props = withDefaults(defineProps<Props>(), {
  paperData: {
    type: Object,
    default: {
      value: {},
    },
  },
});
/**
 * @method getPic
 * @description 下载回执单响应
 */
const getPic = () => {
  let can: any = document.querySelector("#fee-canv");
  let url = can.toDataURL("image/png");
  let aDom = document.createElement("a");
  aDom.download = "物业费回执单.png";
  aDom.href = url;
  document.body.appendChild(aDom);
  aDom.click();
  document.body.removeChild(aDom);
};
/**
 * @method drawCanvas
 * @description 数据生成canvas
 */
const drawCanvas = () => {
  let canvas: any = document.querySelector("#fee-canv");
  let ctx: any = canvas.getContext("2d");
  canvas.width = 1000;
  canvas.height = 360;
  canvas.style.border = "2px solid #000";
  let rectH: number = 45,
    rectW: number = 500,
    labelW: number = 150;
  ctx.lineWidth = 2;

  // 画横线
  for (let i = 1; i < canvas.height; i++) {
    ctx.moveTo(0, rectH * i);
    ctx.lineTo(canvas.width, rectH * i);
  }
  // 画左侧label右侧边框
  let ind = 1;
  ctx.moveTo(labelW, 45);
  while (ind <= canvas.height / rectH) {
    ctx.lineTo(labelW, rectH * ind);
    ind++;
  }
  // 画右侧label边框
  ctx.moveTo(rectW, 45);
  ctx.lineTo(rectW, rectH * 2);
  ctx.moveTo(rectW, 135);
  ctx.lineTo(rectW, rectH * 5);

  ctx.moveTo(rectW + labelW, 45);
  ctx.lineTo(rectW + labelW, rectH * 2);
  ctx.moveTo(rectW + labelW, 135);
  ctx.lineTo(rectW + labelW, rectH * 5);

  // 画四周边框
  ctx.moveTo(0, 45);
  ctx.lineTo(0, rectH * 8);

  ctx.moveTo(canvas.width, 45);
  ctx.lineTo(canvas.width, rectH * 8);

  // 填入内容
  ctx.font = "18px bold 黑体";
  ctx.fillStyle = "#000000";
  ctx.textBaseline = "middle";
  ctx.fillText("回单类型", 38, 69);
  ctx.fillText(props.paperData.receiptType, 170, 69);

  ctx.fillText("缴费项目", 538, 69);
  ctx.fillText(props.paperData.receiptName, 670, 69);

  ctx.fillText("收费单位", 38, 114);
  ctx.fillText(props.paperData.propertyName, 170, 114);

  ctx.fillText("缴费房屋", 38, 159);
  ctx.fillText(props.paperData.locality, 170, 159);
  ctx.fillText("缴费人", 538, 159);
  ctx.fillText(props.paperData.payerName, 670, 159);

  ctx.fillText("金额(大写)", 38, 204);
  ctx.fillText(props.paperData.rmb, 170, 204);
  ctx.fillText("金额(小写)", 538, 204);
  ctx.fillText((props.paperData.totalFee / 100).toFixed(2), 670, 204);

  ctx.fillText("支付方式", 38, 249);
  ctx.fillText(globalFilters(props.paperData.bankPayType, bankType), 170, 249);

  ctx.fillText("账单周期", 38, 294);
  ctx.fillText(
    `${parseTime(new Date(props.paperData.beginTime).getTime(), "", "/").slice(
      0,
      7
    )} - ${parseTime(
      new Date(props.paperData.endTime).getTime(),
      "",
      "/"
    ).slice(0, 7)}`,
    170,
    294
  );

  ctx.fillText("支付时间", 38, 339);
  ctx.fillText(
    parseTime(new Date(props.paperData.payTime).getTime(), "", "/"),
    170,
    339
  );

  ctx.fillText(`电子回执单号码:${props.paperData.receiptId}`, 0, 24);
  ctx.stroke();
};
onMounted(() => {
  drawCanvas();
});
</script>

<template>
  <el-row
    style="display: flex; justify-content: space-between; padding-bottom: 10px"
  >
    <p>电子回执单号码:{{ paperData.receiptId }}</p>
    <el-button type="success" @click="getPic">下载</el-button>
  </el-row>
  <div class="paper-table">
    <el-row class="paper-table-line">
      <el-col :span="12">
        <el-col :span="8">
          <div class="paper-table-label">回单类型</div>
        </el-col>
        <el-col :span="16">
          <div class="paper-table-content">{{ paperData.receiptType }}</div>
        </el-col>
      </el-col>
      <el-col :span="12">
        <el-col :span="8" class="paper-table-content-right">
          <div class="paper-table-label">缴费项目</div>
        </el-col>
        <el-col :span="16">
          <div class="paper-table-content">{{ paperData.receiptName }}</div>
        </el-col>
      </el-col>
    </el-row>
    <el-row class="paper-table-line">
      <el-col :span="24">
        <el-col :span="4">
          <div class="paper-table-label">收费单位</div>
        </el-col>
        <el-col :span="20">
          <div class="paper-table-content">
            {{ paperData.propertyName }}
          </div>
        </el-col>
      </el-col>
    </el-row>
    <el-row class="paper-table-line">
      <el-col :span="12">
        <el-col :span="8">
          <div class="paper-table-label">缴费房屋</div>
        </el-col>
        <el-col :span="16">
          <div class="paper-table-content">{{ paperData.locality }}</div>
        </el-col>
      </el-col>
      <el-col :span="12">
        <el-col :span="8" class="paper-table-content-right">
          <div class="paper-table-label">缴费人</div>
        </el-col>
        <el-col :span="16">
          <div class="paper-table-content">{{ paperData.payerName }}</div>
        </el-col>
      </el-col>
    </el-row>
    <el-row class="paper-table-line">
      <el-col :span="12">
        <el-col :span="8">
          <div class="paper-table-label">金额(大写)</div>
        </el-col>
        <el-col :span="16">
          <div class="paper-table-content">{{ paperData.rmb }}</div>
        </el-col>
      </el-col>
      <el-col :span="12">
        <el-col :span="8" class="paper-table-content-right">
          <div class="paper-table-label">金额(小写)</div>
        </el-col>
        <el-col :span="16">
          <div class="paper-table-content">
            {{ (paperData.totalFee / 100).toFixed(2) }}
          </div>
        </el-col>
      </el-col>
    </el-row>
    <el-row class="paper-table-line">
      <el-col :span="24">
        <el-col :span="4">
          <div class="paper-table-label">支付方式</div>
        </el-col>
        <el-col :span="20">
          <div class="paper-table-content">
            {{ globalFilters(paperData.bankPayType, bankType) }}
          </div>
        </el-col>
      </el-col>
    </el-row>
    <el-row class="paper-table-line">
      <el-col :span="24">
        <el-col :span="4">
          <div class="paper-table-label">账单周期</div>
        </el-col>
        <el-col :span="20">
          <div class="paper-table-content">
            {{
              parseTime(new Date(paperData.beginTime).getTime(), "", "/").slice(
                0,
                7
              )
            }}
            -
            {{
              parseTime(new Date(paperData.endTime).getTime(), "", "/").slice(
                0,
                7
              )
            }}
          </div>
        </el-col>
      </el-col>
    </el-row>
    <el-row class="paper-table-line">
      <el-col :span="24">
        <el-col :span="4">
          <div class="paper-table-label">支付时间</div>
        </el-col>
        <el-col :span="20">
          <div class="paper-table-content">
            {{ parseTime(new Date(paperData.payTime).getTime(), "", "/") }}
          </div>
        </el-col>
      </el-col>
    </el-row>
  </div>
  <template style="z-index: -1">
    <canvas
      id="fee-canv"
      style="padding: 40px; margin-top: -500px; opacity: 0"
    ></canvas>
  </template>
</template>

<style lang="scss" scoped>
.paper-table {
  border-top: 2px solid #000;
  border-left: 2px solid #000;
  border-right: 2px solid #000;
  z-index: 1000;
  &-line {
    border-bottom: 2px solid #000;
    display: flex;
  }
  &-content-right {
    border-left: 2px solid #000;
    flex-grow: 1;
  }
}
.paper-table-label {
  line-height: 25px;
  padding: 10px;
  width: 100px;
  border-right: 2px solid #000;
  text-align: center;
}
.paper-table-content {
  line-height: 25px;
  padding: 10px;
}
</style>