<template> 
 | 
  <div class="app-container"> 
 | 
    <el-form :model="filters" :inline="true"> 
 | 
      <el-form-item label="设备名称"> 
 | 
        <el-input 
 | 
          v-model="filters.deviceName" 
 | 
          style="width: 240px" 
 | 
          placeholder="请输入设备名称" 
 | 
          clearable 
 | 
          :prefix-icon="Search" 
 | 
          @change="getTableData" 
 | 
        /> 
 | 
      </el-form-item> 
 | 
      <el-form-item label="规格型号"> 
 | 
        <el-input 
 | 
            v-model="filters.deviceModel" 
 | 
            style="width: 240px" 
 | 
            placeholder="请输入规格型号" 
 | 
            clearable 
 | 
            :prefix-icon="Search" 
 | 
            @change="getTableData" 
 | 
        /> 
 | 
      </el-form-item> 
 | 
      <el-form-item label="供应商"> 
 | 
        <el-input 
 | 
            v-model="filters.supplierName" 
 | 
            style="width: 240px" 
 | 
            placeholder="请输入供应商" 
 | 
            clearable 
 | 
            :prefix-icon="Search" 
 | 
            @change="getTableData" 
 | 
        /> 
 | 
      </el-form-item> 
 | 
      <el-form-item label="单位"> 
 | 
        <el-input 
 | 
            v-model="filters.unit" 
 | 
            style="width: 240px" 
 | 
            placeholder="请输入单位" 
 | 
            clearable 
 | 
            :prefix-icon="Search" 
 | 
            @change="getTableData" 
 | 
        /> 
 | 
      </el-form-item> 
 | 
      <el-form-item label="录入日期:"> 
 | 
        <el-date-picker v-model="filters.entryDate" value-format="YYYY-MM-DD" format="YYYY-MM-DD" type="daterange" 
 | 
                        placeholder="请选择" clearable @change="changeDaterange" /> 
 | 
      </el-form-item> 
 | 
      <el-form-item> 
 | 
        <el-button type="primary" @click="getTableData">搜索</el-button> 
 | 
        <el-button @click="resetFilters">重置</el-button> 
 | 
      </el-form-item> 
 | 
    </el-form> 
 | 
    <div class="table_list"> 
 | 
      <div class="actions"> 
 | 
        <div></div> 
 | 
        <div> 
 | 
          <el-button type="primary" @click="add" icon="Plus"> 新增 </el-button> 
 | 
          <el-button @click="handleOut" icon="download">导出</el-button> 
 | 
          <el-button 
 | 
            type="danger" 
 | 
            icon="Delete" 
 | 
            :disabled="multipleList.length <= 0" 
 | 
            @click="deleteRow(multipleList.map((item) => item.id))" 
 | 
          > 
 | 
            批量删除 
 | 
          </el-button> 
 | 
        </div> 
 | 
      </div> 
 | 
      <PIMTable 
 | 
        rowKey="id" 
 | 
        isSelection 
 | 
        :column="columns" 
 | 
        :tableData="dataList" 
 | 
        :page="{ 
 | 
          current: pagination.currentPage, 
 | 
          size: pagination.pageSize, 
 | 
          total: pagination.total, 
 | 
        }" 
 | 
        :isShowSummary="true" 
 | 
        :summaryMethod="summaryMethod" 
 | 
        @selection-change="handleSelectionChange" 
 | 
        @pagination="changePage" 
 | 
      > 
 | 
      </PIMTable> 
 | 
    </div> 
 | 
    <Modal ref="modalRef" @success="getTableData"></Modal> 
 | 
    <el-dialog v-model="qrDialogVisible" title="二维码" width="300px"> 
 | 
      <div style="text-align:center;"> 
 | 
        <img :src="qrCodeUrl" alt="二维码" style="width:200px;height:200px;" /> 
 | 
        <div style="margin:10px 0;"> 
 | 
          <el-button type="primary" @click="downloadQRCode">下载二维码图片</el-button> 
 | 
        </div> 
 | 
      </div> 
 | 
    </el-dialog> 
 | 
  </div> 
 | 
</template> 
 | 
  
 | 
<script setup> 
 | 
import { usePaginationApi } from "@/hooks/usePaginationApi"; 
 | 
// import { Search } from "@element-plus/icons-vue"; 
 | 
