Browse Source

执行项目单

lihong 1 year ago
parent
commit
68a82a7bd3

+ 24 - 0
src/api/medical-advice/excute-item.js

@@ -53,4 +53,28 @@ export function saveYzSign(data) {
 }
 
 
+export function queryExecuteItem(data) {
+    return request({
+        url: '/executeItem/queryExecuteItem',
+        method: 'post',
+        data,
+    })
+}
+
+export function updateExecuteItemPrintFlag(data) {
+    return request({
+        url: '/executeItem/updateExecuteItemPrintFlag',
+        method: 'post',
+        data,
+    })
+}
+export function queryExecuteItemDetail(data) {
+    return request({
+        url: '/executeItem/queryExecuteItemDetail',
+        method: 'post',
+        data,
+    })
+}
+
+
 

+ 38 - 0
src/api/medical-advice/medical-common.js

@@ -26,6 +26,44 @@ export function queryYzYpPageNo(data) {
     })
 }
 
+/**
+ * 查询项目细类
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function queryItemsSubclass(data) {
+    return request({
+        url: '/medicalAdvice/medicalCommon/queryItemsSubclass',
+        method: 'post',
+        data
+    })
+}
+
+/**
+ * 查询项目分类
+ * @returns {AxiosPromise}
+ */
+export function queryItemsList() {
+    return request({
+        url: '/medicalAdvice/medicalCommon/queryItemsList',
+        method: 'get',
+
+    })
+}
+
+/**
+ * 查询项目明细 根据code查询
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function queryItemDetail(data) {
+    return request({
+        url: '/medicalAdvice/medicalCommon/queryItemDetail',
+        method: 'post',
+        data
+    })
+}
+
 
 
 

+ 224 - 0
src/components/medical-advice/ItemClass.vue

@@ -0,0 +1,224 @@
+<template>
+  <el-container>
+    <el-header >
+      <el-row :gutter="10">
+        <el-col :span="8">
+          输入码:<el-input v-model="headerParams.keyWard" style="width: 100px" clearable />
+        </el-col>
+        <el-col :span="14">
+          <el-radio-group v-model="headerParams.itemClass" @change="selectItemClass">
+            <el-radio label="0">大类 </el-radio>
+            <el-radio label="1">细类</el-radio>
+            <el-radio label="2">项目</el-radio>
+            <el-radio label="3">副治疗</el-radio>
+          </el-radio-group>
+        </el-col >
+        <el-col >
+          <el-button  @click="selectItemClass">查询</el-button>
+          <el-button  @click="selectionData">确定</el-button>
+          <el-button  @click="cancel">退出</el-button>
+        </el-col>
+      </el-row>
+    </el-header>
+    <el-main>
+      <div>
+        <el-table v-if="tableVisble"
+            ref="multipleTableRef"
+            :data="tableData"
+            style="width: 100%"
+            height="500"
+            @selection-change="handleSelectionChange"
+        >
+          <el-table-column type="selection" width="55" />
+          <el-table-column  property="code" label="代码" />
+          <el-table-column v-if="headerParams.itemClass =='1'" property="supply_name" label="给药方式" />
+          <el-table-column v-if="headerParams.itemClass =='1'" property="py_code" label="拼音码" />
+          <el-table-column v-if="headerParams.itemClass =='1'" property="d_code" label="自定义码" />
+          <el-table-column v-if="headerParams.itemClass =='1'" property="class" label="分类" />
+          <el-table-column v-if="headerParams.itemClass =='1'" property="sort_code" label="排序码" />
+          <el-table-column v-if="headerParams.itemClass =='0' || headerParams.itemClass =='3' " property="name" label="名称"/>
+        </el-table>
+        <div  v-if="!tableVisble">
+          <el-container>
+            <el-aside width="150px">
+              <el-table
+                  :data="tableData"
+                  style="width: 100%"
+                  height="500"
+                  @row-click="handleClick"
+              >
+                <el-table-column  property="code" width="50" label="编码" />
+                <el-table-column  property="name" width="100" label="名称" />
+              </el-table>
+            </el-aside>
+            <el-main>
+              <el-table
+                  :data="rTableData"
+                  style="width: 100%"
+                  height="500"
+                  @selection-change="handleItemDetail"
+              > <el-table-column type="selection" width="55" />
+                <el-table-column  property="code" label="编码" />
+                <el-table-column  property="name" label="名称" />
+                <el-table-column  v-if="drug_specification_flag" property="drug_specification" label="规格" />
+              </el-table>
+            </el-main>
+          </el-container>
+        </div>
+      </div>
+    </el-main>
+  </el-container>
+</template>
+
+<script setup lang="ts" name="ItemClass">
+import {computed, onMounted, ref,defineExpose } from "vue";
+import {queryItemsSubclass,queryItemsList,queryItemDetail} from "@/api/medical-advice/medical-common";
+import {stringNotBlank,stringIsBlank} from "@/utils/blank-utils";
+import {ElMessage} from "element-plus";
+const emit = defineEmits(['selectionPageClass','closeDiag']);
+
+const setWardCode =(res)=>{
+  headerParams.value.wardCode = res
+}
+
+defineExpose({
+  setWardCode
+})
+
+const props = defineProps({
+  wardCode: {
+    type: String
+  },
+
+})
+
+const headerParams = ref({
+  wardCode:props.wardCode,
+  keyWard:'',
+  itemClass:'0',
+})
+
+const cancel = ()=>{
+  emit('closeDiag')
+}
+
+
+
+const tableVisble = ref(true)
+
+//选择分类
+const selectItemClass = () =>{
+  clearTableData()
+  if(headerParams.value.itemClass == '0'){
+    tableData.value = bigClass
+    tableVisble.value = true
+  }else if(headerParams.value.itemClass == '1' ){
+    tableVisble.value = true
+    queryItemsSubclass(headerParams.value).then((res:any)=>{
+      tableData.value = res
+    })
+  }else if(headerParams.value.itemClass == '2' ){
+    tableVisble.value = false
+    queryItemsList().then((res:any)=>{
+      tableData.value = res
+    })
+  }else {
+    tableVisble.value = true
+    tableData.value = fzlClass
+  }
+
+}
+// 项目选中数据
+const itemCode = ref('')
+
+const clearTableData = ()=>{
+  tableData.value = []
+  rTableData.value = []
+  itemCode.value = ''
+}
+
+onMounted(()=>{
+  selectItemClass()
+})
+
+const drug_specification_flag = ref(false)
+// 查询项目明细
+const handleClick = (row) =>{
+  itemCode.value = row.code
+  if(row.code === '#'){
+    drug_specification_flag.value = true
+  }else {
+    drug_specification_flag.value = false
+  }
+  queryItemDetail(
+      {
+        wardCode:headerParams.value.wardCode,
+        code:row.code,
+      }
+  ).then((res:any)=>{
+    rTableData.value = res
+  })
+
+}
+
+const rTableData = ref([])
+
+const tableData = ref([])
+
+//大类
+const bigClass = [
+  {code:'1',name:'口服' },
+  {code:'2',name:'输液' },
+  {code:'3',name:'出院带药' },
+  {code:'4',name:'领药(临时)' },
+  {code:'5',name:'退药' },
+  {code:'6',name:'外用' },
+  {code:'7',name:'注射' },
+  {code:'8',name:'药物治疗' },
+  {code:'9',name:'其他' },
+]
+// 副治疗
+const fzlClass =   [
+  {code:'1',name:'口服' },
+  {code:'3',name:'出院带药' },
+  {code:'4',name:'领药(临时)' },
+  {code:'5',name:'退药' },
+  {code:'6',name:'领药(非临时)' },
+  {code:'8',name:'药物治疗' },
+  {code:'9',name:'其他' },
+]
+
+const selectionData = () =>{
+  let params = {
+    classCode : headerParams.value.itemClass,
+    codes:[],
+    itemCode:itemCode.value
+  }
+  if(tableVisble.value){
+    params.codes = multipleSelection.value
+  }else {
+    params.codes = mulItemDetailData.value
+  }
+  emit('selectionPageClass',params)
+  emit('closeDiag')
+}
+
+const multipleTableRef =ref({})
+const multipleSelection = ref([])
+const handleSelectionChange = (val) => {
+  multipleSelection.value = val
+}
+
+const mulItemDetailData  = ref([])
+const handleItemDetail = (val)=>{
+  mulItemDetailData.value = val
+}
+
+
+
+
+</script>
+
+<style scoped lang="scss">
+
+</style>

+ 12 - 0
src/router/modules/dashboard.js

@@ -1021,6 +1021,18 @@ const route = [
                 path: 'executeItem/yzExecuteSignature',
                 component: createNameComponent(() => import('@/views/medical-advice/execute-item/YzExecuteSignature.vue')),
                 meta: {title: '医嘱执行签名'},
+            },{
+                path: 'executeItem/printExecuteItem',
+                component: createNameComponent(() => import('@/views/medical-advice/execute-item/PrintExecuteItem.vue')),
+                meta: {title: '打印执行项目表'},
+            },{
+                path: 'executeItem/printExecuteDetail',
+                component: createNameComponent(() => import('@/views/medical-advice/execute-item/PrintExecuteDetail.vue')),
+                meta: {title: '打印执行单明细'},
+            },{
+                path: 'executeItem/psInfo',
+                component: createNameComponent(() => import('@/views/medical-advice/nursing-manage/PsInfo.vue')),
+                meta: {title: '皮试结果确认'},
             },
         ],
     },

+ 5 - 0
src/utils/date.js

@@ -211,6 +211,11 @@ export function getDateTiffDays(value) {
     return moment(new Date().getTime() - value * 1000 * 24 * 60 * 60).format('YYYY-MM-DD hh:mm:ss')
 }
 
+export function getDiffDays(day,value) {
+    let date = new Date(day)
+    return moment(date.getTime() + value * 1000 * 24 * 60 * 60).format('YYYY-MM-DD')
+}
+
 // 获取前day的日期(arr是日期拼接符,默认'-')
 export function getDayAgo(day, arr, type) {
 

+ 328 - 0
src/views/medical-advice/execute-item/PrintExecuteDetail.vue

@@ -0,0 +1,328 @@
+<template>
+  <page-layer>
+    <template #header>
+      <el-select filterable v-model="queryParam.wardCode" @change="initPatintBedNo"
+                 style="width: 130px;margin-right: 10px" size="small">
+        <el-option v-for="item in ward" :key="item.code" :label="item.name" :value="item.code">
+          <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      执行时间:
+      <el-date-picker
+          v-model="queryParam.executeTime"
+          type="datetime"
+          size="small"
+          :clearable="false"
+          format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
+          style="width: 150px;margin-right: 10px"/>
+      床位范围:
+      <el-select v-model="queryParam.startBedNo"
+                 clearable
+                 style="width: 70px">
+        <el-option v-for="item in patintList"
+                   :key="item.bedNo"
+                   :label="item.bedNo"
+                   :value="item.bedNo">
+          <span>{{ item.bedNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.inpatientNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      至
+      <el-select v-model="queryParam.endBedNo"
+                 style="width: 70px;margin-right: 10px"
+                 clearable>
+        <el-option v-for="item in reverPatintList"
+                   :key="item.bedNo"
+                   :label="item.bedNo"
+                   :value="item.bedNo">
+          <span>{{ item.bedNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.inpatientNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      频率:
+      <el-select v-model="queryParam.frequCodeFlag"
+                 style="width: 70px;margin-right: 10px"
+      >
+        <el-option label="全部" value="0"></el-option>
+        <el-option label="临时" value="1"></el-option>
+        <el-option label="长期" value="2"></el-option>
+      </el-select>
+      打印范围:
+      <el-select v-model="queryParam.printFlag"
+                 style="width: 70px;margin-right: 10px"
+      >
+        <el-option label="全部" value="0"></el-option>
+        <el-option label="新增" value="1"></el-option>
+        <el-option label="已打印" value="2"></el-option>
+      </el-select>
+      <el-radio-group v-model="queryParam.pageClass" size="small" @change="pageClassChange" style="margin-right: 20px">
+        <el-radio @click="pageClassChange" label="0">选择分类</el-radio>
+        <el-radio label="1">全部分类</el-radio>
+      </el-radio-group>
+      <el-button icon="Search" type="primary" @click="queryInfo">查询</el-button>
+      <el-button icon="Printer" type="success" @click="printInfo">打印</el-button>
+    </template>
+    <template #main>
+      <el-scrollbar class="scrollbar" :max-height="(getWindowSize.h/1.2-100)+'px'" noresize="true">
+        <div id="printId">
+          <table class="pageTable">
+            <thead>
+            <tr>
+              <td colspan="10" style="width: 100%;border: none;text-align: center;font-size: 25px;font-weight:bold">
+                执行项目表
+              </td>
+            </tr>
+            <tr>
+              <td colspan="10" style="width: 753px;border: none;">
+                <div style="float: left;width: 25%">
+                  病房:{{ getWardName(queryParam.wardCode) }}
+                </div>
+                <div style="float: left;width: 50%">
+                  日期:{{ queryParam.executeTime }}至
+                  {{ getDiffDays(queryParam.executeTime.split(" ")[0], 1) + " " + queryParam.executeTime.split(" ")[1] }}
+                </div>
+                <div style="float: left;width: 25%">
+                  打印日期:{{ getFormatDatetime(new Date(), 'YYYY-MM-DD') }}
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <th style="height: 30px">床号</th>
+              <th>姓名</th>
+              <th>执行项目名称</th>
+              <th>频率</th>
+              <th>剂量</th>
+              <th>给药方式</th>
+              <th>执行时间</th>
+              <th>嘱托</th>
+              <th>执行</th>
+              <th>核对</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr v-for="(item,index) in resData">
+              <td style="width: 5%">{{ item.bedNo }}</td>
+              <td style="width: 8%">{{ item.name }}</td>
+              <td style="width: 25%">{{ item.orderName }}</td>
+              <td style="width: 10%">{{ item.frequCode }}</td>
+              <td style="width: 10%">&nbsp;{{ item.dose ? item.dose : item.drugQuan }} {{item.doseUnit}} &nbsp; {{item.unit}}</td>
+              <td style="width: 10%;text-align: center">{{ item.supplyName }}</td>
+              <td style="width: 10%">{{ item.occTimeStr }}</td>
+              <td style="width: 10%">{{ item.instruction }}</td>
+              <td style="width: 5%"></td>
+              <td style="width: 5%"></td>
+            </tr>
+            </tbody>
+          </table>
+        </div>
+      </el-scrollbar>
+      <el-dialog
+          v-model="dialogVisible"
+          title="选择分类"
+          width="50%"
+      >
+        <ItemClass ref="itemClassRef" :wardCode="queryParam.wardCode" @closeDiag="closeDiag"
+                   @selectionPageClass="selectionPageClass"></ItemClass>
+      </el-dialog>
+    </template>
+  </page-layer>
+</template>
+
+<script setup lang="ts" name='PrintExecuteItem'>
+import {computed, onMounted, ref} from 'vue'
+import {useStore} from 'vuex'
+import {getFormatDatetime, getDiffDays} from "@/utils/date"
+import {ElMessage, ElMessageBox} from 'element-plus'
+import {getAllWards} from "@/api/zhu-yuan-yi-sheng/resident-doctor";
+import {queryYpZdGroupName, queryYzYpPageNo} from "@/api/medical-advice/medical-common";
+import {queryPatientInfo} from "@/api/medical-advice/medical-advice-management";
+import {stringNotBlank} from "@/utils/blank-utils"
+import {queryExecuteItemDetail, updateExecuteItemPrintFlag} from "@/api/medical-advice/excute-item";
+import PageLayer from "@/layout/PageLayer";
+import ItemClass from "@/components/medical-advice/ItemClass";
+import {getLodop, initLodop} from '@/utils/c-lodop'
+import {getWindowSize} from "@/utils/window-size";
+import {userInfoStore} from "@/utils/store-public";
+
+const queryParam = ref({
+  wardCode: '',
+  startBedNo: '',
+  endBedNo: '',
+  executeTime: getFormatDatetime(new Date(), 'YYYY-MM-DD' + ' 00:00:00'),
+  frequCodeFlag: '0',
+  printFlag: '1',
+  executeFlag: '2',
+  pageClass: '1',
+  classCode: '',
+  codes: [],
+  itemCode: '',
+})
+
+//选择分类切换
+const pageClassChange = () => {
+  if (queryParam.value.pageClass === '0') {
+    dialogVisible.value = true
+  } else {
+    dialogVisible.value = false
+  }
+}
+
+
+
+
+const selectionPageClass = (val) => {
+  queryParam.value.codes = val.codes
+  queryParam.value.classCode = val.classCode
+  queryParam.value.itemCode = val.itemCode
+}
+
+const closeDiag = () => {
+  dialogVisible.value = false
+}
+
+const dialogVisible = ref(false)
+
+const ward = ref([])
+
+const getWardName = (code) => {
+  for (let i = 0; i < ward.value.length; i++) {
+    if (code === ward.value[i].code) {
+      return ward.value[i].name
+    }
+  }
+}
+
+onMounted(() => {
+  initLodop()
+  getAllWards().then((res: any) => {
+    if (res) {
+      ward.value = res
+      queryParam.value.wardCode = res[0].code
+      initPatintBedNo()
+    }
+  })
+
+})
+const patintList = ref([])
+const reverPatintList = computed(() => reverseArray(patintList.value))
+
+function reverseArray(arr) {
+  let newArr = [];
+  arr.forEach(element => {
+    // unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
+    newArr.unshift(element);
+  });
+  return newArr;
+}
+
+const itemClassRef = ref(null)
+const resData = ref([])
+const queryInfo = () => {
+  queryExecuteItemDetail(queryParam.value).then((res: any) => {
+    resData.value = res
+  })
+}
+
+const printCss = `
+.pageTable tr th {
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+
+}
+ .pageTable tr td{
+   border-bottom:1px dashed black;
+   border-top:1px dashed black;
+   text-align: left;
+   font-size: 12px;
+   padding: 0 0;
+ }
+
+
+.pageTable tr td{
+  height: 27px;
+}
+
+#printId{
+  padding: 0 0;
+  width: 753px;
+}
+
+.pageTable {
+  border-collapse: collapse;
+}
+
+
+`
+
+
+
+
+const printInfo = () => {
+  updateExecuteItemPrintFlag(resData.value).then((res: any) => {
+    let LODOP = getLodop()
+    LODOP.PRINT_INIT('执行项目表') // 初始化打印机 名字
+    LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '') // 设置纸张大小  A4
+    LODOP.ADD_PRINT_TABLE('2mm', '5mm', '205mm', '220mm', '<style>' + printCss + '</style>' + '<body>' + document.getElementById('printId').innerHTML + '</body>') //要打印的内容
+    LODOP.SET_PRINT_STYLE('ItemType', 3)
+    LODOP.ADD_PRINT_TEXT('250mm', '100mm', '25mm', '10mm', '第#页/共&页')
+    LODOP.PREVIEW() // 关闭
+  })
+}
+
+const initPatintBedNo = () => {
+  itemClassRef.value ? itemClassRef.value.setWardCode(queryParam.value.wardCode) : ''
+  queryPatientInfo('', queryParam.value.wardCode, '').then((res: any) => {
+    patintList.value = res
+  })
+}
+</script>
+<style scoped lang="scss">
+.pageTable tr th {
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+
+}
+
+#printId .pageTable tr td {
+  border-bottom: 1px dashed black;
+  border-top: 1px dashed black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+}
+
+
+
+
+.pageTable tr td {
+  height: 27px;
+}
+
+#smalPrintId {
+  padding: 0 0;
+  width: 470px;
+}
+
+#printId {
+  padding: 0 0;
+  width: 753px;
+}
+
+.pageTable {
+  border-collapse: collapse;
+}
+</style>

+ 418 - 0
src/views/medical-advice/execute-item/PrintExecuteItem.vue

@@ -0,0 +1,418 @@
+<template>
+  <page-layer>
+    <template #header>
+      <el-select filterable v-model="queryParam.wardCode" @change="initPatintBedNo"
+                 style="width: 130px;margin-right: 10px" size="small">
+        <el-option v-for="item in ward" :key="item.code" :label="item.name" :value="item.code">
+          <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      执行时间:
+      <el-date-picker
+          v-model="queryParam.executeTime"
+          type="datetime"
+          size="small"
+          :clearable="false"
+          format="YYYY-MM-DD HH:mm:ss" value-format="YYYY-MM-DD HH:mm:ss"
+          style="width: 150px;margin-right: 10px"/>
+      床位范围:
+      <el-select v-model="queryParam.startBedNo"
+                 clearable
+                 style="width: 70px">
+        <el-option v-for="item in patintList"
+                   :key="item.bedNo"
+                   :label="item.bedNo"
+                   :value="item.bedNo">
+          <span>{{ item.bedNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.inpatientNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      至
+      <el-select v-model="queryParam.endBedNo"
+                 style="width: 70px;margin-right: 10px"
+                 clearable>
+        <el-option v-for="item in reverPatintList"
+                   :key="item.bedNo"
+                   :label="item.bedNo"
+                   :value="item.bedNo">
+          <span>{{ item.bedNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.inpatientNo }}</span>
+          <el-divider direction="vertical"></el-divider>
+          <span>{{ item.name }}</span>
+        </el-option>
+      </el-select>
+      频率:
+      <el-select v-model="queryParam.frequCodeFlag"
+                 style="width: 70px;margin-right: 10px"
+      >
+        <el-option label="全部" value="0"></el-option>
+        <el-option label="临时" value="1"></el-option>
+        <el-option label="长期" value="2"></el-option>
+      </el-select>
+      打印范围:
+      <el-select v-model="queryParam.printFlag"
+                 style="width: 70px;margin-right: 10px"
+                 >
+        <el-option label="全部" value="0"></el-option>
+        <el-option label="新增" value="1"></el-option>
+        <el-option label="已打印" value="2"></el-option>
+      </el-select>
+      <el-radio-group v-model="queryParam.pageClass" size="small" @change="pageClassChange" style="margin-right: 20px">
+        <el-radio @click="pageClassChange"  label="0" >选择分类</el-radio>
+        <el-radio  label="1" >全部分类</el-radio>
+      </el-radio-group>
+      <el-radio-group v-model="queryParam.executeFlag" size="small"  style="margin-right: 10px">
+        <el-radio  label="0" >大执行单</el-radio>
+        <el-radio  label="1" >小执行单</el-radio>
+      </el-radio-group>
+      <el-button icon="Search" type="primary" @click="queryInfo">查询</el-button>
+      <el-button icon="Printer" type="success" @click="printInfo">打印</el-button>
+    </template>
+    <template #main>
+      <el-scrollbar  class="scrollbar" :max-height="(getWindowSize.h/1.2-100)+'px'" noresize="true">
+        <div v-if="queryParam.executeFlag=='0'"  id="printId">
+          <table class="pageTable">
+            <thead>
+            <tr>
+              <td colspan="9" style="width: 100%;border: none;text-align: center;font-size: 25px;font-weight:bold">
+                执行项目表
+              </td>
+            </tr>
+            <tr>
+              <td colspan="9" style="width: 753px;border: none;">
+                <div style="float: left;width: 25%">
+                  病房:{{getWardName(queryParam.wardCode)}}
+                </div>
+                <div style="float: left;width: 50%">
+                  日期:{{queryParam.executeTime}}至 {{getDiffDays(queryParam.executeTime.split(" ")[0],1)+" "+queryParam.executeTime.split(" ")[1]}}
+                </div>
+                <div style="float: left;width: 25%">
+                   打印日期:{{getFormatDatetime(new Date(),'YYYY-MM-DD')}}
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <th style="width: 10%;height: 27px">医嘱名称</th>
+              <th >剂量</th>
+              <th >总量</th>
+              <th >给药方式</th>
+              <th >频率</th>
+              <th >执行时间</th>
+              <th >执行者</th>
+              <th >审核者</th>
+              <th >医生嘱托</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr v-for="(item,index) in resData">
+              <td colspan="9" v-if="item.showFlag==0" style="font-weight: bold;font-size: 13px;border-bottom: 1px black solid;border-top: 1px black solid;">{{item.bedNo}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {{item.name}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{item.inpatientNo}}</td>
+              <td v-if="item.showFlag==1" style="width: 20%">{{item.orderName}}</td>
+              <td  v-if="item.showFlag==1"  style="width: 8%">{{item.dose ?item.dose:''}}</td>
+              <td  v-if="item.showFlag==1" style="width: 8%">{{item.drugQuanStr}}</td>
+              <td  v-if="item.showFlag==1" style="width: 8%">{{item.supplyName}}</td>
+              <td  v-if="item.showFlag==1" style="width: 8%">{{item.frequCode}}</td>
+              <td  v-if="item.showFlag==1" style="width: 25%">{{item.occTimeStr}}</td>
+              <td  v-if="item.showFlag==1"  style="width: 8%"></td>
+              <td  v-if="item.showFlag==1" style="width: 8%"></td>
+              <td  v-if="item.showFlag==1" style="width: 8%">{{item.instruction}}</td>
+            </tr>
+            </tbody>
+          </table>
+        </div>
+        <div v-if="queryParam.executeFlag=='1'" id="smalPrintId">
+          <table class="pageTable">
+            <thead>
+            <tr>
+              <td colspan="6" style="width: 65%;border: none;">
+                <div style="font-size: 25px;text-align:center;font-weight:bold">
+                  执行项目表
+                </div>
+                <div style="float: right">
+                  打印日期:{{getFormatDatetime(new Date(),'YYYY-MM-DD')}}
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <td colspan="6" style="width: 753px;border: none;">
+                <div style="float: left;width: 25%">
+                  病房:{{getWardName(queryParam.wardCode)}}
+                </div>
+                <div style="float: left;width: 75%">
+                  日期:{{queryParam.executeTime}}至 {{getDiffDays(queryParam.executeTime.split(" ")[0],1)+" "+queryParam.executeTime.split(" ")[1]}}
+                </div>
+              </td>
+            </tr>
+            <tr>
+              <th  style="height: 27px;border-left: 1px solid black">医嘱名称</th>
+              <th >剂量</th>
+              <th  >给药方式</th>
+              <th  >频率</th>
+              <th colspan="2" style="text-align: center;border: 1px black solid">执行签名</th>
+            </tr>
+            </thead>
+            <tbody>
+            <tr v-for="(item,index) in resData">
+              <td colspan="4" v-if="item.showFlag==0" style="font-weight: bold;font-size: 13px;border: 1px black solid ; ">{{item.bedNo}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  {{item.name}}&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {{item.inpatientNo}}</td>
+              <td v-if="item.showFlag==1" style="width: 45%;border-left: 1px black solid">{{item.orderName}}</td>
+              <td  v-if="item.showFlag==1"  style="width: 10%">{{item.dose ?item.dose:''}}</td>
+              <td  v-if="item.showFlag==1" style="width: 15%">{{item.supplyName}}</td>
+              <td  v-if="item.showFlag==1" style="width: 10%">{{item.frequCode}}</td>
+              <td  v-if="item.showFlag==0"  style="width: 10%;border-left:  1px black solid;border-bottom:  none;border-right:  1px black solid;border-top: 1px black solid"></td>
+              <td  v-if="item.showFlag==0"  style="width: 10%;border-left:  1px black solid;border-bottom:  none;border-right:  1px black solid;border-top: 1px black solid"></td>
+              <td   v-if="item.showFlag==1"  style="width: 10%;border-left:  1px black solid;border-bottom: none;border-right:  1px black solid;border-top: none"></td>
+              <td  v-if="item.showFlag==1"  style="width: 10%;border-left:  1px black solid;border-bottom: none;border-right:  1px black solid;border-top: none"></td>
+            </tr>
+            <tr>
+              <td colspan="6"  style="border: 1px solid black;height: 0px"></td>
+            </tr>
+            </tbody>
+          </table>
+        </div>
+
+      </el-scrollbar>
+      <el-dialog
+          v-model="dialogVisible"
+          title="选择分类"
+          width="50%"
+      >
+       <ItemClass ref="itemClassRef"  :wardCode="queryParam.wardCode"  @closeDiag="closeDiag" @selectionPageClass="selectionPageClass" ></ItemClass>
+      </el-dialog>
+    </template>
+  </page-layer>
+</template>
+
+<script setup lang="ts" name='PrintExecuteItem'>
+import { computed, onMounted, ref } from 'vue'
+import { useStore } from 'vuex'
+import { getFormatDatetime,getDiffDays } from "@/utils/date"
+import { ElMessage, ElMessageBox } from 'element-plus'
+import {getAllWards} from "@/api/zhu-yuan-yi-sheng/resident-doctor";
+import {queryYpZdGroupName,queryYzYpPageNo} from "@/api/medical-advice/medical-common";
+import {queryPatientInfo} from "@/api/medical-advice/medical-advice-management";
+import {stringNotBlank} from "@/utils/blank-utils"
+import {queryExecuteItem,updateExecuteItemPrintFlag} from "@/api/medical-advice/excute-item";
+import PageLayer from "@/layout/PageLayer";
+import ItemClass from "@/components/medical-advice/ItemClass";
+import {getLodop, initLodop} from '@/utils/c-lodop'
+import {getWindowSize} from "@/utils/window-size";
+import {userInfoStore} from "@/utils/store-public";
+
+const queryParam = ref({
+  wardCode:'',
+  startBedNo:'',
+  endBedNo:'',
+  executeTime:getFormatDatetime(new Date(), 'YYYY-MM-DD' + ' 00:00:00'),
+  frequCodeFlag:'0',
+  printFlag:'1',
+  executeFlag:'0',
+  pageClass:'1',
+  classCode:'',
+  codes:[],
+  itemCode:'',
+})
+
+//选择分类切换
+const pageClassChange = () =>{
+   if(queryParam.value.pageClass === '0'){
+     dialogVisible.value = true
+   }else {
+     dialogVisible.value = false
+   }
+}
+
+const selectionPageClass = (val)=>{
+  console.log('pageClass',val)
+  queryParam.value.codes = val.codes
+  queryParam.value.classCode = val.classCode
+  queryParam.value.itemCode = val.itemCode
+}
+
+const closeDiag = ()=>{
+  dialogVisible.value = false
+}
+
+const dialogVisible = ref(false)
+
+const ward = ref([])
+
+const  getWardName = (code)=>{
+  for (let i = 0; i < ward.value.length; i++) {
+    if(code === ward.value[i].code ){
+      return ward.value[i].name
+    }
+  }
+}
+
+onMounted(()=>{
+  initLodop()
+  getAllWards().then((res:any)=>{
+    if(res){
+      ward.value = res
+      queryParam.value.wardCode = res[0].code
+      initPatintBedNo()
+    }
+  })
+
+})
+const patintList = ref([])
+const reverPatintList = computed(() => reverseArray(patintList.value))
+function reverseArray(arr) {
+  let newArr = [];
+  arr.forEach(element => {
+    // unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。
+    newArr.unshift(element);
+  });
+  return newArr;
+}
+
+const itemClassRef =ref(null)
+const resData = ref([])
+const queryInfo = ()=>{
+ queryExecuteItem(queryParam.value).then((res:any)=>{
+   resData.value = res
+ })
+}
+
+const printCss =`
+.pageTable tr th {
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+
+}
+ .pageTable tr td{
+   border-bottom:1px dashed black;
+   border-top:1px dashed black;
+   text-align: left;
+   font-size: 12px;
+   padding: 0 0;
+ }
+
+
+.pageTable tr td{
+  height: 27px;
+}
+
+#printId{
+  padding: 0 0;
+  width: 753px;
+}
+
+.pageTable {
+  border-collapse: collapse;
+}
+
+
+`
+
+const smallPrintCss =`
+.pageTable tr th {
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+
+}
+
+.pageTable tr td{
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+}
+
+.pageTable tr td{
+  height: 27px;
+}
+
+
+.pageTable {
+  border-collapse: collapse;
+}
+
+
+`
+
+
+const printInfo = ()=>{
+  updateExecuteItemPrintFlag(resData.value).then((res:any)=>{
+    let LODOP = getLodop()
+    LODOP.PRINT_INIT('执行项目表') // 初始化打印机 名字
+    if(queryParam.value.executeFlag=='0'){
+      LODOP.SET_PRINT_PAGESIZE(1, '210mm', '297mm', '') // 设置纸张大小  A4
+    }else {
+      LODOP.SET_PRINT_PAGESIZE(1, '148mm', '210mm', '') // 设置纸张大小  A5
+    }
+    LODOP.SET_PRINT_MODE('FULL_WIDTH_FOR_OVERFLOW', true) // 整宽不变形
+    if(queryParam.value.executeFlag=='0'){
+      LODOP.ADD_PRINT_TABLE('2mm', '5mm', '205mm', '220mm', '<style>' + printCss + '</style>' + '<body>' + document.getElementById('printId').innerHTML + '</body>') //要打印的内容
+      LODOP.SET_PRINT_STYLE('ItemType', 3)
+      LODOP.ADD_PRINT_TEXT('250mm', '100mm', '25mm', '10mm', '第#页/共&页')
+    }else {
+      LODOP.ADD_PRINT_TABLE('2mm', '5mm', '143mm', '165mm', '<style>' + smallPrintCss + '</style>' + '<body>' + document.getElementById('smalPrintId').innerHTML + '</body>') //要打印的内容
+      LODOP.SET_PRINT_STYLE('ItemType', 3)
+      LODOP.ADD_PRINT_TEXT('200mm', '70mm', '25mm', '10mm', '第#页/共&页')
+    }
+    LODOP.PREVIEW() // 关闭
+  })
+}
+
+const initPatintBedNo=()=>{
+  itemClassRef.value ? itemClassRef.value.setWardCode(queryParam.value.wardCode) : ''
+  queryPatientInfo('',queryParam.value.wardCode,'').then((res:any)=>{
+    patintList.value = res
+  })
+}
+</script>
+<style scoped lang="scss">
+ .pageTable tr th {
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+
+}
+#printId .pageTable tr td{
+   border-bottom:1px dashed black;
+   border-top:1px dashed black;
+   text-align: left;
+   font-size: 12px;
+   padding: 0 0;
+ }
+
+#smalPrintId .pageTable tr td{
+  border-bottom: 1px solid black;
+  border-top: 1px solid black;
+  text-align: left;
+  font-size: 12px;
+  padding: 0 0;
+}
+
+
+.pageTable tr td{
+  height: 27px;
+}
+ #smalPrintId{
+   padding: 0 0;
+   width: 470px;
+ }
+#printId{
+  padding: 0 0;
+  width: 753px;
+}
+
+.pageTable {
+  border-collapse: collapse;
+}
+</style>

+ 54 - 9
src/views/medical-advice/nursing-manage/PsInfo.vue

@@ -1,11 +1,19 @@
 <template>
         <el-container>
             <el-header>
+              <el-select v-if="wardFlag" filterable v-model="queryParam.curWard" @change="initPatintBedNo"
+                         style="width: 130px;margin-right: 10px" size="small">
+                <el-option v-for="item in ward" :key="item.code" :label="item.name" :value="item.code">
+                  <span style="color: #8492a6; font-size: 12px">{{ item.code }}</span>
+                  <el-divider direction="vertical"></el-divider>
+                  <span>{{ item.name }}</span>
+                </el-option>
+              </el-select>
                 床位范围:<el-select v-model="queryParam.startBedNo"
-                                :clearable="wardsClearable"
+                                :clearable="true"
                                 style="width: 110px"
             >
-                <el-option v-for="item in props.patintList"
+                <el-option v-for="item in patintList"
                            :key="item.bedNo"
                            :label="item.bedNo"
                            :value="item.bedNo">
@@ -43,7 +51,7 @@
             </el-header>
             <el-main>
                 <div style="width: 100%;">
-                <el-table :data="psInfo"  highlight-current-row stripe border show-overflow-tooltip :height="getWindowSize.h/1.2-140">
+                <el-table :data="psInfo"  highlight-current-row stripe border show-overflow-tooltip :height="props.height">
                     <el-table-column label="排序" type="index" width="40" />
                     <el-table-column prop="bedNo" label="床号" width="40" />
                     <el-table-column prop="inpatientNo" label="住院号"/>
@@ -86,6 +94,8 @@ import {onMounted,computed} from "vue";
 import {stringNotBlank} from "@/utils/blank-utils";
 import {ElMessage, ElMessageBox} from 'element-plus'
 import {getWindowSize} from "@/utils/window-size";
+import {queryPatientInfo} from "@/api/medical-advice/medical-advice-management";
+import {getAllWards} from "@/api/zhu-yuan-yi-sheng/resident-doctor";
 
 
 const props = defineProps({
@@ -96,9 +106,17 @@ const props = defineProps({
     curWard:{
         type: String,
         default:''
-    }
+    },
+  height:{
+      type:Number,
+    default:getWindowSize.value.h-50
+  }
 })
 
+
+
+
+const wardFlag = ref(true)
 const  queryInfo = ()=>{
     queryPsInfo(queryParam.value).then((res)=>{
         psInfo.value = res
@@ -121,8 +139,9 @@ const  savePsInfo = ()=>{
 const psInfo = ref([])
 
 
-const reverPatintList = computed(() => reverseArray(props.patintList))
+const reverPatintList = computed(() => reverseArray(patintList.value))
 
+const patintList = ref([])
 
 function reverseArray(arr) {
     let newArr = [];
@@ -139,15 +158,41 @@ const queryParam = ref({
     confirmFlag:'0'
 })
 
-const excuTime = ref(getFormatDatetime(new Date(),'HH:mm'))
+const ward =ref([])
+
 
 
+const excuTime = ref(getFormatDatetime(new Date(),'HH:mm'))
 
+const initPatintBedNo=()=>{
+  queryPatientInfo('',queryParam.value.curWard,'').then((res)=>{
+    patintList.value = res
+    if(patintList.value.length > 0){
+      queryParam.value.startBedNo  =patintList.value[0].bedNo ? patintList.value[0].bedNo:''
+      queryParam.value.endBedNo = patintList.value[patintList.value.length-1].bedNo ? patintList.value[patintList.value.length-1].bedNo : ''
+    }
+  })
+}
 
 onMounted(() => {
-    queryParam.value.curWard =props.curWard
-    queryParam.value.startBedNo = props.patintList[0].bedNo ? props.patintList[0].bedNo:''
-    queryParam.value.endBedNo = reverPatintList.value[0].bedNo ? reverPatintList.value[0].bedNo : ''
+  if(stringNotBlank(props.curWard)){
+    wardFlag.value =false
+  }
+  getAllWards().then((res) => {
+    if (res) {
+      ward.value = res
+      queryParam.value.curWard = stringNotBlank(props.curWard) ? props.curWard :  res[0].code
+      if(props.patintList.length > 0 ){
+        patintList.value = props.patintList
+        if(patintList.value.length > 0){
+          queryParam.value.startBedNo = patintList.value[0].bedNo ? patintList.value[0].bedNo:''
+          queryParam.value.endBedNo = reverPatintList.value[patintList.value.length-1].bedNo ? patintList.value[patintList.value.length-1].bedNo : ''
+        }
+      }else {
+        initPatintBedNo()
+      }
+    }
+  })
 })
 
 </script>

+ 1 - 1
src/views/medical-advice/nursing-manage/ThreeTestList.vue

@@ -244,7 +244,7 @@
         </el-container>
     </el-container>
     <el-dialog v-model="psDialogFlag"  title="皮试信息" destroy-on-close="true" style="width:75%;height:75% ">
-        <PsInfo :patintList="allPatientList" :curWard="curWard"></PsInfo>
+        <PsInfo :patintList="allPatientList" :curWard="curWard"  :height="getWindowSize.h/1.2-140"></PsInfo>
     </el-dialog>
 </template>