<template>
  <div class="app-container">
    <div class="left">
      <div class="form">
        <el-form
          :model="queryParams"
          ref="queryRef"
          :inline="true"
          v-show="showSearch"
          label-position="right"
          style="min-width: 500px"
        >
          <el-form-item label="患者信息" prop="condition">
            <el-input
              v-model="queryParams.condition"
              placeholder="请输入姓名/证件号"
              clearable
              style="width: 160px"
              @keyup.enter="handleQuery"
            />
          </el-form-item>
          <el-form-item label="发药状态" prop="departmentId" style="margin-left: 10px">
            <el-select
              v-model="queryParams.statusEnum"
              placeholder="请选择发药状态"
              clearable
              style="width: 160px"
              @change="handleQuery"
            >
              <el-option
                v-for="item in dispenseStatusOptions"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
            </el-select>
          </el-form-item>
          <el-form-item label="就诊日期">
            <el-date-picker
              v-model="dateRange"
              type="daterange"
              start-placeholder="开始日期"
              end-placeholder="结束日期"
              style="width: 250px"
              value-format="YYYY-MM-DD"
              @change="handleQuery"
            />
          </el-form-item>
          <!-- <el-form-item label="科室" prop="departmentId">
            <el-select
              v-model="queryParams.departmentId"
              placeholder="请选择科室"
              clearable
              style="width: 160px"
              @change="handleQuery"
            >
              <el-option
                v-for="item in departmentList"
                :key="item.value"
                :label="item.label"
                :value="item.value"
              />
            </el-select>
          </el-form-item> -->
          <el-form-item style="margin-left: 15px">
            <el-button type="primary" @click="handleQuery">搜索</el-button>
            <el-button @click="resetQuery">重置</el-button>
          </el-form-item>
        </el-form>
      </div>

      <el-table
        :data="patientList"
        border
        style="width: 100%; height: 60vh"
        highlight-current-row
        @row-click="handleCurrentChange"
      >
        <el-table-column prop="patientName" label="姓名" width="130" align="center" />
        <el-table-column
          prop="genderEnum_enumText"
          label="性别"
          width="80"
          align="center"
        />
        <el-table-column prop="age" label="年龄" width="80" align="center" />
        <el-table-column prop="receptionTime" label="就诊日期" align="center">
          <template #default="scope">
            {{ scope.row.receptionTime ? formatDate(scope.row.receptionTime) : "-" }}
          </template>
        </el-table-column>
      </el-table>
      <pagination
        v-show="total > 0"
        :total="total"
        v-model:page="queryParams.pageNo"
        v-model:limit="queryParams.pageSize"
        @pagination="getList"
      />
    </div>

    <div class="right">
      <!-- <div class="select_wrapper_div">
        <p style="margin-right: 60px; font-size: 19px">患者基本信息</p> -->

      <!-- <el-button type="success" plain @click="print" icon="Printer" style="margin-left: 30px;">打印</el-button> -->
      <!-- </div> -->
      <div class="top">
        <!-- <el-descriptions :column="4" title="患者基本信息">
          <el-descriptions-item label="姓名：">{{ personInfo.patientName }}</el-descriptions-item>
          <el-descriptions-item label="性别：">
            {{ personInfo.genderEnum_enumText }}
          </el-descriptions-item>
          <el-descriptions-item label="年龄：">{{ personInfo.age }}</el-descriptions-item>
          <el-descriptions-item label="合同类型：">
            {{ personInfo.categoryEnum_enumText }}
          </el-descriptions-item>
          <el-descriptions-item label="就诊科室：">
            {{ personInfo.organizationName }}
          </el-descriptions-item>
          <el-descriptions-item label="就诊日期：">
            {{ personInfo.encounterDate }}
          </el-descriptions-item>
          <el-descriptions-item label="证件号：">{{ personInfo.idCard }}</el-descriptions-item>
          <el-descriptions-item label="总金额：">
            {{ personInfo.totalPrice ? personInfo.totalPrice.toFixed(2) : '0.00' }}元
          </el-descriptions-item>
        </el-descriptions> -->
        <!-- <el-row>
          <el-col :span="4">姓名：{{ personInfo.patientName }}</el-col>
          <el-col :span="3">性别：{{ personInfo.genderEnum_enumText }}</el-col>
          <el-col :span="3">年龄：{{ personInfo.age }}</el-col>
          <el-col :span="5">合同类型：{{ personInfo.categoryEnum_enumText }}</el-col> </el-row
        ><br />
        <el-row>
          <el-col :span="5">就诊科室：{{ personInfo.organizationName }}</el-col>
          <el-col :span="5">就诊日期：{{ personInfo.encounterDate }}</el-col>
          <el-col :span="7">证件号：{{ personInfo.idCard }}</el-col>

           </el-row
        ><br />
        <el-row>
          <el-col :span="4"
            >总金额：{{
              personInfo.totalPrice ? personInfo.totalPrice.toFixed(2) : '0.00'
            }}元</el-col
          >
        </el-row> -->
        <span
          style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px"
        >
          调配药师
        </span>
        <el-select v-model="preparerDoctor" placeholder="调配药师" style="width: 160px">
          <el-option
            v-for="item in preparerDoctorOptions"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
        <span
          style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px"
        >
          药品分类
        </span>
        <el-select
          v-model="tcmFlag"
          placeholder="药品分类"
          style="width: 160px"
          @change="
            () => {
              if (currentRow.encounterId) {
                getMedicineList(currentRow.encounterId);
              }
            }
          "
        >
          <el-option
            v-for="item in medCategoryCode"
            :key="item.value"
            :label="item.label"
            :value="item.value"
          />
        </el-select>
        <span
          style="color: #606266; font-size: 14px; font-weight: 700; margin-right: 15px"
        >
          项目
        </span>
        <el-select
          v-model="projectTypeCode"
          placeholder="项目"
          style="width: 160px"
          :clearable="false"
          @change="
            () => {
              getList();
              if (currentRow) {
                getMedicineList(currentRow?.encounterId);
              }
            }
          "
        >
          <el-option label="全部" value="1" />
          <el-option label="药品" value="2" />
          <el-option label="耗材" value="3" />
        </el-select>
        <el-button
          :disabled="medicineInfoList && medicineInfoList.length == 0"
          type="primary"
          @click="handleBatch()"
          style="margin-left: 30px"
        >
          批量发药
        </el-button>
        <el-button type="primary" @click="handleScan()" style="margin-left: 30px">
          扫码
        </el-button>
        <el-button type="primary" @click="previewAndPrint()" style="margin-left: 30px">
          处方打印
        </el-button>
        <div style="position: absolute; top: 30px; right: 25px">
          总金额：{{ medicineTotalPrice ? medicineTotalPrice.toFixed(2) : "0.00" }}元
        </div>
      </div>
      <el-table
        :data="medicineInfoList"
        border
        style="width: 100%; height: 65vh; margin-top: 10px"
        :row-style="rowStyle"
        :span-method="spanMethod"
        @select="handleSelectionChange"
        ref="tableRef"
      >
        <el-table-column type="selection" width="55" align="center" fixed="left" />
        <el-table-column
          prop="prescriptionNo"
          label="处方号"
          width="120"
          align="center"
        />
        <el-table-column prop="itemName" label="项目名称" width="160" align="center" />
        <el-table-column
          prop="statusEnum_enumText"
          label="发药状态"
          width="100"
          align="center"
        >
          <template #default="scope">
            <el-tag :type="tagType(scope.row.statusEnum)">
              {{ scope.row.statusEnum_enumText }}
            </el-tag>
          </template>
        </el-table-column>
        <el-table-column prop="quantity" label="发药数量" width="100" align="center">
          <template #default="scope">
            {{ scope.row.quantity }}{{ scope.row.unitCode_dictText }}
          </template>
        </el-table-column>
        <!-- <el-table-column prop="flag" label="组合" width="60" align="center" /> -->
        <!-- <el-table-column prop="quantity" label="发药数量" width="100" align="center" /> -->
        <el-table-column prop="totalVolume" label="规格" width="100" align="center" />
        <!-- <el-table-column prop="unitCode_dictText" label="单位" width="100" align="center" /> -->
        <!-- <el-table-column
          prop="doseUnitCode_dictText"
          label="单次剂量"
          width="80"
          align="center"
          v-if="tcmFlag == '0'"
        >
          <template #default="scope">
            {{ scope.row.dose }}{{ scope.row.doseUnitCode_dictText }}
          </template>
        </el-table-column> -->
        <el-table-column
          prop="traceNo"
          label="追溯码"
          width="180"
          align="center"
          v-if="tcmFlag == '0'"
        >
          <template #default="scope">
            <el-tooltip
              :content="formatContent(scope.row.traceNo)"
              placement="top"
              popper-class="custom-tooltip"
            >
              <el-input
                :ref="'traceNoRef' + scope.$index"
                @input="handleTraceNoInput(scope.row, scope.$index)"
                v-model="scope.row.traceNo"
                placeholder="请输入追溯码"
              />
            </el-tooltip>
          </template>
        </el-table-column>
        <el-table-column prop="lotNumber" label="批次号" width="120" align="center" />
        <el-table-column
          prop="totalPrice"
          label="金额"
          width="100"
          :formatter="formatPrice"
          align="right"
          header-align="center"
        />
        <el-table-column prop="locationName" label="发药药房" width="90" align="center" />
        <el-table-column
          prop="manufacturerText"
          label="生产厂家"
          width="200"
          align="center"
        />
        <el-table-column prop="doctorName" label="开单医生" width="100" align="center" />
        <el-table-column prop="conditionName" label="诊断" width="120" align="center" />
        <!-- <el-table-column prop="dose" label="剂量" width="100" align="center" /> -->
        <el-table-column prop="rateCode" label="频次" width="100" align="center" />
        <el-table-column
          prop="methodCode_dictText"
          label="用法"
          width="100"
          align="center"
        />
        <el-table-column
          prop="dispensePerDuration"
          label="天数"
          width="80"
          align="center"
        />
        <el-table-column
          label="操作"
          align="center"
          width="160"
          fixed="right"
          class-name="small-padding fixed-width"
        >
          <template #default="scope">
            <el-button
              link
              type="primary"
              :disabled="scope.row.statusEnum != 2"
              icon="SuccessFilled"
              @click="handleBatch(scope.row)"
            >
              发药
            </el-button>
            <el-button
              link
              type="primary"
              :disabled="scope.row.statusEnum != 2"
              @click="backMedicine(scope.row)"
              icon="CircleClose"
            >
              作废
            </el-button>
          </template>
        </el-table-column>
        <!-- <el-table-column prop="performOrg_dictText" label="是否拆零" width="120">
                    <template #default="scope">
                        <el-select v-model="scope.row.performOrg_dictText" placeholder="请选择"
                            @change="handleSelectChange(scope.row)">
                            <el-option v-for="option in options" :key="option.value" :label="option.label"
                                :value="option.value"></el-option>
                        </el-select>
                    </template>
                </el-table-column> -->
        <!-- <el-table-column prop="medicationStatusEnum_enumText" label="追溯码" width="100" /> -->
        <!-- <el-table-column
          prop="unitPrice"
          label="单价"
          width="100"
          :formatter="formatPrice"
          align="right"
          header-align="center"
        /> -->
      </el-table>
    </div>
    <el-dialog title="选择作废原因" v-model="showDialog" width="30%">
      <!-- 下拉选择框 -->
      <el-select v-model="notPerformedReasonEnum" placeholder="请选择作废原因">
        <el-option
          v-for="item in backReason"
          :key="item.value"
          :label="item.label"
          :value="item.value"
        />
      </el-select>

      <!-- 弹窗底部按钮 -->
      <template #footer>
        <span class="dialog-footer">
          <el-button type="primary" @click="handleConfirm">确 定</el-button>
          <el-button @click="handleCancel">取 消</el-button>
        </span>
      </template>
    </el-dialog>
    <TraceNoDialog
      :ypName="ypName"
      :openDialog="openTraceNoDialog"
      @submit="submit"
      @cancel="openTraceNoDialog = false"
    />
  </div>
