医院收费系统 一点的简单总结

本文介绍了使用Struts1.2、Hibernate3.2、Spring2.5和ExtJS3.0等技术开发医院收费系统的过程,重点讲解了数据库迁移、备份还原及报表查询等功能实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

开发框架  struts1.2 + hibernate 3.2 + spring 2.5 + extjs 3.0

 

开发工具  myeclipse 6.5   tomcat6.0

 

项目描述: 就是一个医院的收费系统。然后外带一些报表的查询。

 

运用的一下技术。

 1.数据库方面 :要将原来系统的数据导入到现在的数据库。 使用了

 select   t.字段1,t.字段1,t.字段1, table t into table t2

 

2.数据库的备份还原Mysql (都是java调用cmd命令执行mysql的命令) 没有考虑linux

 

cmd命令中需要  mysql  用户名称 密码 数据库 

 当时考虑 在程序中将这些写死不容易维护 就 想到了XML 配置文件。原来想用spring 的jdbc.properties的。可是在我这没问题。就是 hql语句会莫名其妙 where条件不执行。

 

xml 我使用sax解析。

 

配置文件:我放在了classpath 下方便查找。

<?xml version="1.0" encoding="UTF-8"?>
<datasource>
    <propertys>
        <property name="driverClassName" value="com.mysql.jdbc.Driver" comment="数据库驱动"/>
        <property name="url" value="221.131.187.**"  comment="数据库地址"/>
        <property name="db" value="his" comment="数据库名称"/>
        <property name="username" value="logistics" comment="用户名"/>
        <property name="password" value="abc123" comment="密码"/>
        <property name="port" value="3306" comment="端口号"/>
    </propertys>
</datasource> 


 

在action中 解析的方法:

 /**   
      * @param request   
      * @return   
      * 获取配置文件绝对路径   
      */   
    private static String getXMLFile(HttpServletRequest request,String xmlFileName) throws Exception{  
          xmlFileName = request.getSession().getServletContext().getRealPath(xmlFileName);
          log.info("XML File Name : " + xmlFileName);
          return    xmlFileName;
     }    
         
     /**   
      * @param request   
      * @return   
      * 初始化配置文件   
      */   
     private static Document getDocument(HttpServletRequest request,String xmlFileName) throws Exception{
        
          SAXReader saxReader = new SAXReader();   
          //得到指定文件以流的形式对文件进行序列化    
          FileInputStream fis = new FileInputStream(getXMLFile(request, xmlFileName));    
          return  saxReader.read(fis);    
     }    
         
 
       
     /**   
      * @param request   
      * @return   
      * 获取某个指定preparents的配置属性   
      */   
     @SuppressWarnings("unchecked")
    private static Map getXmlMap(HttpServletRequest request,String xmlFileName) throws Exception{    
         //xml中的访问路径,说明欲处理XML文件的根元素是datasource   
         String xPath = "//propertys/property";    
         //获取按照指定搜索路径得到的元素列表,这里指获取所有的datasource下的propertys元素    
         List result = getDocument(request,xmlFileName).selectNodes(xPath);    
         //属性和指定子元素的存储体    
         Map valueMap = new HashMap();    
         //遍历所得元素    
         Iterator iter = result.iterator();    
         while (iter.hasNext()) {       
             //获得具体的preparents元素    
             Element preparents = (Element) iter.next();    
             // 取得preparents元素的id属性的值    
             String propertyName = preparents.attributeValue("name");
             String propertyValue = preparents.attributeValue("value");    
             log.info("propertyName : " + propertyName + "  propertyValue : " + propertyValue);
             valueMap.put(propertyName, propertyValue);
          }    
          return valueMap;    
    }   
 

 

 

 

    /**
     *
     * <B>Description:</B>方法描述 数据库备份<BR>
     * <B>Param:</B><BR>
     * <B>Return:ActionForward</B><BR>    
     * <B>Author:刘成</B><BR>
     * <B>Apr 2, 2010</B><BR>
     */
    public ActionForward doCopyData(ActionMapping mapping, ActionForm form,
            HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        
            response.setContentType("text/html;charset=utf-8");
            //获取流
            PrintWriter out = response.getWriter();
            String xmlFilename = "/WEB-INF/classes/jdbc.xml";
            
            Boolean result = false;
            try {

                Map map = UserAction.getXmlMap(request,xmlFilename);
                
                String url = (String) map.get("url");
                String username = (String) map.get("username");
                String password = (String) map.get("password");
                String database = (String) map.get("db");
                String port = (String) map.get("port");
                
                //检查数据库连接是否正确
                int value = UserAction.DataConnection("jdbc:mysql://"+url+":"+port+"/"+database, username, password);
                if(value != 0){
                    out.print("备份失败, 数据库连接配置错误 联系管理员!");
                    return null;
                }
                
                //构造数据库备份命令
                String sqlCommand = "mysqldump -h"+url+"  -u"+username+" -p"+password+"  --default-character-set=utf8 "+database +" > " + fileName();
                Runtime rt = Runtime.getRuntime();       
                Process child = rt.exec("cmd /c " + sqlCommand);
                child.waitFor();
                child.destroy();
                result = true;
            } catch (IOException e) {
                // TODO: handle exception
                out.print("备份失败, 生成备份文件失败 检查是否有创建权限!");
                out.flush();
                out.close();
                return null;
            }
            log.info("数据库备份成功");
            //将流打到客户端
            out.print("备份成功 请于 d:/goldenbean/db 目录下查看!");
            //清空缓存
            out.flush();
            //关闭流
            out.close();
            return null;
        
    } 

 

    备份到这里结束。xml的解析都没什么问题。就是那个备份执行的那个命令。

    刚开始。    Runtime rt = Runtime.getRuntime();       
                   Process child = rt.exec("cmd /c " + sqlCommand);

   这句 我没有加 cmd /c  也成功执行了。但是就是没有生成文件。然后就用child.getInputStream();得到流生成文件。也生成成功了。可是后来做到还原的时候。命令也是执行了。但是还是没反应。所以就上网百度。原来要加个cmd /c    linux 好像 是sh

 

