Jelajahi Sumber

Merge branch 'hotfix/辩证'

cc12458 8 bulan lalu
induk
melakukan
e20bc69a36

+ 14 - 0
jsconfig.json

@@ -0,0 +1,14 @@
+{
+  "compilerOptions": {
+    "target": "ES6",
+    "module": "commonjs",
+    "allowSyntheticDefaultImports": true,
+    "baseUrl": "./",
+    "paths": {
+      "@/*": ["src/*"]
+    }
+  },
+  "exclude": [
+    "node_modules"
+  ]
+}

+ 5 - 0
package-lock.json

@@ -8781,6 +8781,11 @@
         "renderkid": "^2.0.4"
       }
     },
+    "print-js": {
+      "version": "1.6.0",
+      "resolved": "https://registry.npmjs.org/print-js/-/print-js-1.6.0.tgz",
+      "integrity": "sha512-BfnOIzSKbqGRtO4o0rnj/K3681BSd2QUrsIZy/+WdCIugjIswjmx3lDEZpXB2ruGf9d4b3YNINri81+J0FsBWg=="
+    },
     "process": {
       "version": "0.11.10",
       "resolved": "https://registry.npmmirror.com/process/download/process-0.11.10.tgz",

+ 1 - 0
package.json

@@ -13,6 +13,7 @@
     "dayjs": "^1.11.13",
     "echarts": "^4.8.0",
     "element-ui": "^2.15.14",
+    "print-js": "^1.6.0",
     "vue": "^2.6.11",
     "vue-print-nb": "^1.7.4",
     "vue-router": "^3.2.0",

+ 27 - 0
public/print/DiseaseD.css

@@ -0,0 +1,27 @@
+@media print {
+    .msg-item {
+        font-size: 16px;
+        font-family: PingFang SC;
+        font-weight: 400;
+        color: #333333;
+        margin-bottom: 10px;
+    }
+
+    .msg-item span {
+        flex: none;
+        width: 80px;
+        text-align-last: justify;
+        text-align: justify;
+    }
+    .msg-item div {
+        flex: auto;
+    }
+
+
+    /* common */
+    .flex-plane-center-l {
+        display: flex;
+        justify-content: flex-start;
+        align-items: flex-start;
+    }
+}

+ 67 - 0
public/print/DoctorCaseD.css

@@ -0,0 +1,67 @@
+@media print {
+    .msg-info {
+        display: block;
+        margin-bottom: 18px;
+        padding-bottom: 8px;
+        border-bottom: 1px #000 dashed;
+    }
+    .msg-item {
+        font-size: 16px;
+        font-family: PingFang SC;
+        font-weight: 400;
+        color: #333333;
+        margin-bottom: 10px;
+    }
+
+    .msg-item span {
+        flex: none;
+        width: 80px;
+        text-align-last: justify;
+        text-align: justify;
+    }
+
+    .msg-item div {
+        flex: auto;
+    }
+
+    .recipe-right {
+        font-size: 16px;
+        font-weight: 500;
+    }
+
+    .recipe-right .title {
+        color: #5386f6;
+        margin: 12px 0;
+    }
+
+    .r-msg-item {
+        margin-bottom: 15px;
+    }
+
+    .r-msg-item .name {
+        flex: none;
+        width: 80px;
+        text-align-last: justify;
+        text-align: justify;
+    }
+
+    .r-msg-item .right {
+        flex: auto;
+    }
+
+    .r-msg-item .prescription span {
+        margin: 8px 12px 0 0;
+    }
+
+
+    /* common */
+    .flex-plane-center-l {
+        display: flex;
+        justify-content: flex-start;
+        align-items: flex-start;
+    }
+
+    .flex-wrap {
+        flex-wrap: wrap;
+    }
+}

+ 32 - 0
public/print/PrescriptionD.css

@@ -0,0 +1,32 @@
+@media print {
+    .detail-item {
+        font-size: 16px;
+        font-family: PingFang SC;
+        font-weight: 400;
+        color: #333333;
+        margin-bottom: 10px;
+    }
+
+    .detail-item .title {
+        flex: none;
+        width: 90px;
+        text-align-last: justify;
+    }
+
+    .detail-item .right {
+        flex: auto;
+    }
+
+    .detail-item span {
+        display: inline-block;
+        margin-right: 30px;
+    }
+
+
+    /* common */
+    .flex-plane-center-l {
+        display: flex;
+        justify-content: flex-start;
+        align-items: flex-start;
+    }
+}

+ 14 - 0
public/print/containers.css

@@ -0,0 +1,14 @@
+@media print {
+    @page {
+        size: A4;
+    }
+
+
+    .no-print {
+        display: none !important;
+    }
+
+    .print-containers {
+        white-space: pre-wrap;
+    }
+}

+ 3 - 0
src/api/system.js

@@ -419,6 +419,9 @@ export function getDataByKey(data) {
            case 'transitionPr': return {
                enabled: !res.ResultInfo || res.ResultInfo === '0',
            }
+           case 'showPrintHTML': return {
+               enabled: res.ResultInfo === '0',
+           }
            default: return res;
        }
     });