</template>

<script setup name="westernmedicine">
import { ref, computed, onMounted, onBeforeMount } from "vue";
import { ElMessage } from "element-plus";
import {
  listWesternmedicine,
  listPatient,
  updateMedicion,
  listInit,
  backMedicion,
  prepareMedicion,
  itemTraceNo,
  getReportRegisterInit,
  deviceDispense,
  deviceInvalid,
  devicePatientList,
} from "./components/api";
import { advicePrint } from "@/api/public";
import { formatDate, formatDateStr } from "@/utils/index";
import { debounce } from "lodash-es";
import TraceNoDialog from "@/components/OpenHis/TraceNoDialog/index.vue";
// 使用window.hiprint，不再从vue-plugin-hiprint导入
import templateJson from "./components/templateJson.json";
import disposalTemplate from "./components/disposalTemplate.json";

const showSearch = ref(true);
const total = ref(0);
const markers = ref([]);
const patientList = ref([]);
const medicineInfoList = ref([]);
const departmentList = ref([]);
const dateRange = ref([]);
const personInfo = ref([]);
const dispenseStatusOptions = ref([]);
const preparerDoctorOptions = ref([]);
const diagnoses = ref("");
const preparerDoctor = ref();
const backReason = ref([]);
const selectedPrescriptionNo = ref("");
const showDialog = ref(false);
const notPerformedReasonEnum = ref();
const currentRow = ref(null);
const tableRef = ref(null);
const selectedGroupIds = ref(new Set());
const selectedItems = ref(new Set());
const traceNoList = ref([]);
const traceNo = ref("");
const traceNoTemp = ref("");
const tcmFlag = ref("0");
const openTraceNo = ref(false);
const isManualSelection = ref(false);
const groups = ref({});
const openTraceNoDialog = ref(false);
const ypName = ref("");
const medicineTotalPrice = ref(0);
const projectTypeCode = ref("2");
const selectedRow = ref(null);

