Pārlūkot izejas kodu

基数导入、验证

zdm 6 gadi atpakaļ
vecāks
revīzija
5aa12ffc73

+ 3 - 0
common/common-request-mapping/src/main/java/com/yihu/jw/rm/base/BaseRequestMapping.java

@ -401,6 +401,9 @@ public class BaseRequestMapping {
    public static class BasePopulation extends Basic {
        public static final String PREFIX  = "/basePopulation";
        public static final String CHECK_POPULATION_IS_EXIST  = "/checkBasePopulationIsExist";
        public static final String POPULATION_BATCH_IMPORT  = "/basePopulationBatchImport";
        public static final String POPULATION_BATCH_ERROR_DOENLOAD  = "/basePopulationBatchErrorDownLoad";
    }
    /**

+ 3 - 3
common/common-rest-model/src/main/java/com/yihu/jw/restmodel/base/saas/SaasTypeDictVO.java

@ -13,7 +13,7 @@ import io.swagger.annotations.ApiModelProperty;
public class SaasTypeDictVO extends UuidIdentityVOWithOperator {
    @ApiModelProperty(value = "Saas类型编码", example = "familyDoctor")
    private String code;
    private Integer code;
    @ApiModelProperty(value = "Saas类型名称", example = "家医型")
    private String name;
@ -21,11 +21,11 @@ public class SaasTypeDictVO extends UuidIdentityVOWithOperator {
    @ApiModelProperty(value = "状态(effective-生效中,invalid-已失效)", example = "effective")
    private SaasTypeDictDO.Status status;
    public String getCode() {
    public Integer getCode() {
        return code;
    }
    public void setCode(String code) {
    public void setCode(Integer code) {
        this.code = code;
    }

+ 27 - 0
svr/svr-base/pom.xml

@ -141,6 +141,33 @@
            <artifactId>spring-boot-starter-mail</artifactId>
        </dependency>
        <!--   poi xml导入导出工具 start-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <exclusions>
                <exclusion>
                    <groupId>com.yihu.ehr</groupId>
                    <artifactId>commons-util</artifactId>
                </exclusion>
                <exclusion>
                    <groupId>org.apache.commons</groupId>
                    <artifactId>commons-collections4</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
        </dependency>
        <!-- xlsx  依赖这个包 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
        </dependency>
        <!--   poi xml导入导出工具 end -->
    </dependencies>
    <build>

+ 43 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/common/excel/ObjectFileRW.java

@ -0,0 +1,43 @@
package com.yihu.jw.base.endpoint.common.excel;
import java.io.*;
/**
 * @author lincl
 * @version 1.0
 * @created 2016/6/19
 */
public class ObjectFileRW {
    public static void write(File file, Object obj) throws IOException {
        ObjectOutputStream oos = null;
        try {
            if(file.exists()){
                file.delete();
                file.createNewFile();
            }
            oos = new ObjectOutputStream(new FileOutputStream(file));
            oos.writeObject(obj);
            oos.flush();
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if(oos!=null){ oos.close();}
        }
    }
    public static Object read(File file) throws IOException, ClassNotFoundException {
        ObjectInputStream ois = null;
        try {
            ois = new ObjectInputStream(new FileInputStream(file));
            Object temp = ois.readObject();
            return temp;
        } catch (Exception e) {
            e.printStackTrace();
            throw e;
        } finally {
            if(ois!=null){ ois.close();}
        }
    }
}

+ 40 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/common/excel/TemPath.java

@ -0,0 +1,40 @@
package com.yihu.jw.base.endpoint.common.excel;
import com.yihu.utils.date.DateUtil;
import org.apache.log4j.Logger;
import java.io.File;
import java.io.IOException;
/**
 * @author lincl
 * @version 1.0
 * @created 2016/6/19
 */
public class TemPath {
    public static Logger logger  = Logger.getLogger(TemPath.class);
    public final static String tmpdir = System.getProperty("java.io.tmpdir");
    public final static String separator = System.getProperty("file.separator");
    public final static String defPath =separator;
    public static String createFileName( String type, String parentFile, String fileType) throws IOException {
        File file = new File( tmpdir + separator + defPath + parentFile + separator);
        if(!file.exists()) {
            file.mkdirs();
        }
        String curPath = DateUtil.getCurrentString("yyyy_MM_dd") + separator;
        String fileUrl = tmpdir + separator + defPath + parentFile + separator + curPath;
        logger.warn("upload addrr = " + fileUrl);
        file = new File( fileUrl );
        if(!file.exists()) {
            file.mkdirs();
        }
        return curPath + DateUtil.getCurrentString("HHmmss") + "_" + type + fileType;
    }
    public static String getFullPath(String fileName, String parent){
        return tmpdir + separator + defPath + parent + separator + fileName;
    }
}

+ 224 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/common/populationBatchImport/PopulationMsg.java

@ -0,0 +1,224 @@
package com.yihu.jw.base.endpoint.common.populationBatchImport;
import com.yihu.jw.util.excel.ExcelUtil;
import com.yihu.jw.util.excel.Validation;
import com.yihu.jw.util.excel.annotation.Location;
import com.yihu.jw.util.excel.annotation.Row;
import com.yihu.jw.util.excel.annotation.Title;
import com.yihu.jw.util.excel.annotation.ValidRepeat;
import javax.persistence.Column;
import java.util.Date;
import java.util.Map;
import java.util.Set;
/**
 *  基础人口信息列表-excel实体类
 *
 * @author zdm
 * @vsrsion 1.0
 * Created at 2018/10/15.
 */
@Row(start = 1)
@Title(names= "{'租户名称', '时间','常住人口', '户籍人口', '糖尿病人数', '高血压人数', '任务数'}")
public class PopulationMsg extends ExcelUtil implements Validation {
    @Location(x=0)
    @ValidRepeat
    String saasName;
    @Location(x=1)
    @ValidRepeat
    String year;
    @Location(x=2)
    @ValidRepeat
    Integer populationNum;
    @Location(x=3)
    @ValidRepeat
    Integer regisPopulationNum;
    @Location(x=4)
    @ValidRepeat
    Integer dmNum;
    @Location(x=5)
    @ValidRepeat
    Integer hbpNum;
    @Location(x=6)
    @ValidRepeat
    Integer taskNum;
    private String  saasId;
    //租户创建时间
    private Date saasCreateTime;
    //所属省代码
    private String  provinceCode;
    //省份名称
    private String  provinceName;
    //城市编码
    private String  cityCode;
    //城市名称
    private String  cityName;
    //所属区代码
    private String  districtCode;
    //区名
    private String  districtName;
    //慢病人数
    private Integer ncdNum;
    @Override
    public int validate(Map<String, Set> repeatMap) {
        int rs = 1;
        if(!repeatMap.get("saasName").add(saasName+year)){
            rs = 0;
            addErrorMsg("saasName", "已添加"+year+saasName+"的基础人口信息,请直接修改即可");
        }
        if(populationNum<0){
            rs = 0;
            addErrorMsg("populationNum", "常住人口数不能小于0!");
        }
        if(regisPopulationNum<0){
            rs = 0;
            addErrorMsg("regisPopulationNum", "户籍人口数不能小于0!");
        }
        if(dmNum<0){
            rs = 0;
            addErrorMsg("dmNum", "糖尿病人口不能小于0!");
        }
        if(hbpNum<0){
            rs = 0;
            addErrorMsg("hbpNum", "高血压人口不能小于0!");
        }
        if(taskNum<0){
            rs = 0;
            addErrorMsg("taskNum", "任务数不能小于0!");
        }
        return rs;
    }
    public String getSaasName() {
        return saasName;
    }
    public void setSaasName(String saasName) {
        this.saasName = saasName;
    }
    public String getYear() {
        return year;
    }
    public void setYear(String year) {
        this.year = year;
    }
    public Integer getPopulationNum() {
        return populationNum;
    }
    public void setPopulationNum(Integer populationNum) {
        this.populationNum = populationNum;
    }
    public Integer getRegisPopulationNum() {
        return regisPopulationNum;
    }
    public void setRegisPopulationNum(Integer regisPopulationNum) {
        this.regisPopulationNum = regisPopulationNum;
    }
    public Integer getDmNum() {
        return dmNum;
    }
    public void setDmNum(Integer dmNum) {
        this.dmNum = dmNum;
    }
    public Integer getHbpNum() {
        return hbpNum;
    }
    public void setHbpNum(Integer hbpNum) {
        this.hbpNum = hbpNum;
    }
    public Integer getTaskNum() {
        return taskNum;
    }
    public void setTaskNum(Integer taskNum) {
        this.taskNum = taskNum;
    }
    public Date getSaasCreateTime() {
        return saasCreateTime;
    }
    public void setSaasCreateTime(Date saasCreateTime) {
        this.saasCreateTime = saasCreateTime;
    }
    public String getProvinceCode() {
        return provinceCode;
    }
    public void setProvinceCode(String provinceCode) {
        this.provinceCode = provinceCode;
    }
    public String getProvinceName() {
        return provinceName;
    }
    public void setProvinceName(String provinceName) {
        this.provinceName = provinceName;
    }
    public String getCityCode() {
        return cityCode;
    }
    public void setCityCode(String cityCode) {
        this.cityCode = cityCode;
    }
    public String getCityName() {
        return cityName;
    }
    public void setCityName(String cityName) {
        this.cityName = cityName;
    }
    public String getDistrictCode() {
        return districtCode;
    }
    public void setDistrictCode(String districtCode) {
        this.districtCode = districtCode;
    }
    public String getDistrictName() {
        return districtName;
    }
    public void setDistrictName(String districtName) {
        this.districtName = districtName;
    }
    public Integer getNcdNum() {
        return ncdNum;
    }
    public void setNcdNum(Integer ncdNum) {
        this.ncdNum = ncdNum;
    }
    public String getSaasId() {
        return saasId;
    }
    public void setSaasId(String saasId) {
        this.saasId = saasId;
    }
}

+ 63 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/common/populationBatchImport/PopulationMsgReader.java

@ -0,0 +1,63 @@
package com.yihu.jw.base.endpoint.common.populationBatchImport;
import com.yihu.jw.util.excel.AExcelReader;
import jxl.Workbook;
import java.util.*;
/**
 * 基础人口信息列表-excel解析类
 *
 * @author zdm
 * @vsrsion 1.0
 * Created at 2018/10/15.
 */
public class PopulationMsgReader extends AExcelReader {
    @Override
    public void read(Workbook rwb) throws Exception {
        try {
            jxl.Sheet[] sheets = rwb.getSheets();
            int j = 0, rows;
            PopulationMsg populationMsg;
            getRepeat().put("saasName", new HashSet<>());
            getRepeat().put("year", new HashSet<>());
            getRepeat().put("populationNum", new HashSet<>());
            getRepeat().put("regisPopulationNum", new HashSet<>());
            getRepeat().put("dmNum", new HashSet<>());
            getRepeat().put("hbpNum", new HashSet<>());
            getRepeat().put("taskNum", new HashSet<>());
            for (jxl.Sheet sheet : sheets) {
                if ((rows = sheet.getRows()) == 0) {
                    continue;
                }
                for (int i = 1; i < rows; i++, j++) {
                    populationMsg = new PopulationMsg();
                    populationMsg.setSaasName(replaceBlank(getCellCont(sheet, i, 0)));
                    populationMsg.setYear(replaceBlank(getCellCont(sheet, i, 1)));
                    populationMsg.setPopulationNum(null == getCellCont(sheet, i, 2) ? 0 : Integer.valueOf(getCellCont(sheet, i, 2).trim()));
                    populationMsg.setRegisPopulationNum(null == getCellCont(sheet, i, 3) ? 0 : Integer.valueOf(getCellCont(sheet, i, 3).trim()));
                    populationMsg.setDmNum(null == getCellCont(sheet, i, 4) ? 0 : Integer.valueOf(getCellCont(sheet, i, 4).trim()));
                    populationMsg.setHbpNum(null == getCellCont(sheet, i, 5) ? 0 : Integer.valueOf(getCellCont(sheet, i, 5).trim()));
                    populationMsg.setTaskNum(null == getCellCont(sheet, i, 6) ? 0 : Integer.valueOf(getCellCont(sheet, i, 6).trim()));
                    int rs = populationMsg.validate(repeat);
                    if (rs == 0) {
                        errorLs.add(populationMsg);
                    } else if (rs == 1) {
                        correctLs.add(populationMsg);
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException("模板不正确,请下载新的模板,并按照示例正确填写后上传!");
        } finally {
            if (rwb != null) {
                rwb.close();
            }
        }
    }
}

+ 115 - 5
svr/svr-base/src/main/java/com/yihu/jw/base/endpoint/population/BasePopulationEndpoint.java

@ -1,5 +1,8 @@
package com.yihu.jw.base.endpoint.population;
import com.yihu.jw.base.endpoint.common.excel.ObjectFileRW;
import com.yihu.jw.base.endpoint.common.excel.TemPath;
import com.yihu.jw.base.endpoint.common.populationBatchImport.*;
import com.yihu.jw.base.service.area.BaseCityService;
import com.yihu.jw.base.service.area.BaseProvinceService;
import com.yihu.jw.base.service.area.BaseTownService;
@ -8,6 +11,7 @@ import com.yihu.jw.base.service.saas.SaasService;
import com.yihu.jw.entity.base.area.BaseTownDO;
import com.yihu.jw.entity.base.population.BasePopulationDO;
import com.yihu.jw.entity.base.saas.SaasDO;
import com.yihu.jw.exception.business.ManageException;
import com.yihu.jw.restmodel.base.population.BasePopulationVO;
import com.yihu.jw.restmodel.web.Envelop;
import com.yihu.jw.restmodel.web.ListEnvelop;
@ -15,25 +19,32 @@ import com.yihu.jw.restmodel.web.ObjEnvelop;
import com.yihu.jw.restmodel.web.PageEnvelop;
import com.yihu.jw.restmodel.web.endpoint.EnvelopRestEndpoint;
import com.yihu.jw.rm.base.BaseRequestMapping;
import com.yihu.jw.util.excel.AExcelReader;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.MediaType;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.util.*;
/**
 * 基础人口基数信息控制器
 *
 * @version <pre>
 *                                                       Author	Version		Date		Changes
 *                                                       litaohong 	1.0  		2018年09月26日 	update
 *           Author	Version		Date		Changes
 *           litaohong 	1.0  		2018年09月26日 	update
 *
 *                                                       </pre>
 *           </pre>
 * @since 1.
 */
@RestController
@ -51,6 +62,7 @@ public class BasePopulationEndpoint extends EnvelopRestEndpoint {
    private BaseProvinceService baseProvinceService;
    @Autowired
    private BaseCityService baseCityService;
    static final String parentFile = "population";
    @PostMapping(value = BaseRequestMapping.BasePopulation.CREATE, consumes = MediaType.APPLICATION_JSON_UTF8_VALUE)
@ -253,5 +265,103 @@ public class BasePopulationEndpoint extends EnvelopRestEndpoint {
        return (null != basePopulationDOList && basePopulationDOList.size() > 0) ? true : false;
    }
    @PostMapping(value = BaseRequestMapping.BasePopulation.POPULATION_BATCH_IMPORT)
    @Transactional(rollbackFor = Exception.class)
    @ApiOperation(value = "基础人口信息列表导入")
    public Envelop importData(
            @ApiParam(name = "file", value = "文件", required = true)
            @RequestPart(value = "file") MultipartFile file,
            HttpServletRequest request) throws IOException, ManageException {
        try {
            request.setCharacterEncoding("UTF-8");
            AExcelReader excelReader = new PopulationMsgReader();
            excelReader.read(file.getInputStream());
            //验证未通过
            List<PopulationMsg> errorLs = excelReader.getErrorLs();
            List<PopulationMsg> correctLs = excelReader.getCorrectLs();
            //获取所有租户+年份的基础人口信息
            Set<String> populationNameAndYear =new HashSet<String>( basePopulationService.getFacilityCodeByServerType());
            PopulationMsg model;
            List saveLs = new ArrayList<>();
            if (correctLs.size() > 0) {
                for (int i = 0; i < correctLs.size(); i++) {
                    model = correctLs.get(i);
                    Map<Boolean,PopulationMsg> map=validate(model,populationNameAndYear);
                    if (null==map.get(true)) {
                        errorLs.add(model);
                    } else {
                        saveLs.add(model);
                    }
                }
                Map<String, Object> result = basePopulationService.batchInsertPopulation(saveLs);
                result.put("errorLs",errorLs);
                return success("导入成功!", result);
            }
        } catch (Exception e) {
            e.printStackTrace();
            return failed("导入异常,请检查导入文件格式"+e.getMessage());
        }
        return failed("导入失败");
    }
    private Map<Boolean,PopulationMsg> validate(PopulationMsg model, Set<String> populationNameAndYear) throws Exception{
        Map<Boolean,PopulationMsg> msgMap =new HashMap<>();
        Boolean rs = true;
        //验证租户是否存在
        SaasDO saasDO = saasService.findByName(model.getSaasName());
        String nameAndYear=model.getSaasName()+model.getYear();
        //验证租户+年份的人口基数是否存在
        if (populationNameAndYear.contains(nameAndYear)) {
            model.addErrorMsg("saasName", "已添加"+model.getYear()+model.getSaasName()+"的基础人口信息,请直接修改即可!");
            rs = false;
        }
        if (null==saasDO) {
            model.addErrorMsg("saasName", "租户不存在,请核对!");
            rs = false;
        }else {
            model.setSaasId(saasDO.getId());
            model.setSaasCreateTime(saasDO.getCreateTime());
            String areaCode = saasDO.getAreaNumber();
            String filters = "province?" + areaCode + " g1;city?" + areaCode + " g1;code?" + areaCode + " g1;";
            List<BaseTownDO> baseTowns = baseTownService.search(filters);
            BaseTownDO baseTownDO = (null != baseTowns && baseTowns.size() > 0 ? baseTowns.get(0) : null);
            if (null != baseTownDO) {
                if (baseTownDO.getCode().equals(areaCode)) {
                    model.setProvinceCode(baseTownDO.getProvince());
                    model.setProvinceName(baseProvinceService.getNameByCode(baseTownDO.getProvince()));
                    //市编码
                    model.setCityCode(baseTownDO.getCity());
                    model.setCityName(baseCityService.getNameByCode(baseTownDO.getCity()));
                    //区县编码
                    model.setDistrictCode(areaCode);
                    model.setDistrictName(baseTownDO.getName());
                } else if (baseTownDO.getCity().equals(areaCode)) {
                    model.setProvinceCode(baseTownDO.getProvince());
                    model.setProvinceName(baseProvinceService.getNameByCode(baseTownDO.getProvince()));
                    //市编码
                    model.setCityCode(areaCode);
                    model.setCityName(baseCityService.getNameByCode(areaCode));
                    //区县编码
                    model.setDistrictCode("");
                    model.setDistrictName("");
                } else if (baseTownDO.getProvince().equals(areaCode)) {
                    //省编码
                    model.setProvinceCode(areaCode);
                    model.setProvinceName(baseProvinceService.getNameByCode(areaCode));
                    //市编码
                    model.setCityCode("");
                    model.setCityName("");
                    //区县编码
                    model.setDistrictCode("");
                    model.setDistrictName("");
                }
            }
        }
        msgMap.put(rs,model);
        return msgMap;
    }
}

+ 71 - 3
svr/svr-base/src/main/java/com/yihu/jw/base/service/population/BasePopulationService.java

@ -1,19 +1,29 @@
package com.yihu.jw.base.service.population;
import com.yihu.jw.base.dao.population.BasePopulationDao;
import com.yihu.jw.base.endpoint.common.populationBatchImport.PopulationMsg;
import com.yihu.jw.entity.base.population.BasePopulationDO;
import com.yihu.jw.exception.business.ManageException;
import com.yihu.mysql.query.BaseJpaService;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
 * 基础人口基数信息服务service
 *
 * @version <pre>
 *          Author	Version		Date		Changes
 *          litaohong    1.0  2018年09月26日 update
 *                            Author	Version		Date		Changes
 *                            litaohong    1.0  2018年09月26日 update
 *
 *          </pre>
 *                            </pre>
 * @since 1.
 */
@Service
@ -24,4 +34,62 @@ public class BasePopulationService extends BaseJpaService<BasePopulationDO, Base
    public BasePopulationDO findById(String id) {
        return basePopulationDao.findOne(id);
    }
    /**
     * 批量导入基础人口信息的集合
     *
     * @param populations 基础人口信息
     */
    public Map<String, Object> batchInsertPopulation(List<PopulationMsg> populations) throws ManageException {
        Map<String, Object> result = new HashMap<>();
        //批量存储的集合
        int correctCount = 0;
        List<BasePopulationDO> corrects = new ArrayList<>();
        BasePopulationDO basePopulationDO;
        //批量存储
        for (PopulationMsg populationMsg : populations) {
            basePopulationDO = new BasePopulationDO();
            basePopulationDO.setId(getCode());
            basePopulationDO.setSaasId(populationMsg.getSaasId());
            basePopulationDO.setSaasName(populationMsg.getSaasName());
            basePopulationDO.setSaasCreateTime(populationMsg.getSaasCreateTime());
            basePopulationDO.setYear(populationMsg.getYear());
            basePopulationDO.setProvinceCode(populationMsg.getProvinceCode());
            basePopulationDO.setProvinceName(populationMsg.getProvinceName());
            basePopulationDO.setCityCode(populationMsg.getCityCode());
            basePopulationDO.setCityName(populationMsg.getCityName());
            basePopulationDO.setDistrictCode(populationMsg.getDistrictCode());
            basePopulationDO.setDistrictName(populationMsg.getDistrictName());
            basePopulationDO.setRegisPopulationNum(populationMsg.getRegisPopulationNum());
            basePopulationDO.setPopulationNum(populationMsg.getPopulationNum());
            //糖尿病人数
            basePopulationDO.setDmNum(populationMsg.getDmNum());
            //高血压人数
            basePopulationDO.setHbpNum(populationMsg.getHbpNum());
            basePopulationDO.setTaskNum(populationMsg.getTaskNum());
            //慢病人数
            basePopulationDO.setNcdNum(populationMsg.getHbpNum() + populationMsg.getDmNum());
            corrects.add(basePopulationDO);
            if (corrects.size() > 100) {
                basePopulationDao.save(corrects);
                correctCount += corrects.size();
                corrects.clear();
            }
        }
        if (!corrects.isEmpty()) {
            basePopulationDao.save(corrects);
            correctCount += corrects.size();
        }
        result.put("correctCount", correctCount);
        return result;
    }
    public List<String> getFacilityCodeByServerType() {
        Session s = currentSession();
        String hql = "SELECT concat(p.saas_name,p.year)  FROM  base_population p ";
        Query query = s.createSQLQuery(hql);
        return query.list();
    }
}

+ 4 - 0
svr/svr-base/src/main/java/com/yihu/jw/base/service/saas/SaasService.java

@ -272,4 +272,8 @@ public class SaasService extends BaseJpaService<SaasDO, SaasDao> {
        return saasDao.findById(id);
    }
    public SaasDO findByName(String name){
        return saasDao.findByName(name);
    }
}