数据库的还原:

              大体和上边都是差不多 也是 判断配置文件是否正确。判断数据库用户名。密码。客户端选择一个sql文件 。上传到服务器的  目录下 然后还原其实就是  

  String sqlCommand = "mysqldump -h"+url+"  -u"+username+" -p"+password+"  --default-character-set=utf8 "+database +" <" + fileName();

 

这条命令  中   '>'  这个符号         '>c:/a.sql' 是备份到那个目录下  '<c:/a.sql' 是通过那个目录下的文件还原

 

 3.报表的查询。

    有几个报表.其中有一个比较复杂。根据某张表的某个字段的类型分组排序。还要和别的表关联。真是麻烦。我当时想到了存储过程。其实在java中搞了这么久。没怎么用过存储过程。然后那天写了一个。

发现还行。

 

就简单描述一下怎么在hiberante 中使用存储过程。

 

首先。我们建一个简单的存储过程 :

            create procedure(in doctor varchar(50))

            begin

                      select id,aa,bb,cc,dd from table where doctor = doctor

            end;

          大概就是这个意思。设计的比这个复杂的多。根据传入的参数返回一些汇总信息。

 

          那么在hibernate中怎么配呢。

         我是建了一张表 表中的类容和上边查询的对应   id aa bb  cc dd 字段。

         也可以不用建表。为什么建呢。是因为hibernate 可以根据aa bb  cc  得到对应的pojo反射生成对象。 如果不建表返回的可是 query.list  中可是 object[] 数组

 

  hibernate:  配置文件

 