const { proxy } = getCurrentInstance();
const medCategoryCode = ref([
  {
    label: "西药中成药",
    value: "0",
  },
  {
    label: "中药",
    value: "1",
  },
]);

const data = reactive({
  form: {},
  queryParams: {
    pageNo: 1,
    pageSize: 10,
    condition: null,
    departmentId: null,
    statusEnum: 3,
    classEnum: 2,
  },
});
const { queryParams } = toRefs(data);

// 在组件挂载后调用 getList
onMounted(() => {
  setDefaultDateRange();
  getList();
});
function handleScan() {
  openTraceNoDialog.value = true;
}
function submit(value) {
  let list = [];
  if (value) {
    list = value.split(",");
  }
  itemTraceNo(list).then((res) => {
    if (res.code === 200) {
      if (!res.data) {
        proxy.$modal.msgWarning("未在库存中匹配到追溯码，请在发药列表中单独扫描");
        openTraceNoDialog.value = false;
        proxy.$refs["traceNoRef0"].focus();
        return;
      }
      medicineInfoList.value.forEach((item, index) => {
        if (
          res.data[item.medicineId] &&
          res.data[item.medicineId].split(",") > item.quantity
        ) {
          proxy.$modal.msgWarning("操作失败");
          return;
        }
        medicineInfoList.value[index].traceNo = res.data[item.medicineId];
      });
      openTraceNoDialog.value = false;
    }
  });
}
// 设置默认日期范围为当天
function setDefaultDateRange() {
  const today = new Date();
  const year = today.getFullYear();
  const month = String(today.getMonth() + 1).padStart(2, "0");
  const day = String(today.getDate()).padStart(2, "0");
  const formattedDate = `${year}-${month}-${day}`;
  dateRange.value = [formattedDate, formattedDate];
  console.log("222", dateRange.value);
}

function getList() {
  console.log("224555552", dateRange.value);
  queryParams.value.receptionTimeSTime = dateRange.value[0] + " 00:00:00";
  queryParams.value.receptionTimeETime = dateRange.value[1] + " 23:59:59";

  console.log("222", queryParams.value);
  if (projectTypeCode.value == 2) {
    listPatient(queryParams.value).then((response) => {
      console.log("Full response1:", response);
      patientList.value = response.data.records;
      total.value = response.data.total;
    });
  } else if (projectTypeCode.value == 3) {
    debugger;
    devicePatientList(queryParams.value).then((response) => {
      console.log("Full response1:", response);
      patientList.value = response.data.records;
      total.value = response.data.total;
    });
  } else {
    Promise.all([
      listPatient(queryParams.value),
      devicePatientList(queryParams.value),
    ]).then(([patientRes, deviceRes]) => {
      // 合并两个接口的数据
      const patientRecords = patientRes.data.records || [];
      const deviceRecords = deviceRes.data.records || [];
      const combinedRecords = [...patientRecords, ...deviceRecords];
      // 根据 encounterId 去重
      const uniqueRecords = combinedRecords.filter(
        (item, index, self) =>
          index === self.findIndex((record) => record.encounterId === item.encounterId)
      );
      patientList.value = uniqueRecords;
      // 合并总数量（如果需要精确数量，可能需要后端支持）
      total.value = uniqueRecords.length;
    });
  }
  listInit().then((response) => {
    console.log("Full response2:", response);
    departmentList.value = [
      { value: null, label: "全部" },
      ...response.data.departmentOptions,
    ];
    backReason.value = response.data.notPerformedReasonOptions;
    dispenseStatusOptions.value = response.data.dispenseStatusOptions;
    preparerDoctorOptions.value = response.data.preparerDoctorOptions;
    preparerDoctor.value = preparerDoctorOptions.value[0].value;
  });
}
//打印中西药处方
async function printPrescription() {
  const selectedRows = tableRef.value.getSelectionRows();
  if (selectedRows.length === 0) {
    proxy.$modal.msgWarning("未选择要打印的项目，请重新选择，打印失败");
    return;
  }
  let requestIds = selectedRows.map((item) => item.requestId).join(",");
  const result = [];
  advicePrint({ requestIds: requestIds, isPrescription: "1" }).then((res) => {
    const groupedRows = {};
    res.data.adviceItemList.forEach((row) => {
      const prescriptionNo = row.prescriptionNo;
      if (!groupedRows[prescriptionNo]) {
        groupedRows[prescriptionNo] = [];
      }
      row.contractName = res.data.contractName;
      groupedRows[prescriptionNo].push(row);
    });

    console.log("按处方号分组的结果:", groupedRows);

    // 如果您需要将分组后的数据转换为数组形式
    const groupedArray = Object.values(groupedRows);
    console.log("分组后的数组形式:", groupedArray);

    groupedArray.forEach((item, index) => {
      const total = item.reduce((sum, item) => {
        return sum + (item.totalPrice || 0);
      }, 0);
      result.push({
        ...res.data,
        medTotalAmount: total,
        prescriptionList: item,
      });
    });
    console.log(result, "result");
    const printElements = templateJson;
    var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements }); // 定义模板
    hiprintTemplate.print2(result, {
      title: "打印标题",
      height: 210,
      width: 148,
    }); //开始打印
    // 直接打印回调
    // 发送任务到打印机成功
    hiprintTemplate.on("printSuccess", function (e) {
      console.log("打印成功");
    });
    // 发送任务到打印机失败
    hiprintTemplate.on("printError", function (e) {
      console.log("打印失败");
    });
  });
}
// 新增打印机相关变量
const printerList = ref([]); // 打印机列表
const selectedPrinter = ref(""); // 选中的打印机
const showPrinterDialog = ref(false); // 显示打印机选择对话框
const previewData = ref(null); // 预览数据