import { getLedgerPage, delLedger } from "@/api/equipmentManagement/ledger"; 
 | 
import { onMounted, getCurrentInstance } from "vue"; 
 | 
import Modal from "./Modal.vue"; 
 | 
import { ElMessageBox, ElMessage } from "element-plus"; 
 | 
import dayjs from "dayjs"; 
 | 
import QRCode from "qrcode"; 
 | 
import { ref } from "vue"; 
 | 
import { summarizeTable } from "@/utils/summarizeTable"; 
 | 
import {Search} from "@element-plus/icons-vue"; 
 | 
  
 | 
defineOptions({ 
 | 
  name: "设备台账", 
 | 
}); 
 | 
  
 | 
// 表格多选框选中项 
 | 
const multipleList = ref([]); 
 | 
const { proxy } = getCurrentInstance(); 
 | 
const modalRef = ref(); 
 | 
const qrDialogVisible = ref(false); 
 | 
const qrCodeUrl = ref(""); 
 | 
const qrRowData = ref(null); 
 | 
  
 | 
const { 
 | 
  filters, 
 | 
  columns, 
 | 
  dataList, 
 | 
  pagination, 
 | 
  getTableData, 
 | 
  resetFilters, 
 | 
  onCurrentChange, 
 | 
} = usePaginationApi( 
 | 
  getLedgerPage, 
 | 
  { 
 | 
    deviceName: undefined, 
 | 
    deviceModel: undefined, 
 | 
    supplierName: undefined, 
 | 
    unit: undefined, 
 | 
    entryDateStart: undefined, 
 | 
    entryDateEnd: undefined, 
 | 
  }, 
 | 
  [ 
 | 
    { 
 | 
      label: "设备名称", 
 | 
      align: "center", 
 | 
      prop: "deviceName", 
 | 
    }, 
 | 
    { 
 | 
      label: "规格型号", 
 | 
      align: "center", 
 | 
      prop: "deviceModel", 
 | 
    }, 
 | 
    { 
 | 
      label: "供应商", 
 | 
      align: "center", 
 | 
      prop: "supplierName", 
 | 
    }, 
 | 
    { 
 | 
      label: "单位", 
 | 
      align: "center", 
 | 
      prop: "unit", 
 | 
    }, 
 | 
    { 
 | 
      label: "数量", 
 | 
      align: "center", 
 | 
      prop: "number", 
 | 
    }, 
 | 
    { 
 | 
      label: "含税单价", 
 | 
      align: "center", 
 | 
      prop: "taxIncludingPriceUnit", 
 | 
    }, 
 | 
    { 
 | 
      label: "含税总价", 
 | 
      align: "center", 
 | 
      prop: "taxIncludingPriceTotal", 
 | 
    }, 
 | 
    { 
 | 
      label: "税率", 
 | 
      align: "center", 
 | 
      prop: "taxRate", 
 | 
    }, 
 | 
    { 
 | 
      label: "不含税总价", 
 | 
      align: "center", 
 | 
      prop: "unTaxIncludingPriceTotal", 
 | 
    }, 
 | 
    { 
 | 
      label: "录入人", 
 | 
      align: "center", 
 | 
      prop: "createUser", 
 | 
    }, 
 | 
    { 
 | 
      label: "录入日期", 
 | 
      align: "center", 
 | 
      prop: "createTime", 
 | 
    }, 
 | 
        { 
 | 
            dataType: "action", 
 | 
            label: "操作", 
 | 
            align: "center", 
 | 
            fixed: 'right', 
 | 
            width: 140, 
 | 
            operation: [ 
 | 
                { 
 | 
                    name: "编辑", 
 | 
                    type: "text", 
 | 
                    clickFun: (row) => { 
 | 
                        edit(row.id) 
 | 
                    }, 
 | 
                }, 
 | 
                { 
 | 
                    name: "生成二维码", 
 | 
                    type: "text", 
 | 
                    clickFun: (row) => { 
 | 
                        showQRCode(row) 
 | 
                    }, 
 | 
                }, 
 | 
            ], 
 | 
        }, 
 | 
  ] 
 | 
); 
 | 
  
 | 
// 多选后做什么 
 | 
const handleSelectionChange = (selectionList) => { 
 | 
  multipleList.value = selectionList; 
 | 
}; 
 | 
  
 | 
const add = () => { 
 | 
  modalRef.value.openModal(); 
 | 
}; 
 | 
