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.BaUserMapper; 
 | 
import com.dy.pipIrrGlobal.pojoBa.BaDistrict; 
 | 
import com.dy.pipIrrGlobal.pojoBa.BaUser; 
 | 
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 ; 
 | 
  
 | 
    @Autowired 
 | 
    public void setDistriDao(BaDistrictMapper distriDao){ 
 | 
        this.distriDao = distriDao ; 
 | 
    } 
 | 
  
 | 
    @Autowired 
 | 
    public void setUserDao(BaUserMapper userDao){ 
 | 
        this.userDao = userDao ; 
 | 
    } 
 | 
  
 | 
  
 | 
    /** 
 | 
     * 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,"name", 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, 0, 99,null) ; 
 | 
                            Long supperId = this.saveDistrict(null, distriName, distriNum, distriLevel); 
 | 
                            if(supperId != null && configXml.existElement(doc, "config.orgs.org" + num + ".districts.province.city")){ 
 | 
                                if(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); 
 | 
                                    } 
 | 
                                } 
 | 
                            } 
 | 
                        } 
 | 
                        /* 2023-11-23 下面是最初实现,后满足IC卡中存在省的要求,增加省级行政区划 
 | 
                        if(configXml.existElement(doc, "config.orgs.org" + num + ".districts.city")){ 
 | 
                            String distriName = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.city","name", null, false, null) ; 
 | 
                            String distriNum = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.city","num", null, false, null) ; 
 | 
                            Integer distriLevel = configXml.getSetAttrPlusInt(doc, "config.orgs.org" + num + ".districts.city","level", null, 1, 99,null) ; 
 | 
                            Long supperId = this.saveDistrict(null, distriName, distriNum, distriLevel); 
 | 
                            if(supperId != null && configXml.existElement(doc, "config.orgs.org" + num + ".districts.city.country")){ 
 | 
                                distriName = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.city.country","name", null, false, null) ; 
 | 
                                distriNum = configXml.getSetAttrTxt(doc, "config.orgs.org" + num + ".districts.city.country","num", null, false, null) ; 
 | 
                                distriLevel = configXml.getSetAttrPlusInt(doc, "config.orgs.org" + num + ".districts.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); 
 | 
                        } 
 | 
                    } 
 | 
                }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) ; 
 | 
    } 
 | 
  
 | 
    /** 
 | 
     * 数据库中保存行政区划实体 
 | 
     * @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.insert(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.name = 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.insert(po) ; 
 | 
        } 
 | 
    } 
 | 
  
 | 
} 
 |