// 抽取获取打印数据的公共函数
// 合并预览和打印功能的主函数
async function previewAndPrint() {
  try {
    const result = await getPrintData();
    if (!result) return;

    // 保存预览数据
    previewData.value = result;

    console.log("直接执行处方打印预览");

    // 构建预览HTML（保持原有格式）
    let previewHtml = "";

    // 为每个处方生成预览内容
    result.forEach((prescription, index) => {
      // 确保处方数据存在
      if (!prescription) return;

      // 从处方获取药品列表，确保是数组
      const prescriptionList = Array.isArray(prescription.prescriptionList)
        ? prescription.prescriptionList
        : [];

      previewHtml += '<div class="prescription-container">';
      previewHtml += "<h3>处方 " + (index + 1) + "</h3>";
      previewHtml += '<div class="prescription-info">';
      previewHtml +=
        "<p><strong>处方号:</strong> " + (prescription.prescriptionNo || "N/A") + "</p>";
      previewHtml +=
        "<p><strong>患者姓名:</strong> " + (prescription.patientName || "N/A") + "</p>";
      previewHtml +=
        "<p><strong>性别:</strong> " +
        (prescription.genderEnum_enumText || prescription.gender || "N/A") +
        "</p>";
      previewHtml += "<p><strong>年龄:</strong> " + (prescription.age || "N/A") + "</p>";
      previewHtml +=
        "<p><strong>开具日期:</strong> " +
        (prescription.reqTime ||
          prescription.adviceDate ||
          prescription.createTime ||
          new Date().toLocaleDateString()) +
        "</p>";
      previewHtml +=
        "<p><strong>医生:</strong> " + (prescription.doctorName || "N/A") + "</p>";

      // 添加额外的处方信息
      if (prescription.encounterNo)
        previewHtml += "<p><strong>门诊号:</strong> " + prescription.encounterNo + "</p>";
      if (prescription.departmentName)
        previewHtml +=
          "<p><strong>科室:</strong> " + prescription.departmentName + "</p>";
      if (prescription.conditionName)
        previewHtml +=
          "<p><strong>临床诊断:</strong> " + prescription.conditionName + "</p>";
      if (prescription.phone)
        previewHtml += "<p><strong>电话:</strong> " + prescription.phone + "</p>";
      previewHtml += "</div>";

      previewHtml += '<table class="prescription-table">';
      previewHtml += "<thead>";
      previewHtml += "<tr>";
      previewHtml += "<th>药品名称</th>";
      previewHtml += "<th>规格</th>";
      previewHtml += "<th>单价</th>";
      previewHtml += "<th>数量</th>";
      previewHtml += "<th>金额</th>";
      previewHtml += "<th>费用等级</th>";
      previewHtml += "<th>用法用量</th>";
      previewHtml += "</tr>";
      previewHtml += "</thead>";
      previewHtml += "<tbody>";

      // 添加药品列表
      if (prescriptionList.length > 0) {
        prescriptionList.forEach((item) => {
          previewHtml += "<tr>";
          // 使用映射后的字段名，确保与打印模板一致
          previewHtml += "<td>" + (item.medicineName || item.itemName || "N/A") + "</td>";
          previewHtml += "<td>" + (item.totalVolume || item.spec || "") + "</td>";
          previewHtml += "<td>" + (item.unitPrice || item.price || "0.00") + "</td>";
          previewHtml +=
            "<td>" +
            (item.quantity || "N/A") +
            " " +
            (item.unitCode_dictText || item.unit || "") +
            "</td>";
          previewHtml += "<td>" + (item.totalPrice || "0.00") + "</td>";
          previewHtml += "<td>" + (item.contractName || "N/A") + "</td>";

          // 组合用法用量信息
          const usageInfo = [];
          if (item.dose && item.doseUnitCode_dictText) {
            usageInfo.push(item.dose + item.doseUnitCode_dictText);
          }
          if (item.methodCode_dictText || item.usage) {
            usageInfo.push(item.methodCode_dictText || item.usage);
          }
          if (item.frequency) {
            usageInfo.push(item.frequency);
          }
          previewHtml += "<td>" + usageInfo.join("<br/>") + "</td>";
          previewHtml += "</tr>";
        });
      } else {
        previewHtml +=
          '<tr><td colspan="7" style="text-align: center;">暂无药品信息</td></tr>';
      }

      previewHtml += "</tbody>";
      previewHtml += "<tfoot>";
      previewHtml += "<tr>";
      previewHtml +=
        '<td colspan="6" style="text-align: right; font-weight: bold;">总计:</td>';
      previewHtml +=
        '<td style="font-weight: bold;">' +
        (prescription.medTotalAmount || "0.00") +
        "</td>";
      previewHtml += "</tr>";
      previewHtml += "</tfoot>";
      previewHtml += "</table>";

      previewHtml += '<div class="prescription-footer">';
      previewHtml +=
        "<p><strong>医疗机构:</strong> " + (prescription.contractName || "N/A") + "</p>";
      previewHtml += "</div>";
      previewHtml += "</div>";
      previewHtml += '<hr class="prescription-separator">';
    }); // ✅ 正确的 forEach 结束位置

    // ✅ hiprint 打印逻辑移到这里（forEach 循环之外）
    console.log(result, "result");
    const printElements = templateJson;
    var hiprintTemplate = new hiprint.PrintTemplate({ template: printElements });
    hiprintTemplate.print2(result, {
      height: 210,
      width: 148,
    });

    // 打印回调
    hiprintTemplate.on("printSuccess", function (e) {
      console.log("打印成功");
    });

    hiprintTemplate.on("printError", function (e) {
      console.log("打印失败");
    });

    // ✅ 创建临时打印容器（不可见）
    const printContainer = document.createElement("div");
    printContainer.style.position = "fixed";
    printContainer.style.left = "-9999px";
    printContainer.style.top = "-9999px";
    printContainer.style.width = "800px";

    // 添加打印样式
    const style = document.createElement("style");
    style.textContent = `
      .print-content {
        font-family: Arial, sans-serif;
        font-size: 12px;
      }
      .patient-info-table {
        width: 100%;
        border-collapse: collapse;
        margin-bottom: 15px;
      }
      .patient-info-table td {
        padding: 4px 8px;
        border: 1px solid #ddd;
        font-size: 12px;
      }
      .patient-info-table .label {
        font-weight: bold;
        background-color: #f9f9f9;
      }
      .medicine-table {
        width: 100%;
        border-collapse: collapse;
      }
      .medicine-table th,
      .medicine-table td {
        border: 1px solid #000;
        padding: 8px;
        text-align: left;
      }
      .medicine-table th {
        background: #f2f2f2;
        font-weight: bold;
      }
      .page-break {
        page-break-after: always;
      }
      @media print {
        body > *:not(#print-container) {
          display: none !important;
        }
        #print-container {
          position: static !important;
          width: 100% !important;
        }
      }
    `;
    document.head.appendChild(style);

    printContainer.id = "print-container";

    // 构建包含患者信息和药品信息的打印内容
    let printHtml = '<div class="print-content">';

    result.forEach((prescription, index) => {
      if (!prescription) return;
      const prescriptionList = Array.isArray(prescription.prescriptionList)
        ? prescription.prescriptionList
        : [];

      printHtml += '<div class="prescription-medicines">';
      printHtml += "<h4>处方 " + (index + 1) + "</h4>";

      // 添加患者信息表格
      printHtml += '<table class="patient-info-table">';
      printHtml += "<tr>";
      printHtml += '<td class="label">姓名:</td>';
      printHtml += "<td>" + (prescription.patientName || "-") + "</td>";
      printHtml += '<td class="label">性别:</td>';
      printHtml +=
        "<td>" +
        (prescription.genderEnum_enumText || prescription.gender || "-") +
        "</td>";
      printHtml += '<td class="label">年龄:</td>';
      printHtml += "<td>" + (prescription.age || "-") + "</td>";
      printHtml += '<td class="label">处方号:</td>';
      printHtml += "<td>" + (prescription.prescriptionNo || "-") + "</td>";
      printHtml += "</tr>";
      printHtml += "<tr>";
      printHtml += '<td class="label">门诊号:</td>';
      printHtml += "<td>" + (prescription.encounterNo || "-") + "</td>";
      printHtml += '<td class="label">开具日期:</td>';
      printHtml +=
        "<td>" +
        (prescription.reqTime ||
          prescription.adviceDate ||
          prescription.createTime ||
          "-") +
        "</td>";
      printHtml += '<td class="label">医生:</td>';
      printHtml += "<td>" + (prescription.doctorName || "-") + "</td>";
      printHtml += '<td class="label">科室:</td>';
      printHtml += "<td>" + (prescription.departmentName || "-") + "</td>";
      printHtml += "</tr>";
      printHtml += "<tr>";
      printHtml += '<td class="label">临床诊断:</td>';
      printHtml += '<td colspan="3">' + (prescription.conditionName || "-") + "</td>";
      printHtml += '<td class="label">电话:</td>';
      printHtml +=
        '<td colspan="3">' +
        (prescription.phone || prescription.mobile || prescription.patientPhone || "-") +
        "</td>";
      printHtml += "</tr>";
      printHtml += "</table>";

      // 添加药品信息表格
      if (prescriptionList.length > 0) {
        printHtml += '<table class="medicine-table">';
        printHtml += "<thead>";
        printHtml += "<tr>";
        printHtml += "<th>药品名称</th>";
        printHtml += "<th>规格</th>";
        printHtml += "<th>单价</th>";
        printHtml += "<th>数量</th>";
        printHtml += "<th>金额</th>";
        printHtml += "<th>用法用量</th>";
        printHtml += "</tr>";
        printHtml += "</thead>";
        printHtml += "<tbody>";

        prescriptionList.forEach((item) => {
          printHtml += "<tr>";
          printHtml += "<td>" + (item.medicineName || item.itemName || "N/A") + "</td>";
          printHtml += "<td>" + (item.totalVolume || item.spec || "") + "</td>";
          printHtml += "<td>" + (item.unitPrice || item.price || "0.00") + "</td>";
          printHtml +=
            "<td>" +
            (item.quantity || "N/A") +
            " " +
            (item.unitCode_dictText || item.unit || "") +
            "</td>";
          printHtml += "<td>" + (item.totalPrice || "0.00") + "</td>";

          const usageInfo = [];
          if (item.dose && item.doseUnitCode_dictText) {
            usageInfo.push(item.dose + item.doseUnitCode_dictText);
          }
          if (item.methodCode_dictText || item.usage) {
            usageInfo.push(item.methodCode_dictText || item.usage);
          }
          if (item.frequency) {
            usageInfo.push(item.frequency);
          }
          printHtml += "<td>" + usageInfo.join("<br/>") + "</td>";
          printHtml += "</tr>";
        });

        printHtml += "</tbody>";
        printHtml += "<tfoot>";
        printHtml += "<tr>";
        printHtml +=
          '<td colspan="4" style="text-align: right; font-weight: bold;">总计:</td>';
        printHtml +=
          '<td colspan="2" style="font-weight: bold;">' +
          (prescription.medTotalAmount || "0.00") +
          "</td>";
        printHtml += "</tr>";
        printHtml += "</tfoot>";
        printHtml += "</table>";
      } else {
        printHtml += "<p>暂无药品信息</p>";
      }

      // 分页符（最后一个处方除外）
      if (index < result.length - 1) {
        printHtml += '<div class="page-break"></div>';
      }

      printHtml += "</div>";
    });

    printHtml += "</div>";
    printContainer.innerHTML = printHtml;

    // 添加到文档
    document.body.appendChild(printContainer);

    // 触发打印预览
    window.print();

    // 打印完成后移除临时容器和样式
    const cleanup = () => {
      if (printContainer && document.body.contains(printContainer)) {
        document.body.removeChild(printContainer);
      }
      if (style && document.head.contains(style)) {
        document.head.removeChild(style);
      }
      window.removeEventListener("afterprint", cleanup);
    };

    // 监听打印完成事件
    window.addEventListener("afterprint", cleanup);

    // 添加超时清理
    setTimeout(() => {
      cleanup();
    }, 30000);

    proxy.$modal.msgSuccess("打印预览已启动");

    // 同时处理后台打印逻辑
    setTimeout(() => {
      handleBackgroundPrint(result);
    }, 500);
  } catch (error) {
    console.error("预览和打印过程出错:", error);
    proxy.$modal.msgError("操作失败: " + error.message);
  }
}

