chenyc
2024-12-25 21ef2641f0292f01cb0bb362c24b30b5014dae8e
加生化
5个文件已修改
3个文件已添加
1334 ■■■■■ 已修改文件
chenyc.ps 27 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
package.json 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/dataConversio/index.ts 161 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/lis/report.ts 166 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/layout/navBars/topBar/user.vue 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/stores/patientsInfo.ts 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/home/components/lis_.ui.vue 965 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/home/index.vue 9 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
chenyc.ps
New file
@@ -0,0 +1,27 @@
#!/bin/bash
# 设置变量
user="chenyc"
start_date="2024-01-01T00:00:00"
end_date="2024-12-30T23:59:59"
# 检查当前目录是否是Git仓库
if ! git rev-parse --is-inside-work-tree > /dev/null 2>&1; then
  echo "当前目录不是一个Git仓库。请在Git仓库的根目录下运行此脚本。"
  exit 1
fi
# 获取提交次数
commit_count=$(git log --author="$user" --since="$start_date" --until="$end_date" --pretty=oneline | wc -l)
# 获取代码行数的变化
lines_info=$(git log --author="$user" --since="$start_date" --until="$end_date" --pretty=tformat: --numstat | awk '{ add += $1; del += $2; net += $1 - $2 } END { printf "%s,%s,%s", add, del, net }')
IFS=',' read lines_added lines_deleted lines_changed <<< "$lines_info"
# 输出结果
echo "日期: $start_date ~ $end_date"
echo "用户: $user"
echo "提交次数: $commit_count"
echo "增加的代码行数: $lines_added"
echo "删除的代码行数: $lines_deleted"
echo "净变化的代码行数: $lines_changed"
package.json
@@ -6,6 +6,7 @@
    "license": "MIT",
    "scripts": {
        "dev": "vite --force",
        "dev:prod": "vite --force --mode production",
        "build": "vite build",
        "lint-fix": "eslint --fix --ext .js --ext .jsx --ext .vue src/"
    },
src/api/dataConversio/index.ts
New file
@@ -0,0 +1,161 @@
import request from "/@/utils/request";
import { IMapper, IHandCalculatorKtvAndUrrParams, IIistMapper } from "./type";
import { AxiosPromise } from "axios";
/**
 * 列出所有收费项目
 * @returns
 */
export function apiGetChargeItems() {
    return request({
        url: "/lis/report/listFeeItems",
        method: "post"
    });
}
/**
 * 获取患者检验明细
 * @param params
 * @returns
 */
export function listReportsByPatientApi(params: object) {
    return request({
        url: '/lis/report/listReportsByPatient2',
        method: 'post',
        data: params
    })
}
/**
 * 删除检验报告
 * @param data
 * @returns
 */
export function apiDelLisByDate(data: string) {
    return request({
        url: "/lis/report/deleteLisReport",
        method: "post",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        data
    });
}
/**
 * 删除lis结果
 * @param code
 * @returns
 */
export function apiDelLis(data: string) {
    return request({
        url: "/lis/report/deleteLisResult",
        method: "post",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        data
    });
}
/**
 * 修改LIS结果
 * @param data
 * @returns
 */
export function apiUpdateLis(params: { reportCode: string;  itemName: string; result: string; code?: string; sampleDate?: string; }) {
    return request({
        url: "/lis/report/updateLisResult",
        method: "post",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        params
    });
}
/**
 * 根据收费项目获取系统内置检验项目
 * @param data
 * @returns
 */
