diff --git a/src/api/checkCode/index.ts b/src/api/checkCode/index.ts index d2b66a1..76c6580 100644 --- a/src/api/checkCode/index.ts +++ b/src/api/checkCode/index.ts @@ -18,4 +18,68 @@ export function fetchCodeList(query?: Object) { method: 'get', params: query, }); +} +// 查询项目 +export function fetchCodeDetail(query?: Object) { + return request({ + url: 'zyreq/detail', + method: 'get', + params: query, + }); +} +// 执行条码 +export function fetchCodeExec(query?: Object) { + return request({ + url: '/zyreq/exec', + method: 'get', + params: query, + }); +} +// 获取申请单主表信息 +export function fetchCodeReqmain(query?: Object) { + return request({ + url: 'zyreq/reqmain', + method: 'get', + params: query, + }); +} +// 查询报告单列表 +export function reportList(query?: Object) { + return request({ + url: '/report/ReportList', + method: 'post', + data: query, + }); +} +// 查询报告Pdf +export function reportPrintPdf(query?: Object) { + return request({ + url: '/report/pdf', + method: 'get', + params: query, + }); +} +// 查询项目报告 +export function reportResult(query?: Object) { + return request({ + url: '/report/result', + method: 'post', + data: query, + }); +} +// 查询微生物报告 +export function reportMedList(query?: Object) { + return request({ + url: '/report/MedList', + method: 'post', + data: query, + }); +} +// 查询微生物报告 +export function reportFsresult(query?: Object) { + return request({ + url: '/report/fsresult', + method: 'post', + data: query, + }); } \ No newline at end of file diff --git a/src/api/liswork/dict/ComDict.js b/src/api/liswork/dict/ComDict.js index aaecb47..3995af2 100644 --- a/src/api/liswork/dict/ComDict.js +++ b/src/api/liswork/dict/ComDict.js @@ -2,37 +2,45 @@ import request from '@/utils/request' // 查询字典数据列表 export function queryComDictListService(query) { - return request({ - url: '/comdict/query', - method: 'get', - params: query - }) + return request({ + url: '/comdict/query', + method: 'get', + params: query + }) } //增加字典数据 export function addComDictService(data) { - return request({ - url: '/comdict/add', - method: 'post', - data - }) + return request({ + url: '/comdict/add', + method: 'post', + data + }) } //修改字典数据 export function updateComDictService(data) { - return request({ - url: '/comdict/update', - method: 'post', - data - }) + return request({ + url: '/comdict/update', + method: 'post', + data + }) + +} +//删除字典数据 +export function delComDictService(data) { + return request({ + url: '/comdict/del', + method: 'delete', + data + }) } // 根据字典类型查询字典数据信息 export function getComDicts(zdlb) { - return request({ - url: '/comdict/getComDicts', - method: 'get', - params: zdlb - }) -} - + return request({ + url: '/comdict/getComDicts', + method: 'get', + params: zdlb + }) +} \ No newline at end of file diff --git a/src/components/tableCom/index.vue b/src/components/tableCom/index.vue index 195c3af..ecad793 100644 --- a/src/components/tableCom/index.vue +++ b/src/components/tableCom/index.vue @@ -1,7 +1,7 @@ - - + - + @@ -31,7 +31,7 @@ - + @@ -83,6 +83,12 @@ interface TableColumn { visible?: boolean; // 是否显示列 } +// 在子组件中定义插槽类型 +defineSlots<{ + // 具名插槽和动态插槽(不含 default) + [slotName: string]: (props: { row?: any; column?: any; $index?: number }) => any; +}>(); + // Props 定义 const props = defineProps({ // 表格数据 diff --git a/src/plugins/download.js b/src/plugins/download.js index 1a89efd..a4a0377 100644 --- a/src/plugins/download.js +++ b/src/plugins/download.js @@ -1,11 +1,21 @@ import axios from 'axios' -import { ElLoading, ElMessage } from 'element-plus' -import { saveAs } from 'file-saver' -import { getToken } from '@/utils/auth' +import { + ElLoading, + ElMessage +} from 'element-plus' +import { + saveAs +} from 'file-saver' +import { + getToken +} from '@/utils/auth' import errorCode from '@/utils/errorCode' -import { blobValidate } from '@/utils/ruoyi' +import { + blobValidate +} from '@/utils/ruoyi' -const baseURL = import.meta.env.VITE_APP_BASE_API +const baseURL = + import.meta.env.VITE_APP_BASE_API let downloadLoadingInstance; export default { @@ -15,7 +25,14 @@ export default { method: 'get', url: url, responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } + headers: { + 'Authorization': 'Bearer ' + getToken() + }, + onDownloadProgress: (progressEvent) => { + console.log(progressEvent) + //progressEvent.loaded 下载文件的当前大小 + //progressEvent.total 下载文件的总大小 如果后端没有返回 请让他加上 + } }).then((res) => { const isBlob = blobValidate(res.data); if (isBlob) { @@ -32,7 +49,9 @@ export default { method: 'get', url: url, responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } + headers: { + 'Authorization': 'Bearer ' + getToken() + } }).then((res) => { const isBlob = blobValidate(res.data); if (isBlob) { @@ -45,16 +64,23 @@ export default { }, zip(url, name) { var url = baseURL + url - downloadLoadingInstance = ElLoading.service({ text: "正在下载数据,请稍候", background: "rgba(0, 0, 0, 0.7)", }) + downloadLoadingInstance = ElLoading.service({ + text: "正在下载数据,请稍候", + background: "rgba(0, 0, 0, 0.7)", + }) axios({ method: 'get', url: url, responseType: 'blob', - headers: { 'Authorization': 'Bearer ' + getToken() } + headers: { + 'Authorization': 'Bearer ' + getToken() + } }).then((res) => { const isBlob = blobValidate(res.data); if (isBlob) { - const blob = new Blob([res.data], { type: 'application/zip' }) + const blob = new Blob([res.data], { + type: 'application/zip' + }) this.saveAs(blob, name) } else { this.printErrMsg(res.data); @@ -75,5 +101,4 @@ export default { const errMsg = errorCode[rspObj.code] || rspObj.msg || errorCode['default'] ElMessage.error(errMsg); } -} - +} \ No newline at end of file diff --git a/src/utils/classCom.ts b/src/utils/classCom.ts new file mode 100644 index 0000000..0773b35 --- /dev/null +++ b/src/utils/classCom.ts @@ -0,0 +1,83 @@ + +/** + * 颜色处理工具类 + * 提供十进制颜色值转十六进制颜色码(支持BGR转RGB)及文字对比度计算功能 + */ + +function decimalToHexColor(decimal: number | string): string { + // 处理空值和非数字情况 + if (decimal === undefined || decimal === null || decimal === '') { + return '#FFFFFF'; + } + + // 统一转换为数字类型 + const num = typeof decimal === 'string' ? parseFloat(decimal) : decimal; + if (isNaN(num)) { + return '#FFFFFF'; + } + + // 十进制转十六进制并转为大写 + let hex = Math.floor(num).toString(16).toUpperCase(); + + // 确保十六进制字符串为6位,不足则补0 + if (hex.length < 6) { + hex = hex.padStart(6, '0'); + } + + // BGR转RGB(交换前后两位) + const r = hex.substring(4, 6); + const g = hex.substring(2, 4); + const b = hex.substring(0, 2); + const rgbHex = r + g + b; + + return `#${rgbHex}`; +} + +/** + * 根据背景色计算对比度文字颜色(黑/白) + * @param bgColor 十六进制背景色(如#FFFF80) + * @returns 对比度文字颜色(#333333或#FFFFFF) + */ +function getContrastTextColor(bgColor: string): string { + // 验证颜色格式 + if (!/^#([0-9A-F]{6})$/i.test(bgColor)) { + throw new Error('Invalid hex color format. Expected #RRGGBB'); + } + + // 提取RGB分量 + const r = parseInt(bgColor.slice(1, 3), 16); + const g = parseInt(bgColor.slice(3, 5), 16); + const b = parseInt(bgColor.slice(5, 7), 16); + + // 计算亮度(标准 luminance 公式) + const luminance = (0.299 * r + 0.587 * g + 0.114 * b) / 255; + + // 根据亮度返回对比色 + return luminance > 0.5 ? '#333333' : '#FFFFFF'; +} +// 打印base64 pdf +function printPDF(base64: string) { + const blob = base64ToBlob(base64); + const pdfUrl = URL.createObjectURL(blob); + const iframe = document.createElement('iframe'); + iframe.style.display = 'none'; + iframe.src = pdfUrl; + document.body.appendChild(iframe); + iframe.onload = () => { + iframe.contentWindow?.print(); + setTimeout(() => URL.revokeObjectURL(pdfUrl), 1000); // 释放内存 + }; +} + +function base64ToBlob(base64: string) { + const binaryString = atob(base64.replace(/[\n\r]/g, '')); + const bytes = new Uint8Array(binaryString.length); + for (let i = 0; i < binaryString.length; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return new Blob([bytes], { type: 'application/pdf' }); +} + + +export const classCom = { decimalToHexColor, getContrastTextColor, printPDF } + diff --git a/src/utils/print-utils.ts b/src/utils/hiprintPrinter.ts similarity index 88% rename from src/utils/print-utils.ts rename to src/utils/hiprintPrinter.ts index 8797d90..98d3805 100644 --- a/src/utils/print-utils.ts +++ b/src/utils/hiprintPrinter.ts @@ -1,8 +1,10 @@ -// src/utils/print-utils.ts +// src/utils/hiprintPrinter.ts import { io, Socket } from "socket.io-client"; import { ElMessage, ElMessageBox } from 'element-plus' import { usePrintStore } from '@/store/modules/printStore' - +import { onUnmounted } from "vue" +// @ts-ignore +import Download from '@/plugins/download'; // ... 类型定义 ... type PrinterInfo = { name: string; @@ -61,7 +63,7 @@ function initSocket(onPrinterUpdate?: OnPrinterUpdate) { socket.on("connect_error", (err: Error) => { console.log('连接错误', err); ElMessageBox.alert( - `连接失败!请确保目标服务器已 下载 并运行 打印服务!`, + `连接失败!请确保目标服务器已 下载 并运行 打印服务!`, "客户端未连接", { dangerouslyUseHTMLString: true, @@ -70,8 +72,19 @@ function initSocket(onPrinterUpdate?: OnPrinterUpdate) { printStore.setConnected(false); socket?.close(); }); + + } + +const downExe = () => { + // 下载逻辑实现 + console.log('开始下载打印服务'); + Download.name('hiprint_win_x64-1.0.13.exe') +}; + +// 挂载到window,使其能被全局访问 +(window as any).downExe = downExe function silentPrintPdf(url: string, printOptions?: object) { const printStore = usePrintStore(); if (!url) { @@ -143,4 +156,10 @@ export const HiprintPrinter = { const printStore = usePrintStore(); return printStore.defaultPrinter; }, -}; \ No newline at end of file +}; + +onUnmounted(() => { + if ('downExe' in window) { + delete (window as any).downExe; + } +}); \ No newline at end of file diff --git a/src/views/checkCode/index.vue b/src/views/checkCode/index.vue index 2cfaeb6..abb6c19 100644 --- a/src/views/checkCode/index.vue +++ b/src/views/checkCode/index.vue @@ -4,22 +4,23 @@ - + - - - + + + - - - + + + - + @@ -53,10 +54,10 @@ 打印 - 采样登记 + 采样登记 - 送检登记 + 送检登记 报告查询 @@ -74,32 +75,51 @@ :columns="columns"> - - - {{ row.tfailed5 }} + + + {{ row.jzbz == '1' ? '急诊' : '非急诊' }} + + + {{ row.jjzt == '1' ? '计价' : '无' }} + + + {{ formatDict(row.brly, 'PT') }} + + + {{ formatDict(row.zt.trim(), 'ST') }} + + + {{ formatDict(row.yljg, 'HOS') }} 项目 - 拆分选中项目 - + + + + {{ row.jjzt == '1' ? '计价' : '无' }} + + + {{ formatDict(row.zt, 'ST') }} + - + - + - 读取 + 读取 删除选中行 @@ -108,66 +128,52 @@ 打印 - 保存 + - + + + {{ formatDict(row.zt, 'ST') }} + - - - - - - - - - - - 读取 - - - 删除选中行 - - - 打印 - - - 保存 - - - - @@ -512,21 +450,31 @@ const getContrastTextColor = (bgColor) => { .app-container { display: flex; flex-direction: column; - height: 90vh; /* 容器高度等于窗口高度 */ + height: 90vh; + /* 容器高度等于窗口高度 */ overflow: hidden; } + .compact-form { - height: 75px; /* 固定高度 */ + height: 75px; + /* 固定高度 */ } + .mb8 { - height: 30px; /* 固定高度 */ + height: 30px; + /* 固定高度 */ } -.table-summary{ - height: 10px; /* 固定高度 */ + +.table-summary { + height: 10px; + /* 固定高度 */ } + .table-container { - flex: 1; /* 占满剩余高度 */ - overflow: hidden; /* 避免表格超出容器 */ + flex: 1; + /* 占满剩余高度 */ + overflow: hidden; + /* 避免表格超出容器 */ } .compact-form .el-form-item { @@ -537,22 +485,32 @@ const getContrastTextColor = (bgColor) => { .compact-form .el-form-item__label { padding-bottom: 0px; } + ::v-deep .my-table .el-table__row td { - padding: 1px 0; /* 减小行高 */ + padding: 1px 0; + /* 减小行高 */ } + ::v-deep .my-table .el-table__header-wrapper th { - padding: 6px 0; /* 表头内边距 */ - background-color: #b3d8ff !important; /* 表头背景色(保留之前的设置) */ - color: #333; /* 文字颜色加深,提升可读性 */ - font-weight: 500; /* 文字加粗 */ + padding: 6px 0; + /* 表头内边距 */ + background-color: #b3d8ff !important; + /* 表头背景色(保留之前的设置) */ + color: #333; + /* 文字颜色加深,提升可读性 */ + font-weight: 500; + /* 文字加粗 */ } + ::v-deep .my-table .el-table__cell { - padding: 0 2px; /* 减小列间距 */ + padding: 0 2px; + /* 减小列间距 */ } /* 可选:调整表格整体样式 */ ::v-deep .my-table { - font-size: 13px; /* 适当减小字体 */ + font-size: 13px; + /* 适当减小字体 */ } ::v-deep .my-table .el-table__cell, @@ -560,17 +518,25 @@ const getContrastTextColor = (bgColor) => { border-width: 1px; border-color: #ebeef5; } + .card-content { - max-height: 450px; /* 设置最大高度 */ - overflow-y: auto; /* 超出高度时显示垂直滚动条 */ - padding: 5px; /* 保持与卡片默认一致的内边距 */ + max-height: 450px; + /* 设置最大高度 */ + overflow-y: auto; + /* 超出高度时显示垂直滚动条 */ + padding: 5px; + /* 保持与卡片默认一致的内边距 */ } + .clickable:hover { - cursor: pointer; /* 鼠标悬停时显示手型 */ - transition: all 0.3s; /* 平滑过渡效果 */ + cursor: pointer; + /* 鼠标悬停时显示手型 */ + transition: all 0.3s; + /* 平滑过渡效果 */ color: blue; } + /* 汇总行样式 */ .table-summary { display: flex; @@ -582,7 +548,9 @@ const getContrastTextColor = (bgColor) => { border: 1px solid #ebeef5; border-radius: 4px; font-weight: 500; - line-height: 24px; /* 汇总行文字行高 */ + line-height: 24px; + + /* 汇总行文字行高 */ .summary-item { display: flex; align-items: center; @@ -596,12 +564,16 @@ const getContrastTextColor = (bgColor) => { .summary-value { color: #303133; min-width: 40px; - text-align: left;/* 核心:数值左对齐 */ + text-align: left; + /* 核心:数值左对齐 */ } + /* 单独设置"单价合计"的值为红色 */ &:nth-child(3) .summary-value { - color: #f56c6c; /* Element UI 红色主题色 */ - font-weight: 600; /* 可选:加粗字体 */ + color: #f56c6c; + /* Element UI 红色主题色 */ + font-weight: 600; + /* 可选:加粗字体 */ } } } diff --git a/tsconfig.json b/tsconfig.json index 9567627..fa0fc83 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -32,6 +32,6 @@ // "allowUnknownInTemplate": true // 允许模板中使用未知属性 // } }, - "include": ["src/**/*","src/**/*.ts", "src/**/*.vue", "src/**/*.tsx", "src/**/*.d.ts", "auto-imports.d.ts"], // **表示任意目录,而 * 表示任意文件。这表明 src 目录中的所有文件都将被编译 + "include": ["src/**/*","src/**/*.ts", "src/**/*.vue","src/**/**/*.vue", "src/**/*.tsx", "src/**/*.d.ts", "auto-imports.d.ts"], // **表示任意目录,而 * 表示任意文件。这表明 src 目录中的所有文件都将被编译 "exclude": ["node_modules", "dist"] ,// 指示不需要编译的文件目录 } diff --git a/vite.config.js b/vite.config.js index a267ffe..b27487c 100644 --- a/vite.config.js +++ b/vite.config.js @@ -35,7 +35,7 @@ export default defineConfig(({ server: { port: 8888, host: true, - open: true, + open: false, proxy: { // https://cn.vitejs.dev/config/#server-proxy '/dev-api': {