// 后台打印逻辑，复用原有的打印功能
function handleBackgroundPrint(result) {
  try {
    // 获取打印机列表
    const printers = getPrinterList();
    console.log("获取到的打印机列表:", printers);

    if (printers.length === 0) {
      console.log("未检测到可用打印机，仅提供预览功能");
      return;
    }

    // 设置打印机列表
    printerList.value = printers;

    // 检查是否有缓存的打印机
    const cachedPrinter = getCachedPrinter();
    console.log("缓存的打印机:", cachedPrinter);

    if (cachedPrinter && printers.some((printer) => printer.name === cachedPrinter)) {
      // 如果有缓存的打印机，直接使用
      selectedPrinter.value = cachedPrinter;
      confirmPrinter(result);
    } else {
      // 否则不自动显示打印机选择对话框，让用户在预览页面手动选择打印
      console.log("无缓存打印机，用户可在预览页面手动打印");
    }
  } catch (error) {
    console.error("后台打印过程出错:", error);
    // 不显示错误提示，以免干扰用户在预览页面的操作
  }
}

// 使用保存的打印数据执行打印
function confirmPrinter(printData) {
  console.log("开始打印，传入数据:", printData);
  console.log("window临时数据:", window.currentPrintData);

  // 如果没有传入数据，尝试从window临时变量获取
  let data = printData || window.currentPrintData;

  if (!selectedPrinter.value) {
    proxy.$modal.msgWarning("请选择打印机");
    return;
  }

  if (!data || !Array.isArray(data) || data.length === 0) {
    proxy.$modal.msgError("没有找到有效的打印数据");
    showPrinterDialog.value = false;
    return;
  }

  if (!templateJson) {
    proxy.$modal.msgError("打印模板加载失败");
    showPrinterDialog.value = false;
    return;
  }

  // 确保数据字段映射正确，特别是规格字段
  data = data.map((prescription) => {
    const mappedPrescription = { ...prescription };
    // 确保药品列表字段映射正确
    if (Array.isArray(prescription.prescriptionList)) {
      mappedPrescription.prescriptionList = prescription.prescriptionList.map((med) => ({
        ...med,
        // 确保规格字段正确映射，优先使用totalVolume
        totalVolume: med.totalVolume || med.spec || "",
        // 确保其他关键字段存在
        medicineName: med.medicineName || med.itemName || "",
        unitPrice: med.unitPrice || med.price || 0,
        unitCode_dictText: med.unitCode_dictText || med.unit || "",
        methodCode_dictText: med.methodCode_dictText || med.usage || "",
      }));
    }
    return mappedPrescription;
  });
  console.log("处理后的打印数据:", data);

  console.log("准备执行打印，打印机:", selectedPrinter.value);

  // 使用his.js中的savePrinterToCache保存选择
  savePrinterToCache(selectedPrinter.value);

  try {
    // 检查hiprint是否可用
    if (!window.hiprint) {
      throw new Error("打印插件未正确加载");
    }

    // 直接使用hiprint执行打印，确保功能正常
    const hiprintTemplate = new window.hiprint.PrintTemplate({
      template: templateJson,
    });
    const printOptions = {
      title: "处方打印",
      height: 210,
      width: 148,
      printer: selectedPrinter.value,
    };

    // 打印成功回调
    hiprintTemplate.on("printSuccess", function (e) {
      console.log("打印成功:", e);
      proxy.$modal.msgSuccess("打印成功");
      showPrinterDialog.value = false;
      // 清除临时数据
      window.currentPrintData = null;
    });

    // 打印失败回调
    hiprintTemplate.on("printError", function (e) {
      console.error("打印失败:", e);
      proxy.$modal.msgError("打印失败，请检查打印机连接");
      showPrinterDialog.value = false;
      window.currentPrintData = null;
    });

    // 执行打印
    console.log("调用hiprint.print2方法");
    hiprintTemplate.print2(data, printOptions);
  } catch (error) {
    console.error("打印执行出错:", error);
    proxy.$modal.msgError("打印执行失败: " + error.message);
    showPrinterDialog.value = false;
    window.currentPrintData = null;
  }
}

