| package com.dy.pipIrrBase.util; | 
|   | 
| import com.dy.common.multiDataSource.DataSourceContext; | 
| import com.dy.common.mybatis.envm.Deleted; | 
| import com.dy.common.mybatis.envm.Disabled; | 
| import com.dy.common.util.ConfigXml; | 
| import com.dy.common.util.MD5; | 
| import com.dy.common.webListener.ConfigListener; | 
| import com.dy.pipIrrGlobal.daoBa.BaDistrictMapper; | 
| import com.dy.pipIrrGlobal.daoBa.BaSettingsMapper; | 
| import com.dy.pipIrrGlobal.daoBa.BaUserMapper; | 
| import com.dy.pipIrrGlobal.daoSe.SePaymentMethodMapper; | 
| import com.dy.pipIrrGlobal.daoSe.SeWaterTypeMapper; | 
| import com.dy.pipIrrGlobal.pojoBa.BaDistrict; | 
| import com.dy.pipIrrGlobal.pojoBa.BaSettings; | 
| import com.dy.pipIrrGlobal.pojoBa.BaUser; | 
| import com.dy.pipIrrGlobal.pojoSe.SePaymentMethod; | 
| import com.dy.pipIrrGlobal.pojoSe.SeWaterType; | 
| import com.dy.pipIrrGlobal.util.DistrictLevel; | 
| import org.jdom2.Document; | 
| import org.springframework.beans.factory.annotation.Autowired; | 
| import org.springframework.boot.context.event.ApplicationReadyEvent; | 
| import org.springframework.context.ApplicationListener; | 
| import org.springframework.lang.NonNull; | 
| import org.springframework.stereotype.Component; | 
|   | 
| import java.net.URL; | 
|   | 
| /** | 
|  * 监听器,实现功能:在系统启动时初始化,向数据库中插入数据 | 
|  * 本监听器不能采用ServletContextListener方式,因为Servlet上下文Context创建后 | 
|  * Spring容器并没有创建完,而本类中用了Spring容器中的Bean,即distriDao, userDao。 | 
|  * 所以采用了Spring事件监听器来实现 | 
|  */ | 
| @Component | 
| public class InitListener implements ApplicationListener<ApplicationReadyEvent> { | 
|   | 
|     private BaDistrictMapper distriDao ; | 
|     private BaUserMapper userDao ; | 
|     private SePaymentMethodMapper paymentMethodDao ; | 
|     private BaSettingsMapper settingsDao ; | 
|     private SeWaterTypeMapper waterTypeDao ; | 
|   | 
|     @Autowired | 
|     public void setDistriDao(BaDistrictMapper distriDao){ | 
|         this.distriDao = distriDao ; | 
|     } | 
|   | 
|     @Autowired | 
|     public void setUserDao(BaUserMapper userDao){ | 
|         this.userDao = userDao ; | 
|     } | 
|   | 
|     @Autowired | 
|     public void setPaymentDao(SePaymentMethodMapper paymentMethodDao){ | 
|         this.paymentMethodDao = paymentMethodDao ; | 
|     } | 
|   | 
|     @Autowired | 
|     public void setSettingsDao(BaSettingsMapper settingsDao){ | 
|         this.settingsDao = settingsDao ; | 
|     } | 
|   | 
|     @Autowired | 
|     public void setWaterTypeDao(SeWaterTypeMapper waterTypeDao){ | 
|         this.waterTypeDao = waterTypeDao ; | 
|     } | 
|   | 
|   | 
|     /** | 
|      * SpringBoot容器已经准备好了 | 
|      * @param event 事件 | 
|      */ | 
|     @Override | 
|     public void onApplicationEvent(@NonNull ApplicationReadyEvent event) { | 
|         try { | 
|             //等1秒,等待com.alibaba.druid.pool.DruidDataSource实始化完成 | 
|             Thread.sleep(1000L); | 
|         } catch (InterruptedException e) { | 
|             e.printStackTrace(); | 
|         }finally { | 
|             this.init(event); | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 实始化 | 
|      */ | 
|     @SuppressWarnings("unused ") | 
|     private void init(ApplicationReadyEvent event){ | 
|         try { | 
|             URL configFileURL = ConfigListener.class.getResource("/init-config.xml" ); | 
|             ConfigXml configXml = new ConfigXml() ; | 
|             Document doc = configXml.createDom(configFileURL) ; | 
|             this.doInit(configXml, doc); | 
|         } catch (Exception e) { | 
|             System.out.println("系统启动时,初始化配置出错 !"); | 
|             System.out.println(e.getMessage()); | 
|             e.printStackTrace(); | 
|         } | 
|     } | 
|     private void doInit(ConfigXml configXml, Document doc) throws Exception{ | 
|         if(configXml != null && doc != null){ | 
|             for(int num = 1; num <= 10000; num++){ | 
|                 if(configXml.existElement(doc, "config.orgs.org" + num)){ | 
|                     String orgTag = configXml.getSetAttrTxt(doc, "config.orgs.org" + num,"tag", null, false, null) ; | 
|                     //设置数据源 | 
|                     DataSourceContext.set(orgTag); | 
|                     if(!this.existDistricts()){ | 
|                         if(configXml.existElement(doc, "config.orgs.org" + num + ".districts.province")){ | 
|                             String distriName = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.province","name", null, false, null) ; | 
|                             String distriNum = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.province","num", null, false, null) ; | 
|                             Integer distriLevel = configXml.getSetAttrPlusInt(doc, "config.orgs.org" + num + ".districts.province","level", null, 1, 99,null) ; | 
|                             Long supperId = this.saveDistrict(null, distriName, distriNum, distriLevel); | 
|                             if(supperId != null && configXml.existElement(doc, "config.orgs.org" + num + ".districts.province.city")){ | 
|                                 distriName = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.province.city","name", null, false, null) ; | 
|                                 distriNum = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.province.city","num", null, false, null) ; | 
|                                 distriLevel = configXml.getSetAttrPlusInt(doc, "config.orgs.org" + num + ".districts.province.city","level", null, 1, 99,null) ; | 
|                                 supperId = this.saveDistrict(supperId, distriName, distriNum, distriLevel); | 
|                                 if(supperId != null && configXml.existElement(doc, "config.orgs.org" + num + ".districts.province.city.country")) { | 
|                                     distriName = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.province.city.country", "name", null, false, null); | 
|                                     distriNum = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.province.city.country", "num", null, false, null); | 
|                                     distriLevel = configXml.getSetAttrPlusInt(doc, "config.orgs.org" + num + ".districts.province.city.country", "level", null, 1, 99, null); | 
|                                     this.saveDistrict(supperId, distriName, distriNum, distriLevel); | 
|                                 } | 
|                             } | 
|                         } | 
|                     } | 
|                     if(!this.existUsers()){ | 
|                         if(configXml.existElement(doc, "config.orgs.org" + num + ".user")){ | 
|                             String name = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".user","name", null, false, null) ; | 
|                             String phone = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".user","phone", null, false, null) ; | 
|                             String password = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".user","password", null, false, null) ; | 
|                             Integer supperAdmin = configXml.getSetAttrPlusInt(doc, "config.orgs.org" + num + ".user","supperAdmin", null, 0, 1,null) ; | 
|                             this.saveUser(orgTag, name, phone, password, supperAdmin); | 
|                         } | 
|                     } | 
|                     if(!this.existPayments()){ | 
|                         if(configXml.existElement(doc, "config.orgs.org" + num + ".payments")){ | 
|                             for(int i = 1 ; i < 10000; i++){ | 
|                                 if(configXml.existElement(doc, "config.orgs.org" + num + ".payments.item" + i)){ | 
|                                     String name = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".payments.item" + i,"name", null, false, null) ; | 
|                                     this.savePayment(orgTag, name); | 
|                                 }else{ | 
|                                     break ; | 
|                                 } | 
|                             } | 
|                         } | 
|                     } | 
|                     if(!this.existSettings()){ | 
|                         if(configXml.existElement(doc, "config.orgs.org" + num + ".settings")){ | 
|                             for(int i = 1 ; i < 10000; i++){ | 
|                                 if(configXml.existElement(doc, "config.orgs.org" + num + ".settings.item" + i)){ | 
|                                     String item_name = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".settings.item" + i,"item_name", null, false, null) ; | 
|                                     String item_value = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".settings.item" + i,"item_value", null, false, null) ; | 
|                                     String remarks = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".settings.item" + i,"remarks", null, false, null) ; | 
|                                     this.saveSettings(orgTag, item_name, item_value, remarks); | 
|                                 }else{ | 
|                                     break ; | 
|                                 } | 
|                             } | 
|                         } | 
|                     } | 
|                     if(!this.existWaterTypes()){ | 
|                         if(configXml.existElement(doc, "config.orgs.org" + num + ".waterTypes")){ | 
|                             for(int i = 1 ; i < 10000; i++){ | 
|                                 if(configXml.existElement(doc, "config.orgs.org" + num + ".waterTypes.item" + i)){ | 
|                                     String typeName = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".waterTypes.item" + i,"typeName", null, false, null) ; | 
|                                     this.saveWaterType(orgTag, typeName); | 
|                                 }else{ | 
|                                     break ; | 
|                                 } | 
|                             } | 
|                         } | 
|                     } | 
|                 }else{ | 
|                     break ; | 
|                 } | 
|             } | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 数据库中是否存在行政区划数据 | 
|      * @return 存在否 | 
|      */ | 
|     private boolean existDistricts(){ | 
|         Long total = this.distriDao.selectCount(null) ; | 
|         return (total != null && total > 0) ; | 
|     } | 
|   | 
|     /** | 
|      * 数据库中是否存在用户数据 | 
|      * @return 存在否 | 
|      */ | 
|     private boolean existUsers(){ | 
|         Long total = this.userDao.selectCount(null) ; | 
|         return (total != null && total > 0) ; | 
|     } | 
|   | 
|     /** | 
|      * 数据库中是否存在支付方式数据 | 
|      * @return 存在否 | 
|      */ | 
|     private boolean existPayments(){ | 
|         Long total = this.paymentMethodDao.selectCount(null) ; | 
|         return (total != null && total > 0) ; | 
|     } | 
|   | 
|     /** | 
|      * 数据库中是否存在系统配置数据 | 
|      * @return 存在否 | 
|      */ | 
|     private boolean existSettings(){ | 
|         Long total = this.settingsDao.selectCount(null) ; | 
|         return (total != null && total > 0) ; | 
|     } | 
|   | 
|     /** | 
|      * 数据库中是否存在用水类型数据 | 
|      * @return 存在否 | 
|      */ | 
|     private boolean existWaterTypes(){ | 
|         Long total = this.waterTypeDao.selectCount(null) ; | 
|         return (total != null && total > 0) ; | 
|     } | 
|   | 
|     /** | 
|      * 数据库中保存行政区划实体 | 
|      * @param supperId 上级ID | 
|      * @param name 名称 | 
|      * @param num 编号 | 
|      * @param level 级别 | 
|      * @return id | 
|      */ | 
|     private Long saveDistrict(Long supperId, String name, String num, Integer level){ | 
|         if((name != null && !name.trim().equals("")) && | 
|                 (num != null && !num.trim().equals("")) && | 
|                 level != null){ | 
|             BaDistrict po = new BaDistrict() ; | 
|             po.supperId = supperId ; | 
|             po.name = name ; | 
|             po.num = num ; | 
|             po.level = DistrictLevel.get(level.byteValue()) ; | 
|             po.deleted = Deleted.NO ; | 
|             this.distriDao.putin(po) ; | 
|             return po.getId() ; | 
|         }else{ | 
|             return null ; | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 保存用户 | 
|      * @param orgTag 机构标签 | 
|      * @param name 名称 | 
|      * @param phone 手机号 | 
|      * @param password 密码 | 
|      * @param supperAdmin 是否为超级管理员(1是,0否) | 
|      */ | 
|     private void saveUser(String orgTag, String name, String phone, String password, Integer supperAdmin) throws Exception{ | 
|         if((name != null && !name.trim().equals("")) && | 
|                 (phone != null && !phone.trim().equals("")) && | 
|                 (password != null && !password.trim().equals("")) && | 
|                 supperAdmin != null){ | 
|             BaUser po = new BaUser() ; | 
|             po.userName = name ; | 
|             po.phone = phone ; | 
|             po.password = MD5.encrypt(password) ;//进行加密码 ; | 
|             po.orgTag = orgTag ; | 
|             po.supperAdmin = supperAdmin.byteValue() ; | 
|             po.disabled = Disabled.NO ; | 
|             po.deleted = Deleted.NO ; | 
|             this.userDao.putin(po) ; | 
|         } | 
|     } | 
|     /** | 
|      * 保存支付方式 | 
|      * @param orgTag 机构标签 | 
|      * @param name 名称 | 
|      */ | 
|     private void savePayment(String orgTag, String name) throws Exception{ | 
|         if(name != null && !name.trim().equals("")){ | 
|             SePaymentMethod po = new SePaymentMethod() ; | 
|             po.setName(name); | 
|             po.setDeleted(Deleted.NO.code); | 
|             this.paymentMethodDao.insert(po) ; | 
|         } | 
|     } | 
|   | 
|     /** | 
|      * 保存系统配置 | 
|      * @param item_name 配置项 | 
|      * @param item_value 配置项值 | 
|      * @param remarks 备注信息 | 
|      * @throws Exception | 
|      */ | 
|     private void saveSettings(String orgTag,String item_name, String item_value,String remarks) throws Exception{ | 
|         if((item_name != null && !item_name.trim().equals("")) && | 
|                 (item_value != null && !item_value.trim().equals("")) && | 
|                 (remarks != null && !remarks.trim().equals(""))){ | 
|             BaSettings po = new BaSettings() ; | 
|             po.setItemName(item_name); | 
|             po.setItemValue(item_value); | 
|             po.setRemarks(remarks); | 
|             this.settingsDao.insert(po) ; | 
|         } | 
|     } | 
|   | 
|   | 
|     /** | 
|      * 保存用水类型 | 
|      * @param orgTag 机构标签 | 
|      * @param typeName 名称 | 
|      */ | 
|     private void saveWaterType(String orgTag, String typeName) throws Exception{ | 
|         if(typeName != null && !typeName.trim().equals("")){ | 
|             SeWaterType po = new SeWaterType() ; | 
|             po.setTypename(typeName); | 
|             this.waterTypeDao.insert(po) ; | 
|         } | 
|     } | 
|   | 
| } |