浏览代码

打印三测单

lihong 2 年之前
父节点
当前提交
95629ccc2d

+ 3 - 1
package.json

@@ -19,7 +19,8 @@
     "@vueuse/core": "^9.6.0",
     "axios": "^0.27.2",
     "clipboard": "^2.0.11",
-    "dayjs": "^1.10.6",
+    "d3": "^5.16.0",
+    "dayjs": "^1.11.7",
     "echarts": "^5.2.0",
     "element-plus": "^2.2.6",
     "file-saver": "^2.0.5",
@@ -34,6 +35,7 @@
     "vue": "^3.2.37",
     "vue-router": "^4.0.16",
     "vue3-json-viewer": "^2.2.2",
+    "vue3-print-nb": "^0.1.4",
     "vuex": "^4.0.2",
     "vxe-table": "^4.3.14",
     "xe-utils": "^3.5.7",

+ 25 - 1
src/api/medical-advice/nursing-manage.js

@@ -203,4 +203,28 @@ export function selectEmpInfo(keyWard) {
         method: 'get',
         params: {keyWard}
     })
-}
+}
+
+/**查询打印三测单的图表数据*/
+export function getChartData(data) {
+    return request({
+        url: '/medicalAdvice/nursingManagement/getChartData',
+        method: 'post',
+        data,
+    })
+}
+
+/**
+ * 查询有几周
+ * @param data
+ * @returns {AxiosPromise}
+ */
+export function getWeek(data) {
+    return request({
+        url: '/medicalAdvice/nursingManagement/getWeek',
+        method: 'post',
+        data,
+    })
+}
+
+

+ 1277 - 0
src/components/medical-advice/temperature/graphics.vue