// 取消打印机选择
function cancelPrinter() {
  showPrinterDialog.value = false;
  window.currentPrintData = null;
}
/** 重置按钮操作 */
function resetQuery() {
  setDefaultDateRange();
  medicineInfoList.value = [];
  personInfo.value = [];
  proxy.resetForm("queryRef");
  getList();
}
/** 搜索按钮操作 */
function handleQuery() {
  if (dateRange.value) {
    queryParams.value.receptionTimeSTime = dateRange.value[0] + " 00:00:00";
    queryParams.value.receptionTimeETime = dateRange.value[1] + " 23:59:59";
  } else {
    queryParams.value.receptionTimeSTime = null;
    queryParams.value.receptionTimeETime = null;
  }
  queryParams.value.pageNo = 1;
  getList();
}

function countGroupRows(data) {
  const groupCounts = new Map();
  data.forEach((item, index) => {
    if (!groupCounts.has(item.prescriptionNo)) {
      groupCounts.set(item.prescriptionNo, { count: 0, indices: [] });
    }
    const groupInfo = groupCounts.get(item.prescriptionNo);
    groupInfo.count++;
    groupInfo.indices.push(index);
  });
  return groupCounts;
}
function getRowMarkers(groupCounts, data) {
  const markers = new Array(data.length).fill("");

  // ✅ 兼容 Map 和普通对象
  const entries =
    groupCounts instanceof Map
      ? Array.from(groupCounts.entries())
      : Object.entries(groupCounts);

  entries.forEach(([prescriptionNo, groupInfo]) => {
    const { count, indices } = groupInfo;

    if (count === 1) {
      // 如果只有一行，不显示标记
      return;
    }

    if (count === 2) {
      // 如果有两行，分别显示左右括号
      markers[indices[0]] = "┏";
      markers[indices[1]] = "┗";
    } else {
      // 如果有两行以上，第一条显示左括号，中间用竖线，最后一条显示右括号
      markers[indices[0]] = "┏";
      for (let i = 1; i < indices.length - 1; i++) {
        markers[indices[i]] = "┃";
      }
      markers[indices[indices.length - 1]] = "┗";
    }
  });

  return markers;
}

