Browse Source

Merge branch 'master' into 淮海科技

lighter 4 weeks ago
parent
commit
d23f1a99ad

+ 38 - 0
src/api/crb-manage/crb-base-info.js

@@ -0,0 +1,38 @@
+import request from '../../utils/request'
+
+
+// 根据条件查询用户信息
+export function selectBaseUser(data) {
+    return request({
+        url: '/crbBase/selectBaseUser',
+        method: 'post',
+        data
+    })
+}
+
+// 根据条件查询科室信息
+export function selectBaseDept(data) {
+    return request({
+        url: '/crbBase/selectBaseDept',
+        method: 'post',
+        data
+    })
+}
+
+// 上传用户信息
+export function uploadBaseUserData(data) {
+    return request({
+        url: '/crbBase/uploadBaseUser',
+        method: 'post',
+        data
+    })
+}
+
+// 上传科室信息
+export function uploadBaseDeptData(data) {
+    return request({
+        url: '/crbBase/uploadBaseDept',
+        method: 'post',
+        data
+    })
+}

+ 24 - 0
src/api/dictionary/jc-part-maintain.js

@@ -0,0 +1,24 @@
+import request from '../../utils/request'
+
+export function getAllJcPart() {
+  return request({
+    url: '/jcPartMaintain/getAllJcPart',
+    method: 'get',
+  })
+}
+
+export function insertNewPart(data) {
+  return request({
+    url: '/jcPartMaintain/insertNewPart',
+    method: 'post',
+    data
+  })
+}
+
+export function updatePart(data) {
+  return request({
+    url: '/jcPartMaintain/updatePart',
+    method: 'post',
+    data
+  })
+}

+ 2 - 0
src/api/settings/schedulingClassApi.ts

@@ -9,6 +9,8 @@ export type DataValue = {
   falseCode: string;
   code: string;
   falseCodeList: { code: string; name: string }[];
+  // 换班人员的code
+  changeClass: string;
 };
 
 export function getCodes() {

+ 16 - 3
src/api/yp-dict/yp-dict-info.js

@@ -37,9 +37,9 @@ export function updateYpStopOrUsed(code, serial, delFlag) {
 }
 
 /**
- * 根据code(药品编码)查询药品账页信息
- * @param {string} code
- * @param serial serial
+ * 根据code(药品编码)和serial(包装规格)查询药品账页信息
+ * @param {string} code 药品编码
+ * @param {string} serial 包装规格
  * @returns
  */
 export function selectYpDictByCode(code, serial) {
@@ -50,6 +50,19 @@ export function selectYpDictByCode(code, serial) {
     })
 }
 