@@ -0,0 +1,1277 @@
+<template>
+  <div class="table_wrap">
+    <div
+      :key="'comKey' + comKey"
+      class="container"
+      :style="{
+        marginTop: marginTop + 'px'
+      }"
+    >
+      <svg width="100%" height="100%"></svg>
+    </div>
+    <table class="temperatureChart">
+      <caption>
+        <p style="font-size: 20px; font-weight: bold">长沙泰和医院</p>
+        <p style="font-size: 20px; font-weight: bold">体温单</p>
+        <p style="position: relative; text-align: left">
+          <span class="tbale-label">&nbsp&nbsp;姓名:</span
+          ><span
+            style="display: inline-block; width: 75px; text-align: left"
+            >{{ patientInfo.name }}</span
+          >
+          <span class="tbale-label">年龄:</span>
+          <span
+            style="display: inline-block; width: 60px; text-align: left"
+            >{{ patientInfo.age + "岁"  }}</span
+          >
+          <span class="tbale-label">性别:</span>
+          <span
+            style="display: inline-block; width: 60px; text-align: left"
+            >{{ patientInfo.sexName }}</span
+          >
+          <span class="tbale-label">入院日期:</span>
+          <span
+                  style="display: inline-block; width: 100px; text-align: left"
+          >{{patientInfo.admissDate}}</span
+          >
+          <span class="tbale-label">科室:</span>
+          <span
+                  style="display: inline-block; width: 65px; text-align: left"
+          >{{ patientInfo.admissWardName }}</span
+          >
+          <span class="tbale-label">床号:</span>
+          <span
+            style="display: inline-block; width: 60px; text-align: left"
+            >{{ patientInfo.bedNo }}</span
+          >
+          <span class="tbale-label">住院号:</span>
+          <span
+            style="display: inline-block; width: 100px; text-align: left"
+            >{{ patientInfo.inpatientNo }}</span
+          >
+        </p>
+      </caption>
+
+      <thead></thead>
+      <tbody>
+        <tr>
+          <td
+            ref="topTd"
+            :colspan="index === 0 ? 8 : 6"
+            :class="[index && 'redLineTd', !index && 'table-just']"
+            v-for="(item, index) in inHospitalTime"
+            :key="index + '|indays'"
+          >
+            {{
+              index === 0
+                ? "日&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;期"
+                : item
+            }}
+          </td>
+        </tr>
+        <tr>
+          <td
+            :colspan="index === 0 ? 8 : 6"
+            :class="[index && 'redLineTd', !index && 'table-just']"
+            v-for="(item, index) in inHospitalDays"
+            :key="index + '|inHospitalDays'"
+          >
+            {{ index === 0 ? "住院天数" : item }}
+          </td>
+        </tr>
+        <tr>
+          <td
+            :colspan="index === 0 ? 8 : 6"
+            :class="[index && 'redLineTd', !index && 'table-just']"
+            v-for="(item, index) in surgeryDays"
+            :key="index + '|surgeryDays'"
+          >
+            {{ index === 0 ? "手术后天数" : item }}
+          </td>
+        </tr>
+        <tr>
+          <td class="table-just" rowspan="2" colspan="8">
+            时&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;间
+          </td>
+        </tr>
+        <tr>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText redLineTd">23</td>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText redLineTd">23</td>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText redLineTd">23</td>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText redLineTd">23</td>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText redLineTd">23</td>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText redLineTd">23</td>
+          <td class="focusText">3</td>
+          <td>7</td>
+          <td>11</td>
+          <td>15</td>
+          <td class="focusText">19</td>
+          <td class="focusText">23</td>
+        </tr>
+
+        <!-- <record></record> -->
+        <tr class="recorde temperature_mark">
+          <td colspan="2" rowspan="45" style="border-right: 1px solid white">
+            <div style="margin-top: 476px;height: 31px">
+              <p style="width:35px;">
+                <span>口表•</span>
+                <span style="color: blue">腋表x</span>
+                <span>肛表o</span>
+                <span style="color: red">脉搏•</span>
+                <span style="color: red">心率o</span>
+              </p>
+              <p></p>
+            </div>
+          </td>
+          <td colspan="3" rowspan="45">
+            <div style="color: red" class="num_wrapper">
+              <p style="margin-top: 0;text-align: right">脉搏次/分</p>
+              <p style="margin-top: 32px">180</p>
+              <p style="margin-top: 55px">160</p>
+              <p style="margin-top: 55px">140</p>
+              <p style="margin-top: 55px">120</p>
+              <p style="margin-top: 55px">100</p>
+              <p style="margin-top: 55px">80</p>
+              <p style="margin-top: 56px">60</p>
+              <p style="margin-top: 56px">40</p>
+            </div>
+          </td>
+          <td colspan="3" rowspan="45">
+            <div style="color: blue" class="num_wrapper">
+              <p style="margin-top: 0">体温<br />x</p>
+              <p style="margin-top: 32px">41</p>
+              <p style="margin-top: 55px">40</p>
+              <p style="margin-top: 55px">39</p>
+              <p style="margin-top: 55px">38</p>
+              <p style="margin-top: 55px">37</p>
+              <p style="margin-top: 55px">36</p>
+              <p style="margin-top: 56px">35</p>
+              <p style="margin-top: 56px">34</p>
+            </div>
+          </td>
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td0'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          >
+            <div class="recorde-text">{{ getSymbolTextArr(y) }}</div>
+          </td>
+        </tr>
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0]"
+          :key="index + 'tr1'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td1'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td2'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td2'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr2'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td3'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td4'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td4'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr3'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td5'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td6'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td6'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr4'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td7'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td8'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td8'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr5'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td9'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td10'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td10'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr6'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td11'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td11'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td11'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr7'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td12'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td12'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0]"
+          :key="index + 'tr8'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td13'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+        <tr class="recorde">
+          <template v-for="(item, index) of tdList">
+            <td
+              :key="index + 'td14'"
+              v-if="index % 6 === 5 && index != tdList.length"
+              style="
+                border-right: 1px solid #ff6e71;
+                border-bottom: 1px solid #7e7eff;
+              "
+            ></td>
+            <td
+              :key="index + 'td14'"
+              v-else
+              style="border-bottom: 1px solid #7e7eff"
+            ></td>
+          </template>
+        </tr>
+        <tr
+          class="recorde"
+          v-for="(tr, index) in [0, 0, 0, 0, 0]"
+          :key="index + 'tr9'"
+        >
+          <td
+            v-for="(item, y) in tdList"
+            :key="y + 'td15'"
+            :class="[y % 6 === 5 && y != tdList.length && 'redLineTd']"
+          ></td>
+        </tr>
+
+        <tr></tr>
+
+        <tr>
+          <td
+
+                  :colspan="index === 0 ? 8 : 1"
+                  v-for="(item, index) in array42"
+                  :class="[index && 'redLineTd']"
+                  :key="index + '|098'"
+          >
+            {{
+            index === 0
+            ? "呼吸(次/分)"
+            : typesViewData["098"] && typesViewData["098"][index - 1]
+            }}
+          </td>
+
+        </tr>
+        <tr>
+          <td
+
+                  :colspan="index === 0 ? 8 : 1"
+                  v-for="(item, index) in array42"
+                  :class="[index && 'redLineTd']"
+                  :key="index + '|099'"
+          >
+            {{
+            index === 0
+            ? "疼痛强度"
+            : typesViewData["099"] && typesViewData["099"][index - 1]
+            }}
+          </td>
+        </tr>
+        <tr>
+          <td
+                  :colspan="index === 0 ? 8 : 6"
+                  v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+                  :class="[index && 'redLineTd']"
+                  :key="index + '|005'"
+          >
+            {{
+            index === 0
+            ? "大便(次/日)"
+            : typesViewData["005"] && typesViewData["005"][index - 1]
+            }}
+          </td>
+        </tr>
+
+        <tr>
+          <td
+                  :colspan="index === 0 ? 8 : 6"
+                  v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+                  :class="[index && 'redLineTd']"
+                  :key="index + '|004'"
+          >
+            {{
+            index === 0
+            ? "小便(ml)"
+            : typesViewData["004"] && typesViewData["004"][index - 1]
+            }}
+          </td>
+        </tr>
+        <tr>
+          <td
+            :colspan="index === 0 ? 8 : 6"
+            v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+            :class="[index && 'redLineTd']"
+            :key="index + '|008'"
+          >
+            {{
+              index === 0
+                ? "血压(mmHg)"
+                : typesViewData["008"] && typesViewData["008"][index - 1]
+            }}
+          </td>
+        </tr>
+        <tr >
+          <td
+                  :colspan="index === 0 ? 8 : 6"
+                  v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+                  :class="[index && 'redLineTd']"
+                  :key="index + '|030'"
+          >
+            {{
+            index === 0
+            ? "身高(cm)"
+            : typesViewData["030"] && typesViewData["030"][index - 1]
+            }}
+          </td>
+        </tr>
+        <tr>
+          <td
+                  :colspan="index === 0 ? 8 : 6"
+                  v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+                  :class="[index && 'redLineTd']"
+                  :key="index + '|009'"
+          >
+            {{
+            index === 0
+            ? "体重(kg)"
+            : typesViewData["009"] && typesViewData["009"][index - 1]
+            }}
+          </td>
+        </tr>
+
+        <tr>
+          <td
+            :colspan="index === 0 ? 8 : 6"
+            v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+            :class="[index && 'redLineTd']"
+            :key="index + '|006'"
+          >
+            {{
+              index === 0
+                ? "入量"
+                : typesViewData["006"] && typesViewData["006"][index - 1]
+            }}
+          </td>
+        </tr>
+        <tr>
+          <td
+            :colspan="index === 0 ? 8 : 6"
+            v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+            :class="[index && 'redLineTd']"
+            :key="index + '|011'"
+          >
+            {{
+              index === 0
+                ? "出量"
+                : typesViewData["011"] && typesViewData["011"][index - 1]
+            }}
+          </td>
+        </tr>
+
+
+        <tr>
+          <td
+            :colspan="index === 0 ? 8 : 6"
+            v-for="(item, index) in [0, 1, 2, 3, 4, 5, 6, 7]"
+            :class="[index && 'redLineTd']"
+            :key="index + '|010'"
+          >
+            {{
+              index === 0
+                ? "过敏药物"
+                : typesViewData["010"] && typesViewData["010"][index - 1]
+            }}
+          </td>
+        </tr>
+      </tbody>
+    </table>
+    <div style="text-align: center">
+      <div style="font-size: 20px; font-weight: bold">
+        {{ `第${info.pageNo}页` }}
+      </div>
+    </div>
+  </div>
+</template>
+
+<script>
+import * as d3 from 'd3'
+import dayjs from 'dayjs'
+import { getKeyMap, SectionToChinese } from './utils'
+import {getChartData} from "@/api/medical-advice/nursing-manage";
+import { getFormatDatetime } from "@/utils/date"
+
+export default {
+  props: {
+    patientInfo: Object,
+    queryParam: Object,
+  },
+  data () {
+    return {
+      marginTop: 0,
+      keyMap: getKeyMap(),
+      info: {
+        age: 0,
+        beginDate: '',
+        potNo: '',
+        hospDate: 0,
+        admissDate:'',
+        bedNo:'',
+        inDate: 0,
+        inDiagName: null,
+        name: '',
+        dept: '',
+        sex: '',
+        pageNo: '1',
+        operaDays:[]
+      },
+      xyList: [],
+      typesInfo: [],
+      typesViewData: {},
+      breathData: [],
+      tdList: new Array(42).fill(0),
+      comKey: 1,
+      symbolTextArr: [],
+      array42:[],
+    }
+  },
+  computed: {
+    // 日期
+    inHospitalTime () {
+      const initday = dayjs(this.info.beginDate)
+      console.log('initday',initday)
+      return [
+        null, // 文案天
+        initday.format('YYYY-MM-DD'),
+        initday.add(1, 'day').format('MM-DD'),
+        initday.add(2, 'day').format('MM-DD'),
+        initday.add(3, 'day').format('MM-DD'),
+        initday.add(4, 'day').format('MM-DD'),
+        initday.add(5, 'day').format('MM-DD'),
+        initday.add(6, 'day').format('MM-DD')
+      ]
+    },
+    // 住院天数
+    inHospitalDays () {
+      const initday = this.info.hospDays || 0
+      return [
+        null, // 文案天
+        initday + 1,
+        initday + 2,
+        initday + 3,
+        initday + 4,
+        initday + 5,
+        initday + 6,
+        initday + 7
+      ]
+    },
+    // 手术天数
+    surgeryDays () {
+      const initday = this.info.operaDays
+      if (initday.length <=0) {
+        return new Array(8).fill(null)
+      } else {
+        return  initday
+      }
+    }
+  },
+  mounted () {
+    for (let i = 0; i < 43; i++) {
+      this.array42.push(i)
+    }
+    console.log('this.queryParam',this.queryParam)
+    this.initData()
+    console.log('this.info',this.info)
+    const marginTop =
+      (Math.round(this.$refs.topTd[0].getBoundingClientRect().height) - 18) *
+        10 +
+      28
+    this.marginTop = marginTop
+    // setTimeout(() => {
+    //   this.$emit('done')
+    // })
+  },
+  methods: {
+    SectionToChinese,
+    getSymbolTextArr (index) {
+      const current = this.symbolTextArr.find(i => i.x === index)
+      if (current) {
+        return current.y
+      } else {
+        return ''
+      }
+    },
+    temperatureConverter (c) {
+      const value = (c * 9) / 5 + 32
+      return value.toFixed(1)
+    },
+    initData () {
+      // this.info = dataModel.grParamBOS
+      this.info.pageNo = this.queryParam.week
+      this.info.beginDate =this.queryParam.startRecTime
+      this.info.hospDays = (Number(this.queryParam.week)-1)*7
+      // this.rowsInfo = dataModel.rows || []
+      // this.typesInfo = dataModel.types || []
+      let param = {
+        inpatientNo:this.patientInfo.inpatientNo,
+        admissTimes:this.patientInfo.admissTimes,
+        week:this.queryParam.week,
+        startRecTime:this.queryParam.startRecTime,
+        endRecTime:this.queryParam.endRecTime,
+        mbFlag:this.queryParam.checkBoxFlag.mbFlag,
+        hxFlag:this.queryParam.checkBoxFlag.hxFlag,
+        xyFlag:this.queryParam.checkBoxFlag.xyFlag,
+        wcyRqFlag:this.queryParam.checkBoxFlag.wcyRqFlag,
+      }
+      getChartData(param).then((res)=>{
+        console.log('resChar', res)
+        this.rowsInfo = res.rows
+        this.typesInfo = res.types
+        this.info.operaDays = res.operaDays
+        this.init()
+      })
+    },
+    init () {
+      //800 758
+      var width = 690
+      var height = 682
+      // SVG画布边缘与图表内容的距离
+      var padding = { top: 50, right: 0, bottom: 50, left: 50 }
+      // 创建一个分组用来组合要画的图表元素
+      var main = d3
+        .select('.container svg')
+        .append('g')
+        .classed('main', true)
+        .attr('transform', 'translate(' + 80 + ',' + 80 + ')')
+      // 模拟数据 体温
+      var dataset = getTypeData('003', this.rowsInfo)
+      console.log(dataset, '腋表')
+      var datasetAnus = getTypeData('015', this.rowsInfo)
+      console.log(datasetAnus, '肛表【黑空圆】')
+      var datasetHeartrate = getTypeData('014', this.rowsInfo)
+      console.log(datasetHeartrate, '心率【红空圆】')
+      var datasetPulse = getTypeData('002', this.rowsInfo)
+      console.log(datasetPulse, '脉搏【红实圆】')
+      var symbolTextArr = getTypeData('012', this.rowsInfo, false)
+      this.symbolTextArr = symbolTextArr
+      console.log(symbolTextArr, '【特殊标记】')
+      // 口表【黑实圆】
+      var datasetPain = getTypeData('001', this.rowsInfo)
+      this.breathData = datasetPain
+      console.log(datasetPain, '口表【黑实圆】')
+      // const circleNode = document.createElement('circle')
+      // circleNode.setAttribute('cx', '179.2439024390244')
+      // circleNode.setAttribute('cy', '582')
+      // circleNode.setAttribute('r', '4')
+      // circleNode.setAttribute('stroke', '#000000')
+      // circleNode.setAttribute('stroke-width', '1')
+      // circleNode.setAttribute('fill', '#FFFFFF')
+      // document.querySelector('.main').appendChild(circleNode)
+      // 创建x轴的比例尺(线性比例尺)
+      var xScale = d3.scaleLinear()
+        .domain([0, 41])
+        .range([9, width - padding.left - padding.right +75])
+      // 创建y轴的比例尺(线性比例尺)
+
+      /* var yScale = d3.scale.linear()
+                        .domain([0, d3.max(dataset,function(d) {
+                            return d.y;
+                        })])
+                        .range([height - padding.top - padding.bottom, 0]); */
+      // 体温
+      var yScale = d3.scaleLinear()
+              .domain([33, 42])
+              .range([height - padding.top - padding.bottom , -56])
+      // 脉搏
+      var yScale1 = d3.scaleLinear()
+              .domain([20, 200])
+              .range([height - padding.top - padding.bottom , -55])
+      // 呼吸
+      var yScale2 = d3.scaleLinear()
+        .domain([0, 40])
+        .range([height - padding.top + 22, -55])
+
+      // 创建x轴
+      var xAxis = d3.axisBottom()
+        .scale(xScale)
+      // 创建y轴
+      var yAxis = d3.axisLeft()
+        .scale(yScale)
+      var yAxis1 = d3.axisLeft()
+        .scale(yScale1)
+      var yAxis2 = d3.axisLeft()
+        .scale(yScale2)
+
+      // 添加SVG元素并与x轴进行“绑定”
+      main
+        .append('g')
+        .attr('class', 'axis')
+        .attr(
+          'transform',
+          'translate(0,' + (height - padding.top - padding.bottom) + ')'
+        )
+        .call(xAxis)
+
+      // 添加SVG元素并与y轴进行“绑定”
+      main
+        .append('g')
+        .attr('class', 'axis')
+        .call(yAxis)
+      main
+        .append('g')
+        .attr('class', 'axis')
+        .call(yAxis1)
+      main
+        .append('g')
+        .attr('class', 'axis')
+        .call(yAxis2)
+
+      // 添加折线
+      var line = d3.line()
+        .x(function (d) {
+          return xScale(d.x)
+        })
+        .y(function (d) {
+          return yScale(d.y)
+        })
+      var line1 = d3
+        .line()
+        .x(function (d) {
+          return xScale(d.x)
+        })
+        .y(function (d) {
+          return yScale1(d.y)
+        })
+      var line2 = d3
+        .line()
+        .x(function (d) {
+          return xScale(d.x)
+        })
+        .y(function (d) {
+          return yScale(d.y)
+        })
+        // .interpolate('linear')
+      // 选择线条的类型
+
+      // 添加path元素,并通过line()计算出值来赋值
+      main
+        .append('path')
+        .attr('class', 'line tiwenline')
+        .attr('d', line(dataset))
+      main
+        .append('path')
+        .attr('class', 'line')
+        .attr('d', line(datasetAnus))
+      main
+        .append('path')
+        .attr('class', 'line')
+        .attr('d', line2(datasetPain))
+      main
+        .append('path')
+        .attr('class', 'line redColor')
+        .attr('d', line1(datasetHeartrate))
+      main
+        .append('path')
+        .attr('class', 'line redColor')
+        .attr('d', line1(datasetPulse))
+      // main.append('path').attr('class', 'line').attr('d', line3(dataset))
+
+      // 添加点
+
+      /* 黑实圆--start */
+      // main
+      //   .selectAll('rect')
+      //   .data(dataset_mouth)
+      //   .enter()
+      //   .append('circle')
+      //   .attr('cx', function (d) {
+      //     return xScale(d.x)
+      //   })
+      //   .attr('cy', function (d) {
+      //     return yScale(d.y)
+      //   })
+      //   .attr('r', 4)
+      //   .attr('fill', function (d, i) {
+      //     return 'black'
+      //   })
+      /* 黑实圆--end */
+
+      /* 黑空圆--start */
+      main
+        .selectAll('rect')
+        .data(datasetAnus)
+        .enter()
+        .append('circle')
+        .attr('cx', function (d) {
+          return xScale(d.x)
+        })
+        .attr('cy', function (d) {
+          return yScale(d.y)
+        })
+        .attr('r', 4)
+        .attr('stroke', '#000000')
+        .attr('stroke-width', 1)
+        .attr('fill', '#FFFFFF')
+      /* 黑空圆--end */
+
+      /* 红空圆--start */
+      main
+        .selectAll('rect')
+        .data(datasetHeartrate)
+        .enter()
+        .append('circle')
+        .attr('cx', function (d) {
+          return xScale(d.x)
+        })
+        .attr('cy', function (d) {
+          return yScale1(d.y)
+        })
+        .attr('r', 4)
+        .attr('stroke', '#EE0000')
+        .attr('stroke-width', 1)
+        .attr('fill', '#FFFFFF')
+      /* 红空圆--end */
+
+      /* 红实圆--start */
+      main
+        .selectAll('rect')
+        .data(datasetPulse)
+        .enter()
+        .append('circle')
+        .attr('cx', function (d) {
+          return xScale(d.x)
+        })
+        .attr('cy', function (d) {
+          return yScale1(d.y)
+        })
+        .attr('r', 4)
+        .attr('fill', '#EE0000')
+        // .on('mouseover', function (d) {
+        //   // (1)取得提示显示的位置
+        //   var xPosition = parseFloat(d3.select(this).attr('cx')) + 698
+        //   var yPosition = parseFloat(d3.select(this).attr('cy')) + 24
+        //
+        //   // (2)创建提示条SVG
+        //   d3.select('.container svg')
+        //     .append('text')
+        //     .attr('id', 'tooltip') // 设置id便于移除提示
+        //     .attr('x', xPosition)
+        //     .attr('y', yPosition)
+        //     .attr('text-anchor', 'middle')
+        //     .attr('font-family', 'sans-setif')
+        //     .attr('font-size', '11px')
+        //     .attr('font-weight', 'bold')
+        //     .attr('fill', 'white')
+        //     .text(d.value)
+        // })
+      // (3)移除提示条SVG
+
+      /* 红实圆--end */
+      /* 黑实圆--start */
+      main
+        .selectAll('rect')
+        .data(datasetPain)
+        .enter()
+        .append('circle')
+        .attr('cx', function (d) {
+          return xScale(d.x)
+        })
+        .attr('cy', function (d) {
+          return yScale(d.y)
+        })
+        .attr('r', 4)
+        .attr('stroke', '#000000')
+        .attr('fill', '#000000')
+      /* 黑实圆--end */
+      this.drawx(main, dataset, xScale, yScale)
+      this.initTypes()
+      // this.hoverEvent(main)
+    },
+    drawx (main, dataset, xScale, yScale) {
+      /* 【叉形】--start */
+      main
+        .selectAll('rect')
+        .data(dataset)
+        .enter()
+        .append('line')
+        .attr('x1', function (d) {
+          return xScale(d.x) - 4
+        })
+        .attr('y1', function (d) {
+          return yScale(d.y) - 4
+        })
+        .attr('x2', function (d) {
+          return xScale(d.x) + 4
+        })
+        .attr('y2', function (d) {
+          return yScale(d.y) + 4
+        })
+        .attr('stroke', function (d, i) {
+          return 'blue'
+        })
+
+      main
+        .selectAll('rect')
+        .data(dataset)
+        .enter()
+        .append('line')
+        .attr('x1', function (d) {
+          return xScale(d.x) + 4
+        })
+        .attr('y1', function (d) {
+          return yScale(d.y) - 4
+        })
+        .attr('x2', function (d) {
+          return xScale(d.x) -4
+        })
+        .attr('y2', function (d) {
+          return yScale(d.y) + 4
+        })
+        .attr('stroke', function (d,i) {
+          return 'blue'
+        })
+      /* 体温【叉形】--end */
+    },
+    hoverEvent (main) {
+      ///* 鼠标悬停直线--start
+      //         var dataset_line = [{x: 0,y: 0}]
+      //         main.selectAll('rect')
+      //           .data(dataset_line)
+      //           .enter()
+      //           .append('line')
+      //           .attr({
+      //             'x1':100,'y1':-56,
+      //             'x2':100,'y2':582
+      //           })
+      //           .attr('stroke', function(d, i) {
+      //             return 'black';
+      //           });
+            //  鼠标悬停直线--end */
+      document.querySelector('.lineColor').style.stroke = 'red'
+      const recordeNode = document.createElement('div')
+      recordeNode.setAttribute('class', 'recorde-text')
+      document.querySelector('.recorde td').append(recordeNode)
+      const allTrtd = document.querySelectorAll('.temperatureChart tr td');
+      [...allTrtd].map(ele => {
+        ele.setAttribute('title', ele.innerText)
+      })
+      /* 鼠标悬停提示框 */
+      var tooltip = d3
+        .select('body')
+        .append('div')
+        .attr('class', 'tooltip')
+        .style('opacity', 0.0)
+
+      main
+        .on('mouseover', function (d) {
+          console.log(d3.event, 'dinfo')
+          console.log(this, d, this.data, 'this dinfo')
+          /*
+                    鼠标移入时,
+                    (1)通过 selection.html() 来更改提示框的文字
+                    (2)通过更改样式 left 和 top 来设定提示框的位置
+                    (3)设定提示框的透明度为1.0(完全不透明)
+                    */
+          tooltip
+            .html('呼吸:19次/分<br/>录入信息:2017-11-02<br/>姓名:张三')
+            .style('left', d3.event.pageX + 'px')
+            .style('top', d3.event.pageY + 20 + 'px')
+            .style('opacity', 1.0)
+          console.log(d3.event.target)
+        })
+        .on('mousemove', function (d) {
+          /* 鼠标移动时,更改样式 left 和 top 来改变提示框的位置 */
+          tooltip
+            .style('left', d3.event.pageX + 'px')
+            .style('top', d3.event.pageY + 20 + 'px')
+          // console.log(d3.event.target);
+        })
+        .on('mouseout', function (d) {
+          /* 鼠标移出时,将透明度设定为0.0(完全透明) */
+
+          tooltip.style('opacity', 0.0)
+        })
+    },
+    initTypes () {
+      const keyMap = {}
+      this.typesInfo.map(item => {
+        const key = item.typeCode
+        if (keyMap[key]) {
+          keyMap[key].push(item.typeValue)
+        } else {
+          keyMap[key] = [item.typeValue]
+        }
+      })
+      this.typesViewData = keyMap
+      console.log('this.typesViewData',this.typesViewData)
+    }
+  }
+}
+
+function getTypeData (type, allData = [], isNumber = true) {
+  return allData
+    .map((rowBOSItem, index) => {
+      const rowBOS = rowBOSItem.rowBOS
+      const cur =
+        rowBOS.find(item => {
+          return item.typeCode === type
+        }) || {}
+      return { x: index, y: (isNumber ? +cur.typeValue : cur.typeValue) || '' }
+    })
+    .filter(item => {
+      return item.y !== ''
+    })
+}
+</script>
+
+<style  scoped>
+  .table_wrap {
+    line-height: normal;
+  }
+  table {
+    font-weight: normal;
+    border-collapse: collapse;
+    font-size: 8px;
+    text-align: center;
+    width: 100%;
+    table-layout: fixed;
+    border: 2px #2f4f4f solid;
+  }
+  td {
+    border: 1px solid #ccc;
+    width: 12px;
+    height: 11px;
+  }
+  .redLineTd {
+    border-right: 1px solid #ff6e71;
+  }
+  .recorde-text {
+    width: 13px;
+    height: 8px;
+    color: #ff0000;
+    font-size: 10px;
+    position: relative;
+    top: -4px;
+  }
+  .table_wrap {
+    position: relative;
+    margin: 0 auto;
+    width: 835px;
+  }
+  .container {
+    /* 高度最好动态计算,不然很容易错位*/
+
+    margin: 30px auto;
+    margin-top: 28px;
+    width: 805px;
+    height: 758px;
+    position: absolute;
+    top: 142px;
+    left: 28px;
+  }
+  .temperature_mark td p {
+    position: relative;
+    top: 0;
+    margin-top: 58px;
+  }
+  .num_wrapper {
+    width: 35px;
+    height: 636px;
+    position: relative;
+  }
+  .pain_wrapper {
+    position: absolute;
+    width: 100%;
+    height: 70px;
+    right: 0;
+    bottom: -3px;
+    border: 1px solid #ccc;
+  }
+  .zeroline {
+    fill: none;
+    stroke: red;
+    stroke-width: 0.5px;
+    stroke-dasharray: 5 5;
+  }
+  .zerolinetext {
+    fill: red;
+  }
+  .overlay {
+    fill: none;
+    stroke: none;
+    pointer-events: all;
+  }
+  .tooltip {
+    font-family: "宋体";
+    font-size: 10px;
+    line-height: 16px;
+    color: #736269;
+    width: auto;
+    height: auto;
+    padding: 4px;
+    position: absolute;
+    text-align: left;
+    border: 1px solid #736269;
+    background-color: #e7e9f3;
+    border-radius: 2px;
+    background: linear-gradient(#fefdff, #e5e5f1);
+    /* 标准的语法(必须放在最后) */
+
+  }
+
+</style>
+<style >
+  .table_wrap {
+    font-family: "Microsoft YaHei", "Helvetica Neue", Helvetica, Arial, sans-serif;
+  }
+  .table_wrap .tick,
+  .table_wrap .domain {
+    display: none;
+  }
+  .table_wrap .tbale-label {
+    font-weight: 700;
+  }
+  .table_wrap .focusLine {
+    fill: none;
+    stroke: red;
+    stroke-width: 0.5px;
+  }
+  .table_wrap .focusText {
+    color: red;
+  }
+  .table_wrap .breath_td_odd {
+    vertical-align: top;
+    font-size: 10px;
+  }
+  .table_wrap .breath_td_even {
+    vertical-align: bottom;
+    font-size: 10px;
+  }
+  .table_wrap .line {
+    fill: none;
+    stroke: black;
+    stroke-width: 2px;
+  }
+  .table_wrap .line.tiwenline {
+    stroke: blue;
+    fill: none;
+  }
+
+  .table_wrap .line.redColor{
+    stroke: red;
+    fill: none;
+  }
+  .table_wrap .axis path,
+  .table_wrap .axis line,
+  .table_wrap .line {
+    stroke: #000;
+    fill: none;
+  }
+  .table_wrap .legend {
+    display: flex;
+  }
+  .table_wrap .legend .legend-text {
+    display: flex;
+  }
+  .table_wrap .legend .legend-item {
+    margin-right: 20px;
+  }
+
+</style>

+ 82 - 0
src/components/medical-advice/temperature/utils.js

@@ -0,0 +1,82 @@
+export function getKeyMap () {
+  const neworold = 1
+  const selectMap = {
+    '001': '呼吸',
+    '002': '脉搏',
+    '003': '体温',
+    '004': '小便',
+    '005': '大便',
+    '007': '腹围',
+    '008': '血压',
+    '009': '体重',
+    '012': '特殊标记',
+    '013': '标记内容',
+    '014': '心率',
+    '015': '物理降温',
+    '016': '宝宝体重',
+    '017': '母乳摄入',
+    '018': '人工摄入',
+    '019': '混合摄入',
+    '020': '糖水摄入',
+    '021': '其它摄入',
+    '022': '皮肤',
+    '023': '眼睛',
+    '024': '口腔',
+    '025': '脐带',
+    '026': '大便颜色',
+    '027': '大便性质',
+    '028': '小便出量',
+    '029': '呕吐次数',
+    '030': '身高'
+  }
+  if (neworold === 2) {
+    selectMap['006'] = '入水量'
+    selectMap['010'] = '皮试'
+    selectMap['011'] = '其他出量'
+  } else {
+    selectMap['006'] = '入水量'
+    // selectMap['006'] = '总入量'
+    selectMap['010'] = '药物过敏'
+    selectMap['011'] = '出水量'
+  }
+  return selectMap
+}
+
+export function SectionToChinese (section) {
+  if (!section) return ''
+  var chnNumChar = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
+  var chnUnitChar = ['', '十', '百', '千', '万', '亿', '万亿', '亿亿']
+  var strIns = ''
+  var chnStr = ''
+  var unitPos = 0
+  var zero = true
+  while (section > 0) {
+    var v = section % 10
+    if (v === 0) {
+      if (!zero) {
+        zero = true
+        chnStr = chnNumChar[v] + chnStr
+      }
+    } else {
+      zero = false
+      strIns = chnNumChar[v]
+      strIns += chnUnitChar[unitPos]
+      chnStr = strIns + chnStr
+    }
+    unitPos++
+    section = Math.floor(section / 10)
+  }
+  return chnStr
+}
+
+export function getOS () {
+  if (navigator.userAgent.indexOf('Window') > 0) {
+    return 'windows'
+  } else if (navigator.userAgent.indexOf('Mac OS X') > 0) {
+    return 'mac '
+  } else if (navigator.userAgent.indexOf('Linux') > 0) {
+    return 'linux'
+  } else {
+    return ''
+  }
+}

+ 4 - 0
src/main.js

@@ -15,6 +15,7 @@ import DataVVue3 from '@kjgl77/datav-vue3'
 import tip from '@/instructions/tip'
 import VXETable from 'vxe-table'
 import 'vxe-table/lib/style.css'
+import print from 'vue3-print-nb'
 
 addRoutes()
 
@@ -36,6 +37,9 @@ app.use(ElementPlus, {locale: zhCn, size: store.state.app.elementSize})
 app.use(store)
 app.use(router)
 app.use(DataVVue3)
+app.use(print)
+tip(app)
+
 app.use(VXETable)
 app.use(JsonViewer);
 app.mount('#app')

+ 6 - 1
src/router/modules/dashboard.js

@@ -885,7 +885,12 @@ const route = [
                 path: 'nursingManagement/nursingRecord',
                 component: createNameComponent(() => import('@/views/medical-advice/nursing-manage/NursingRecord.vue')),
                 meta: {title: '护理记录'},
-            }
+            },
+            {
+                path: 'nursingManagement/printThreeTestList',
+                component: createNameComponent(() => import('@/views/medical-advice/nursing-manage/PrintThreeTestList.vue')),
+                meta: {title: '打印三测单'},
+            },
         ],
     },
 ];