function spanMethod({ row, column, rowIndex, columnIndex }) {
  // 定义需要合并的列范围（前6列，包括selection列）
  const columnsToMerge = [1, 16]; // 假设selection列是第0列，其他列依次是1, 2, 3, 4, 5
  console.log(row);
  // 检查当前列是否在需要合并的列范围内
  if (row.prescriptionNo) {
    if (columnsToMerge.includes(columnIndex)) {
      const prescriptionNo = row.prescriptionNo;

      // 查找当前处方号在列表中第一次出现的索引
      const firstRowIndex = medicineInfoList.value.findIndex(
        (item) => item.prescriptionNo === prescriptionNo
      );

      // 如果当前行是该处方号的首行，则合并count行
      if (rowIndex === firstRowIndex) {
        // 计算该处方号的总行数
        const count = medicineInfoList.value.filter(
          (item) => item.prescriptionNo === prescriptionNo
        ).length;
        return [count, 1]; // 合并count行，1列
      } else {
        return [0, 0]; // 其他行不显示
      }
    }
  }

  // 其他列不进行合并
  return [1, 1];
}

function handleSelectionChange(selectedRows, currentRow) {
  medicineInfoList.value
    .filter((item) => {
      return item.dispenseId == currentRow.dispenseId;
    })
    .forEach((item, index) => {
      tableRef.value.toggleRowSelection(item, selectedRows.includes(currentRow));
    });
}

function formatPrice(row, column, cellValue) {
  if (cellValue === null || cellValue === undefined) {
    return "0.00 元"; // 如果值为空，返回0.00
  }
  return cellValue.toFixed(2) + " 元"; // 保留两位小数
}

function tagType(statusEnum) {
  if (statusEnum == 2 || statusEnum == 2) {
    return "default";
  } else if (statusEnum == 4) {
    return "success";
  } else if (statusEnum == 5 || statusEnum == 6 || statusEnum == 7) {
    return "warning";
  } else if (statusEnum == 12) {
    return "info";
  }
}

function handleCurrentChange(row) {
  currentRow.value = row; // 更新当前选中行的数据
  console.log("当前选中行的数据：", currentRow.value);
  currentRow.value.statusEnum = undefined;
  currentRow.value.dispenseStatus = queryParams.value.statusEnum;
  getMedicineList(row.encounterId);
}

function getMedicineList(encounterId) {
  // 根据projectTypeCode的值决定调用哪些接口
  if (projectTypeCode.value == 1) {
    // 同时调用两个接口并将数据合并显示
    Promise.all([
      listWesternmedicine({
        pageNo: 1,
        pageSize: 100,
        encounterId: encounterId,
        statusEnum: queryParams.value.statusEnum,
        tcmFlag: tcmFlag.value,
      }),
      getReportRegisterInit({
        pageNo: 1,
        pageSize: 100,
        encounterId: encounterId,
        statusEnum: queryParams.value.statusEnum,
        tcmFlag: tcmFlag.value,
      }),
    ])
      .then(([westernRes, reportRes]) => {
        // 合并两个接口的数据
        let westernData = Array.isArray(westernRes.data.records)
          ? westernRes.data.records
          : [westernRes.data.records];

        let reportData = Array.isArray(reportRes.data.records)
          ? reportRes.data.records
          : [reportRes.data.records];

        // 合并数据
        medicineInfoList.value = [...westernData, ...reportData];

        // 处理合并后的数据
        processMedicineListData();
      })
      .catch((error) => {
        console.error("获取数据失败:", error);
        proxy.$modal.msgError("获取数据失败");
      });
  } else if (projectTypeCode.value == 2) {
    // 只调用listWesternmedicine接口
    listWesternmedicine({
      pageNo: 1,
      pageSize: 100,
      encounterId: encounterId,
      statusEnum: queryParams.value.statusEnum,
      tcmFlag: tcmFlag.value,
    }).then((response) => {
      console.log("121212", response);
      // personInfo.value = response.data.prescriptionPatientInfoDto;
      medicineInfoList.value = Array.isArray(response.data.records)
        ? response.data.records
        : [response.data.records];

      // 处理数据
      processMedicineListData();
    });
  } else if (projectTypeCode.value == 3) {
    // 只调用getReportRegisterInit接口
    getReportRegisterInit({
      encounterId: encounterId,
      statusEnum: queryParams.value.statusEnum,
      tcmFlag: tcmFlag.value,
    }).then((response) => {
      medicineInfoList.value = Array.isArray(response.data.records)
        ? response.data.records
        : [response.data.records];

      // 处理数据
      processMedicineListData();
    });
  }
}

// 提取公共的数据处理逻辑
function processMedicineListData() {
  // 创建分组映射表
  const groupMap = {};
  medicineTotalPrice.value = 0;
  medicineInfoList.value.forEach((item) => {
    const groupId = item.groupId; // 确保属性名一致
    medicineTotalPrice.value = medicineTotalPrice.value + item.totalPrice;
    if (groupId != null) {
      // 过滤掉null/undefined
      groupMap[groupId] = groupMap[groupId] || [];
      groupMap[groupId].push(item);
    }
  });

  // 处理每个分组
  Object.values(groupMap).forEach((group) => {
    const count = group.length;
    if (count === 2) {
      group[0].flag = "┓";
      group[1].flag = "┛";
    } else if (count > 2) {
      group[0].flag = "┓";
      group.slice(1, -1).forEach((item) => (item.flag = "┃")); // 中间元素
      group[group.length - 1].flag = "┛";
    }
  });

  // 处理没有分组的项
  medicineInfoList.value.forEach((item) => {
    if (item.groupId == null) {
      // 确保属性名一致
      item.flag = "";
    } else if (!item.flag) {
      // 确保所有项都有flag属性
      item.flag = "";
    }
  });

  diagnoses.value = medicineInfoList.value.map((item) => item.诊断 || "无").join(", ");
}