<hibernate-mapping>
    <class name="cn.goldenbean.database.cost.to.TblReportChargesDetail" table="TBL_REPORT_CHARGES_DETAIL" catalog="his">
        <id name="id" type="java.lang.Integer">
            <column name="ID" />
            <generator class="native" />
        </id>

        <property name="doctor" type="java.lang.String">
            <column name="DOCTOR">
                <comment>医生</comment>
            </column>
        </property>
      <property name="checkFee" type="java.lang.Double">
            <column name="CHECK_FEE" precision="10">
                <comment>检查费</comment>
            </column>
        </property>
        <property name="operaFee" type="java.lang.Double">
            <column name="OPERA_FEE" precision="10">
                <comment>手术费</comment>
            </column>
        </property>
            <property name="laboratoryFee" type="java.lang.Double">
            <column name="LABORATORY_FEE" precision="10">
                <comment>化验费</comment>
            </column>
    </class>
     <!--存储过程主要要配这个  name 是你 hibernate 中调用的名称 随便写-->
        <sql-query name="chargesDetail" callable="true">
       <!--alias 别名    class 就是你要反射生成的对象   对象中的属性  和存储过程中的对应上就可以 这样在 返回的就是一个对象了--->
            <return alias="chargesDetail" class="cn.goldenbean.database.cost.to.TblReportChargesDetail">
                <return-property name="doctor" column="aa"/>
                <return-property name="checkFee" column="bb"/>
                <return-property name="operaFee" column="cc"/>
                <return-property name="laboratoryFee" column="dd"/>
            </return>
            {call chargesDetail(?)} <!--数据库中的存储过程名 有几个参数写几个 ? 用逗号隔开。-->
        </sql-query>
</hibernate-mapping> 

 

 

在dao中如何调用呢。

   先得到hibernate  的 Session

   org.hibernate.Session session = this.getSession();

    Query query = session.getNamedQuery("chargesDetail");//调用存储过程
    
        query.setParameter(0, doctor); //注册参数 从下标0 开始
       query.list();//这个list 返回的就是 对象的集合


       // if(query.list().size() > 0)  

         // return  (TblReportChargesDetail) query.list().get(0); 我的只需要第一条。

 

别的就没什么了。

 

 

框架的搭建什么的。都是那样。ssh 

 

 哎。发现写总结真是不会写。好难。

 

 

 

 

 

转载于:https://www.cnblogs.com/lyglcheng/archive/2010/04/08/1707387.html

医院门诊收费管理系统需求 一、 系统组成 本系统由于五大模块组成: 1. 系统管理 2. 基本资料 3. 查询修改 4. 统计分析 5. 系统帮助 各模块的基本功能如下: 一、系统管理 a. 用户基本信息。包括用户的名称,地址,联系方式,法人,屏保时间,注册码 b. 用户管理。建立用户基本资料 c. 权限管理。分配用户的操作权限 d. 修改密码 e. 数据备份 f. 数据还原 g. 系统日志 二、 基本资料 a. 科室信息 b. 医生信息 c. 收费项目信息 d. 门诊收费收据 e. 退费管理 (当天的收据只能修改,不能作退费处理) 三、 查询修改 a. 收据修改 b. 退费单查询修改 c.系统月结 四、 统计分析 1. 日报表 a、日总报表。包括当日会诊收据的列单,及金额的汇总 b、收费员日报表。包括每个收费员的当日的收费清单及金额的汇总 c、医生收费日报表。分类统计当天所有的医生收费情况。医生收费日报表 d、科室收费日报表。分类统计当天所有的科室收费情况 e、收费项目日报表。分类统计当天所有的收费项目的收费情况。 2、月报表 a、 月总报表。包括选择日期范围内的每日收入小计及当月合计 b、医生收费月报表。分类统计选择日期范围内医生收费情况。 c、科室收费月报表。分类统计选择日期范围所有的科室收费情况 d、收费项目月报表。分类统计选择日期范围所有的收费项目的收费情况 3、时段分类统计 a、收费员单元时间统计 b、 医生单元时间统计 c、 科室单元时间统计 d、 收费项目单元统计 4、公费医序统计
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值