+ 137 - 0
src/views/medical-advice/nursing-manage/PrintThreeTestList.vue

@@ -0,0 +1,137 @@
+<template>
+    <el-container>
+        <el-aside width="280px">
+            <PatientBaseList  @selectPatientInfo="selectPatientInfo"></PatientBaseList>
+        </el-aside>
+        <el-container>
+            <el-header style="height: 100px">
+                <PatientInfo :patientInfo="patientInfo"></PatientInfo>
+
+            </el-header>
+
+            <el-main>
+               <div style="margin-bottom: 10px">
+                   <div style="width: 100%;height: 20px;padding-left: 10px;" >
+                       查询日期
+                       <el-input :disabled="true" v-model="queryParam.startRecTime" style="width: 80px"></el-input>
+                       至
+                       <el-input :disabled="true"  v-model="queryParam.endRecTime" style="width: 80px"></el-input>
+                       <el-select  filterable v-model="queryParam.week" style="width: 100px;" size="small" @change="selectWeek">
+                           <el-option v-for="item in weekList" :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-button icon="Search" type="primary" @click="queryInfo">查询</el-button>
+                       <el-button icon="Printer" type="success" v-print="'#scdPrint'">打印</el-button>&nbsp;
+                       <el-checkbox v-model="checkBoxFlag.mbFlag" label="脉搏" size="small" />
+                       <el-checkbox v-model="checkBoxFlag.hxFlag" label="呼吸" size="small" />
+                       <el-checkbox v-model="checkBoxFlag.xyFlag" label="血压" size="small" />
+                       <el-checkbox v-model="checkBoxFlag.wcyRqFlag" label="无出院日期" size="small" />
+                   </div>
+               </div>
+                <el-scrollbar height="600px">
+                    <div id="scdPrint" style="background:white;">
+                        <Graphics v-if="graphicsFlag"  :patientInfo="patientInfo" :queryParam="queryParam"></Graphics>
+                    </div>
+                </el-scrollbar>
+            </el-main>
+        </el-container>
+    </el-container>
+</template>
+
+
+<script setup name='PrintThreeTestList'>
+import  Graphics from '@/components/medical-advice/temperature/graphics'
+import PatientInfo from "@/components/medical-advice/PatientInfo.vue"
+import PatientBaseList from "@/components/medical-advice/PatientBaseList.vue"
+import {stringNotBlank} from "@/utils/blank-utils"
+import { getFormatDatetime } from "@/utils/date"
+import {getAllWards} from "@/api/zhu-yuan-yi-sheng/resident-doctor";
+import {getWeek} from "@/api/medical-advice/nursing-manage";
+
+import { ref, onMounted,nextTick } from 'vue'
+
+const queryParam = ref(
+    {
+        startRecTime:'',
+        endRecTime:'',
+        week:'',
+        }
+)
+//选中第几周
+const selectWeek = (val)=>{
+    queryParam.value.startRecTime = weekMap.value['ev_'+val].startDate
+    queryParam.value.endRecTime = weekMap.value['ev_'+val].endDate
+}
+//下拉框 周
+const weekList = ref([])
+
+const weekMap = ref({})
+
+const checkBoxFlag = ref({
+    mbFlag:true,
+    hxFlag:true,
+    xyFlag:true,
+    wcyRqFlag:false
+})
+
+onMounted(() => {
+
+})
+
+const graphicsFlag = ref(false)
+
+// 基本信息
+const patientInfo = ref({})
+
+const queryInfo = ()=>{
+    queryParam.value['checkBoxFlag'] = checkBoxFlag.value
+    graphicsFlag.value = false
+    nextTick(() => {
+        graphicsFlag.value = true
+    })
+}
+
+
+const selectPatientInfo=(val)=>{
+    patientInfo.value =  val.patientInfo
+    patientInfo.value.admissDate =getFormatDatetime(val.patientInfo.admissDate,'YYYY-DD-MM')
+    getWeek({inpatientNo:val.patientInfo.inpatientNo,admissTimes:val.patientInfo.admissTimes}).then((res)=>{
+        weekMap.value = res
+        weekList.value = []
+        for (let i = 1; i <= res.totalWeek; i++) {
+            let temp = {}
+            temp['code'] = i;
+            temp['name'] = `第${i}周`;
+            weekList.value.push(temp)
+        }
+        queryParam.value.week = 1
+        selectWeek(1)
+        queryInfo()
+    })
+}
+
+
+
+</script>
+
+<style  scoped>
+
+    .nav{
+        margin: 0 auto;
+        width: 100%;
+        padding-left: 20px;
+    }
+    ul{
+        list-style: none;
+        width: 100%;
+    }
+    .nav li{
+        float: left;
+        margin-left: 15px;
+
+    }
+
+</style>