export function apiGetInspectionItemsByChargeItem(feeItemName: string, clientCode: string) {
    console.log("feeItemName: ", feeItemName)
    return request({
        url: "/lis/report/listTestItemsByFeeItemName",
        method: "post",
        headers: {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        data: "feeItemName=" + feeItemName + "&clientCode=" + clientCode
    });
}
/**
 * 根据客户编号查询对照列表
 * @param clientCode
 * @returns
 */
export function apiFindComparisonListByClientCode(clientCode: string) : AxiosPromise<IIistMapper[]> {
    return request({
        url: "/lis/test/item/mapper/listMapper",
        method: "post",
        headers: {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        data: "clientCode=" + clientCode
    });
}
/**
 * 保存对照
 * @param data
 * @returns
 */
export function apiSavecompare(data: IMapper) {
    return request({
        url: "/lis/test/item/mapper/save",
        method: "post",
        headers: {
            "Content-Type": "application/json"
        },
        data
    });
}
/**
 * 查出所有lis里已有项目
 * @param clientCode
 * @returns
 */
export function apiGetListItemNames (clientCode: string): AxiosPromise<string[]> {
    return request({
        url: '/lis/report/listDistinctItemNames',
        method: 'post',
        headers: {
            "Content-Type": "application/x-www-form-urlencoded"
        },
        params: { clientCode }
    })
}
/**
 * 计算患者urr ktv
 * @param data
 * @returns
 */
export function handCalculatorKtvAndUrrApi(data: IHandCalculatorKtvAndUrrParams) {
    return request({
        url: '/lis/stat/handCalculatorKtvAndUrr',
        method: 'post',
        data
    })
}
src/api/lis/report.ts
New file
@@ -0,0 +1,166 @@
import request from '/@/utils/request';
import type { ListTestResultsParams, SaveTestResultData, ListTestSamplesReponseItem } from './type';
import { AxiosPromise } from 'axios';
export function reportList(params) {
    return request({
        url: '/lis/report/list',
        method: 'post',
        data: params,
    })
}
export function listResults(params:string) {
    return request({
        url: '/lis/report/listResults',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        data: params,
    })
}
export function listReportsByPatient(params) {
    return request({
        url: '/lis/report/listReportsByPatient',
        method: 'post',
        data: params,
    })
}
export function listReportsByPatientDay(params) {
    return request({
        url: '/lis/report/listReportsByPatientDay',
        method: 'post',
        data: params,
    })
}
export function listReportResultsByPatientDayFeeItem(params) {
    return request({
        url: '/lis/report/listReportResultsByPatientDayFeeItem',
        method: 'post',
        data: params,
    })
}
export function listFeeItems() {
    return request({
        url: '/lis/report/listFeeItems',
        method: 'post',
    })
}
export function listTestItemsByFeeItemName(params) {
    return request({
        url: '/lis/report/listTestItemsByFeeItemName',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        data: params,
    })
}
export function saveLisResult(params) {
    return request({
        url: '/lis/report/saveLisResult',
        method: 'post',
        data: params,
    })
}
/**
 * 修改LIS结果
 * @param data
 * @returns
 */
export function apiUpdateLis(params: { code: string; result: string; sampleDate: string; }) {
    return request({
        url: "/lis/report/updateLisResult",
        method: "post",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        params
    });
}
/**
 * 删除lis结果
 * @param code
 * @returns
 */
export function apiDelLis(data: string) {
    return request({
        url: "/lis/report/deleteLisResult",
        method: "post",
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        data
    });
}
/**
 * 根据患者获取标本列表
 * @param patientCode 患者编号
 * @returns
 */
export function listTestSamplesApi(patientCode: string): AxiosPromise<ListTestSamplesReponseItem[]> {
    return request({
        url: '/patient/lis/report/listTestSamples',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        params: { patientCode }
    })
}
/**
 * 根据患者+标本编号查询出所有检查项目
 * @param params
 * @returns
 */
export function listTestResultsApi(params: ListTestResultsParams) {
    return request({
        url: '/patient/lis/report/listTestResults',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        params
    })
}
/**
 * 保存手动填写的检查项目
 * @param data
 * @returns
 */
export function saveTestResultApi(data: SaveTestResultData) {
    return request({
        url: '/patient/lis/report/saveTestResult',
        method: 'post',
        data
    })
}
/**
 * 删除检查项目
 * @param id
 * @returns
 */
export function delTestResultApi(id: number) {
    return request({
        url: '/patient/lis/report/delete',
        method: 'post',
        headers: {
            'Content-Type': 'application/x-www-form-urlencoded'
        },
        params: { id }
    })
}
src/layout/navBars/topBar/user.vue
@@ -6,7 +6,7 @@
            </div>
            <template #dropdown>
                <el-dropdown-menu :style="{ maxHeight: '600px', overflow: 'auto' }" class="scrollable-menu">
                <el-dropdown-menu                  class="scrollable-menu">
                    <el-dropdown-item v-for="(client,key) in userInfos.clientInfos" :key="key" @click="clientSet(client)" >
                        <span :style="{color:userInfos.clientName===client.clientName?'#409EFF':''}">
                            {{client.clientName}}
src/stores/patientsInfo.ts
@@ -12,7 +12,8 @@
            age: 0,
            patientName: '',
            patientGenderText: '',
            patientAvatarIcon: ''
            patientAvatarIcon: '',
            clientCode:''
        }
    }),
    actions: {
src/views/home/components/lis_.ui.vue
@@ -1,110 +1,883 @@
<template>
    <div class="dietarySurvey-home">
        <!-- <div v-if="patientsInfo.id">
           <div class="lisview">
            <div class="child">
                1的撒啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                1
            </div>
            <div class="child">
                大水水水水水水水水水水水水水水
            </div>
            <div class="child">
                1
            </div>
            <div class="child">
                1
            </div>
            <div class="child">
                1
            </div>
            <div class="child">
                1
            </div>
            <div class="child">
                1
            </div>
            <div class="child">
                大水水水水水水水水水水水水水水水水水水
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
            <div class="child">
                34222222222222222222222222222222222222222222222222222222222反倒是水水水水水水水水水水水水水水水水十大啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
            </div>
           </div>
        </div>
        -->
        <el-empty  description="该功能未开发"></el-empty>
    </div>
    <div class="inspection_project_report_container">
        <el-row>
            <el-col :span="24" class="card_box card_box_search">
                <el-form :model="searchForm" inline size="small">
                    <!-- <el-form-item label="收费项目">
                        <el-select v-model="searchForm.feeItemName" filterable placeholder="收费项目" :loading="feeItemNameLoading" @change="feeItemChange">
                            <el-option v-for="(item, index) in feeItemOptions" :key="index" :label="item" :value="item" />
                        </el-select>
                    </el-form-item> -->
                    <!-- <el-form-item label="患者">
                        <el-select v-model="searchForm.patCode" filterable placeholder="患者" :loading="patLoading">
                            <el-option v-for="(item, index) in patOptions" :key="index" :label="item.patientName" :value="item.code" />
                        </el-select>
                    </el-form-item> -->
                    <el-form-item>
                        <el-button type="primary" :loading="loading" @click="searchFun">
                            <el-icon><RefreshRight /></el-icon>
                            刷新
                        </el-button>
                        <!-- <el-button type="success" :loading="loading" @click="addFun">
                            <el-icon><Plus /></el-icon>
                            新增检验数据
                        </el-button> -->
                    </el-form-item>
                    <el-form-item></el-form-item>
                </el-form>
            </el-col>
            <el-col :span="24" v-loading="loading">
                <el-row :gutter="15">
                    <el-col :span="4">
                        <el-row>
                            <el-col :span="24" class="patTabel">
                                <el-table
                                    v-if="tableHeight > 0"
                                    :data="feeItemOptions"
                                    :height="tableHeight"
                                    border
                                    class="patient_table"
                                    :row-class-name="feeItemTableRowClassName"
                                    @row-click="feeItemRowClick"
                                >
                                    <!-- <el-table-column label="序号" type="index" width="100" /> -->
                                    <el-table-column label="收费项目">
                                        <template #default="scope">
                                            {{ scope.row }}
                                        </template>
                                    </el-table-column>
                                </el-table>
                            </el-col>
                        </el-row>
                    </el-col>
                    <el-col :span="20" class="card_box" v-loading="loading">
                        <el-empty v-if="tableData.length <= 0" description="暂无检验数据" />
                        <div class="result_box" v-if="tableHeight > 0" :style="{ height: (tableHeight-10) + 'px' }">
                            <el-descriptions
                                v-for="item in tableData"
                                :key="item.reportCode"
                                class="fee_item_box"
                                :title="formatDescriptionsTitle(item.sampleDate)"
                                :column="4"
                                size="small"
                                border
                            >
                                <!-- <template #extra>
                                    <el-button type="primary" size="small" :loading="false" @click="editRow(item)">编辑</el-button>
                                    <el-button type="danger" size="small" :loading="false" @click="delRow(item)">删除</el-button>
                                </template> -->
                                <el-descriptions-item v-for="(td, index) in item.results" :key="index">
                                    <template #label>
                                        <div class="cell-item">
                                            {{ td.itemName }}
                                        </div>
                                    </template>
                                    <el-popover placement="right" :width="220" trigger="click">
                                        <template #reference>
                                            <span class="item_res_text" :style="{ color: formatResultColor(td.resultFlag) }"
                                                >{{ td.itemResult }} {{ td.itemResultUnit ? `(${td.itemResultUnit})` : '' }}</span
                                            >
                                        </template>
                                        <div>
                                            <el-button type="success" size="mini" @click="editItem(td, item)">编辑</el-button>
                                            <el-button type="danger" size="mini" @click="delItem(td)">删除</el-button>
                                        </div>
                                    </el-popover>
                                </el-descriptions-item>
                            </el-descriptions>
                        </div>
                    </el-col>
                </el-row>
            </el-col>
        </el-row>
        <!-- 修改单项的dialog -->
        <el-dialog v-model="isEditItemDialogShow" title="编辑" center width="400px">
            <el-form ref="editItemFormRef" :model="editItemForm" size="small" :rules="editItemFormRules">
                <el-form-item label="检验日期">
                    <el-date-picker v-model="editItemForm.sampleDate" type="date" style="width: 100%" placeholder="检验日期" :clearable="false" />
                </el-form-item>
                <el-form-item label="检验项目">
                    <el-input disabled v-model="editItemForm.itemName"></el-input>
                </el-form-item>
                <el-form-item label="检验结果" prop="itemResult">
                    <el-input v-model="editItemForm.itemResult" @change="(e) => itemInpChangeyz(e, editItemForm)" placeholder="检验结果" clearable>
                        <template #append>
                            <span v-if="editItemForm.itemResultUnit">{{ editItemForm.itemResultUnit }}</span>
                        </template>
                    </el-input>
                </el-form-item>
            </el-form>
            <template #footer>
                <el-button size="small" :loading="loading" @click="isEditItemDialogShow = false">取消</el-button>
                <el-button type="primary" size="small" :loading="loading" @click="editItemSubmit(editItemFormRef)">保存</el-button>
            </template>
        </el-dialog>
        <!-- 修改多项 -->
        <el-dialog v-model="isManyFeeShow" title="编辑" center width="800px" :close-on-click-modal="false">
            <el-form ref="editManyFeeFormRef" :model="editManyFeeForm" size="small" label-width="150px" label-position="right">
                <el-row :gutter="10">
                    <el-col :span="12" class="m_b_20">
                        <el-form-item label="检验日期">
                            <el-date-picker v-model="editManyFeeForm.sampleDate" type="date" style="width: 100%" placeholder="检验日期" :clearable="false" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12" class="m_b_20">
                        <el-form-item label="收费项目">
                            <el-input v-model="searchForm.feeItemName" disabled></el-input>
                        </el-form-item>
                    </el-col>
                    <el-col v-for="(item, index) in editManyFeeForm.children" :key="item.code" :span="12" class="m_b_20">
                        <el-form-item :label="item.itemName">
                            <el-input
                                v-model="item.itemResult"
                                :disabled="item.itemSystemName === '转铁蛋白饱和度' || disabledItem.includes(item.itemSystemName)"
                                @change="(e) => itemInpChangeyz(e, item)"
                                @input="(e) => itemInpChange2(e, item)"
                            >
                                <template #append>
                                    <span v-if="item.itemResultUnit">{{ item.itemResultUnit }}</span>
                                </template>
                            </el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="24" v-if="searchForm.feeItemName === 'KT/V检查'">
                        <el-form-item label=" ">
                            <el-button type="success" size="small" :loading="loading || addLoading" @click="calculatorKtvAndUrrByUpdate">计算URR K/TV</el-button>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
            <template #footer>
                <el-button size="small" :loading="loading" @click="isManyFeeShow = false">取消</el-button>
                <el-button type="primary" size="small" :loading="loading" @click="editManySubmit(editManyFeeFormRef)">保存</el-button>
            </template>
        </el-dialog>
        <!-- 新增 -->
        <el-dialog v-model="isShowAddFeeShow" title="新增检验数据" center width="800px" :close-on-click-modal="false">
            <el-form :model="addFeeForm" v-loading="addLoading" size="small" label-width="150px" label-position="right">
                <el-row :gutter="10">
                    <el-col :span="12" class="m_b_20">
                        <el-form-item label="检验日期">
                            <el-date-picker v-model="addFeeForm.sampleDate" type="date" style="width: 100%" placeholder="检验日期" :clearable="false" />
                        </el-form-item>
                    </el-col>
                    <el-col :span="12" class="m_b_20">
                        <el-form-item label="收费项目">
                            <el-select v-model="addFeeForm.feeItemName" filterable placeholder="收费项目" @change="feeItemChangeByAdd">
                                <el-option v-for="(item, index) in feeItemOptions" :key="index" :label="item" :value="item" />
                            </el-select>
                        </el-form-item>
                    </el-col>
                    <el-col v-for="(item, index) in addFeeForm.details" :key="index" :span="12" class="m_b_20">
                        <el-form-item :label="item.testItem">
                            <el-input
                                v-model="item.testValue"
                                :disabled="disabledItem.includes(item.stName)"
                                :placeholder="item.placeholder"
                                @change="(e) => itemInpChangeyz(e, item)"
                                @input="(e) => itemInpChange(e, item)"
                            >
                                <template #append>{{ item.testItemUnit }}</template>
                            </el-input>
                        </el-form-item>
                    </el-col>
                    <el-col :span="24" v-if="addFeeForm.feeItemName === 'KT/V检查'">
                        <el-form-item label=" ">
                            <el-button type="success" size="small" :loading="loading || addLoading" @click="calculatorKtvAndUrr">计算URR K/TV</el-button>
                        </el-form-item>
                    </el-col>
                </el-row>
            </el-form>
            <template #footer>
                <el-button size="small" :loading="loading || addLoading" @click="isShowAddFeeShow = false">取消</el-button>
                <el-button type="primary" size="small" :loading="loading || addLoading" @click="addSubmit">保存</el-button>
            </template>
        </el-dialog>
    </div>
</template>
<script setup lang="ts">
<script lang="ts" setup>
import { listTestItemsByFeeItemName, saveLisResult } from '/@/api/lis/report';
import { number } from 'echarts';
import { ElMessage, ElMessageBox } from 'element-plus';
import { computed, nextTick, onMounted, ref, watch } from 'vue';
import {
    apiGetChargeItems,
    listReportsByPatientApi,
    apiDelLisByDate,
    apiDelLis,
    apiUpdateLis,
    handCalculatorKtvAndUrrApi,
} from '/@/api/dataConversio/index';
import { useStore } from '/@/store/index';
import { storeToRefs } from 'pinia';
import { usePatientsInfo } from '/@/stores/patientsInfo';
import { computed, reactive } from 'vue';
import { formatDate } from '/@/utils/formatTime';
import { verifyNumberIntegerAndFloat } from '/@/utils/toolsValidate';
import { QueryList } from '/@/api/Patients';
const storesPat = usePatientsInfo();
const { patientsInfo } = storeToRefs(storesPat);
const props = defineProps(['tableHeight'])
const state = reactive({
    tableData: [],
    loading: false,
})
const tableHe = computed(() => {
    return props.tableHeight - 130
})
// 第一步:定义子组件里面的方法
const getData = (str: string) => {
    console.log("子组件获取显示数据!" + str);
    console.log(props.tableHeight)
    var pam = {
        patientCode: patientsInfo.value.code,
        page: 1,
        size: 100,
        orderType: 1,
        orderIsUse: 2,
        desc: 1,
        orderName: '',
    }
    state.loading = true
const store = patientsInfo;
}
const searchForm = ref({
    patCode: '', // 患者编号
    feeItemName: '', // 收费项目
});
// 第二步:暴露方法
defineExpose({ getData })
const loading = ref(false);
const tableData = ref([]);
const tableCols = ref([]);
const feeItemNameLoading = ref(false);
const feeItemOptions = ref<string[]>([]);
const patLoading = ref(false);
const patOptions = ref<any[]>([]);
const tableHeight = ref(0);
const editItemForm = ref({
    code: '',
    itemName: '',
    itemResult: '',
    itemResultUnit: '',
    sampleDate: formatDate(new Date(), 'YYYY-mm-dd'),
    oldSampleDate: formatDate(new Date(), 'YYYY-mm-dd'),
    reportCode: '',
}); // 修改单项时用到的
const isEditItemDialogShow = ref(false);
const editItemFormRef = ref();
const editItemFormRules = ref({
    itemResult: [{ required: true, message: '请输入检验结果', trigger: 'blur' }],
});
const disabledItem = ['转铁蛋白饱和度', '计算URR', 'KT/V (计算KT/V)'];
watch(
    // @ts-ignore
    () => patientsInfo.value.code,
    (newVal) => {
        if (newVal) {
            if (newVal) {
                searchForm.value.patCode = newVal;
                nextTick(() => {
                    searchFun();
                });
            }
        } else {
            ElMessage.warning('请选择患者');
        }
    }
);
// 修改整个日期的
const editManyFeeFormRef = ref();
const isManyFeeShow = ref(false);
const editManyFeeForm = ref({
    sampleDate: formatDate(new Date(), 'YYYY-mm-dd'),
    oldSampleDate: formatDate(new Date(), 'YYYY-mm-dd'),
    reportCode: '',
    children: [],
});
// 新增检验数据
const addFeeFormRef = ref();
const isShowAddFeeShow = ref(false);
const addLoading = ref(false);
// 临时日期 上次保存的日期
const addFeeFormDatels = ref('');
const addFeeForm = ref({
    patientCode: '',
    sampleDate: formatDate(new Date(), 'YYYY-mm-dd'),
    feeItemName: '',
    details: [],
});
const clientCode = computed(() => {
    // @ts-ignore
    return patientsInfo.value.clientCode;
});
/**
 * 查询
 */
const searchFun = async () => {
    if (!searchForm.value.patCode) return ElMessage.warning('请选择患者');
    if (!searchForm.value.feeItemName) return ElMessage.warning('请选择收费项目');
    loading.value = true;
    try {
        const params = {
            clientCode: clientCode.value,
            ...searchForm.value,
            isFilterTestItem: 1,
        };
        const { data } = await listReportsByPatientApi(params);
        tableCols.value = data.cols;
        tableData.value = data.reports;
    } finally {
        loading.value = false;
    }
};
/**
 * 获取收费项目列表
 */
const getFeeItems = async () => {
    feeItemNameLoading.value = true;
    try {
        const { data } = await apiGetChargeItems();
        feeItemOptions.value = data;
        if (data.length > 0) {
            feeItemRowClick(data[0]);
        }
    } finally {
        feeItemNameLoading.value = false;
    }
};
/**
 * 获取患者列表
 */
const getPatients = async () => {
    patLoading.value = true;
    try {
        const params = {
            page: 0,
            size: 0,
            wherecondition: ` client_code="${clientCode.value}" and patient_is_alive='1'`,
            ordercondition: 'patient_hemo_code asc',
        };
        const { data } = await QueryList(params);
        patOptions.value = data.list;
        if (data.list.length > 0) {
            searchForm.value.patCode = data.list[0].code;
        }
    } catch (err) {
        console.error(err);
    } finally {
        patLoading.value = false;
    }
};
/**
 * 删除检验数据
 */
const delRow = (row: any) => {
    let msg = `<span style="color:red"> ${row.sampleDate.substring(0, 11)} </span>`;
    ElMessageBox.confirm(
        `
    此操作将会删除该患者 ${msg} 所有的检验数据,是否确认?
    `,
        '提示',
        {
            dangerouslyUseHTMLString: true,
            confirmButtonText: '确认',
            cancelButtonText: '取消',
            type: 'warning',
        }
    )
        .then(async () => {
            loading.value = true;
            try {
                await apiDelLisByDate(`reportCode=${row.reportCode}`);
                await searchFun();
                ElMessage.success('删除成功');
            } finally {
                loading.value = false;
            }
        })
        .catch(() => {});
};
/** 删除单项检验数据 */
const delItem = (item: any) => {
    let msg = `<span style="color:red"> ${item.itemName} </span>`;
    ElMessageBox.confirm(
        `
    此操作将会删除该患者 ${msg} 的检验数据,是否确认?
    `,
        '提示',
        {
            dangerouslyUseHTMLString: true,
            confirmButtonText: '确认',
            cancelButtonText: '取消',
            type: 'warning',
        }
    )
        .then(async () => {
            loading.value = true;
            try {
                await apiDelLis(`code=${item.code}`);
                await searchFun();
                ElMessage.success('删除成功');
            } finally {
                loading.value = false;
            }
        })
        .catch(() => {});
};
/** 更新整个日期的检查项 */
const editRow = (row: any) => {
    console.log(row);
    const editData = {
        sampleDate: formatDate(new Date(row.sampleDate), 'YYYY-mm-dd'),
        oldSampleDate: formatDate(new Date(row.sampleDate), 'YYYY-mm-dd'),
        reportCode: row.reportCode, // 报告单编号
        children: [],
    };
    editData.children = row.results.map((item) => {
        const editItem = {
            code: item ? item.code : '',
            itemSystemName: item.itemSystemName,
            itemName: item.itemName,
            stName: item.itemName,
            itemResult: item ? item.itemResult : '',
            itemResultUnit: item ? item.itemResultUnit : '',
            sampleDate: formatDate(new Date(row.sampleDate), 'YYYY-mm-dd'),
            reportCode: row.reportCode, // 报告单编号
            参考值高值: item.参考高值,
            参考值低值: item.参考低值,
        };
        return editItem;
    });
    editManyFeeForm.value = editData;
    isManyFeeShow.value = true;
};
/** 更新整个日期的检查项 -- 提交 */
const editManySubmit = async (formEl: any) => {
    console.log(formEl);
    if (!formEl) return;
    await formEl.validate(async (valid, fields) => {
        if (valid) {
            loading.value = true;
            try {
                const asyncs = editManyFeeForm.value.children.map((e) => {
                    const item: any = {
                        reportCode: e.reportCode,
                        code: e.code,
                        itemName: e.itemName,
                        result: e.itemResult,
                    };
                    // 判断检查日期是否修改,如果修改则需要提交 sampleDate
                    if (formatDate(new Date(editManyFeeForm.value.sampleDate), 'YYYY-mm-dd') !== editManyFeeForm.value.oldSampleDate) {
                        item.sampleDate = formatDate(new Date(editManyFeeForm.value.sampleDate), 'YYYY-mm-dd');
                    }
                    return item;
                });
                await Promise.all(asyncs.map((e) => apiUpdateLis(e)));
                await searchFun();
                loading.value = false;
                isManyFeeShow.value = false;
                ElMessage.success('修改成功');
            } catch (error) {
                loading.value = false;
            }
        }
    });
};
/** 更新单项检验数据 */
const editItem = (item: any, row: any) => {
    const editItem = {
        code: item ? item.code : '',
        itemName: item.itemName,
        stName: item.itemName,
        itemResult: item ? item.itemResult : '',
        itemResultUnit: item ? item.itemResultUnit : '',
        sampleDate: formatDate(new Date(row.sampleDate), 'YYYY-mm-dd'),
        oldSampleDate: formatDate(new Date(row.sampleDate), 'YYYY-mm-dd'),
        reportCode: row.reportCode, // 报告单编号
        参考值低值: item.参考低值,
        参考值高值: item.参考高值,
    };
    editItemForm.value = editItem;
    isEditItemDialogShow.value = true;
};
/** 更新单项检验数据 -- 提交 */
const editItemSubmit = async (formEl: any) => {
    if (!formEl) return;
    await formEl.validate(async (valid, fields) => {
        if (valid) {
            try {
                const params: any = {
                    reportCode: editItemForm.value.reportCode,
                    code: editItemForm.value.code,
                    itemName: editItemForm.value.itemName,
                    result: editItemForm.value.itemResult,
                };
                // 判断检验日期是否有更改,如果有则需要提交sampleDate
                if (formatDate(new Date(editItemForm.value.sampleDate), 'YYYY-mm-dd') !== editItemForm.value.oldSampleDate) {
                    params.sampleDate = formatDate(new Date(editItemForm.value.sampleDate), 'YYYY-mm-dd');
                }
                await apiUpdateLis(params);
                await searchFun();
                loading.value = false;
                isEditItemDialogShow.value = false;
                ElMessage.success('修改成功');
            } catch (error) {
                loading.value = false;
            }
        }
    });
};
const addFun = async () => {
    // 新增检验数据
    addFeeForm.value = {
        patientCode: searchForm.value.patCode,
        sampleDate: addFeeFormDatels.value === '' ? formatDate(new Date(), 'YYYY-mm-dd') : addFeeFormDatels.value,
        feeItemName: searchForm.value.feeItemName,
        details: [],
    };
    isShowAddFeeShow.value = true;
    addLoading.value = true;
    try {
        addFeeForm.value.details = await getTestItems();
    } finally {
        addLoading.value = false;
    }
};
const addSubmit = async () => {
    const isHaveResData = addFeeForm.value.details.filter((v: any) => !!v.testValue || v.testValue == 0);
    if (isHaveResData.length <= 0) return ElMessage.warning('请至少保证一项检验结果存在数据');
    addLoading.value = true;
    try {
        const details = isHaveResData.map((v) => {
            const item = {
                feeItemName: v.feeItem,
                sampleDate: addFeeForm.value.sampleDate,
                testItemName: v.testItem,
                testItemResult: v.testValue,
                testItemUnit: v.testItemUnit,
                itemRef: v.参考值,
            };
            return item;
        });
        const data = {
            patientCode: searchForm.value.patCode,
            details,
        };
        addFeeFormDatels.value = addFeeForm.value.sampleDate;
        await saveLisResult(data);
        isShowAddFeeShow.value = false;
        searchFun();
        ElMessage.success('保存成功');
    } catch (error) {
        ElMessage.error('保存失败,请联系管理员: ' + error);
    } finally {
        addLoading.value = false;
    }
};
const feeItemChangeByAdd = (val: string) => {
    nextTick(async () => {
        addLoading.value = true;
        try {
            addFeeForm.value.details = await getTestItems();
        } finally {
            addLoading.value = false;
        }
    });
};
const itemInpChange2 = (val: any, colItem: any) => {
    if (colItem.itemSystemName !== '血清铁' && colItem.itemSystemName !== '总铁结合力') return false;
    let xtq = val || 0; // 血清铁
    let ztjhl = val || 0; // 总铁结合力
    if (colItem.itemSystemName === '血清铁') {
        const item = editManyFeeForm.value.children.find((e) => e.itemSystemName === '总铁结合力');
        item && (ztjhl = item.itemResult || 0);
    }
    if (colItem.itemSystemName === '总铁结合力') {
        const item = editManyFeeForm.value.children.find((e) => e.itemSystemName === '血清铁');
        item && (xtq = item.itemResult || 0);
    }
    console.log(xtq, ztjhl);
    if (!verifyNumberIntegerAndFloat(xtq + '') || !verifyNumberIntegerAndFloat(ztjhl + '') || ztjhl == 0 || xtq == 0) {
        const i = editManyFeeForm.value.children.findIndex((e) => e.itemSystemName === '转铁蛋白饱和度');
        if (i !== -1) {
            editManyFeeForm.value.children[i].itemResult = '';
        }
        return false;
    }
    let sum: any = (xtq / ztjhl) * 100;
    if (sum % 1 !== 0) {
        sum = scaleFormat(sum, 2);
    }
    // 查
    const i = editManyFeeForm.value.children.findIndex((e) => e.itemSystemName === '转铁蛋白饱和度');
    if (i !== -1) {
        editManyFeeForm.value.children[i].itemResult = sum;
    }
};
const itemInpChange = (val: any, colItem: any) => {
    if (colItem.stName !== '血清铁' && colItem.stName !== '总铁结合力') return false;
    let xtq = val || 0; // 血清铁
    let ztjhl = val || 0; // 总铁结合力
    if (colItem.stName === '血清铁') {
        const item = addFeeForm.value.details.find((e) => e.stName === '总铁结合力');
        item && (ztjhl = item.testValue || 0);
    }
    if (colItem.stName === '总铁结合力') {
        const item = addFeeForm.value.details.find((e) => e.stName === '血清铁');
        item && (xtq = item.testValue || 0);
    }
    console.log(xtq, ztjhl);
    if (!verifyNumberIntegerAndFloat(xtq + '') || !verifyNumberIntegerAndFloat(ztjhl + '') || ztjhl == 0 || xtq == 0) {
        const i = addFeeForm.value.details.findIndex((e) => e.stName === '转铁蛋白饱和度');
        if (i !== -1) {
            addFeeForm.value.details[i].testValue = '';
        }
        return false;
    }
    let sum: any = (xtq / ztjhl) * 100;
    if (sum % 1 !== 0) {
        sum = scaleFormat(sum, 2);
    }
    // 查
    const i = addFeeForm.value.details.findIndex((e) => e.stName === '转铁蛋白饱和度');
    if (i !== -1) {
        addFeeForm.value.details[i].testValue = sum;
    }
};
const itemInpChangeyz = (val: any, colItem: any) => {
    const isNumber = /^\d*$/.test(val);
    console.log(val, colItem, isNumber);
    if (val && isNumber) {
        if (colItem.参考值低值 && colItem.参考值高值) {
            if (Number(val) <= colItem.参考值低值 || Number(val) >= colItem.参考值高值) {
                ElMessage({
                    message: `${colItem.stName}输入的值为${val}没有在${colItem.参考值低值}~${colItem.参考值高值}参考值范围内!`,
                    type: 'warning',
                    duration: 5000,
                });
            }
        }
    }
};
const scaleFormat = (value: any = 0, scale: number = 4) => {
    return Number.parseFloat(value).toFixed(scale);
};
const getTestItems = async () => {
    const { data } = await listTestItemsByFeeItemName(`feeItemName=${addFeeForm.value.feeItemName}&clientCode=${clientCode.value}`);
    return data.testItems
        .filter((e) => e.是否显示 !== 0)
        .map((v: any) => {
            const obj = Object.assign({}, { ...v });
            const item = {
                ...v,
                testValue: '',
                stName: obj.testItem,
                testItem: obj.testItem2 || v.testItem,
                placeholder: obj.参考值,
                sortOrder: obj.排序字段 || 9999,
            };
            return item;
        })
        .sort((a, b) => a.sortOrder - b.sortOrder);
};
const formatResultColor = (resultFlag: string) => {
    let color = '#606266';
    switch (resultFlag) {
        case '正常':
            color = '#606266';
            break;
        case '偏高':
            color = 'red';
            break;
        case '高':
            color = 'red';
            break;
        case '偏低':
            color = '#409EFF';
            break;
        case '低':
            color = '#409EFF';
            break;
    }
    return color;
};
/** 选中收费项目 */
const feeItemRowClick = (row: any) => {
    if (row === searchForm.value.feeItemName) return false;
    searchForm.value.feeItemName = row;
    searchFun();
};
const formatDescriptionsTitle = (str: string) => {
    return `检验日期:${formatDate(new Date(str), 'YYYY-mm-dd')}`;
};
const feeItemTableRowClassName = ({ row, rowIndex }: { row: any; rowIndex: number }) => {
    if (searchForm.value.feeItemName) {
        if (row === searchForm.value.feeItemName) {
            return 'success-row';
        } else {
            return '';
        }
    } else {
        return '';
    }
};
const setTableHeight = () => {
    let height = document.documentElement.clientHeight;
    const navDom = document.querySelector('.layout-header');
    if (navDom) {
        height -= navDom.scrollHeight;
    }
    const demoFormDom = document.querySelector('.card_box_search');
    if (demoFormDom) {
        height -= demoFormDom.scrollHeight;
    }
    height = height - 200;
    tableHeight.value = height;
};
/** 计算ktv/urr 修改的 */
const calculatorKtvAndUrrByUpdate = async () => {
    const compareMap = [
        { stTestName: '透析前尿素氮', key: 'dataNiaosu1' },
        { stTestName: '透析后尿素氮', key: 'dataNiaosu2' },
        { stTestName: '透析时间', key: 'dataMedPeriod' },
        { stTestName: '透前体重', key: 'dataWeight1' },
        { stTestName: '透后体重', key: 'dataWeight2' },
    ];
    const params: any = {};
    const blanks: string[] = [];
    editManyFeeForm.value.children.forEach((e) => {
        const item = compareMap.find((v) => v.stTestName === e.itemSystemName);
        if (item) {
            console.log(+e.itemResult);
            if (e.itemResult === '' || typeof +e.itemResult !== 'number' || isNaN(+e.itemResult)) {
                blanks.push(e.itemSystemName);
            }
            params[item.key] = e.itemResult;
        }
    });
    if (blanks.length > 0) return ElMessage.warning(`${blanks.join('、')}为空或不为数字`);
    addLoading.value = true;
    try {
        const { data } = await handCalculatorKtvAndUrrApi(params);
        const urrIndex = editManyFeeForm.value.children.findIndex((e) => e.itemSystemName === '计算URR');
        const ktvIndex = editManyFeeForm.value.children.findIndex((e) => e.itemSystemName === 'KT/V (计算KT/V)');
        if (urrIndex !== -1) {
            editManyFeeForm.value.children[urrIndex].itemResult = data?.URR;
        }
        if (ktvIndex !== -1) {
            editManyFeeForm.value.children[ktvIndex].itemResult = data?.Ktv;
        }
    } finally {
        addLoading.value = false;
    }
};
/**
 * 计算ktv/URR 新增的
 */
const calculatorKtvAndUrr = async () => {
    const compareMap = [
        { stTestName: '透析前尿素氮', key: 'dataNiaosu1' },
        { stTestName: '透析后尿素氮', key: 'dataNiaosu2' },
        { stTestName: '透析时间', key: 'dataMedPeriod' },
        { stTestName: '透前体重', key: 'dataWeight1' },
        { stTestName: '透后体重', key: 'dataWeight2' },
    ];
    const params: any = {};
    const blanks: string[] = [];
    addFeeForm.value.details.forEach((e) => {
        const item = compareMap.find((v) => v.stTestName === e.stName);
        if (item) {
            console.log(+e.testValue);
            if (e.testValue === '' || typeof +e.testValue !== 'number' || isNaN(+e.testValue)) {
                blanks.push(e.testItem);
            }
            params[item.key] = e.testValue;
        }
    });
    if (blanks.length > 0) return ElMessage.warning(`${blanks.join('、')}为空或不为数字`);
    addLoading.value = true;
    try {
        const { data } = await handCalculatorKtvAndUrrApi(params);
        const urrIndex = addFeeForm.value.details.findIndex((e) => e.stName === '计算URR');
        const ktvIndex = addFeeForm.value.details.findIndex((e) => e.stName === 'KT/V (计算KT/V)');
        if (urrIndex !== -1) {
            addFeeForm.value.details[urrIndex].testValue = data?.URR;
        }
        if (ktvIndex !== -1) {
            addFeeForm.value.details[ktvIndex].testValue = data?.Ktv;
        }
    } finally {
        addLoading.value = false;
    }
};
onMounted(async () => {
    setTableHeight();
    // await getPatients();
    // @ts-ignore
    if (patientsInfo.value.code) {
        // @ts-ignore
        searchForm.value.patCode = patientsInfo.value.code
    } else {
        ElMessage.warning('请选择患者');
    }
    getFeeItems();
});
</script>
<style  lang="scss">
.lisview{
    display: flex; /* 使用Flexbox布局 */
    flex-wrap: wrap;
    .child {
        margin: 5px; /* 为了清楚地展示间隔 */
        padding: 10px;
        border: 1px solid #000;
    }
<style lang="scss" scoped>
* {
    box-sizing: border-box;
}
.inspection_project_report_container {
    .card_box {
        padding: 15px;
        background: #fff;
        padding-bottom: 0;
        &.card_box_search {
            padding-bottom: 0;
            margin-bottom: 10px;
        }
    }
    .search_inp_box {
        padding: 10px;
        background-color: #6babfa;
    }
    .fee_item_box {
        margin-bottom: 20px;
    }
    .item_res_text {
        &:hover {
            color: #409eff !important;
            cursor: pointer;
        }
    }
    .m_b_20 {
        margin-bottom: 20px;
    }
    .result_box {
        overflow-y: auto;
    }
}
</style>
<style lang="scss">
.patient_table {
    .success-row {
        background: rgb(197.7, 225.9, 255);
            color: #409EFF;
    }
}
</style>
src/views/home/index.vue
@@ -46,7 +46,6 @@
                                <span style="margin-left: 5px">生化数据</span>
                            </span>
                        </template>
                        <lisUi ref="lisUiRef"></lisUi>
                    </el-tab-pane>
                    <el-tab-pane label="用药记录" name="用药记录">
                        <template #label>
@@ -227,7 +226,9 @@
        age: 0,
        patientName: '',
        patientGenderText: '',
        patientAvatarIcon: ''
        patientAvatarIcon: '',
        clientCode:''
    })
    QueryList(ps).then(res => {
        console.log('----------------患者--------')
@@ -290,8 +291,8 @@
        }
        .el-table__body tr.current-row>td.el-table__cell {
            background: #E4F6DE;
            color: #5FCD00;
            background: rgb(197.7, 225.9, 255);
            color: #409EFF;
            /* height: 25px; */
            /* border: tomato solid 1px; */
        }