const edit = (id) => { 
 | 
  modalRef.value.loadForm(id); 
 | 
}; 
 | 
const changePage = ({ page, limit }) => { 
 | 
  pagination.currentPage = page; 
 | 
    pagination.pageSize = limit; 
 | 
  onCurrentChange(page); 
 | 
}; 
 | 
  
 | 
// 合计方法 
 | 
const summaryMethod = (param) => { 
 | 
  return summarizeTable( 
 | 
    param, 
 | 
    ['number', 'taxIncludingPriceTotal', 'unTaxIncludingPriceTotal', 'taxIncludingPriceUnit'], 
 | 
    { 
 | 
      number: { noDecimal: true }, 
 | 
      taxIncludingPriceTotal: { decimalPlaces: 2 }, 
 | 
      unTaxIncludingPriceTotal: { decimalPlaces: 2 } 
 | 
    } 
 | 
  ); 
 | 
}; 
 | 
  
 | 
const deleteRow = (id) => { 
 | 
  ElMessageBox.confirm("此操作将永久删除该文件, 是否继续?", "提示", { 
 | 
    confirmButtonText: "确定", 
 | 
    cancelButtonText: "取消", 
 | 
    type: "warning", 
 | 
  }).then(async () => { 
 | 
    const { code } = await delLedger(id); 
 | 
    if (code == 200) { 
 | 
      ElMessage({ 
 | 
        type: "success", 
 | 
        message: "删除成功", 
 | 
      }); 
 | 
      getTableData(); 
 | 
    } 
 | 
  }); 
 | 
}; 
 | 
  
 | 
const changeDaterange = (value) => { 
 | 
  if (value) { 
 | 
    filters.entryDateStart = dayjs(value[0]).format("YYYY-MM-DD"); 
 | 
    filters.entryDateEnd = dayjs(value[1]).format("YYYY-MM-DD"); 
 | 
  } else { 
 | 
    filters.entryDateStart = undefined; 
 | 
    filters.entryDateEnd = undefined; 
 | 
  } 
 | 
  getTableData(); 
 | 
}; 
 | 
  
 | 
const handleOut = () => { 
 | 
  ElMessageBox.confirm("选中的内容将被导出,是否确认导出?", "导出", { 
 | 
    confirmButtonText: "确认", 
 | 
    cancelButtonText: "取消", 
 | 
    type: "warning", 
 | 
  }) 
 | 
    .then(() => { 
 | 
      proxy.download(`/device/ledger/export`, {}, "设备台账档案.xlsx"); 
 | 
    }) 
 | 
    .catch(() => { 
 | 
      proxy.$modal.msg("已取消"); 
 | 
    }); 
 | 
}; 
 | 
  
 | 
const showQRCode = async (row) => { 
 | 
  // 你可以自定义二维码内容,比如 row.id 或 row.deviceName 
 | 
  const qrContent = JSON.stringify(row); // 或 `${row.id}` 
 | 
  qrCodeUrl.value = await QRCode.toDataURL(qrContent); 
 | 
  qrRowData.value = row; 
 | 
  qrDialogVisible.value = true; 
 | 
}; 
 | 
  
 | 
const downloadQRCode = () => { 
 | 
  const a = document.createElement("a"); 
 | 
  a.href = qrCodeUrl.value; 
 | 
  a.download = `${qrRowData.value.deviceName || "二维码"}.png`; 
 | 
  a.click(); 
 | 
}; 
 | 
  
 | 
onMounted(() => { 
 | 
  filters.entryDate = [ 
 | 
    dayjs().format("YYYY-MM-DD"), 
 | 
    dayjs().add(1, "day").format("YYYY-MM-DD"), 
 | 
  ] 
 | 
  filters.entryDateStart = dayjs().format("YYYY-MM-DD") 
 | 
  filters.entryDateEnd = dayjs().add(1, "day").format("YYYY-MM-DD") 
 | 
  getTableData(); 
 | 
}); 
 | 
</script> 
 | 
  
 | 
<style lang="scss" scoped> 
 | 
.table_list { 
 | 
  margin-top: unset; 
 | 
} 
 | 
.actions { 
 | 
  display: flex; 
 | 
  justify-content: space-between; 
 | 
  margin-bottom: 10px; 
 | 
} 
 | 
</style> 
 |