From d41b809e74935935f1d685c284ed8c2459a50ee6 Mon Sep 17 00:00:00 2001 From: pengjun <158915633@qq.com> Date: Thu, 4 Dec 2025 15:37:35 +0800 Subject: [PATCH] seo --- .../customerOrg/customerOrgTree.vue | 44 +- .../PatientRegisterRecoverList.vue | 24 +- .../patientRegister/customerOrgTreeAll.vue | 102 +-- .../patientRegister/patientRegisterQuery.vue | 2 +- .../patientRegisterRecoverListQuery.vue | 632 ++++++++++++++++++ src/store/index.js | 2 + src/utlis/indexedDB.js | 219 ++++++ src/utlis/proFunc.js | 45 ++ src/views/workload/examinedoctor.vue | 11 +- 9 files changed, 999 insertions(+), 82 deletions(-) create mode 100644 src/components/patientRegister/patientRegisterRecoverListQuery.vue create mode 100644 src/utlis/indexedDB.js diff --git a/src/components/customerOrg/customerOrgTree.vue b/src/components/customerOrg/customerOrgTree.vue index 0667bf9..026c719 100644 --- a/src/components/customerOrg/customerOrgTree.vue +++ b/src/components/customerOrg/customerOrgTree.vue @@ -63,31 +63,23 @@ export default { methods: { ...mapMutations(["setData"]), - //获取体检单位列表树信息 + //获取体检单位列表树信息 避免重复切换页面,多次调用接口/下载 内存溢出 getCustomerOrgTree() { - //let customerOrgTree = [] - // [ - // { - // displayName: "个人体检", // - // id: "00000000-0000-0000-0000-000000000000", // - // //treeChildren: [], - // }, - // { - // displayName: "组件式", // - // id: "10000000-0000-0000-0000-000000000000", // - // //treeChildren: [], - // }, - // ]; - //console.log('getCustomerOrgTree start') - // api/app/organization-units/organization-unit-by-is-peis // api/app/customer-org/by-code-all - getapi("/api/app/customerorg/getbycodeall?IsHidePerson=1").then((res) => { - //customerOrgTree = res.data; - if (res.code != -1) { - this.customerOrg.customerOrgTreeBak = reMadeOrgTree(deepCopy(res.data)) - this.customerOrg.customerOrgTree = deepCopy(this.customerOrg.customerOrgTreeBak) - // tcdate(this.customerOrg.customerOrgTree); - } - }); + if (this.dataTransOpts.orgDataSet.length > 0) { + this.customerOrg.customerOrgTreeBak = reMadeOrgTree(deepCopy(this.dataTransOpts.orgDataSet)) + this.customerOrg.customerOrgTree = deepCopy(this.customerOrg.customerOrgTreeBak) + } else { + getapi("/api/app/customerorg/getbycodeall?IsHidePerson=1").then((res) => { + //customerOrgTree = res.data; + if (res.code > -1) { + this.dataTransOpts.orgDataSet = res.data + this.customerOrg.customerOrgTreeBak = reMadeOrgTree(deepCopy(this.dataTransOpts.orgDataSet)) + this.customerOrg.customerOrgTree = deepCopy(this.customerOrg.customerOrgTreeBak) + // tcdate(this.customerOrg.customerOrgTree); + } + }); + } + }, // 判断选中接点是否可以拖拽 @@ -112,10 +104,10 @@ export default { let body = { itemList: [] } if (draggingNode.data.parentId) { - let parentNode = getTreeNode(this.customerOrg.customerOrgTree, 'treeChildren', 'id', draggingNode.data.parentId) + let parentNode = getTreeNode(this.customerOrg.customerOrgTree, 'treeChildren', 'id', draggingNode.data.parentId) parentNode.treeChildren.forEach((e, i) => { body.itemList.push({ id: e.id, displayOrder: i }) - }); + }); } else { this.customerOrg.customerOrgTree.forEach((e, i) => { body.itemList.push({ id: e.id, displayOrder: i }) diff --git a/src/components/patientRegister/PatientRegisterRecoverList.vue b/src/components/patientRegister/PatientRegisterRecoverList.vue index 616ebf6..e703c0a 100644 --- a/src/components/patientRegister/PatientRegisterRecoverList.vue +++ b/src/components/patientRegister/PatientRegisterRecoverList.vue @@ -2,9 +2,9 @@
+ size="small" highlight-current-row ref="dataList" @selection-change="handleSelectionChange" @row-click="rowClick"> - + @@ -92,13 +92,11 @@
-
+
共:{{ loadOpts.totalCount }} 条记录,当前显示:{{ tableData.length }} - 条。 - - + 条。
@@ -158,7 +156,8 @@ export default { maxResultCount: 100, }, loadOptsInit: {}, - lazyLoading:false + lazyLoading:false, + dom:null, }; }, @@ -300,6 +299,7 @@ export default { async load() { this.loadOpts.skipCount++; await this.getPrList(); + this.lazyLoading = false }, // 获取列表数据 @@ -503,14 +503,14 @@ export default { //滚动加载数据 scrollFull() { - let obj = this.$refs['dataList'].bodyWrapper - console.log('obj', obj) + this.dom = this.$refs['dataList'].bodyWrapper + console.log('obj', this.dom) - obj.addEventListener('scroll', async () => { + this.dom.addEventListener('scroll', async () => { // console.log('scrollTop',this.dom.scrollTop,'clientHeight',this.dom.clientHeight,'scrollHeight',this.dom.scrollHeight); - if (obj.scrollTop + obj.clientHeight + 20 > obj.scrollHeight && !this.lazyLoading) { + if (this.dom.scrollTop + this.dom.clientHeight + 20 > this.dom.scrollHeight && !this.lazyLoading) { // 获取到的不是全部数据 当滚动到底部 - console.log('scrollTop', obj.scrollTop, 'clientHeight', obj.clientHeight, 'scrollHeight', obj.scrollHeight); + //console.log('scrollTop', obj.scrollTop, 'clientHeight', obj.clientHeight, 'scrollHeight', obj.scrollHeight); if (Number(this.loadOpts.skipCount) * Number(this.loadOpts.maxResultCount) >= Number(this.loadOpts.totalCount)) { this.lazyLoading = false } else { diff --git a/src/components/patientRegister/customerOrgTreeAll.vue b/src/components/patientRegister/customerOrgTreeAll.vue index f80af36..dc2aa6a 100644 --- a/src/components/patientRegister/customerOrgTreeAll.vue +++ b/src/components/patientRegister/customerOrgTreeAll.vue @@ -35,7 +35,9 @@ + diff --git a/src/store/index.js b/src/store/index.js index 92158ed..13b4ac7 100644 --- a/src/store/index.js +++ b/src/store/index.js @@ -417,6 +417,8 @@ export default new Vuex.Store({ // 多层数据传递时使用(统一归结在此,便于管理) dataTransOpts: { + orgDatas:[], // 未处理所有单位的数据 + orgDataSet:[], // 单位设置处使用 // 强制刷新(如触发数据刷新的ID值没有变化时,但也想强制刷新数据: // S--single 单记录刷新,M--more 多记录刷新,D--detail // 当父子组件都在存在多记录刷新时 父组件用 M,子组件用 D diff --git a/src/utlis/indexedDB.js b/src/utlis/indexedDB.js new file mode 100644 index 0000000..6d97543 --- /dev/null +++ b/src/utlis/indexedDB.js @@ -0,0 +1,219 @@ +/** + * 打开数据库 + * @param {object} dbName 数据库的名字 + * @param {string} storeName 仓库名称 + * @param {string} version 数据库的版本 + * @return {object} 该函数会返回一个数据库实例 + */ +function openDB(dbName, version = 1) { + return new Promise((resolve, reject) => { + // 兼容浏览器 + var indexedDB = + window.indexedDB || + window.mozIndexedDB || + window.webkitIndexedDB || + window.msIndexedDB; + let db; + // 打开数据库,若没有则会创建 + const request = indexedDB.open(dbName, version); + // 数据库打开成功回调 + request.onsuccess = function (event) { + db = event.target.result; // 数据库对象 + // console.log("indexedDB 数据库打开成功"); + resolve(db); + }; + // 数据库打开失败的回调 + request.onerror = function (event) { + console.log("indexedDB 数据库打开报错", event) + reject("indexedDB 数据库打开报错"); + }; + + // 数据库有更新时候的回调 + request.onupgradeneeded = function (event) { + // 数据库创建或升级的时候会触发 + // console.log("onupgradeneeded"); + db = event.target.result; // 数据库对象 + // 创建表 keyPath 表示主键,插入更新数据时,必须存在 主键 + + // 可放在配置中,读取文件后,循环创建 ObjectStore(表) + // let tables = Object.keys(dbSQL.dddw) + // tables.forEach(e => { + // if (!db.objectStoreNames.contains(e)) createObjectStore(db,e,'id') + // }); + //if (!db.objectStoreNames.contains('dict')) db.createObjectStore('dict', { keyPath: "id" }) // tableName作为id值 + + // 创建表 storeName 相当于表的概念 + createObjectStore(db, 'dict', 'id') // 创建字典表,数据说明:id = tableName + createObjectStore(db, 'sort', 'id') // 创建排序信息表,数据说明:id = user_id + _ + tableName + _ + pageName + createObjectStore(db, 'drag', 'id') // 创建数据列拖拽表,数据说明:id = user_id + _ + tableName + _ + pageName + createObjectStore(db, 'form', 'id') // 创建表单设计表,数据说明:id = user_id + _ + tableName + _ + pageName + createObjectStore(db, 'query', 'id') // 创建高级查询表,数据说明:id = user_id + _ + tableName + _ + pageName + createObjectStore(db, 'localConfig', 'id') // 创建本地参数,数据说明:本地客户端个性化设置 + createObjectStore(db, 'route', 'id') // 路由数据, id = path + createObjectStore(db, 'other', 'id') // 创建本地参数,数据说明:其他存本地参数,如:用户权限 + + // var objectStore; //相当于表名 + // // 创建存储库 + // objectStore = db.createObjectStore("signalChat", { + // keyPath: "sequenceId", // 这是主键 + // // autoIncrement: true // 实现自增 + // }); + // // 创建索引,在后面查询数据的时候可以根据索引查 + // objectStore.createIndex("link", "link", { unique: false }); + // objectStore.createIndex("sequenceId", "sequenceId", { unique: false }); + // objectStore.createIndex("messageType", "messageType", { + // unique: false, + // }); + }; + }); +} + +function createObjectStore(db, objectStoreName, keyPath) { + if (!db.objectStoreNames.contains(objectStoreName)) db.createObjectStore(objectStoreName, { keyPath: keyPath || "id" }) +} + +/** + * 更新数据 (插入也可以用此接口) + * @param {object} db 数据库实例 + * @param {string} storeName 仓库名称 + * @param {object} data 数据 {id:'data',records:[],updatedat:Date.now()} + * @param {string} devMode 是否开发模式 Y 时,打印日志 + */ +function updateDB(db, pkey, data, devMode) { + return updateDBCom(db, 'dict', pkey, data, devMode) +} +function updateDBCom(db, storeName, pkey, data, devMode) { + return new Promise((resolve, reject) => { + + let request = db + .transaction([storeName], "readwrite") // 事务对象 + .objectStore(storeName) // 仓库对象 + .put({ id: pkey, data, createdat: Date.now() }); + + request.onsuccess = function () { + if (devMode == 'Y') console.log("indexedDB 数据更新成功:storeName, pkey ", storeName, pkey); + resolve("indexedDB 数据更新成功"); + }; + + request.onerror = function () { + if (devMode == 'Y') console.log("indexedDB 数据更新失败"); + reject("数据更新失败") + }; + }) +} + +/** + * 通过主键读取数据 + * @param {object} db 数据库实例 + * @param {string} storeName 仓库名称 + * @param {string} key 主键值 + * @param {string} devMode 是否开发模式 Y 时,打印日志 + */ +function getDataByKey(db, pkey, devMode) { + return getDataByKeyCom(db, 'dict', pkey, devMode) +} +function getDataByKeyCom(db, storeName, pkey, devMode) { + return new Promise((resolve, reject) => { + var transaction = db.transaction([storeName]); // 事务 + var objectStore = transaction.objectStore(storeName); // 仓库对象 + var request = objectStore.get(pkey); // 通过主键获取数据 + + request.onerror = function (event) { + let err = `indexedDB 缓存数据库,读取 ${db}.${storeName} id=${pkey} 记录失败` + if (devMode == 'Y') console.error(err, event); + reject(err) + }; + + request.onsuccess = function () { + if (devMode == 'Y') console.log(`indexedDB 缓存数据库,读取 ${db}.${storeName} id=${pkey} 记录成功:`, request.result); + resolve(request.result); + }; + }); +} + + +/** + * 通过主键删除数据 + * @param {object} db 数据库实例 + * @param {string} storeName 仓库名称 + * @param {object} pkey 主键值 + * @param {string} devMode 是否开发模式 Y 时,打印日志 + */ +function deleteDB(db, storeName, pkey, devMode) { + return new Promise((resolve, reject) => { + var request = db + .transaction([storeName], "readwrite") + .objectStore(storeName) + .delete(pkey); + + request.onsuccess = function () { + let msg = `indexedDB缓存数据 ${db}.${storeName} id=${pkey} 记录删除成功` + if (devMode == 'Y') console.log(msg); + resolve(msg); + }; + + request.onerror = function () { + let err = `indexedDB缓存数据 ${db}.${storeName} id=${pkey} 记录删除失败` + if (devMode == 'Y') console.error(err); + reject(err) + }; + }); +} + +/** + * 关闭数据库 + * @param {object} db 数据库实例 + */ +function closeDB(db) { + db.close(); + // console.log("数据库已关闭"); +} + +// 删库 +const dropDB = (dbName, devMode) => { + return new Promise((resolve, reject) => { + let request = indexedDB.deleteDatabase(dbName); + request.onsuccess = () => { + let msg = `indexedDB缓存数据库 ${dbName} 已删除成功` + if (devMode == 'Y') console.log(msg); + resolve(msg); + }; + + request.onerror = (event) => { + if (devMode == 'Y') console.error(`indexedDB缓存数据库 ${dbName} 删除失败:`, event.target.error); + reject(`indexedDB缓存数据库 ${dbName} 删除失败:${event.target.error}`) + }; + + request.onblocked = () => { + let wMsg = `indexedDB存在未关闭的缓存数据库 ${dbName} 连接,删除被暂时阻塞` + if (devMode == 'Y') console.warn(wMsg); + reject(wMsg) + }; + }) + +} + +// 清单个表,保留表结构 +const clearStore = (db, storeName) => { + return new Promise((resolve, reject) => { + const transaction = db.transaction(storeName, 'readwrite'); + const objectStore = transaction.objectStore(storeName); + const clearRequest = objectStore.clear(); + + clearRequest.onsuccess = function () { + resolve(`清除表【${storeName}】数据成功!`); + }; + + clearRequest.onerror = function (error) { + reject(`清除表【${storeName}】数据失败,原因: ` + error); + }; + }); +} + + + +export default { + openDB, updateDBCom, getDataByKeyCom, deleteDB, dropDB, clearStore, closeDB, + updateDB, getDataByKey + +} diff --git a/src/utlis/proFunc.js b/src/utlis/proFunc.js index 55c0d91..e8a3c75 100644 --- a/src/utlis/proFunc.js +++ b/src/utlis/proFunc.js @@ -1,3 +1,4 @@ +const indexedDB = require('./indexedDB'); //多级联动选择数据处理 add by pengjun function tcdate(date) { @@ -482,6 +483,50 @@ function isValidMobileNumber(tel) { } exports.isValidMobileNumber = isValidMobileNumber; +// 本地储存 +function updateDBCom(pkey,data){ + return new Promise((resolve, reject) => { + let db + indexedDB.openDB('peis','1') + .then(res => { + db = res + return indexedDB.updateDBCom(db, 'dict', pkey, data, 'Y') + }) + .then(() => { + resolve() + }) + .catch(err => { + console.error(err) + reject(err) + }) + .finally(() => { + if (db) indexedDB.closeDB(db) // 关闭indexedDB + }) + }) +} +exports.updateDBCom = updateDBCom; + +function getDBCom(pkey){ + return new Promise((resolve, reject) => { + let db + indexedDB.openDB('peis','1') + .then(res => { + db = res + return indexedDB.getDataByKeyCom(db,'dict',pkey,'Y') + }) + .then((res) => { + resolve(res) + }) + .catch(err => { + console.error(err) + reject(err) + }) + .finally(() => { + if (db) indexedDB.closeDB(db) // 关闭indexedDB + }) + }) +} +exports.getDBCom = getDBCom; diff --git a/src/views/workload/examinedoctor.vue b/src/views/workload/examinedoctor.vue index f293f58..e2077e0 100644 --- a/src/views/workload/examinedoctor.vue +++ b/src/views/workload/examinedoctor.vue @@ -5,7 +5,7 @@
工作量统计 / 审核医生工作量统计总检审核医生工作量统计
@@ -31,7 +31,7 @@
- 开始日期: + 审核日期: - + +