+ 1 - 1
src/components/ChineseMedicine.vue

@@ -1842,7 +1842,7 @@ export default {
       
       if (obj.dose == null) {
         obj.oldDose = CC_Dosage2Basis(scope.row)
-        obj.dose = CC_Basis2Dosage(obj)
+        obj.dose = CC_Basis2Dosage(obj, (value) => !obj.unit || ['g', '克'].includes(obj.unit) || Number.isInteger(value))
       }
 
       const m = Object.assign(totalData[scope.row.id - 1], obj);

+ 1 - 1
src/router/knowledge.js

@@ -74,7 +74,7 @@ export default [{
         name: 'doctorcased',
         component: () => import('@/views/knowledge/DoctorCaseD.vue'),
         meta: {
-            title: '名医案详情',
+            title: '名医案详情',
             pftitle: '名医名方'
         }
     },

+ 5 - 4
src/utils/medicine.js

@@ -16,11 +16,12 @@ export function CC_Dosage2Basis({dose = 0, xbzxs = 1}) {
  * @param medicine 药品
  * @param {number} medicine.oldDose 基础剂量
  * @param {number} medicine.xbzxs 转换系数
- * @param {boolean=false} keep 保留计算结果
+ * @param {((value: number, oldValue: number) => boolean) | boolean=true} keep 保留计算结果
  * @returns {number} 输入剂量
  */
-export function CC_Basis2Dosage({oldDose = 0, xbzxs = 1}, keep = false) {
-    console.log('log-->CC_Basis2Dosage', `basis: ${oldDose}, xbzxs: ${xbzxs}`);
+export function CC_Basis2Dosage({oldDose = 0, xbzxs = 1}, keep = true) {
+    console.log('log-->CC_Basis2Dosage', `basis: ${oldDose}, xbzxs: ${xbzxs}; keep=${typeof keep === 'function' ? '计算' : keep}`);
     if (!xbzxs || xbzxs === 1) return +oldDose;
-    return +oldDose / xbzxs;
+    const value= +oldDose / xbzxs;
+    return (typeof keep === 'function' ? keep(value, oldDose) : keep) ? value : null;
 }

+ 4 - 0
src/utils/minix/prescribing.js

@@ -1,4 +1,5 @@
 import { getMaxMinDoaseNumber, getRationalSafeUse } from '@/api/diagnosis.js'
+import {addRecipeFrom} from '@/api/dataAnalysis';
 
 let hack_openAddress_true;
 
@@ -81,9 +82,12 @@ export default {
         },
         openPrec() {
             this.showPresc = true
+            addRecipeFrom({ type: 2 }).catch();
+            addRecipeFrom({ type: 4 }).catch();
         },
         openUnifyPrescPrec() {
             this.showUnifyPresc = true
+            addRecipeFrom({ type: 2 }).catch();
         },
         opensafeD() {
             this.showSafeD = true

+ 2 - 0
src/views/diagnosis/Dialectical.vue

@@ -105,6 +105,7 @@
   import {
     mapGetters
   } from "vuex";
+  import {addRecipeFrom} from '@/api/dataAnalysis';
   export default {
     components: {
       IndexBar,
@@ -137,6 +138,7 @@
       this.getMyOfenUse();
     },
     beforeRouteEnter(to, from, next) {
+      addRecipeFrom({ type: 0 }).catch()
       if (from.fullPath.indexOf("/index/dialecticalq") != -1) {
         next();
       } else {

+ 6 - 10
src/views/diagnosis/DialecticalQ.vue

@@ -266,16 +266,8 @@ export default {
   },
   created() {
     this.pageType = this.$route.query.type;
-    this.getDialecticalq();
-    if (this.$route.query.type == 2) {
-      setTimeout(() => {
-        this._znQusetionShow();
-      }, 500);
-    }
-
-    if (this.getPatiensInfo.pid) {
-      this.getPatiensBasisM();
-    }
+    this.loaded();
+    if (this.getPatiensInfo.pid) this.getPatiensBasisM();
   },
   mounted() {
     this.isShrink = window.sessionStorage.getItem('dia_isShrink') == 1
@@ -298,6 +290,10 @@ export default {
     }
   },
   methods: {
+    async loaded() {
+      await this.getDialecticalq();
+      if (+this.pageType === 2) await this._znQusetionShow();
+    },
     // 设置收缩模式
     setShrink() {
       this.isShrink = !this.isShrink

+ 1 - 0
src/views/diagnosis/Prescribing.vue

@@ -4352,6 +4352,7 @@ export default {
     },
     // 获取协定方详细信息
     async getAccordDetail(id) {
+      addRecipeFrom({ type: 2 }).catch();
       let res = await getAccordDetail({
         pid: id
       });

+ 32 - 1
src/views/knowledge/BookD.vue

@@ -1,11 +1,15 @@
 <script>
 import {getBook, getBookContent, getBookListOfRecommend, setBookStatus} from '@/api/knowledge.js';
+import {getDataByKey} from '@/api/system';
+import {mapGetters} from 'vuex';
+import printJS from 'print-js';
 
 
 export default {
   name: 'KnowledgeBookDetail',
   data() {
     return {
+      showPrintHTML: false,
       book: {id: '', catalogueList: []},
       section: [],
       recommend: [],
@@ -19,10 +23,15 @@ export default {
     collection() {
       return +this.book['isBookshelf'] === 1;
     },
+    ...mapGetters(["getuserinfo"]),
   },
   created() {
     this.book.id = this.$route.query.id;
     this.onPreview();
+    getDataByKey({
+      key: "showPrintHTML",
+      organizationid: this.getuserinfo.organizationid,
+    }).then(data => { this.showPrintHTML = data.enabled; });
   },
   mounted() {
     setTimeout(() => {
@@ -92,6 +101,18 @@ export default {
 
       }
     },
+    async print(object) {
+      console.log(object);
+      printJS({
+        printable: this.$refs.print,
+        type: 'html',
+        header: object.name,
+        documentTitle: `名医名方 - 经典医书`,
+        scanStyles: false,
+        css: ['print/containers.css'],
+        style: `.text { line-height: 2.5; }`
+      })
+    }
   },
 };
 </script>
@@ -133,7 +154,10 @@ export default {
           </div>
         </div>
         <div class="content" id="scrolling" :style="{height: containerHeight}" v-loading="!selected.dirty">
-          <div class="text" v-html="selected.content"></div>
+          <el-tooltip content="下载打印">
+            <el-button class="print-btn" size="small" v-if="showPrintHTML" type="primary" circle icon="el-icon-download" :disabled="!selected.dirty" @click="print(selected)"></el-button>
+          </el-tooltip>
+          <div class="text print-containers" ref="print" v-html="selected.content"></div>
           <el-backtop style="right: 300px;" target="#scrolling"></el-backtop>
         </div>
       </div>
@@ -257,6 +281,7 @@ export default {
   }
 
   .content {
+    position: relative;
     flex: 4 4;
 
     > .text {
@@ -264,6 +289,12 @@ export default {
       line-height: 2.5;
       white-space: pre-wrap;
     }
+
+    .print-btn {
+      position: absolute;
+      top: 0;
+      right: 0;
+    }
   }
 
   ::v-deep.el-loading-mask {

+ 25 - 1
src/views/knowledge/DiseaseD.vue

@@ -3,8 +3,9 @@
     <div class="recipe-left">
       <div style="margin-bottom:10px;">
         <el-button size="small" type="primary" @click="$router.back()">返回</el-button>
+        <el-button size="small" v-if="showPrintHTML" type="primary" icon="el-icon-download" :disabled="loading" @click="print()">下载打印</el-button>
       </div>
-      <div class="msg">
+      <div class="msg print-containers" ref="print">
         <div class="msg-item flex-plane-center-l">
           <span>疾病名称:</span>
           <div>{{info.disname}}</div>
@@ -60,9 +61,14 @@
 </template>
 <script>
 import { getDiseasetDetail } from "@/api/knowledge.js";
+import {getDataByKey} from '@/api/system';
+import printJS from 'print-js';
+import {mapGetters} from 'vuex';
 export default {
   data() {
     return {
+      loading: false,
+      showPrintHTML: false,
       info: {},
       tableData: [
         {
@@ -101,18 +107,36 @@ export default {
     };
   },
   created() {
+    getDataByKey({
+      key: "showPrintHTML",
+      organizationid: this.getuserinfo.organizationid,
+    }).then(data => { this.showPrintHTML = data.enabled; });
     this.getDiseasetDetail();
   },
+  computed: {
+    ...mapGetters(["getuserinfo"])
+  },
   methods: {
     // 获取详情数据
     async getDiseasetDetail() {
+      this.loading = true;
       let params = {
         disid: this.$route.query.disid
       };
       let res = await getDiseasetDetail(params);
       if (res.code == 0) {
         this.info = res.data;
+        this.loading = false;
       }
+    },
+    async print() {
+      printJS({
+        printable: this.$refs.print,
+        type: 'html',
+        documentTitle: `名医名方 - 疾病`,
+        scanStyles: false,
+        css: ['print/containers.css', 'print/DiseaseD.css'],
+      })
     }
   }
 };

+ 4 - 0
src/views/knowledge/DoctorCaseBefore.vue

@@ -27,6 +27,7 @@
 </template>
 <script>
 import { getDoctorCaseIndexL } from "@/api/knowledge.js";
+import {addRecipeFrom} from '@/api/dataAnalysis';
 
 export default {
   data() {
@@ -36,6 +37,9 @@ export default {
       list: []
     };
   },
+  created() {
+    addRecipeFrom({ type: 5 }).catch();
+  },
   mounted() {
     this.initData();
   },

+ 56 - 2
src/views/knowledge/DoctorCaseD.vue

@@ -4,6 +4,7 @@
       <!-- <div class="back-btn flex-center" @click="$router.back()">返回</div> -->
       <div>
         <el-button size="small" type="primary" @click="$router.back()">返回</el-button>
+        <el-button size="small" v-if="showPrintHTML" type="primary" icon="el-icon-download" :disabled="loading" @click="print()">下载打印</el-button>
       </div>
       <div class="msg">
         <div class="msg-item flex-plane-center-l">
@@ -66,7 +67,38 @@
         </div>
       </div>
     </div>
-    <div class="recipe-right">
+    <div class="recipe-right print-containers" ref="print">
+      <div class="msg-info">
+        <div class="msg-item flex-plane-center-l">
+          <span>疾病名称:</span>
+          <div>{{info.disname?info.disname:info.westerndisease}}</div>
+        </div>
+        <div class="msg-item flex-plane-center-l">
+          <span>性别:</span>
+          <div>{{info.patientgender=='M'?'男':'女'}}</div>
+        </div>
+        <div class="msg-item flex-plane-center-l">
+          <span>年龄:</span>
+          <div>{{info.patientage}}岁</div>
+        </div>
+        <div class="msg-item flex-plane-center-l">
+          <span>婚姻:</span>
+          <div>{{info.patientmarriage==0?'未婚':'已婚'}}</div>
+        </div>
+
+        <!-- <div class="msg-item flex-plane-center-l">
+                    <span>主诉及现病史:</span>
+                    <div>胃痛两天</div>
+        </div>-->
+        <div class="msg-item flex-plane-center-l" v-if="info.disname">
+          <span>辩证:</span>
+          <div>{{info.chinesesymptom}}</div>
+        </div>
+        <div class="msg-item flex-plane-center-l" v-if="info.disname">
+          <span>治法:</span>
+          <div>{{info.therapy}}</div>
+        </div>
+      </div>
       <div v-for="(item,index) in info.dialist" :key="index">
         <div class="title">{{index==0?'初诊':item.diatimes+'诊'}}</div>
 
@@ -80,7 +112,7 @@
             <div class="right" v-for="(item1,index1) in item.fjlist" :key="index1">
               <div class="flex-plane-center-l opinion">
                 <span>{{item1.preusage}}</span>
-                <div v-if="showTransitionPr" class="flex-center zhuanfang" @click="turnRecipe(item1)">转方</div>
+                <div v-if="showTransitionPr" class="flex-center zhuanfang no-print" @click="turnRecipe(item1)">转方</div>
               </div>
               <div class="prescription flex-plane-center-l flex-wrap">
                 <span
@@ -120,9 +152,12 @@ import { getDCaseDetail } from "@/api/knowledge.js";
 import { numberToUpperCase } from "@/utils/format.js";
 import { mapState, mapGetters, mapActions, mapMutations } from "vuex";
 import { getDataByKey } from '@/api/system';
+import printJS from 'print-js';
 export default {
   data() {
     return {
+      loading: false,
+      showPrintHTML: false,
       showTransitionPr: false,
       radio: 0,
       info: {},
@@ -136,6 +171,10 @@ export default {
       key: "transitionPr",
       organizationid: this.getuserinfo.organizationid,
     }).then(data => { this.showTransitionPr = data.enabled; });
+    getDataByKey({
+      key: "showPrintHTML",
+      organizationid: this.getuserinfo.organizationid,
+    }).then(data => { this.showPrintHTML = data.enabled; });
     this.getDCaseDetail();
   },
   computed: {
@@ -151,6 +190,7 @@ export default {
     },
     //获取详情
     async getDCaseDetail() {
+      this.loading = true;
       let res = await getDCaseDetail({
         verId: this.$route.query.verifyid
       });
@@ -161,8 +201,18 @@ export default {
         });
 
         this.info = res.data;
+        this.loading = false;
       }
     },
+    async print() {
+      printJS({
+        printable: this.$refs.print,
+        type: 'html',
+        documentTitle: `名医名方 - 名医医案`,
+        scanStyles: false,
+        css: ['print/containers.css', 'print/DoctorCaseD.css'],
+      })
+    },
     ...mapMutations({
       setDrugsInfo: "drug/setDrugsInfo"
     })
@@ -250,6 +300,10 @@ export default {
       margin-bottom: 15px;
     }
 
+    .msg-info {
+      display: none;
+    }
+
     .right-msg {
     }
 

+ 2 - 0
src/views/knowledge/Prescription.vue

@@ -51,6 +51,7 @@
 <script>
 import { getEffectQuery, getPrescriptionsList } from "@/api/knowledge.js";
 import { setTimeout } from "timers";
+import {addRecipeFrom} from '@/api/dataAnalysis';
 export default {
   data() {
     return {
@@ -66,6 +67,7 @@ export default {
     };
   },
   created() {
+    addRecipeFrom({ type: 4 }).catch();
     this.getEffectQuery().then(() => this.getPrescriptionsList());
     // setTimeout(() => {
     //   this.getPrescriptionsList();

+ 22 - 3
src/views/knowledge/PrescriptionD.vue

@@ -2,8 +2,9 @@
   <div class="PrescriptionD">
     <div style="margin-bottom:10px;">
       <el-button size="small" type="primary" @click="$router.back()">返回</el-button>
+      <el-button size="small" v-if="showPrintHTML" type="primary" icon="el-icon-download" :disabled="loading" @click="print()">下载打印</el-button>
     </div>
-    <div class="detail">
+    <div class="detail print-containers" ref="print">
       <div class="detail-item flex-plane-center-l">
         <div class="title">方剂名称:</div>
         <div class="right">{{info.prename}}</div>
@@ -13,7 +14,7 @@
         <div class="right">
           <div
             v-if="showTransitionPr"
-            class="zhuanfag flex-center"
+            class="zhuanfag flex-center no-print"
             @click="$router.push({path:'/index/prescribing?recipeID='+$route.query.pried+'&kjType=kj-fj'})"
           >转方</div>
           <div>
@@ -45,7 +46,7 @@
         <div class="right">{{info.content}}</div>
       </div>
       <!-- 笔记输入框 -->
-      <div class="detail-item flex-plane-center-l" v-if="isCollect">
+      <div class="detail-item flex-plane-center-l no-print" v-if="isCollect">
         <div class="title">个人笔记:</div>
         <div class="right flex note">
           <el-input type="textarea" :rows="6" placeholder="请输入" v-model="text" :disabled="!isEdit" />
@@ -70,9 +71,12 @@
 import { mapGetters } from 'vuex';
 import { getDataByKey } from '@/api/system';
 import { getPreDetal } from "@/api/knowledge.js";
+import printJS from 'print-js';
 export default {
   data() {
     return {
+      loading: false,
+      showPrintHTML: false,
       showTransitionPr: false,
       info: {},
       isCollect: false,
@@ -85,6 +89,10 @@ export default {
       key: "transitionPr",
       organizationid: this.getuserinfo.organizationid,
     }).then(data => { this.showTransitionPr = data.enabled; });
+    getDataByKey({
+      key: "showPrintHTML",
+      organizationid: this.getuserinfo.organizationid,
+    }).then(data => { this.showPrintHTML = data.enabled; });
     this.getPreDetal();
   },
   computed: {
@@ -93,12 +101,23 @@ export default {
   methods: {
     // 获取详细信息
     async getPreDetal() {
+      this.loading = true;
       let res = await getPreDetal({
         preid: this.$route.query.pried
       });
       if (res.code == 0) {
         this.info = res.data;
+        this.loading = false;
       }
+    },
+    async print() {
+      printJS({
+        printable: this.$refs.print,
+        type: 'html',
+        documentTitle: `名医名方 - 方剂`,
+        scanStyles: false,
+        css: ['print/containers.css', 'print/PrescriptionD.css'],
+      })
     }
   }
 };

+ 24 - 2
src/views/system/Parameter.vue

@@ -76,6 +76,15 @@
         </el-radio-group>
       </div>
     </div>
+    <div class="code-item flex-vertical-center-l">
+      <span>知识库打印按钮:</span>
+      <div class="input">
+        <el-radio-group v-model="showPrintHTML.value">
+          <el-radio label="0">显示</el-radio>
+          <el-radio label="1">不显示</el-radio>
+        </el-radio-group>
+      </div>
+    </div>
     <!-- <div class="code-item flex-vertical-center-l">
             <span>诊断页配置:</span>
             <div class="input">
@@ -119,6 +128,9 @@ export default {
       transitionPr: {
         key: "transitionPr"
       }, // 转方
+      showPrintHTML: {
+        key: "showPrintHTML"
+      }, // 打印
       defaultHomePage: {
         key: "defaultHomePage"
       }, // 登录默认首页
@@ -134,6 +146,7 @@ export default {
       let paramList = [
         this.defaultHomePage,
         this.transitionPr,
+        this.showPrintHTML,
         this.sign,
         this.doctorbody,
         this.way,
@@ -250,8 +263,17 @@ export default {
             return item.key === "transitionPr";
           });
           this.transitionPr = {
-            key: transitionPr[0].key,
-            value: transitionPr[0].value || '0',
+            key: transitionPr[0] ? transitionPr[0].key : 'transitionPr',
+            value: transitionPr[0] ? (transitionPr[0].value || '0') : '0',
+            pid: this.$route.query.pid
+          };
+          // 打印
+          let showPrintHTML = res.Data.filter(item => {
+            return item.key === "showPrintHTML";
+          });
+          this.showPrintHTML = {
+            key: showPrintHTML[0] ? showPrintHTML[0].key : 'showPrintHTML',
+            value: showPrintHTML[0] ? (showPrintHTML[0].value || '1') : '1',
             pid: this.$route.query.pid
           };
           // 登录首页配置