+/**
+ * 根据code(药品编码)查询药品账页信息
+ * @param {string} code 药品编码
+ * @returns
+ */
+export function selectYpDictByCodeNoSerial(code) {
+    return request({
+        url: '/ypDict/selectYpDictByCodeNoSerial',
+        method: 'get',
+        params: { code },
+    })
+}
+
 /**
  * 保存药品账页信息
  * @param data

+ 188 - 0
src/components/xmlr/components/PrintPrescriptionSign.vue

@@ -0,0 +1,188 @@
+<script setup lang="ts">
+import XcElOption from "@/components/xiao-chan/xc-el-option/XcElOption.vue";
+import { useVuePrint } from "@/utils/cy-use/useVuePrint";
+import env from "@/utils/setting";
+import { UseDialogType } from "@/components/cy/CyDialog/index";
+import dayjs from "dayjs";
+import XEUtils from "xe-utils";
+import SystemStaffSelect from "@/components/system/staff-select/SystemStaffSelect.vue";
+
+const props = defineProps<{
+  data: any[];
+  frequency: any[];
+  patientInfo: any;
+}>();
+
+const now = dayjs().format("YYYY年MM月DD日");
+const doctor = reactive({
+  code: "",
+  name: "",
+});
+
+const [TemplateDefault, print] = useVuePrint({
+  hidden: false,
+  extraPageCss: `table {
+  border-collapse: collapse;
+  height: 210mm;
+  width: 148mm;
+  table-layout: fixed;
+}
+
+th {
+  line-height: 5mm;
+}
+
+tr > td {
+  border: none;
+  height: auto;
+  vertical-align: top;
+}
+
+th {
+  text-align: center;
+}
+
+.doctor_info {
+  text-align: right;
+  width: 5mm;
+}`,
+});
+const colspan = 6;
+
+defineExpose<UseDialogType.Expose>({
+  confirm() {
+    return print();
+  },
+});
+</script>
+
+<template>
+  <div class="layout_container">
+    <TemplateDefault>
+      <table>
+        <thead>
+          <tr>
+            <th scope="col" :colspan="colspan">
+              <span style="font-size: 12pt">{{ env.VITE_HOSPITAL_NAME }}</span>
+            </th>
+          </tr>
+          <tr>
+            <th scope="col" :colspan="colspan">处方筏</th>
+          </tr>
+          <tr>
+            <th style="border-bottom: 1px solid #000" colspan="2">
+              科室:{{ patientInfo.wardName }}
+            </th>
+            <th style="border-bottom: 1px solid #000" colspan="2">
+              住院号:{{ patientInfo.inpatientNo }}
+            </th>
+            <th style="border-bottom: 1px solid #000" colspan="2">
+              {{ now }}
+            </th>
+          </tr>
+          <tr>
+            <th style="border-bottom: 1px solid #000" colspan="2">
+              姓名:{{ patientInfo.name }}
+            </th>
+            <th style="border-bottom: 1px solid #000" colspan="2">
+              年龄:{{ patientInfo.age }}
+            </th>
+            <th style="border-bottom: 1px solid #000" colspan="2">
+              性别:{{ patientInfo.sexName }}
+            </th>
+          </tr>
+          <tr>
+            <th
+              style="
+                text-align: left;
+                border-bottom: 1px solid #000;
+                padding-left: 12pt;
+              "
+              :colspan="colspan"
+            >
+              临床诊断:{{ patientInfo.emrDiagStr }}
+            </th>
+          </tr>
+        </thead>
+        <tbody>
+          <tr>
+            <td colspan="6">
+              <div style="height: 12pt"></div>
+              <div
+                style="display: flex; font-size: 13pt; padding-left: 15pt"
+                v-for="item in props.data"
+              >
+                <div>
+                  {{ item.chargeName }}
+                </div>
+                <div style="width: 2mm"></div>
+                <div>
+                  {{ item.frequencyName }}
+                </div>
+              </div>
+            </td>
+          </tr>
+        </tbody>
+        <tfoot style="border-top: 1px solid #000">
+          <tr>
+            <td class="doctor_info">医师:</td>
+            <td style="border-bottom: 1px solid #000">
+              <img
+                :src="`/doctorSignatureImage/${doctor.code}.png`"
+                style="height: 16pt; width: 47pt"
+                :alt="doctor.name"
+              />
+            </td>
+            <td class="doctor_info">审核:</td>
+            <td style="border-bottom: 1px solid #000"></td>
+
+            <td class="doctor_info">金额:</td>
+            <td style="border-bottom: 1px solid #000"></td>
+          </tr>
+          <tr>
+            <td class="doctor_info">调配:</td>
+            <td style="border-bottom: 1px solid #000"></td>
+
+            <td class="doctor_info">核对:</td>
+            <td style="border-bottom: 1px solid #000"></td>
+
+            <td class="doctor_info">发药:</td>
+            <td style="border-bottom: 1px solid #000"></td>
+          </tr>
+        </tfoot>
+      </table>
+    </TemplateDefault>
+    <header>
+      医师:
+      <SystemStaffSelect v-model="doctor" value="code" label="name" />
+    </header>
+    <div class="layout_main">
+      <el-table :data="props.data" height="100%">
+        <el-table-column prop="chargeDate" label="录入日期" width="80px" />
+        <el-table-column prop="chargeCodeMx" label="项目编码" />
+        <el-table-column prop="chargeName" label="项目名称" />
+        <el-table-column prop="genTime" label="执行时间" width="80px" />
+        <el-table-column prop="execDept" label="执行科室" />
+        <el-table-column label="执行频率">
+          <template #default="{ row }">
+            <el-select
+              v-model="row.frequency"
+              filterable
+              @change="
+                value => {
+                  row.frequencyName = XEUtils.find(props.frequency, item => {
+                    return item.code === value;
+                  }).name;
+                }
+              "
+            >
+              <xc-el-option :data="props.frequency" />
+            </el-select>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+  </div>
+</template>
+
+<style lang="scss"></style>

+ 3 - 0
src/components/xmlr/components/TableFee.vue

@@ -140,6 +140,9 @@ function rcvrcalcost() {
           <el-button type="danger" icon="Delete" @click="refund"
             >退费
           </el-button>
+          <el-button @click="mutation.handlePrintPrescriptionSign"
+            >打印处方签</el-button
+          >
           <GenerateMedicineReturnOrder v-if="!medicalTechnology" />
         </el-form-item>
       </el-form>

+ 36 - 4
src/components/xmlr/index.ts

@@ -5,11 +5,13 @@ import { BizException, ExceptionEnum } from "@/utils/BizException";
 import useCompRef from "@/utils/useCompRef";
 import { ElTable } from "element-plus";
 import { refund } from "@/api/hospitalization-costs/hospitalization-costs-api";
-import { isDev, needRule, ruleName } from "@/utils/public";
+import { isDev } from "@/utils/public";
 import cyRefList from "@/utils/cyRefList";
-import { UseDialogType } from "@/components/cy/CyDialog/index";
+import { useDialog, UseDialogType } from "@/components/cy/CyDialog/index";
 import { useUserStore } from "@/pinia/user-store";
 import { getServerDateApi } from "@/api/public-api";
+import PrintPrescriptionSign from "@/components/xmlr/components/PrintPrescriptionSign.vue";
+import { getFrequency } from "@/api/zhu-yuan-yi-sheng/yi-zhu-lu-ru";
 
 type PatInfo = {
   name?: string;
@@ -43,7 +45,7 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
 
   const store = reactive({
     // 住院号
-    searchPatNo: isDev ? "0420189" : "",
+    searchPatNo: isDev ? "0434450" : "",
     // 患者信息
     patInfo: {} as PatInfo,
     searchFeeParams: {
@@ -57,7 +59,7 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
       refundSymbol: 3,
       execDept: props.medicalTechnology ? (isDev ? "" : userInfo.deptCode) : "",
     },
-    tabsVal: isDev ? "项目录入" : "费用",
+    tabsVal: isDev ? "费用" : "费用",
 
     feeTotal: 0,
     feeData: [],
@@ -155,6 +157,36 @@ export const useXmlr = (props: XmlrProps, emits: UseDialogType.Emits) => {
       tmp[9] = `${store.feeTotal} 元`;
       return tmp;
     },
+    async handlePrintPrescriptionSign() {
+      const data = feeTableRef.value.getSelectionRows();
+      if (data.length === 0) {
+        return;
+      }
+      const filter = XEUtils.filter(data, item => {
+        return item.orderNo === 6 && item.serial !== "00";
+      });
+      if (filter.length === 0) {
+        return;
+      }
+      console.log(data);
+      const frequency = await mutation.getExecutionFrequency();
+
+      useDialog(PrintPrescriptionSign, {
+        dialogProps: {
+          title: "打印处方签",
+          fullscreen: true,
+        },
+        confirmText: "打印",
+        params: {
+          data: XEUtils.cloneDeep(filter),
+          frequency,
+          patientInfo: store.patInfo,
+        },
+      });
+    },
+    getExecutionFrequency: XEUtils.once(async () => {
+      return await getFrequency();
+    }),
   };
 
   onActivated(() => {

+ 5 - 10
src/components/zhu-yuan-yi-sheng/jian-cha-shen-qing/aside/CheckApplicationHistory.vue

@@ -23,11 +23,6 @@
       prop="receiveFlagName"
       width="80"
     ></el-table-column>
-    <el-table-column
-      label="部位"
-      prop="inspectStuffName"
-      width="80"
-    ></el-table-column>
     <el-table-column label="时间" prop="startTime"></el-table-column>
     <el-table-column label="操作" width="120">
       <template #default="{ row, $index }">
@@ -40,7 +35,7 @@
           <div class="but_item">
             <el-button @click.stop="detailsClick(row)"> 详情</el-button>
           </div>
-          <div v-if="props.data.delFlag !== '1'" class="but_item">
+          <div v-if="row.delFlag !== '1'" class="but_item">
             <el-button type="danger" @click.stop="dianJiShanChu(row, $index)">
               删除
             </el-button>
@@ -84,6 +79,8 @@ const props = defineProps<{
   height: number;
 }>();
 
+const emits = defineEmits(["print"]);
+
 const daYingJianChaRef = ref();
 const dialogPrintRef = ref();
 const jianChaJieGuoRef = ref();
@@ -97,7 +94,7 @@ const dianJiShanChu = (row, index) => {
   ElMessageBox.confirm(`您确定要删除【${row.orderName}】吗?`, "提示")
     .then(() => {
       shanChuJianChaJianYan(row.reqNo, row.inpatientNo, row.admissTimes).then(
-        res => {
+        () => {
           props.data.splice(index, 1);
         }
       );
@@ -106,9 +103,7 @@ const dianJiShanChu = (row, index) => {
 };
 
 function printClick(row) {
-  huoQuShengQingXiangQing(row.reqNo).then(res => {
-    daYingJianChaRef.value.printClick(res);
-  });
+  emits("print", row.reqNo);
 }
 
 async function detailsClick(row) {

+ 5 - 2
src/components/zhu-yuan-yi-sheng/jian-cha-shen-qing/da-ying/PrintCheckList.vue

@@ -47,7 +47,6 @@ defineExpose({
   async print(reqs: number[]) {
     data.value = await printListReqNo(reqs);
     handleQrCode();
-    await nextTick();
     await printFun();
   },
 });
@@ -130,7 +129,11 @@ defineExpose({
         <tbody>
           <tr v-for="tmpItem in item.items">
             <td style="height: 40px; width: 40%">
-              <img :src="tmpItem.qrCode" style="height: 100%; width: 100%" />
+              <img
+                :src="tmpItem.qrCode"
+                style="height: 100%; width: 100%"
+                :alt="item.reqNo"
+              />
             </td>
             <td>
               {{ tmpItem.itemName }}

+ 0 - 1
src/components/zhu-yuan-yi-sheng/jian-cha-shen-qing/da-ying/PrintCheckTable.vue

@@ -1,6 +1,5 @@
 <template>
   <div>
-    <el-button v-if="showPrint" @click="printDirectly">打印</el-button>
     <div ref="printRef" style="width: 147mm; height: 209mm">
       <div
         style="

+ 9 - 8
src/utils/cy-use/useVuePrint.tsx

@@ -19,15 +19,16 @@ export function useVuePrint(
     id?: string;
     extraCss?: string[];
     hidden?: boolean;
-    contentStyle?: StyleValue;
+    contentStyle?: string;
+    // css 样式
     extraPageCss?: string;
     popTitle?: string;
     useTable?: boolean;
-    previewBeforeOpenCallback: () => void;
-    previewOpenCallback: () => void;
-    openCallback: () => void;
-    closeCallback: () => void;
-    beforeOpenCallback: () => void;
+    previewBeforeOpenCallback?: () => void;
+    previewOpenCallback?: () => void;
+    openCallback?: () => void;
+    closeCallback?: () => void;
+    beforeOpenCallback?: () => void;
   } = {}
 ) {
   const {
@@ -46,7 +47,7 @@ export function useVuePrint(
       const str = "/static/printcss" + item;
       tmpExtraCss += str + ",";
     });
-
+    // @ts-ignore
     printOjb.extraCss = tmpExtraCss;
   }
 
@@ -110,7 +111,7 @@ export function useVuePrint(
     },
   });
 
-  async function print() {
+  async function print(): Promise<void> {
     await nextTick();
     buttonRef.value.click();
   }

+ 1 - 1
src/utils/useTableToExcel.tsx

@@ -3,7 +3,7 @@ import { nextTick, renderSlot } from "vue";
 export function useTableToExcel({
   css,
   hidden = true,
-}: { css: string; hidden: boolean } = {}) {
+}: { css?: string; hidden?: boolean } = {}) {
   const uri = "data:application/vnd.ms-excel;base64,";
 
   const table: Ref<HTMLDivElement> = shallowRef();

+ 226 - 0
src/views/crb-manage/CrbBaseInfo.vue

@@ -0,0 +1,226 @@
+<template>
+  <div class="layout_container">
+    <header>
+      <el-input v-model.trim="codeRs" class="w-50 m-2" style="width: 280px" placeholder="请输入工号" clearable>
+        <template #prepend>工号</template>
+      </el-input>
+      <el-input v-model.trim="xm" class="w-50 m-2" style="width: 280px; margin-left: 3px" placeholder="请输入姓名" clearable>
+        <template #prepend>姓名</template>
+      </el-input>
+      <el-input v-model.trim="idCard" class="w-50 m-2" style="width: 280px; margin-left: 3px" placeholder="请输入身份证号码" clearable>
+        <template #prepend>身份证号码</template>
+      </el-input>
+      <el-input v-model.trim="deptName" class="w-50 m-2" style="width: 280px; margin-left: 3px" placeholder="请输入科室名称" clearable>
+        <template #prepend>科室名称</template>
+      </el-input>
+      <el-divider direction="vertical" />
+      <el-button type="primary" icon="Search" @click="queryBaseInfo" style="margin-left: 5px">查询</el-button>
+    </header>
+    <div class="layout_main">
+      <el-tabs class="el-tabs__fill" v-model="editableTabsValue" type="border-card" @tab-click="handleClick">
+        <el-tab-pane key="baseUser" label="用户上传" name="baseUser">
+          <div class="layout_display_flex_y">
+            <div class="layout_flex_1-y">
+              <el-table :data="baseUserData.slice(pageSize * (currentPage - 1), pageSize * currentPage)" border
+                        stripe highlight-current-row height="100%">
+                <el-table-column type="index" label="序号" width="50" fixed/>
+                <el-table-column prop="id" label="账号" width="100" />
+                <el-table-column prop="loginName" label="工号" width="100"/>
+                <el-table-column prop="orgCode" label="所属机构" width="100" />
+                <el-table-column prop="deptCode" label="所属科室" width="100" />
+                <el-table-column prop="userName" label="姓名" width="100" />
+                <el-table-column prop="idCardTypeCode" label="身份证件类别" width="120"/>
+                <el-table-column prop="idCard" label="身份证件号码" width="180" >
+                  <template #default="scope">
+                    {{scope.row.idCard.replace(reg, '\$1******\$2')}}
+                  </template>
+                </el-table-column>
+                <el-table-column prop="tel" label="联系电话" width="180">
+                  <template #default="scope">
+                    {{scope.row.tel.replace(reg1, '\$1****\$2')}}
+                  </template>
+                </el-table-column>
+                <el-table-column prop="physicianNo" label="医师执业资格证号" width="180"/>
+                <el-table-column prop="userTypeCode" label="用户类型" width="100"/>
+                <el-table-column fixed="right" label="操作" min-width="80" width="80" center>
+                  <template #default="scope">
+                    <el-button type="primary" size="small" @click="uploadBaseUser(scope.row)">上传</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div>
+              <el-pagination :current-page="currentPage" :page-size="pageSize" :page-sizes="[10, 15, 20, 25]"
+                             :total="baseUserData.length" layout="total, sizes, prev, pager, next, jumper"
+                             style="margin-top: 5px" @size-change="handleSizeChange"
+                             @current-change="handleCurrentChange">
+              </el-pagination>
+            </div>
+          </div>
+        </el-tab-pane>
+        <el-tab-pane key="baseDept" label="科室上传" name="baseDept">
+          <div class="layout_display_flex_y">
+            <div class="layout_flex_1-y">
+              <el-table :data="baseDeptData.slice(pageSizeDept * (currentPageDept - 1), pageSizeDept * currentPageDept)" border
+                        stripe highlight-current-row height="100%">
+                <el-table-column type="index" label="序号" width="50" />
+                <el-table-column prop="deptCode" label="院内科室代码" width="180" />
+                <el-table-column prop="deptName" label="院内科室名称" width="280" />
+                <el-table-column prop="targetDeptCode" label="前置软件科室代码" width="180" />
+                <el-table-column prop="targetDeptName" label="前置软件科室名称" width="280" />
+                <el-table-column fixed="right" label="操作" min-width="80" width="80" center>
+                  <template #default="scope">
+                    <el-button type="primary" size="small" @click="uploadBaseDept(scope.row)">上传</el-button>
+                  </template>
+                </el-table-column>
+              </el-table>
+            </div>
+            <div>
+              <el-pagination :current-page="currentPageDept" :page-size="pageSizeDept" :page-sizes="[10, 15, 20, 25]"
+                             :total="baseDeptData.length" layout="total, sizes, prev, pager, next, jumper"
+                             style="margin-top: 5px" @size-change="handleSizeChangeDept"
+                             @current-change="handleCurrentChangeDept">
+              </el-pagination>
+            </div>
+          </div>
+        </el-tab-pane>
+      </el-tabs>
+    </div>
+  </div>
+</template>
+<script setup name="CrbBaseInfo">
+import {nextTick, onMounted, ref} from "vue";
+import {
+  selectBaseDept,
+  selectBaseUser,
+  uploadBaseDeptData,
+  uploadBaseUserData
+} from "@/api/crb-manage/crb-base-info.js";
+import {ElMessage, ElMessageBox} from "element-plus";
+import {updateMzDrugCodgData} from "@/api/yp-codg/yp-codg-match.js";
+
+const codeRs = ref('')
+const xm = ref('')
+const idCard = ref('')
+const deptName = ref('')
+const editableTabsValue = ref("baseUser")
+const baseUserData = ref([])
+
+const pageSize = ref(20)
+const currentPage = ref(1)
+const handleSizeChange = (val) => {
+  pageSize.value = val
+}
+const handleCurrentChange = (val) => {
+  currentPage.value = val
+}
+
+const baseDeptData = ref([])
+const pageSizeDept = ref(20)
+const currentPageDept = ref(1)
+const handleSizeChangeDept = (val) => {
+  pageSizeDept.value = val
+}
+const handleCurrentChangeDept = (val) => {
+  currentPageDept.value = val
+}
+
+const reg = /^(.{6})\d+(.{4})$/
+const reg1 = /^(1[3-9][0-9])\d{4}(\d{4}$)/
+
+onMounted(() => {
+  nextTick(() => {
+    queryBaseUser()
+  })
+})
+
+const handleClick = (tab, event) => {
+  // 查询哪个tab页面
+  editableTabsValue.value = tab.props.name;
+  if (editableTabsValue.value === "baseUser") {
+    queryBaseUser()
+  } if(editableTabsValue.value === "baseDept"){
+    queryBaseDept()
+  }
+}
+
+const queryBaseInfo = () => {
+  if (editableTabsValue.value === "baseUser") {
+    queryBaseUser()
+  } if(editableTabsValue.value === "baseDept"){
+    queryBaseDept()
+  }
+}
+
+const userInfo = ref({
+  loginName: '', // 工号
+  userName: '', // 姓名
+  idCard: '', // 身份证号码
+})
+//查询用户信息
+const queryBaseUser = () => {
+  userInfo.value.loginName = codeRs.value
+  userInfo.value.userName = xm.value
+  userInfo.value.idCard = idCard.value
+  selectBaseUser(userInfo.value).then((res) => {
+    baseUserData.value = res
+  })
+}
+// 上传用户信息
+const uploadBaseUser = (row) => {
+  ElMessageBox.confirm('确定上传用户信息?', {
+    cancelButtonText: '取消',
+    confirmButtonText: '确定',
+    type: 'warning',
+    distinguishCancelAndClose: true,
+    dangerouslyUseHTMLString: true
+  }).then(() => {
+    uploadBaseUserData(row).then((res) => {
+      ElMessage({
+        type: "success",
+        message: "用户信息上传成功!",
+        duration: 2500,
+        showClose: true,
+      });
+    })
+  }).catch((action) => {
+    if (action === 'cancel') {
+      console.log("已取消。。。")
+    }
+  })
+}
+const deptInfo = ref({
+  deptCode: '',
+  deptName: '',
+})
+//查询科室信息
+const queryBaseDept = () => {
+  deptInfo.value.deptName = deptName.value
+  selectBaseDept(deptInfo.value).then((res) => {
+    baseDeptData.value = res
+  })
+}
+// 上传科室信息
+const uploadBaseDept = (row) => {
+  ElMessageBox.confirm('确定上传科室信息?', {
+    cancelButtonText: '取消',
+    confirmButtonText: '确定',
+    type: 'warning',
+    distinguishCancelAndClose: true,
+    dangerouslyUseHTMLString: true
+  }).then(() => {
+    uploadBaseDeptData(row).then((res) => {
+      ElMessage({
+        type: "success",
+        message: "科室信息上传成功!",
+        duration: 2500,
+        showClose: true,
+      });
+    })
+  }).catch((action) => {
+    if (action === 'cancel') {
+      console.log("已取消。。。")
+    }
+  })
+}
+</script>

+ 169 - 0
src/views/dictionary/JcPartMaintain.vue

@@ -0,0 +1,169 @@
+<template>
+  <div class="layout_container">
+    <header class="round-header">
+      <el-button
+          style="width: 100%"
+          size="large"
+          type="primary"
+          plain
+          @click="clickAdd"
+      >
+        + 新增部位
+      </el-button>
+    </header>
+    <div class="layout_main layout_el-table">
+      <el-table
+          :data="cptJcPart"
+          stripe
+          highlight-current-row
+      >
+        <el-table-column prop="code" label="编码" />
+        <el-table-column prop="name" label="名称" width="220">
+          <template #header>
+            名称
+            <el-input
+                suffix-icon="Search"
+                style="width: 160px"
+                v-model="nameInput"
+                placeholder="输入 首拼/名称 检索"
+            />
+          </template>
+        </el-table-column>
+        <el-table-column prop="parentName" label="检查类别" />
+        <el-table-column label="状态">
+          <template #default="{row}">
+            <span v-html="coloredStatus(row.delFlag)"></span>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作">
+          <template #default="{row}">
+            <el-button
+                icon="Edit"
+                type="primary"
+                plain
+                @click="clickEdit(row)"
+            >
+              编辑
+            </el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+    </div>
+    <el-dialog
+        v-model="showDialog"
+        width="300px"
+        :title="dialogTitle"
+    >
+      <el-form label-width="60">
+        <el-form-item label="编码">
+          <el-input
+              v-model="jcPart.code"
+              placeholder="由系统自动生成"
+              disabled
+          />
+        </el-form-item>
+        <el-form-item label="名称" required>
+          <el-input v-model="jcPart.name"/>
+        </el-form-item>
+        <el-form-item label="检查类别">
+          <el-select
+            v-model="jcPart.parentCode"
+            clearable
+            filterable
+          >
+            <el-option
+                v-for="item in allJcClass"
+                :label="item.name"
+                :value="item.code"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="状态" required>
+          <el-select
+              v-model="jcPart.delFlag"
+          >
+            <el-option label="正常" value="0" />
+            <el-option label="停用" value="1" />
+          </el-select>
+        </el-form-item>
+      </el-form>
+
+      <template #footer>
+        <el-button @click="showDialog = false">取消</el-button>
+        <el-button type="success" @click="clickConfirm">保存</el-button>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script setup>
+import {getAllJcPart, insertNewPart, updatePart} from "@/api/dictionary/jc-part-maintain.js";
+import {xcMessage} from "@/utils/xiaochan-element-plus";
+
+const nameInput = ref('')
+const allJcPart = ref([])
+const allJcClass = ref([])
+
+const cptJcPart = computed(() => {
+  return allJcPart.value.filter((item) => {
+    return item.name.indexOf(nameInput.value) !== -1
+        || item.pyCode.indexOf(nameInput.value) !== -1
+  })
+})
+
+function coloredStatus(delFlag) {
+  return delFlag === '1' ?
+      '<span style="color: red">停用</span>' :
+      '<span style="color: green">正常</span>'
+}
+
+const jcPart = reactive({
+  code: null,
+  name: null,
+  delFlag: null,
+  parentCode: null,
+})
+
+const showDialog = ref(false)
+const dialogTitle = ref('')
+function clickAdd() {
+  jcPart.code = null
+  jcPart.name = null
+  jcPart.delFlag = '0'
+  jcPart.parentCode = null
+  dialogTitle.value = '添加部位'
+  showDialog.value = true
+}
+
+function clickEdit(row) {
+  jcPart.code = row.code
+  jcPart.name = row.name
+  jcPart.delFlag = row.delFlag
+  jcPart.parentCode = row.parentCode
+  dialogTitle.value = '编辑部位'
+  showDialog.value = true
+}
+
+function clickConfirm() {
+  if (jcPart.code === null) {
+    insertNewPart(jcPart).then((res) => {
+      allJcPart.value = res
+      xcMessage.success('添加成功')
+    })
+  } else {
+    updatePart(jcPart).then((res) => {
+      allJcPart.value = res
+      xcMessage.success('修改成功')
+    })
+  }
+  showDialog.value = false
+}
+
+onMounted(() => {
+  getAllJcPart().then((res) => {
+    console.log(res)
+    allJcPart.value = res.jcPartList
+    allJcClass.value = res.jcClassList
+  })
+})
+</script>

+ 0 - 1
src/views/dictionary/ShouShuBuWeiWeiHu.vue

@@ -47,7 +47,6 @@ import {computed} from 'vue'
 import {stringIsBlank} from '@/utils/blank-utils'
 import {ElMessage} from 'element-plus'
 
-const innerHeight = window.innerHeight
 const shouShuBuWeiBianMa = ref('')
 const shuJu = ref({
   data: [],

+ 7 - 1
src/views/hospitalization/zhu-yuan-yi-sheng/jian-cha-jian-yan-shen-qing/JianChaShenQing.vue

@@ -44,6 +44,11 @@
           <template #default="{ height }">
             <CheckApplicationHistory
               ref="historyTableRef"
+              @print="
+                value => {
+                  printListRef.print([value]);
+                }
+              "
               :data="jianChaShuJu"
               :height="height"
             />
@@ -95,12 +100,13 @@ import { CyMessageBox } from "@/utils/cy-message-box";
 import XEUtils from "xe-utils";
 import PrintCheckList from "@/components/zhu-yuan-yi-sheng/jian-cha-shen-qing/da-ying/PrintCheckList.vue";
 import { ElMessageBox } from "element-plus";
+import { useCompShallowRef } from "@/utils/useCompRef";
 
 const orderName = ref("");
 const dateRange = ref(null);
 const jianChaShuJu = ref([]);
 const asideTabs = ref(0);
-const printListRef = ref();
+const printListRef = useCompShallowRef(PrintCheckList);
 
 // 检查结果
 const jieGuoRefV2 = ref();

+ 14 - 2
src/views/medical-advice/execute-item/GenerateYz.vue

@@ -63,7 +63,7 @@ import {onMounted, ref} from "vue";
 import {getWindowSize} from "@/utils/window-size";
 import {getAllWards} from "@/api/zhu-yuan-yi-sheng/resident-doctor";
 import {queryGenerateYzList,generateYpOrZl} from "@/api/medical-advice/excute-item";
-import {ElTable} from "element-plus";
+import {ElTable,ElMessageBox} from "element-plus";
 import { getFormatDatetime } from "@/utils/date";
 const queryParam=ref({
   wardCode:'',
@@ -116,7 +116,19 @@ const yzGenerate = (ypOrZlFlag:any)=>{
     yzDate : queryParam.value.yzDate,
     ypOrZlFlag : ypOrZlFlag,
     zyActpatients :multipleSelection.value
-  }).then((res:any)=>{})
+  }).then((res:any)=>{
+       // 警告信息
+       if(res.length > 0){
+         for (let i = 0; i < res.length; i++) {
+           ElMessageBox.alert(`${res[i]}`,'警告信息',{
+             type: 'error',
+             showCancelButton: false,
+           }).then(() => {})
+         }
+       }
+
+
+  })
 }
 
 </script>

+ 23 - 17
src/views/settings/scheduling-class/ExportFalseExcel.vue

@@ -14,16 +14,20 @@ const [TableTemplate, exportFun] = useTableToExcel({
   css: `td{text-align: center}`,
 });
 
-const store = reactive({
-  headerColSpan: 0,
-  title: "",
-  dayLength: 0,
-  month: "",
-  weekList: [],
-
-  keyDayMap: new Map(),
-  deptList: [],
-});
+function init() {
+  return {
+    headerColSpan: 0,
+    title: "",
+    dayLength: 0,
+    month: "",
+    weekList: [],
+
+    keyDayMap: new Map(),
+    deptList: [],
+  };
+}
+
+const store = reactive(init());
 
 const days = ["天", "一", "二", "三", "四", "五", "六"];
 
@@ -56,8 +60,8 @@ function employeeHandling(month) {
           classDay.push("休");
         }
       } else {
-        const tmpCode = stringNotBlank(值班人员.falseCode)
-          ? 值班人员.falseCode
+        const tmpCode = stringNotBlank(值班人员.changeClass)
+          ? 值班人员.changeClass
           : 值班人员.code;
 
         if (week === 6) {
@@ -87,14 +91,16 @@ function employeeHandling(month) {
 }
 
 function renderTable(month: string, value: DataValue[]) {
-  store.keyDayMap.clear();
+  XEUtils.assign(store, init());
+  store.month = month;
+
   value.forEach(item => {
     store.keyDayMap.set(dayjs(item.schedulingDate).format("MM-DD"), item);
   });
 
   store.dayLength = dayjs(month).daysInMonth();
   store.headerColSpan = store.dayLength + 13;
-  store.title = `${dayjs(month).format("YYYY年MM月")}排班表`;
+  store.title = `${dayjs(month).format("YYYY年MM月")}考勤表`;
   store.weekList = Array.from({ length: store.dayLength }).map((_, i) => {
     let strIndex = i + 1 < 10 ? `${month}-0${i + 1}` : `${month}-${i + 1}`;
     const week = dayjs(strIndex).day();
@@ -106,7 +112,7 @@ function renderTable(month: string, value: DataValue[]) {
 defineExpose({
   exportExcel(month: string, value: DataValue[]) {
     renderTable(month, value);
-    exportFun(dayjs(month).format("YYYY年MM月") + "排班表.xlsx");
+    exportFun(dayjs(month).format("YYYY年MM月") + "考勤表");
   },
 });
 </script>
@@ -144,8 +150,8 @@ defineExpose({
         <tr>
           <td>星期</td>
           <td
-            v-for="item in store.weekList"
-            :key="item"
+            v-for="(item, index) in store.weekList"
+            :key="`${store.month}-${item}-${index}`"
             :style="['天', '六'].includes(item) ? 'background: yellow' : ''"
           >
             {{ item }}

+ 6 - 1
src/views/settings/scheduling-class/index.vue

@@ -16,6 +16,7 @@ import { useCompShallowRef } from "@/utils/useCompRef";
 import ExportFalseExcel from "@/views/settings/scheduling-class/ExportFalseExcel.vue";
 import { useUserStore } from "@/pinia/user-store";
 import SchedulingSelectClasss from "@/views/settings/scheduling-class/SchedulingSelectClasss.vue";
+import { isDev } from "@/utils/public";
 
 const store = reactive({
   codes: [],
@@ -93,7 +94,11 @@ function handleGetByMonth() {
 }
 
 function exportExcel(type: "all" | "true" | "false" = "all") {
-  const month = store.tmpCurrentCalendar;
+  let month = store.tmpCurrentCalendar;
+
+  // if (isDev) {
+  //   month = "2025-07";
+  // }
 
   getByMonth(month).then(res => {
     store.months[month] = res;

+ 6 - 4
src/views/yp-codg/YpCodgMatch.vue

@@ -174,11 +174,13 @@ const queryMzChargePrescription = () => {
 
 // 处方匹配药品追溯码
 const showMzMatchCodg = ref(false)
-const ypMzCfData = ref([])
+const ypMzCfData = ref({})
 const matchCodgForCf = (row) => {
-  ypMzCfData.value = row
-  ypMzCfData.value.patNo = row.patientId
-  ypMzCfData.value.times = row.times
+  ypMzCfData.value = {
+    ...row,
+    patNo: row.patientId,
+    times: row.times
+  }
   showMzMatchCodg.value = true
 }
 

+ 7 - 0
src/views/yp-dict/YpDictBase.vue

@@ -470,6 +470,12 @@
                     <span v-else>{{ scope.row.name }}</span>
                   </template>
                 </el-table-column>
+                <el-table-column prop="supplyCode" label="企业信用代码" width="180">
+                  <template v-slot="scope">
+                    <el-input v-if="scope.row.isEdit" size="small" v-model="scope.row.supplyCode"></el-input>
+                    <span v-else>{{ scope.row.supplyCode }}</span>
+                  </template>
+                </el-table-column>
                 <el-table-column prop="pyCode" label="拼音码" width="120" />
                 <el-table-column prop="dcode" label="自定义码" width="120" />
                 <el-table-column prop="delFlag" label="是否无效" width="150">
@@ -1096,6 +1102,7 @@ const onAddItem = () => {
         ypSupplyData.value.push({
             code: '',
             name: '',
+            supplyCode: '',
             abbrName: '',
             address: '',
             zipCode: '',

+ 17 - 1
src/views/yp-dict/YpDictInfo.vue

@@ -100,6 +100,7 @@ import {Export} from '@/utils/ExportExcel'
 import {
   selectYpDict,
   selectYpDictByCode,
+  selectYpDictByCodeNoSerial,
   selectYpGroupNameByYfFlag,
   selectYpStorageInfo,
   updateYkYpStopOrUsed,
@@ -194,7 +195,22 @@ const closeYpEditAdd = () => {
 }
 
 // 编辑
-const editYpDict = (row) => {
+const zdList = ref([])
+const editYpDict = async (row) => {
+    await selectYpDictByCodeNoSerial(row.code).then((res) => {
+         zdList.value = res
+    })
+
+    if(row.serial === '01' && zdList.value.length > 1) {
+      ElMessage({
+        type: "warning",
+        message: "有大包装规格,请选择大包装规格进行编辑,会同步修改小包装规格的相对应信息!",
+        duration: 2500,
+        showClose: true,
+      });
+      return false
+    }
+
     selectYpDictByCode(row.code, row.serial).then((res) => {
         ypTitle.value = '编码:' + row.code + ' 序号:' + row.serial + ' 规格:' + row.specification + ' 名称:' + row.name + ' 账页信息'
         ypDetail.value = res

+ 10 - 11
src/views/yp-dict/YpPrintName.vue

@@ -94,7 +94,7 @@ const selectYpPrintNameList = () => {
 // 新增
 const onAddItem = () => {
     ypPrintNameData.value.push({
-        chargeCode: '',
+        chargeCode: props.ypPrintNameDetail.chargeCode,
         printName: '',
         ypFlag: '',
         pyCode: '',
@@ -124,16 +124,6 @@ const cancelPrintName = (row) => {
 }
 // 保存
 const updatePrintName = (row) => {
-    if (!row.chargeCode || !row.printName) {
-        ElMessage({
-            type: "warning",
-            message: "药品的编码或别名不存在,请检查!",
-            duration: 2500,
-            showClose: true,
-        });
-        return
-    }
-
     if (row.isAdd) {
         let fe = 0
         for (let num in ypPrintNameData.value) {
@@ -153,6 +143,15 @@ const updatePrintName = (row) => {
         }
 
     } else {
+        if (!row.chargeCode || !row.printName) {
+          ElMessage({
+            type: "warning",
+            message: "药品的编码或别名不存在,请检查!",
+            duration: 2500,
+            showClose: true,
+          });
+          return
+        }
         let oldName = row.oldRow.printName
         if (oldName !== row.printName) {
             let fe = 0