function submitMedicine(saveList) {
  console.log(saveList);
  if (projectTypeCode.value == 1) {
    // 根据itemTable分类数据
    const deviceList = saveList.filter(
      (item) => item.itemTable === "adm_device_definition"
    );
    const medicineList = saveList.filter(
      (item) => item.itemTable === "med_medication_definition"
    );

    // 并行处理两种类型的发药
    const promises = [];

    // 如果有耗材数据，调用deviceDispense接口
    if (deviceList.length > 0) {
      promises.push(
        deviceDispense(deviceList).then((res) => {
          if (res.code != 200) {
            throw new Error("耗材发药失败");
          }
          return res;
        })
      );
    }

    // 如果有药品数据，调用prepareMedicion接口
    if (medicineList.length > 0) {
      promises.push(
        prepareMedicion(medicineList).then((res) => {
          if (res.code != 200) {
            throw new Error("药品发药失败");
          }
          return res;
        })
      );
    }

    // 等待所有发药接口完成
    Promise.all(promises)
      .then(() => {
        // 所有发药都成功后，调用更新接口
        if (medicineList.length > 0) {
          return updateMedicion(medicineList);
        }
      })
      .then((response) => {
        proxy.$modal.msgSuccess("发药成功");
        // 重新获取数据
        getMedicineList(currentRow.value.encounterId);
      })
      .catch((error) => {
        console.error("发药失败:", error);
        proxy.$modal.msgError("发药失败: " + error.message);
      });
  } else if (projectTypeCode.value == 2) {
    prepareMedicion(saveList).then((res) => {
      if (res.code == 200) {
        updateMedicion(saveList).then((response) => {
          proxy.$modal.msgSuccess("发药成功");
          getMedicineList(currentRow.value.encounterId);
        });
      }
    });
  } else {
    deviceDispense(saveList).then((res) => {
      if (res.code == 200) {
        proxy.$modal.msgSuccess("发药成功");
        getMedicineList(currentRow.value.encounterId);
      }
    });
  }
}
const throttledGetList = debounce(handelTraceNo, 500);
const traceNoInput = debounce(handleTraceNoInput, 500);

function formatContent(value) {
  let content = "";
  if (value && value.endsWith(",")) {
    value = value.slice(0, -1);
  }
  if (value) {
    value.split(",").forEach((item, index) => {
      content += `[${index + 1}] ${item}\n`;
    });
    return content;
  }
}
function handleTraceNoInput(row, index) {
  if (row.traceNo) {
    // 先移除所有逗号
    let cleanStr = row.traceNo.replace(/,/g, "");
    // 每20个字符插入一个逗号
    let formattedStr = cleanStr.replace(/(.{20})/g, "$1,");
    // 如果最后一个字符是逗号则移除
    formattedStr = formattedStr.replace(/,$/, "");
    row.traceNo = formattedStr;

    // 保持输入焦点
    proxy.$refs["traceNoRef" + index].focus();
  }
}

let inputValue = "";
function handelTraceNo(value) {
  traceNoList.value.push(value);
  traceNo.value =
    traceNo.value + "[" + traceNoList.value.length + "]" + "  " + value + "\n";
  traceNoTemp.value = "";
  // let saveValue = value.substring(inputValue.length + 5, value.length);
  // inputValue = value;
  // console.log(value);
  // console.log(saveValue);
  // traceNoList.value.push(saveValue);
  // traceNo.value = value + '[' + (traceNoList.value.length + 1) + ']' + '  ';
}

function handleBatch(row) {
  let saveList = [];
  if (row) {
    saveList = medicineInfoList.value
      .filter((item) => {
        return item.dispenseId === row.dispenseId;
      })
      .map((item) => {
        return {
          requestId: item.requestId,
          dispenseId: item.dispenseId,
          traceNo: item.traceNo,
          prescriptionNo: item.prescriptionNo,
          preparerId: preparerDoctor.value,
          itemTable: item.itemTable,
        };
      });
  } else {
    if (tableRef.value.getSelectionRows().length > 0) {
      saveList = tableRef.value.getSelectionRows().map((item) => {
        return {
          requestId: item.requestId,
          dispenseId: item.dispenseId,
          traceNo: item.traceNo,
          prescriptionNo: item.prescriptionNo,
          preparerId: preparerDoctor.value,
          itemTable: item.itemTable,
        };
      });
    }
  }
  console.log(saveList);

  submitMedicine(saveList);
}

function backMedicine(row) {
  showDialog.value = true;
  selectedPrescriptionNo.value = row.dispenseId;
  selectedRow.value = row;
  console.log("作废原因:", selectedPrescriptionNo.value, row.prescriptionNo);
}

function handleCancel() {
  showDialog.value = false;
  notPerformedReasonEnum.value = ""; // 清空选择
}
// ✅ 更完善的版本
async function handleConfirm() {
  // 统一验证
  const validationResult = validate();
  if (!validationResult.success) {
    ElMessage.error(validationResult.message);
    return;
  }

  const loading = ElLoading.service({ text: "作废中..." });

  try {
    const params = buildParams();
    await performInvalidOperation(params);
    await handleSuccess();
  } catch (error) {
    handleError(error);
  } finally {
    loading.close();
  }
}

// 分离验证逻辑
function validate() {
  if (!notPerformedReasonEnum.value) {
    return { success: false, message: "请选择作废原因" };
  }
  if (!selectedRow.value) {
    return { success: false, message: "未选择数据" };
  }
  return { success: true };
}
</script>

<style lang="scss" scoped>
.app-container {
  padding: 20px;
  display: flex;
}

.left {
  width: 25%;

  .form {
    width: 100%;
    display: flex;
    justify-content: space-between;
  }
}

.right {
  margin-left: 2%;
  width: 74%;
}

:deep(.el-table tbody tr:hover > td) {
  background-color: inherit !important;
}

.el-form--inline .el-form-item {
  margin-right: 0px;
}
::v-deep.el-textarea .el-textarea__inner {
  resize: none !important;
}
</style>
