




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
-.z.-----優(yōu)質(zhì)資料**理工大學(xué)"軟件工程綜合課程設(shè)計"報告基于JSP的網(wǎng)上處方跟蹤系統(tǒng)專業(yè):軟件工程班級:**:報告日期:2016年6月30日目錄1背景與意義 1.1背景與現(xiàn)狀 1.2趨勢與前景 1.3工作根底、條件與優(yōu)勢 2需求分析 2.1功能與性能需求 2.2其它需求 3內(nèi)容和目標(biāo) 3.1主要內(nèi)容 3.2預(yù)期目標(biāo) 4技術(shù)路線 4.1總體功能 4.2運行平臺具 4.2.1網(wǎng)絡(luò)環(huán)境 4.2.2設(shè)備情況 4.2.3支撐軟件 4.3程序語言與開發(fā)工具 4.4關(guān)鍵技術(shù) 5進度方案 6條件、假定和限制 7系統(tǒng)設(shè)計與原型UI〔或系統(tǒng)設(shè)計與實現(xiàn)〕 7.1數(shù)據(jù)庫表設(shè)計 7.2關(guān)鍵算法與實現(xiàn)技術(shù) 7.3主要原型UI〔或主要功能實現(xiàn)〕 7.4測試方案與測試用例 7.5安裝與運行情況 7.5.1安裝與配置 7.5.2運行情況圖 8總結(jié) 參考文獻 附件:主要功能的源代碼1背景與意義1.1背景與現(xiàn)狀隨著互聯(lián)網(wǎng)不斷的開展,計算機已經(jīng)深入到了各行各業(yè),計算機不再局限于對科學(xué)技術(shù)的研究,當(dāng)今時代,計算機可以決解大局部的具體問題,而且有利于人們的控制,這大大方便了人們的需求。當(dāng)今的中小型醫(yī)院中一般還沒有全面采用信息技術(shù)來進展管理,所以建議一套計算機輔助經(jīng)營管理系統(tǒng)是必不可少的。本系統(tǒng)是專門為處方專門設(shè)計的,我們知道,傳統(tǒng)的記錄使用手工的方式來記錄數(shù)據(jù),但是如果用手工的方式記錄數(shù)據(jù),如果數(shù)據(jù)量很大,則結(jié)果往往就很容易出錯;而且,隨著時間的積累,數(shù)據(jù)變得越來越多,且容易喪失,傳統(tǒng)的手工管理極大的浪費了人力和財力,不能滿足醫(yī)師和醫(yī)院之間的需求。 總的來說,使用一個高效率的系統(tǒng)來處理這些繁雜的流程是必須的,所以我們有必要建立一個處方跟蹤系統(tǒng)來處理這一系列的問題,讓醫(yī)師可以通過系統(tǒng)方便的記錄病史病癥,開處方,查閱歷史處方,保存。通過這樣,這些數(shù)據(jù)能被即使、準(zhǔn)確、有效的處理。這不僅可以提高工作效率還可以確保信息的平安和準(zhǔn)確。1.2趨勢與前景目前,國內(nèi)的大多數(shù)醫(yī)院均不同程度的將計算機技術(shù)應(yīng)用于醫(yī)院管理。該系統(tǒng)對軟件沒有太高的要求,市場上已存在各式各樣的軟件足以滿足各方面的要求。但是不同軟件之間由于需求的不一致或者是根據(jù)不同的政策標(biāo)準(zhǔn)難以實現(xiàn)軟件統(tǒng)一化,現(xiàn)在醫(yī)療行業(yè)飛速開展,國家政策不斷的推陳出新也使軟件的開發(fā)出現(xiàn)多樣化,模塊的多樣化造成了維護原有系統(tǒng)上的困難,傳統(tǒng)的軟件業(yè)務(wù)有的已經(jīng)也不符合當(dāng)今的要求,所以開發(fā)一款符合當(dāng)今社會需求的軟件是有必要的。1.3工作根底、條件和優(yōu)勢(1)技術(shù)可行性該系統(tǒng)對軟件沒有太高的要求,但是開發(fā)人員必須具有該軟件開發(fā)的專業(yè)知識,已經(jīng)開發(fā)過相關(guān)的醫(yī)學(xué)管理系統(tǒng),在熟悉業(yè)務(wù)的情況下進展開發(fā),完善更多的功能業(yè)務(wù)。(2)經(jīng)濟可行性該軟件的開發(fā)本錢較低,在有前人開發(fā)的經(jīng)歷中開發(fā)風(fēng)險小,系統(tǒng)投入運行后會給醫(yī)院帶來可觀的經(jīng)濟效益:一方面提高了工作效率,增加了市場競爭力。另一方面,所需要的人員減少也提高了經(jīng)濟效益。(3)人才設(shè)備可行性對于針對醫(yī)療行業(yè)軟件開發(fā)的人員是相當(dāng)多的,在設(shè)備方面同樣比擬容易進展,所以在人才設(shè)備上是可行的。2需求分析2.1功能和性能需求功能需求:處方管理系統(tǒng)的構(gòu)建是以醫(yī)師處方為中心,實時錄入病人信息,開處方,生成處方,進展數(shù)據(jù)的統(tǒng)計,簡化了傳統(tǒng)處方信息處理的過程。本系統(tǒng)的重點是跟蹤處方的信息數(shù)據(jù)并處理數(shù)據(jù),處理數(shù)據(jù)時相關(guān)的數(shù)據(jù)對象有如下有以下:〔1〕系統(tǒng)跟蹤每位顧客的以下信息: 顧客**、、出生日期、承保公司、保險號、處方歷史記錄〔2〕每位顧客的服藥史將記錄以下每次處方信息: 由藥房給出的唯一的處方ID號、處方開出的藥物、開處方的醫(yī)生**和、處方日期、處方終止日期、有效購藥次數(shù)、配藥"單位〞數(shù)量〔此處的"單位〞可能是片、匙和毫升等———見后面關(guān)于藥品的討論〕、如果有其它替代品,是否可以向顧客提供替代品?!?〕對于藥房存貨的每種藥品,系統(tǒng)應(yīng)跟蹤的如下: 藥品名稱,藥品"單位〞〔片、匙和毫升等〕,哪些其它藥品可以作為另一種這種藥品的替代品,服用藥品可能引起的副作用?!?〕系統(tǒng)所支持的查詢功能:服藥史,即給定顧客的所有處方歷史記錄—根據(jù)顧客的要求提供的報告,*種給定藥品的副作用報告,隨處方一起提供*種給定藥品的可替換藥品列表一份給定處方是否還有購藥許可:即,是否還可以憑處方購藥,以及處方是否已經(jīng)過期。性能需求: (1)時間特性要求 效勞器啟動時間不超過1分鐘;系統(tǒng)響應(yīng)時間:用戶在使用軟件的過程中對各個功能模塊中的鼠標(biāo)點擊、鍵盤輸入等操作響應(yīng)的時間不操作1秒。 (2)數(shù)據(jù)精度 要按照嚴(yán)格的數(shù)據(jù)格式輸入,對符合數(shù)據(jù)格式要求的輸入進展提示。 (3)效勞器并發(fā)和可伸縮性 軟件應(yīng)采用界面層、應(yīng)用程、數(shù)據(jù)層三層架構(gòu),假設(shè)以后用戶數(shù)量增多,只需要增加應(yīng)用層的效勞器數(shù)量,實現(xiàn)可裁減、可擴大和可移植等不同方面的要求。采用模塊化的應(yīng)用軟件構(gòu)造,確保系統(tǒng)可以靈活的擴大其業(yè)務(wù)功能,并可與其他業(yè)務(wù)系統(tǒng)進展無縫連接。 (4)系統(tǒng)平安性 數(shù)據(jù)庫設(shè)計說明使用何種方式保證系統(tǒng)的平安。2.2其它需求可靠性和可用性需求:出錯處理需求:接口需求:Mysql、Soap、約束需求:暫無逆向需求:暫無將來可能的需求:3內(nèi)容和目標(biāo)3.1主要內(nèi)容(1)用戶信息維護,實現(xiàn)用戶信息的錄入、查詢、修改以及刪除等功能。(2)處方信息處理,針對不同的用戶記錄用戶的處方信息,其中處方信息中記錄處方開出的藥物、開處方的醫(yī)生**和、處方日期、處方終止日期、有效購藥次數(shù)、配藥"單位〞數(shù)量〔此處的"單位〞可能是片、匙和毫升等———見后面關(guān)于藥品的討論〕、如果有其它替代品,是否可以向顧客提供替代品等信息,并可對該處方進展修改以及刪除等操作。(3)處方歷史查詢,查詢所有的處方信息,或者根據(jù)用戶的信息模糊查詢到該用戶的處方信息。(4)處方藥物信息處理,藥方根據(jù)處方信息處理藥物并確認(rèn)處理。3.2預(yù)期目標(biāo)系統(tǒng)必須根據(jù)需**現(xiàn)核心業(yè)務(wù)上的需求內(nèi)容,系統(tǒng)必須嚴(yán)格按照說明書上來開發(fā),最終的系統(tǒng)必須到達需求說明書上的要求,實現(xiàn)一個可靠的、易用的處方跟蹤系統(tǒng),該系統(tǒng)實現(xiàn)了對用戶信息、處方信息的一體化處理。4技術(shù)路線4.1總體功能圖4.-1-1總體功能構(gòu)造圖圖4.-1-3系統(tǒng)數(shù)據(jù)流圖4.2運行平臺4.2.1網(wǎng)絡(luò)環(huán)境局域網(wǎng)網(wǎng)絡(luò)環(huán)境以及私有的IP地址該局域網(wǎng)的網(wǎng)拓?fù)錁?gòu)造如圖4-2-1-1所示:圖4-2-1-1網(wǎng)絡(luò)拓?fù)鋱D4.2.2設(shè)備情況效勞器端:處理器主頻1000MHz內(nèi)存容量64GB主機型號與數(shù)量PA-8800/2外存容量16GB設(shè)備型號與數(shù)量惠普9000rp7420/2輸入及輸出設(shè)備型號與數(shù)量L455有線多媒體鍵盤/1、S22B360HW顯示器/1、N215鼠標(biāo)/1數(shù)據(jù)通信設(shè)備型號與數(shù)量交換機華為S1724G/1其他專用硬件設(shè)備與數(shù)量無客戶端:處理器主頻不限定設(shè)備的型號與數(shù)量不限定主機型號與數(shù)量不限定外存容量不限定設(shè)備型號與數(shù)量無輸入及輸出設(shè)備型號與數(shù)量交換機華為S1724G/1數(shù)據(jù)通信設(shè)備型號與數(shù)量無其他專用硬件設(shè)備與數(shù)量無支撐軟件支撐軟件軟件版本操作系統(tǒng)Linu*數(shù)據(jù)庫管理系統(tǒng)Mysql5.1Web效勞器Tomcat7.0瀏覽器Chrome其他軟件JVM1.74.3程序語言與開發(fā)工具程序語言:HTML/CSS、JavaScript、Jquery、Java、Jsp、Jstl、Spring、SpringMVC、Hibernate、SpringDataJpa、Mysql開發(fā)工具:SpringToolSuit3.7、Maven3.3、Mysql5.1、Tomcat7.0、JavaRuntimeEnviroment1.7、Git工程管理工具4.4關(guān)鍵技術(shù)(1)HTML5WebSocketAPI客戶端與效勞器端進展全雙工通訊,WebSocket的出現(xiàn)是基于Web應(yīng)用的實時性需要而產(chǎn)生的,它允許客戶端和效勞器在任意時刻互相推送消息。WebSocket是下一代客戶端-效勞器異步通訊的方法,它本領(lǐng)上任然是一個基于TCP的協(xié)議,它使用ws或wss協(xié)議,可用于任意的客戶端和效勞器。為了建立一個WebSocket連接,客戶端瀏覽器首先要向效勞器發(fā)起一個HTTP請求,這個請求和通常的HTTP請求不同,包含了一些附加頭信息,其中附加頭信息〞Upgrade:WebSocket〞(〞Upgrade:WebSocket〞表示這是一個特殊的HTTP請求,請求的目的就是要將客戶端和效勞器端的通訊協(xié)議從HTTP協(xié)議升級到WebSocket協(xié)議。)說明這是一個申請協(xié)議升級的HTTP請求,效勞器端解析這些附加的頭信息然后產(chǎn)生應(yīng)答信息返回給客戶端,客戶端和效勞器端的WebSocket連接就建立起來了,雙方就可以通過這個連接通道自由的傳遞信息,并且這個連接會持續(xù)存在直到客戶端或者效勞器端的*一方主動的關(guān)閉連接。它的通訊方式如下:圖4-4-1客戶端和效勞器websocket通訊。圖4-4-1客戶端和效勞器websocket通訊(2)HighChats一套由純Javascript寫的表現(xiàn)層框架,它提供曲線、面積、柱形圖、條形圖、餅圖、散點圖、區(qū)域*圍圖、氣泡、漏斗等等一系列的圖形表現(xiàn)形式。HighChars不需要像Flash和Java那樣需要插件才可以運行,而且運行速度快,它是輕量級的JavaScript腳本,它使用的是json數(shù)據(jù)格式,數(shù)據(jù)傳輸更加方便,而且它的數(shù)據(jù)是在客戶端解析的,減輕了效勞器的壓力,所以它比JFreeChart更方便(JFreeChart是JAVA平臺上的一個開放的圖表繪制類庫。它完全使用JAVA語言編寫在我看來JFreeChart有點笨重了,而且它生成的圖形也比HighChart少,并且好似是收費的)。另外HighCharts還有很好的兼容性,能夠完美支持當(dāng)前大多數(shù)瀏覽器。(3)SpringDataJPA提供了一整套數(shù)據(jù)訪問層(DAO)的解決方案,致力于減少數(shù)據(jù)訪問層的開發(fā)量,并支持云效勞的開源框架。SpringData作為SpringSource的其中一個父工程,旨在統(tǒng)一和簡化對各類型持久化存儲,而不拘泥于是關(guān)系型數(shù)據(jù)庫還是NoSQL數(shù)據(jù)存儲。無論是哪種持久化存儲,數(shù)據(jù)訪問對象〔或稱作為DAO,即DataAccessObjects〕通常都會提供對單一域?qū)ο蟮腃RUD〔創(chuàng)立、讀取、更新、刪除〕操作、查詢方法、排序和分頁方法等。SpringData則提供了基于這些層面的統(tǒng)一接口〔Repository、CrudRepository、PagingAndSortingRepository、JpaRepository〕以及對持久化存儲的實現(xiàn)。JPA〔JavaPersistenceAPI,Java持久化API〕是sun提出的一個對象持久化規(guī)*,各JavaEE應(yīng)用效勞器自主選擇實現(xiàn),JPA的底層實現(xiàn)是一些流行的開源ORM(對象關(guān)系映射)框架〔如Hibernate、OpenJPA、TopLink、Ibatis等等〕,因此JPA其實也就是java實體對象和關(guān)系型數(shù)據(jù)庫建立起映射關(guān)系,通過面向?qū)ο缶幊痰乃枷氩僮麝P(guān)系型數(shù)據(jù)庫的規(guī)*。JPA,定義了對象-關(guān)系映射以及實體對象持久化的標(biāo)準(zhǔn)接口。如以下圖:圖4-4-2JPA在應(yīng)用程序中的位置:圖4-4-2JPA在應(yīng)用程序中的位置SpringDataJpa是SpringData對JPA提供的一套解決方案。SpringDataJpa實現(xiàn)了大局部的持久層的邏輯代碼,你需要做的只是聲明持久層的接口,其他的都交給SpringDataJpa完成。SpringDataJpa中Repository是一個空接口,CrudRepository:繼承Repository,實現(xiàn)了一組CRUD相關(guān)的方法,PagingAndSortingRepository:繼承CrudRepository,實現(xiàn)了一組分頁排序相關(guān)的方法,JpaRepository:繼承PagingAndSortingRepository,實現(xiàn)一組JPA規(guī)*相關(guān)的方法。相關(guān)技術(shù)方案參考SpringData實戰(zhàn)的書籍[2]。SpringDataJpa提供的接口如以下圖4-4-3SpringDataJpa提供的接口圖:圖4-4-3SpringDataJpa提供的接口圖(4)SpringMVC,SpringWebMVC是一種基于Java的實現(xiàn)了WebMVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進展職責(zé)解耦,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),SpringWebMVC也是要簡化我們?nèi)粘eb開發(fā)的。它的請求處理流程圖如下:圖4-4-2springMVC請求處理流程圖前端控制器首先接收到用戶的請求,前端控制器根據(jù)接收的請求信息把請求委托給頁面控制器來處理。處理器接收請求后調(diào)用相應(yīng)的業(yè)務(wù)對象處理請求,如果有數(shù)據(jù)庫操作會向數(shù)據(jù)庫請求數(shù)據(jù),并返回一個模型視圖〔一般是ModelAndView〕,返回的模型經(jīng)過視圖解析器把,模型數(shù)據(jù)解析到頁面中并返回給客戶端。SpringMVC充分對模型、視圖、控制器進展充分的解耦,并利用SpringIOC的功能更加方便管理。相關(guān)技術(shù)方案參考SpringMVC學(xué)習(xí)指南的書籍[1]。(5)REST風(fēng)格URL,REST架構(gòu)風(fēng)格是全新的針對Web應(yīng)用的開發(fā)風(fēng)格,是當(dāng)今世界最成功的互聯(lián)網(wǎng)超媒體分布式系統(tǒng)架構(gòu),它使得人們真正理解了Http協(xié)議本來面貌。隨著REST架構(gòu)成為主流技術(shù),一種全新的互聯(lián)網(wǎng)網(wǎng)絡(luò)應(yīng)用開發(fā)的思維方式開場流行。REST是基于Http協(xié)議的,任何對資源的操作行為都是通過Http協(xié)議來實現(xiàn)。以往的Web開發(fā)大多數(shù)用的都是Http協(xié)議中的GET和POST方法,對其他方法很少使用,這實際上是因為對Http協(xié)議認(rèn)識片面的理解造成的。Http不僅僅是一個簡單的運載數(shù)據(jù)的協(xié)議,而是一個具有豐富內(nèi)涵的網(wǎng)絡(luò)軟件的協(xié)議。他不僅僅能對互聯(lián)網(wǎng)資源進展唯一定位,而且還能告訴我們?nèi)绾螌υ撡Y源進展操作。Http把對一個資源的操作限制在4個方法以內(nèi):GET,POST,PUT和DELETE,這正是對資源CRUD操作的實現(xiàn)。由于資源和URI是一一對應(yīng)的,執(zhí)行這些操作的時候URI是沒有變化的,這和以往的Web開發(fā)有很大的區(qū)別。正由于這一點,極大的簡化了Web開發(fā),也使得URI可以被設(shè)計成更為直觀的反映資源的構(gòu)造,這種URI的設(shè)計被稱作RESTful的URI。基于RESTURL風(fēng)格的請求方式如下:圖4-4-2基于RESTURL風(fēng)格的請求5進度方案說明本工程的進度要求,參照軟件工程的三個時期中的八個階段時間安排問題定義3日可行性分析2日需求分析5日總體設(shè)計5日詳細設(shè)計10日編碼和單元測試15日綜合測試5日軟件維護5日操作培訓(xùn)3日驗收測試2日工程驗收2日總計為57天6條件、假定和限制(1)建議開發(fā)軟件開發(fā)投入的時間:兩個月(2)經(jīng)費來源及限制:由需求方提供(3)軟件的預(yù)期壽命:兩年(4)網(wǎng)絡(luò)環(huán)境:局域網(wǎng)(5)運行環(huán)境:mysql5.1,JavaRuntimeEnviroment1.7及以上版本(6)客戶端環(huán)境:InternetE*plorer8.0及以上的版本(7)硬件設(shè)備:處理器InterPentinm3或者更高,內(nèi)存至少256M以上,硬盤至少2G(8)平臺:linu*redhat5.6以上,內(nèi)核版本kernel-2.6.18-238.el5(9)法律和政策:遵守相關(guān)的法律法規(guī),以保護用戶的隱私為前提開發(fā)軟件7系統(tǒng)設(shè)計與原型UI〔或系統(tǒng)設(shè)計與實現(xiàn)〕7.1數(shù)據(jù)庫表設(shè)計數(shù)據(jù)庫名:Prescription數(shù)據(jù)庫管理者賬號:root密碼:root賬號操作權(quán)限:CREATE、DROP、DELETE、INSERT、UPDATE、SELECT、ALTERUser表:記錄用戶的根本信息。表User(用戶表)用于保存用戶的根本信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是用戶編號NameVarchar64否用戶**TelephoneVarchar20否BirthdayData10否出生日期insurance_panyVarchar32否承保公司Policy_numberVarchar64否保單號表7-1-1User表Department表:部門表,醫(yī)師所屬部門。表Department(部門表)用于保存醫(yī)師的部門字段名數(shù)據(jù)類型長度主鍵描述IdInt11是部門編號NameVarchar64否部門名稱表7-1-2Department表Position表:醫(yī)師所屬職位。表Position(職位表)用于保存醫(yī)師的職位信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是職位編號NameVarchar64否職位名稱表7-1-3Department表Doctor表:醫(yī)師根本信息,包括兩個外鍵,表示醫(yī)師所屬的部門和職位。表Doctor(醫(yī)師表)用于保存醫(yī)師的根本信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是醫(yī)師編號NameVarchar64否醫(yī)師**TelephoneVarchar20否DidInt11否醫(yī)師所屬部門PidInt11否醫(yī)師所屬職位表7-1-4Doctor表Prescription表:處方信息表,記錄處方根本信息以及兩個外鍵,一個是該處方所屬的用戶,另一個是處方所屬醫(yī)師。表Prescription(處方信息表)用于保存處方的根本信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是處方編號UidInt11否該處方所屬用戶DidInt11否該處方所屬醫(yī)師BeginDateDate16否處方日期EndDateDate16否處方終止日期CrawlAgainstInt4否再次抓藥的次數(shù)表7-1-5Prescription表PrescriptionDetail表:處方詳細信息表,記錄一個處方中多個處方詳細信息記錄,兩個外鍵,一個表示該處方詳細所屬的處方,另一個表示該處方詳細中具體的藥物信息。表PrescriptionDetail(處方詳細信息表)用于保存處方的具體的信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是處方詳細編號CountInt4否數(shù)量CanuseString16否是否可用替代藥品Take_methodString255否服用的方式UnitString16否單位MidInt11否藥物的編號PidInt11否處方的編號表7-1-6PrescriptionDetail表Medicine表:記錄藥物的根本信息。表Medicine(藥物信息表)用于保存藥物的信息字段名數(shù)據(jù)類型長度主鍵描述IdInt11是藥物的編號NameString64否藥物的名稱SideeffectString255否副作用表7-1-7Medicine表Subtitute表:藥物可替代的藥品表,每個藥物如果有可替代的藥物,則該藥物將會維持一份藥物替代表,其中兩個字段都是外間,一個是指向具體的*個藥物,另外一個是指向可替代藥物的id編號。表Subtitute(藥物替代表)用于保存藥物的可替代藥物的信息字段名數(shù)據(jù)類型長度主鍵描述M_idInt11是藥物的編號S_idInt11是藥物的標(biāo)號表7-1-8Subtitute表數(shù)據(jù)庫總體UML如以下圖7-1-9數(shù)據(jù)庫UML圖7-1-9數(shù)據(jù)庫UML數(shù)據(jù)庫設(shè)計相關(guān)技術(shù)方案參考據(jù)庫設(shè)計與關(guān)系理論[4]與數(shù)據(jù)庫設(shè)計與應(yīng)用開發(fā)實踐[5]。無,由于使用了springdatajpa操作數(shù)據(jù)庫,springdatajpa簡化了數(shù)據(jù)庫訪問的操作。7.2關(guān)鍵算法與實現(xiàn)技術(shù)1.系統(tǒng)難點:添加一個處方信息可一次性提交多個處方詳細信息〔相當(dāng)于每次開藥方包含多種藥物,每種藥物的數(shù)量也不一致〕,每個處方詳細信息中又包含了根本信息以及藥品對象。為了解決該問題,每次選擇和填好一種藥物后都實用aja*保存到效勞器上的session中,當(dāng)然,在效勞器上建立了兩個類來暫時存放這些數(shù)據(jù),分別是PrescriptionDetailOperator和PrescriptionOperator兩個類。classPrescriptionDetailOperator{ privateintcount;//每個藥品的數(shù)量 privateStringunit;//每個藥品的單位 privateMedicinemedicine;//該藥品的對象 privateStringtakeMethod;//服用方法 privateStringcanuse;//是否可以實用替代藥品 //省略getter和setter方法}classPrescriptionOperator{ //聲明一個map來保存多個PrescriptionDetailOperator對象,實用藥品的id作為主鍵 privateMap<Integer,PrescriptionDetailOperator>map= newLinkedHashMap<Integer,PrescriptionDetailOperator>(); publicCollection<PrescriptionDetailOperator>getPreDetail(){ returnmap.values(); } //每次添加的時候都檢查是否存在藥物,存在則在原來的數(shù)量上增加 publicvoidaddPrescriptionDetail(PrescriptionDetailOperatorpreDetail){ Integerid=preDetail.getMedicine().getId(); if(map.containsKey(id)){ PrescriptionDetailOperator_preDetail=map.get(id); _preDetail.setCount(_preDetail.getCount()+preDetail.getCount()); }else{ map.put(id,preDetail); } } //可以移除處方詳細信息 publicvoidremovePreDetail(Integerpid){ if(map.containsKey(pid)){ map.remove(pid); } }}前臺使用aja*發(fā)送數(shù)據(jù)保存到效勞器端:varpdid;//保存處方詳細的idvar$tmp;//用于保存當(dāng)前刪除的對象的引用//保存更新處方詳細信息functionsaveDetail(item){ varpdid=$(item).attr("lang").trim();//處方詳細唯一編號 var$count;//數(shù)量 varcanuse;//是否可用替代藥品 varunit;//實用藥品單位 vartake_method;//服用方法 //遍歷找到一個處方詳細的信息 $(item).parent().parent().find(".modal-body").each(function(inde*){ $count=$(this).find("#count"); canuse=$(this).find("#canuse").find("option:selected").val().trim(); unit=$(this).find("#unit").val().trim(); take_method=$(this).find("#take_method").val().trim(); }); if(!/^\+"[1-9][0-9]*$/.test($count.val().trim())){ $.tooltip('請輸入正確的數(shù)字,該數(shù)字不能小于1!',2000,false); $count.val("1").focus(); return; } //發(fā)送aja*保存處方詳細信息 $.aja*({type:"POST", data:{"id":pdid,"count":$count.val().trim(),"canuse":canuse,"unit":unit,"takemethod":take_method},url:window.location.pathname.substring(0,25)+"saveUpdateDetail", success:function(data){ if(data){$.tooltip('保存成功成功!',2000,true);}else{$.tooltip('刪除失敗,請檢查效勞器或網(wǎng)絡(luò)狀態(tài)!',2000,false);} }, error:function(){$.tooltip('刪除失敗,請檢查效勞器或網(wǎng)絡(luò)狀態(tài)!',2000,false);} });}2.關(guān)鍵SQL:(1)查詢存在處方數(shù)據(jù)的用戶以及處方的數(shù)量:S,u.policy_number,u.telephone,u.insurance_pany,u.uid,count(*)fromprescriptionpinnerjoinuseruwhereu.id=p.uidgroupbyp.uid;(2).全表掃描user表查詢用戶對象fromUseruwhereconcat(,u.birthday,u.telephone,u.insurancepany,u.policyNumber)likeCONCAT('%',:search,'%');(HQL語法)(3).根據(jù)不同的年齡段統(tǒng)計用戶的數(shù)量selectcount(*),left(birthday,4)fromusergroupbyleft(birthday,4);(4).查詢所有用戶的出生年份,月份,日期分布selectleft(birthday,4),substring(birthday,6,2),substring(birthday,9,2)fromuser;3.核心算法:(1)WebSocket存儲和分發(fā)消息代碼,基于WebSocket效勞器與客戶端通訊的問題,醫(yī)師每添加一條處方記錄或者對處方記錄執(zhí)行刪除修改等操作時會及時通知客戶端效勞器數(shù)據(jù)狀態(tài)的改變并及時更新獲取最新的數(shù)據(jù)。針對以上的問題,我首先針對需要及時處理消息的頁面與效勞器建立WebSocket連接,效勞器端使用一個Map保存客戶端的連接,如下:privatestaticMap<String,Session>sessions=newHashMap<String,Session>();,每次請求時就根據(jù)session的id進展存儲,對每個醫(yī)師處方信息操作的頁面每個在頁面初始化時都與效勞器〔與上面處理的請求是同一個〕也建立一個WebScoket連接〔多個WebSocket連接到同一個請求〕,醫(yī)師每次操作成功時立即就發(fā)送WebScoket消息到效勞器,效勞器根據(jù)承受到的消息遍歷Map中客戶端中的多個連接循環(huán)發(fā)送消息到客戶端,客戶端根據(jù)承受到的消息以根據(jù)消息的內(nèi)容重新請求效勞器上的數(shù)據(jù)。7.3主要原型UI〔或主要功能實現(xiàn)〕(1)系統(tǒng)登錄和主界面圖7-3-1系統(tǒng)登錄界面功能作用:實現(xiàn)醫(yī)師的登錄功能圖7-3-2系統(tǒng)主界面功能作用:介紹系統(tǒng)以及顯示不同年齡或者部門人數(shù)占有的比率(2)用戶信息管理圖7-3-3所有用戶的根本信息功能作用:實用highcharts像是所有的用戶信息,可進展搜索圖7-3-4分頁顯示用戶信息以及操作功能作用:對用戶信息進展分頁處理以及顯示操作圖7-3-5彈出層顯示可編輯的用戶修改(3)處方信息管理功能作用:實現(xiàn)對用戶信息的修改圖7-3-6添加處方信息功能作用:實現(xiàn)添加處方信息圖7-3-7彈出層選擇藥品功能作用:實現(xiàn)添加處方信息中具體的一個藥品圖7-3-8可搜索藥品功能作用:實現(xiàn)藥品的搜索圖7-3-8添加多個藥品功能作用:實用aja*保存數(shù)據(jù),一次性可添加多個藥品的信息,即一個處方中可添加多個藥品信息,每個藥品信息中有不同的單位,數(shù)量,服用方式和是否可用替代的藥品。(3)處方記錄管理圖7-3-9處方歷史記錄的顯示功能作用:實用時間軸顯示每個用戶開過的處方記錄,該記錄上記錄正醫(yī)師的**和,以及每個處方中多個處方詳細信息,如果該藥品是可實用替代藥品,則列出可替代藥品的藥品名稱。圖7-3-9處方信息的修改界面功能作用:每個處方信息中都有多個處方詳細,即每個處方中有多個藥品信息,在該頁面中可對每個藥品進展修改和刪除。圖7-3-10彈出確認(rèn)刪除的模態(tài)框(4)用戶處方查詢圖7-3-11查詢所有處方記錄圖7-3-12實用關(guān)鍵字**搜索圖7-3-13實用關(guān)鍵字出生年份搜索圖7-3-14實用關(guān)鍵字搜索(5)取藥信息查詢管理圖7-3-15實用承保單號唯一搜索圖7-3-16藥物管理主頁功能作用:使用WebSocket實時處理處方數(shù)據(jù),顯示登記的處方信息。圖7-3-16藥物處理(6)系統(tǒng)出錯管理圖7-3-16處理404錯誤頁面圖7-3-17處理500錯誤頁面7.4測試方案與測試用例制定測試方案:(1)確定測試需求(2)制定測試策略(3)建立測試通過準(zhǔn)則(4)確定資源和進度(5)評審測試方案(6)更新測試方案設(shè)計測試:設(shè)計測試用例針對每一個測試需求,確定其需要的測試用例對每個測試用例,確定其輸入的預(yù)期結(jié)果確定測試用例文檔的測試環(huán)境配置對測試用例進展評審開發(fā)測試過程根據(jù)界面原型為每一個測試用例定義詳細的測試步驟為每一個格式步驟定義詳細的測試結(jié)果驗證方法為測試用例準(zhǔn)備輸入數(shù)據(jù)在實施測試時對測試過程進展更改1.單元測試首先在工程開發(fā)中使用單元測試,如:Junit、SpringJUnit4ClassRunner進展單元測試,按照測試過程手工執(zhí)行單元測試或運行測試腳本自動執(zhí)行單元測試,如下:RunWith(SpringJUnit4ClassRunner.class)Conte*tConfiguration(locations={"applicationConte*t.*ml"})TransactionalTransactionConfiguration(transactionManager="transactionManager")publicclassTestModule{Testpublicvoidtest(){}}2.集成測試:使用回歸測試方法,對軟件的新版本測試時,驗證是否解決了軟件缺陷,而且保證以前所有運行正常的功能依舊保持正常,而不會影響本次的修改。按照測試過程手工執(zhí)行集成測試或運行測試腳本自動執(zhí)行集成測試將集成測試結(jié)果作詳細記錄,并評審測試結(jié)果對修改后的工作版本執(zhí)行回歸測試,或者對增量集成后的版本執(zhí)行回歸測試2.驗收測試:以用戶為主,前提是已經(jīng)通過系統(tǒng)測試的軟件系統(tǒng),根據(jù)需求規(guī)格說明書或者概要設(shè)計文檔驗證需求的合理性和正確性,包括文檔資料是否完整、正確,人機界面和其他方面〔如,可移植性、兼容性、錯誤回復(fù)能力和可維護性等〕是否令用戶滿意。7.5安裝與運行情況(1)JDK1.7首先系統(tǒng)必須有JRE的支持,為了能夠完成在該環(huán)境下的編譯,最好能夠安裝下完整的JDK環(huán)境,JDK選用1.7或者更高的版本。(2)Maven3.3或更高的版本,本系統(tǒng)添加對Maven的支持,方便在不同類型的機器上完成編譯工作。(3)MYSQL5.1或更高的版本,與系統(tǒng)集成。(4)WEB效勞器,Tomcat17.0或更高的版本,為了支持WebSocket,Tomcat只有在7.0或者更高的版本中才添加了對WebScoket的支持。7.5.1安裝與配置描述效勞器端運行環(huán)境的配置情況,包括:安裝與初始化數(shù)據(jù)庫、安裝與配置效勞器安裝、安裝支撐軟件、配置系統(tǒng)運行參數(shù),等等。1.JDK環(huán)境配置:(1)如果系統(tǒng)中存在JDK1.7或更高的版本則這一步可以省略,可以實用java-version查看當(dāng)前系統(tǒng)JDK的版本,如以下圖所示。首先到Oracle官網(wǎng)下載下載JDK,官網(wǎng)地址如下:.oracle./technetwork/java/javase/downloads/java-archive-downloads-javase7-521261.html,假設(shè)當(dāng)前的文件名稱為jdk-7u67-linu*-*64.tar.gz,進入到該文件的目錄下。 (2)使用命令tar-z*vfjdk-7u67-linu*-*64.tar.gz-Cpath解壓到path路徑下,path為你想要放置JDK的本地位置,假設(shè)我放在/home/silence/software/jdk1.7.0_67就要執(zhí)行命令tar-z*vfjdk-7u67-linu*-*64.tar.gz/home/silence/software/ e*portCLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib e*portJRE_HOME=${JAVA_HOME}/jre e*portPATH=${JAVA_HOME}/bin:$PATH命令source/etc/profile使其立即生效,cat/etc/profile可以看到如下: (4)運行javac或者java命令可以看到即可 2.Maven安裝 (1)軟件下載,到apache官網(wǎng)地址apache.fayea./maven/maven-3/3.3.3/binaries/apache-maven-3.3.3-bin-tar-gz到本地目錄下。 (2)軟件解壓,進入到該文件的目錄,使用tar-z*vfapache-maven-3.3.3-bin.tar.gz-Cpath解壓到path目錄下,假設(shè)我的地址為:/home/silence/software/maven3.3則使用tar-z*vfapache-maven-3.3.3-bin.tar.gz-Chome/silence/software/maven3.3 (3)環(huán)境變量配置,到gedit/etc/profile翻開全局配置文件,在上面的JDK后添加上e*portMAVEN_HOME=/home/silence/software/maven3.3,最后變?yōu)?(4)執(zhí)行命令mvn-v可以看見maven版本和jre版本(4)修改本地倉庫地址,進入到maven目錄下的conf目錄,翻開settings.*ml,在<settings*mlns="/SETTINGS/1.0.0"*mlns:*si="./2001/*MLSchema-instance"">下添加<localRepository>/home/silence/data/repository</localRepository>其中/home/silence/data/repository是本地文件夾路徑,用來存放第三方j(luò)ar包。 3.Mysql安裝 (1)mysql可以在線安裝,mysql效勞器的安裝apt-getinstallmysql-server,安裝過程提示輸入root密碼 (2)mysql客戶端安裝apt-getinstallmysql-client (3)apt-getinstalllibmysqlclient-dev,實用mysql-uroot-p,輸入密碼,如下4.Tomcat安裝 (1)到apache官網(wǎng)地址下載Tomcat7,地址為: (2)實用命令tar-z*vfapache-tomcat-7.0.70-deploye.tar.gz-Cpath,path同上 (3)同樣的,你也可以把tomcat下的bin目錄添加到profile全局域中,進入到bin目錄下執(zhí)行./startup.sh并在瀏覽器中查看,如下: 5.工程編譯與工程放置及效勞器啟動 (1)文件信息修改,數(shù)據(jù)庫ip,用戶名以及密碼的修改,工程文件接下的src/main/resources下,找到perties,其中jdbc.user=root//用戶名 jdbc.password=root//密碼 jdbc.jdbcUrl=jdbc:mysql:///url地址,修改為當(dāng)前效勞器的ip地址 進入工程的主目錄,本系統(tǒng)的PrescriptionTrackSystem下,執(zhí)行mvnclean命令去除舊版本的編譯文件。 (2)實用mvnplier進展編譯下,如果你是首次進展編譯,則系統(tǒng)將會下載pom.*ml中需要的jar文件進展一起編譯,這將需要一定的時間。 編譯完成 (3)運行命令mvnpackage進展工程的打包工作,打包過的工程可以直接移植到tomcat中直接運行。(4)在當(dāng)前文件夾下的target文件夾下可以找到PrescriptionTrackSystem.war(5)把上圖中的PrescriptionTrackSystem.war放置在Tomcat目錄下的webapps目錄下,進入Tomcat文件夾下的bin文件夾,執(zhí)行./startup.sh文件啟動效勞器。(6)訪問ip+/PrescriptionTrackSystem/login.html可以訪問到如下內(nèi)容:7.5.2運行情況圖圖7-5-2-1所有用戶的根本信息功能作用:查詢在庫的所有用戶的信息記錄。圖7-5-2-2分頁顯示用戶信息以及操作功能作用:對用戶信息進展分頁處理以及顯示操作,并可對用戶進展一定的操作。圖7-5-2-3彈出層顯示可編輯的用戶修改功能作用:實現(xiàn)對用戶信息的修改。圖7-5-2-4添加處方信息功能作用:實現(xiàn)添加處方信息。圖7-5-2-5彈出層選擇藥品功能作用:實現(xiàn)添加處方信息中具體的一個藥品及一些額外信息。圖7-5-2-6可搜索藥品功能作用:實現(xiàn)藥品的搜索。圖7-5-2-7添加多個藥品功能作用:實用aja*保存數(shù)據(jù),一次性可添加多個藥品的信息,即一個處方中可添加多個藥品信息,每個藥品信息中有不同的單位,數(shù)量,服用方式和是否可用替代的藥品。圖7-5-2-8處方歷史記錄的顯示功能作用:實用時間軸顯示每個用戶開過的處方記錄,該記錄上記錄正醫(yī)師的**和,以及每個處方中多個處方詳細信息,如果該藥品是可實用替代藥品,則列出可替代藥品的藥品名稱。圖7-5-2-9處方信息的修改界面功能作用:每個處方信息中都有多個處方詳細,即每個處方中有多個藥品信息,在該頁面中可對每個藥品進展修改和刪除。圖7-5-2-10查詢所有處方記錄功能作用:查詢在庫的所有的處方記錄。圖7-5-2-11實用關(guān)鍵字搜索圖7-5-2-12藥物管理主頁功能作用:使用WebSocket實時處理處方數(shù)據(jù),顯示登記的處方信息。圖7-3-16藥物處理8總結(jié)本工程實現(xiàn)了需求中的大局部內(nèi)容,實現(xiàn)對用戶信息和處方信息維護等等一系列的功能,本工程的難點主要是數(shù)據(jù)構(gòu)造比擬復(fù)雜,表與表之間的關(guān)系比擬復(fù)雜,處理起來比擬麻煩,由于本人的設(shè)計水平有限,實現(xiàn)的功能比擬簡單,還有一些功能沒有具體實現(xiàn),比方權(quán)限的管理,整套系統(tǒng)對WebSocket的支持,沒有用戶方面的操作。另外,遺憾的是本工程默認(rèn)的藥物的數(shù)據(jù)量是不大的,確切的說應(yīng)該對這些藥物進展分類或者分藥房管理,如果藥物數(shù)據(jù)量太大的話執(zhí)行起來是比擬耗時間的。還有一點就是本工程沒有考慮到系統(tǒng)的并發(fā)性,沒有考慮到多個醫(yī)師處理同一個處方信息的情況,當(dāng)然這種情況可以添加權(quán)限來進展管理。參考資料PaulDeck著,SpringMVC學(xué)習(xí)指南.美:人民郵電,20015MarkPollack,SpringData實戰(zhàn).美:人民郵電,2014C.J.Date,數(shù)據(jù)庫設(shè)計與關(guān)系理論.,機械工業(yè),2013SoftwareDocumentation..literateprogramming./documentation.pdf,2001StrategiesforAgileSoftwareDevelopment..agliemodeling..agilemodeling./essays/agileDocumentation.htm,2012附件〔主要功能源代碼〕1.實體對象(1)EntityTable(name="user")publicclassUser{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid;//用戶id Column(length=32) privateStringname;//用戶** privateStringtelephone;//用戶DateTimeFormat(pattern="MM/dd/yyyy")//用戶出生日期 Temporal(TemporalType.DATE) privateDatebirthday; Column(length=32)//承保公司 privateStringinsurancepany; Column(length=32)//保單號 privateStringpolicyNumber; OneToMany(fetch=FetchType.LAZY,mappedBy="user",cascade=CascadeType.ALL) privateSet<Prescription>prescriptions; publicSet<Prescription>getPrescriptions(){ returnprescriptions; } //省略setter和getter}(2)Table(name="department")EntitypublicclassDepartment{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid; Column(length=32,nullable=false) privateStringname;//部門的名字 OneToMany(fetch=FetchType.LAZY,mappedBy="department",cascade=CascadeType.ALL) privateSet<Doctor>doctors=newHashSet<Doctor>();//該部門下的醫(yī)生//省略setter和getter}(3)Table(name="position")EntitypublicclassPosition{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid; Column(length=32,nullable=false) privateStringname;//職位的名稱 OneToMany(fetch=FetchType.LAZY,mappedBy="position",cascade=CascadeType.ALL) OrderBy(value="idASC") privateSet<Doctor>doctors=newHashSet<Doctor>();//該職位下的醫(yī)生//省略setter和getter}(4)EntityTable(name="doctor")publicclassDoctor{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid;Column(length=32,nullable=false) privateStringname;//醫(yī)師** Column(length=32,nullable=false) privateStringtelephone;//醫(yī)師Column(length=32,nullable=false) privateStringpassword;//登錄密碼ManyToOne(fetch=FetchType.EAGER,targetEntity=Department.class,optional=false) JoinColumn(name="did") privateDepartmentdepartment;//醫(yī)師所屬的部門 ManyToOne(fetch=FetchType.EAGER,targetEntity=Position.class,optional=false) JoinColumn(name="pid") privatePositionposition;//醫(yī)師的職位 OneToMany(fetch=FetchType.LAZY,mappedBy="doctor",cascade=CascadeType.ALL) privateSet<Prescription>prescriptions;//該醫(yī)生的處方//省略setter和getter}(5)EntityTable(name="prescription")publicclassPrescription{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid; DateTimeFormat(pattern="MM/dd/yyyy") Temporal(TemporalType.DATE)privateDatebegindate;//處方開場日期 DateTimeFormat(pattern="MM/dd/yyyy") Temporal(TemporalType.DATE) privateDateenddate;//處方終止日期 Column(length=4) privateintcrawlagainst;//有效抓要次數(shù)ManyToOne(fetch=FetchType.LAZY,targetEntity=User.class,optional=false) JoinColumn(name="uid") privateUseruser;//處方所屬用戶 ManyToOne(fetch=FetchType.LAZY,targetEntity=Doctor.class,optional=false) JoinColumn(name="did") privateDoctordoctor;//處方所屬醫(yī)生 OneToMany(fetch=FetchType.EAGER,mappedBy="prescription",cascade=CascadeType.ALL) privateSet<PrescriptionDetail>prescriptionDetails=newHashSet<PrescriptionDetail>();//省略setter和getter}(6)Table(name="prescriptiondetail")EntitypublicclassPrescriptionDetail{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid;Column(length=4,columnDefinition="INTdefault1") privateintcount;//該藥的數(shù)量Column(length=16) privateStringunit;//該藥的單位 Column(length=128,columnDefinition="Stringdefault無建議的服用方式") privateStringtakemethod;//服用方式 Column(length=16,columnDefinition="Stringdefault否") privateStringcanuse;//是否可用替代藥品 ManyToOne(fetch=FetchType.LAZY,targetEntity=Prescription.class,optional=false) JoinColumn(name="pid") privatePrescriptionprescription;//該處方詳細所屬的處方 ManyToOne(fetch=FetchType.LAZY,targetEntity=Medicine.class,optional=false) JoinColumn(name="mid") privateMedicinemedicine;//藥物信息//省略setter和getter}(7)EntityTable(name="medicine")publicclassMedicine{ IdGeneratedValue(strategy=GenerationType.AUTO) privateintid; Column(length=64,nullable=false) privateStringname;//藥物名稱 Column(length=128) privateStringsideeffect;//副作用 OneToMany(fetch=FetchType.LAZY,mappedBy="medicine",cascade=CascadeType.ALL,targetEntity=PrescriptionDetail.class) privateSet<PrescriptionDetail>prescriptionDetails=newHashSet<PrescriptionDetail>(); OneToMany(cascade=CascadeType.ALL,fetch=FetchType.LAZY) JoinTable(name="subtitute",joinColumns={JoinColumn(name="m_id")},inverseJoinColumns ={JoinColumn(name="s_id")}) privateSet<Medicine>substitutes=newHashSet<Medicine>();//可替代的藥品列表//省略setter和getter}2.數(shù)據(jù)訪問接口(1)DoctoryRepositoryRepository(value="doctoryDao")Transactional(readOnly=true)publicinterfaceDoctorRepositorye*tendsJpaRepository<Doctor,Integer>{ModifyingQuery("updateDoctordset=:name,d.telephone=:telephonewhered.id=:id")publicvoidupdate(Param("name")Stringname,Param("telephone")Stringtelephone,Param("id")Integerid); publicDoctorfindByNameAndPassword(Stringname,Stringpassword);}(2)MedicineRepositoryRepository(value="medicineDao")Transactional(readOnly=true)publicinterfaceMedicineRepositorye*tendsJpaRepository<Medicine,Integer>{}(3)PrescriptionRepositoryTransactionalRepository("prescriptionDao")publicinterfacePrescriptionRepositorye*tendsJpaRepository<Prescription,Integer>{ //根據(jù)用戶id號查詢處方記錄 publicList<Prescription>findPrescriptionsByUserId(Integerid); Query("fromPrescriptionpreorderbypre.idDESC") publicList<Prescription>find(); //更新處方,減少處方可取次數(shù) Modifying Query(value="updateprescriptionsetcrawlagainst=crawlagainst-1whereid=:id",nativeQuery=true) publicvoiddecreasePrescription(Param("id")Integerid); //更新處方信息 Modifying Query(value="updatePrescriptionpresetpre.enddate=:enddate,pre.crawlagainst=:crawlagainstwherepre.id=:id") publicvoidupdate(Param("enddate")Dateenddate,Param("crawlagainst")Integercrawlagainst,Param("id")Integerid); Query(value="select,u.policy_number,u.telephone,u.insurance_pany,count(*),u.idfromprescriptionpinnerjoinuseruwhereu.id=p.uidgroupbyp.uid",nativeQuery=true) publicList<Object[]>showUPrescriptionCount(); Query(value="select*fromprescriptionorderbyiddesclimit1",nativeQuer=true) publicPrescriptionfindLastPrescription();}(4)PrescriptionDetailRepositoryRepository(value="prescriptionDetailDao")publicinterfacePrescriptionDetailRepositorye*tendsJpaRepository<PrescriptionDetail,Integer>{ //更新處方詳細信息 TransactionalModifying Query(value="updatePrescriptionDetaildetailsetdetail.count=:count,detail.unit=:unit,detail.takemethod=:takemethod,detail.canuse=:canusewheredetail.id=:id") publicvoidupdateDetail(Param("count")Integercount,Param("unit")Stringunit,Param("takemethod")Stringtakemethod,Param("canuse")Stringcanuse,Param("id")Integerid);}(5)UserRepositoryTransactionalRepository("userDao")publicinterfaceUserRepositorye*tendsJpaRepository<User,Integer>{ Modifying Query("updateUseruset=:name,u.birthday=:birthday,u.telephone=:telephone,u.insurancepany=:insurancepany,u.policyNumber=:policyNumberwhereu.id=:id") publicvoidupdate(Param("name")Stringname,Param("birthday")Datebirthday,Param("telephone")Stringtelephone,Param("insurancepany")Stringinsurancepany,Param("policyNumber")StringpolicyNumber,Param("id")Integerid); //根據(jù)搜索關(guān)鍵字查詢用戶 Query("fromUseruwhereconcat(,u.birthday,u.telephone,u.insurancepany,u.policyNumber)likeCONCAT('%',:search,'%')") publicList<User>findUserByAll(Param("search")Stringsearch);//根據(jù)承保公司計算用戶的數(shù)量 Query("selectcount(*),insurancepanyfromUserugroupbyu.insurancepany") publicList<Object[]>countUser(); //根據(jù)不同的年齡段統(tǒng)計用戶的數(shù)量 Query(value="selectcount(*),left(birthday,4)fromusergroupbyleft(birthday,4)",nativeQuery=true) publicList<Object[]>findByAgeCount(); //查詢用戶的出生年份,月份,日期 Query(value="selectleft(birthday,4),substring(birthday,6,2),substring(birthday,9,2)fromuser",nativeQuery=true) publicList<Object[]>findByYearMonthdayDay(); //根據(jù)用戶的判斷是否存在 Query("fromUseruwhereu.telephone=:telephone") publicUsere*ist(Param("telephone")Stringtelephone); }3.業(yè)務(wù)層接口和類(1)publicinterfaceBaseService<T>{ publicvoidadd(Tt); publicTsearch(); publicTfind(Integerid); publicList<T>find(String[]Param); publicList<T>get(Integerid); publicTfind(Tt); publicList<T>find(); publicvoiddelete(Tt); publicvoiddelete(Integerid); publicList<Object[]>get(); publicList<Object[]>get(Tt); publicvoidupdate(Tt); publicvoidupdate(Integerid); publicLongcount(); publicList<T>findPage(intpage,intpageSize); publicTe*ist(Tt);}(2)publicclassBaseServiceImpl<T>implementsBaseService<T>{ Autowired privateJpaRepository<T,Integer>dao; publicvoidadd(Tt){dao.save(t);} publicTfind(Integerid){returndao.findOne(id);} publicTfind(Tt){returnnull;} pu
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年乳制品市場分析:關(guān)稅變化下的產(chǎn)業(yè)格局與消費趨勢
- 混凝土擠壓墻施工方案
- 《論語●孟子》閱讀練習(xí)
- 黑龍江省大慶市讓胡路區(qū)大慶中學(xué)2024-2025學(xué)年高二上學(xué)期期末數(shù)學(xué)試題(解析版)
- 安徽省馬鞍山市當(dāng)涂第一中學(xué)2024-2025學(xué)年高一上學(xué)期期末質(zhì)量檢測數(shù)學(xué)試題 (解析版)
- 辦公室管理-形考任務(wù)五(第六章~第七章)-國開-參考資料
- 2025年真實情景測試題及答案
- 混凝土攔水帶施工方案
- 6年級上冊英語書課文第2單元
- 5-羥基-1-甲基吡唑的合成
- 多發(fā)傷骨折護理查房
- 2023年軟件評測師《基礎(chǔ)知識》考試題庫(濃縮500題)
- 中建預(yù)制構(gòu)件吊裝安全專項施工方案
- 《馬化騰創(chuàng)業(yè)經(jīng)歷》課件
- 2023年湖北省生態(tài)環(huán)保有限公司招聘筆試真題
- 2023年新疆事業(yè)單位開展招聘考試真題
- 學(xué)校班主任談心制度實施方案
- CRISPR-Cas9-基因編輯技術(shù)簡介
- 質(zhì)量互變規(guī)律、否定之否定規(guī)律
- 小學(xué)語文六年級下冊單元作文評價表:讓真情自然流露
- 2024魚塘租賃合同模板
評論
0/150
提交評論