package cn.com.goldenwater.dcproj.service.impl.plansd; import cn.com.goldenwater.core.service.AbstractCrudService; import cn.com.goldenwater.dcproj.dao.AttAdBaseDao; import cn.com.goldenwater.dcproj.dao.AttInspTypeDao; import cn.com.goldenwater.dcproj.dao.BisInspAllDao; import cn.com.goldenwater.dcproj.dao.BisInspAllRlationPersDao; import cn.com.goldenwater.dcproj.dao.BisInspPlanDpDao; import cn.com.goldenwater.dcproj.dao.BisInspPlanDtlAddvcdDao; import cn.com.goldenwater.dcproj.dao.BisInspPlanDtlDao; import cn.com.goldenwater.dcproj.dao.BisInspPlanDtlPtypDao; import cn.com.goldenwater.dcproj.dao.BisInspPlanYearDao; import cn.com.goldenwater.dcproj.dao.BisInspPlandpRlDao; import cn.com.goldenwater.dcproj.dto.BisInspPlanDtlDto; import cn.com.goldenwater.dcproj.model.AttAdBase; import cn.com.goldenwater.dcproj.model.AttInspType; import cn.com.goldenwater.dcproj.model.BisInspAll; import cn.com.goldenwater.dcproj.model.BisInspPlan; import cn.com.goldenwater.dcproj.model.BisInspPlanDp; import cn.com.goldenwater.dcproj.model.BisInspPlanDtl; import cn.com.goldenwater.dcproj.model.BisInspPlanDtlAddvcd; import cn.com.goldenwater.dcproj.model.BisInspPlanDtlPtyp; import cn.com.goldenwater.dcproj.model.BisInspPlanYear; import cn.com.goldenwater.dcproj.model.BisInspPlandpRl; import cn.com.goldenwater.dcproj.model.OlBisInspOrg; import cn.com.goldenwater.dcproj.param.AttInspTypeParam; import cn.com.goldenwater.dcproj.param.BisInspAllParam; import cn.com.goldenwater.dcproj.param.BisInspPlanDpParam; import cn.com.goldenwater.dcproj.param.BisInspPlanDtlAddvcdParam; import cn.com.goldenwater.dcproj.param.BisInspPlanDtlParam; import cn.com.goldenwater.dcproj.param.BisInspPlanDtlPtypParam; import cn.com.goldenwater.dcproj.param.BisInspPlanYearParam; import cn.com.goldenwater.dcproj.param.BisInspPlandpRlParam; import cn.com.goldenwater.dcproj.service.AttAdBaseService; import cn.com.goldenwater.dcproj.service.BisInspPlanDpService; import cn.com.goldenwater.dcproj.service.BisInspPlanDtlService; import cn.com.goldenwater.dcproj.service.BisInspPlanService; import cn.com.goldenwater.dcproj.service.BisInspPlandpRlService; import cn.com.goldenwater.dcproj.service.OlBisInspOrgService; import cn.com.goldenwater.dcproj.utils.AdLevelUtil; import cn.com.goldenwater.dcproj.utils.Constant; import cn.com.goldenwater.dcproj.utils.StringUtils; import cn.com.goldenwater.id.util.UuidUtil; import org.apache.commons.collections.CollectionUtils; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.VerticalAlignment; import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.WorkbookFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Objects; import java.util.Optional; import java.util.Set; import java.util.stream.Collectors; /** * @author hjp * @date 2022-8-9 */ @Service @Transactional(rollbackFor = Exception.class) public class BisInspPlanDtlServiceImpl extends AbstractCrudService implements BisInspPlanDtlService { @Value("${export.templatePath}") private String templatePath; @Autowired private BisInspPlanDtlDao bisInspPlanDtlDao; @Autowired private BisInspPlanDtlAddvcdDao bisInspPlanDtlAddvcdDao; @Autowired private BisInspPlanDtlPtypDao bisInspPlanDtlPtypDao; @Autowired private BisInspPlandpRlDao bisInspPlandpRlDao; @Autowired private AttAdBaseDao attAdBaseDao; @Autowired private AttInspTypeDao attInspTypeDao; @Autowired private BisInspPlanDpDao bisInspPlanDpDao; @Autowired private BisInspPlanService bisInspPlanService; @Autowired private OlBisInspOrgService olBisInspOrgService; @Autowired private BisInspAllDao bisInspAllDao; @Autowired private BisInspPlanYearDao bisInspPlanYearDao; @Autowired private BisInspAllRlationPersDao bisInspAllRlationPersDao; @Autowired private BisInspPlanDpService bisInspPlanDpService; @Autowired private BisInspPlandpRlService bisInspPlandpRlService; @Autowired private AttAdBaseService attAdBaseService; private static final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM"); public BisInspPlanDtlServiceImpl(BisInspPlanDtlDao bisInspPlanDtlDao) { super(bisInspPlanDtlDao); this.bisInspPlanDtlDao = bisInspPlanDtlDao; } @Override public int insert(BisInspPlanDtl bisInspPlanDtl) { String uuid = UuidUtil.uuid(); // 生成uuid bisInspPlanDtl.setId(uuid); bisInspPlanDtl.setIntm(new Date()); bisInspPlanDtl.setUptm(new Date()); bisInspPlanDtl.setDataStat("0"); return this.bisInspPlanDtlDao.insert(bisInspPlanDtl); } @Override public int update(BisInspPlanDtl bisInspPlanDtl) { bisInspPlanDtl.setUptm(new Date()); return this.bisInspPlanDtlDao.update(bisInspPlanDtl); } @Override public int delete(String id) { return this.bisInspPlanDtlDao.delete(id); } /** * 针对 分解表的子表数据进行更新处理 * * @param bisInspPlanDtlDto 对象 */ @Override public void updatePostProcessing(BisInspPlanDtlDto bisInspPlanDtlDto) { //清空 bisInspPlanDtlPtypDao.deleteBy(new BisInspPlanDtlPtypParam(bisInspPlanDtlDto.getId())); bisInspPlanDtlAddvcdDao.deleteBy(new BisInspPlanDtlAddvcdParam(bisInspPlanDtlDto.getId())); bisInspPlandpRlDao.deleteBy(new BisInspPlandpRlParam(bisInspPlanDtlDto.getPlanId(), Constant.STRING_ONE)); //开展检查实施处室(单位) List rlIds = bisInspPlanDtlDto.getPlanDpRlIds(); //自定义 开展检查实施处室(单位) 添加 String planDpRlNames = bisInspPlanDtlDto.getPlanDpRlNames(); Map rlList = new HashMap<>(); if (CollectionUtils.isNotEmpty(rlIds)) { for (String planDpId : rlIds) { rlList.put(planDpId + "-" + Constant.STRING_ONE, new BisInspPlandpRl(bisInspPlanDtlDto.getId(), planDpId, Constant.STRING_ONE, bisInspPlanDtlDto.getPersId())); } } if (StringUtils.isNotBlank(planDpRlNames)){ Set dpRlNames = Arrays.stream(StringUtils.split(planDpRlNames, ",")).filter(StringUtils::isNotBlank).collect(Collectors.toSet()); String province = AdLevelUtil.getAddvcd(olBisInspOrgService.getRlProvince(bisInspPlanDtlDto.getOrgId())); List list = new ArrayList<>(); dpRlNames.forEach(dpRlName -> list.add(new BisInspPlanDp(dpRlName, Constant.STRING_TWO, bisInspPlanDtlDto.getPersId(), province))); if(list.size()>0){ bisInspPlanDpService.batchInsert(list); } if (CollectionUtils.isNotEmpty(list)) { list.forEach(dp -> { rlList.put(dp.getId() + "-" + Constant.STRING_ZERO, new BisInspPlandpRl(bisInspPlanDtlDto.getPlanId(), dp.getId(), Constant.STRING_ZERO, bisInspPlanDtlDto.getPersId())); rlList.put(dp.getId() + "-" + Constant.STRING_ONE, new BisInspPlandpRl(bisInspPlanDtlDto.getPlanId(), dp.getId(), Constant.STRING_ONE, bisInspPlanDtlDto.getPersId())); }); } } if (rlList.size() > 0) { bisInspPlandpRlService.batchInsert(new ArrayList<>(rlList.values())); } //检查行政区 List dAdCodes = bisInspPlanDtlDto.getdAdCodes(); if (CollectionUtils.isNotEmpty(dAdCodes)) { List list = new ArrayList<>(); for (String dAdCode : dAdCodes) { AttAdBase byAdcode = attAdBaseDao.getByAdcode(dAdCode); if (Objects.nonNull(byAdcode)) { //更新 list.add(new BisInspPlanDtlAddvcd(bisInspPlanDtlDto.getId(), byAdcode.getAdCode(), byAdcode.getAdName(), byAdcode.getAdGrad(), bisInspPlanDtlDto.getPersId())); } } if(list.size()>0){ bisInspPlanDtlAddvcdDao.batchInsert(list); } } //督查类型 if (StringUtils.equals(Constant.STRING_ONE, bisInspPlanDtlDto.getOnlineChk())) { Set ptypIds = new HashSet<>(bisInspPlanDtlDto.getPtypIds()); if (CollectionUtils.isNotEmpty(ptypIds)) { List typeList = attInspTypeDao.findList(new AttInspTypeParam()); List list = new ArrayList<>(); for (String ptypId : ptypIds) { AttInspType attInspType = typeList.stream().filter(t -> StringUtils.equals(t.getCode(), ptypId)).findAny().orElse(null); if (Objects.nonNull(attInspType)) { //更新 list.add(new BisInspPlanDtlPtyp(bisInspPlanDtlDto.getId(), attInspType.getName(), attInspType.getCode(), bisInspPlanDtlDto.getPersId())); } } if (CollectionUtils.isNotEmpty(list)){ bisInspPlanDtlPtypDao.batchInsert(list); Calendar calendar = Calendar.getInstance(); BisInspPlanYear planYear = bisInspPlanYearDao.get(bisInspPlanDtlDto.getPlanId()); if (Objects.isNull(planYear)){ return; } String batchName = calendar.get(Calendar.YEAR) + "年" + (StringUtils.isBlank(planYear.getChkName()) ? "" : planYear.getChkName()) + "督查"; //创建批次 for (BisInspPlanDtlPtyp ptyp : list) { AttInspType by = attInspTypeDao.get(ptyp.getPtype()); if (Objects.isNull(by)){ continue; } BisInspPlan bisInspPlan = new BisInspPlan(); bisInspPlan.setGuid(by.getCode() + bisInspPlanDtlDto.getOrgId()); bisInspPlan.setPrsnTitle(batchName); //判断父级节点下有创建好的批次就无需创建 BisInspAllParam bisInspAllParam = new BisInspAllParam(); bisInspAllParam.setId(bisInspPlan.getGuid()); bisInspAllParam.setPnm(batchName); bisInspAllParam.setIsPlan(Constant.STRING_ONE); List eList = bisInspAllDao.findList(bisInspAllParam); if (eList != null && eList.size() > 0){ continue; } bisInspPlan.setLeadDep(null); bisInspPlan.setPalnSttm(bisInspPlanDtlDto.getStTm()); bisInspPlan.setPalnEntm(bisInspPlanDtlDto.getEnTm()); bisInspPlan.setChkType(null); bisInspPlan.setChkForm(null); bisInspPlan.setIsPlan(Constant.STRING_ONE); bisInspPlan.setYearTaskId(bisInspPlanDtlDto.getId()); bisInspPlan.setOrgId(bisInspPlanDtlDto.getOrgId()); bisInspPlan.setProvince(olBisInspOrgService.getProvince(bisInspPlanDtlDto.getOrgId())); OlBisInspOrg olBisInspOrg = olBisInspOrgService.get(bisInspPlanDtlDto.getOrgId()); Optional.ofNullable(olBisInspOrg).ifPresent(o -> bisInspPlan.setOrgName(o.getOrgNm())); Optional.ofNullable(bisInspAllRlationPersDao.get(bisInspPlanDtlDto.getPersId())).ifPresent(b -> bisInspPlan.setPlanDpId(b.getPlanDpId())); bisInspPlanService.addBisInspPlan(bisInspPlan); } } } } } @Override public List findDtlList(BisInspPlanDtlParam param) { List list = bisInspPlanDtlDao.findDtlList(param); if (CollectionUtils.isNotEmpty(list)) { List dpList = bisInspPlanDpDao.findList(new BisInspPlanDpParam()); list.forEach(l -> { //检查行政区 Optional.ofNullable(bisInspPlanDtlAddvcdDao.findList(new BisInspPlanDtlAddvcdParam(l.getId()))).ifPresent(a -> { l.setdAdName(a.stream().map(BisInspPlanDtlAddvcd::getAdName).collect(Collectors.joining(","))); l.setdAdCodes(a.stream().map(m->m.getAdCode().substring(0,4)).collect(Collectors.toList())); // l.setdAdCodes(a.stream().map(BisInspPlanDtlAddvcd::getAdCode).collect(Collectors.toList())); }); //督查类型 Optional.ofNullable(bisInspPlanDtlPtypDao.findList(new BisInspPlanDtlPtypParam(l.getId()))).ifPresent(b -> { l.setpTypeNames(b.stream().map(BisInspPlanDtlPtyp::getNm).collect(Collectors.joining(","))); l.setPtypIds(b.stream().map(BisInspPlanDtlPtyp::getPtype).collect(Collectors.toList())); }); //参加处室(单位) Optional.ofNullable(bisInspPlandpRlDao.findByPlanDpIdList(new BisInspPlandpRlParam(l.getPlanId(), Constant.STRING_ONE))).ifPresent(c -> { l.setPlanJoinDpRlNames(dpList.stream().filter(dp -> c.stream().anyMatch(id -> Objects.equals(dp.getId(), id))).map(BisInspPlanDp::getDpName).collect(Collectors.joining(","))); l.setPlanJoinDpRlIds(c); }); //开展检查实施处室(单位) Optional.ofNullable(bisInspPlandpRlDao.findByPlanDpIdList(new BisInspPlandpRlParam(l.getId(), Constant.STRING_ONE))).ifPresent(c -> { l.setPlanDpRlNames(dpList.stream().filter(dp -> c.stream().anyMatch(id -> Objects.equals(dp.getId(), id))).map(BisInspPlanDp::getDpName).collect(Collectors.joining(","))); l.setPlanDpRlIds(c); }); //是否重复 true 重复 false 没重复 if (CollectionUtils.isNotEmpty(l.getdAdCodes()) && Objects.nonNull(l.getStTm()) && Objects.nonNull(l.getEnTm())) { l.setItRedundant(CollectionUtils.isNotEmpty( bisInspPlanDtlAddvcdDao.getByAdCodeAndTm(l.getdAdCodes().stream().collect(Collectors.joining("','", "'", "'")), l.getStTm(), l.getEnTm() ))); } //是否重复 true 重复 false 没重复 // if (CollectionUtils.isNotEmpty(l.getdAdCodes()) && Objects.nonNull(l.getChkName()) && Objects.nonNull(l.getEnTm())) { // l.setItRedundant(CollectionUtils.isNotEmpty( // bisInspPlanDtlAddvcdDao.getByAdCodeAnd(l.getdAdCodes().stream().collect(Collectors.joining("','", "'", "'")), // l.getChkName(), // l.getEnTm() // ))); // } }); } if (CollectionUtils.isNotEmpty(list)){ //过滤 if (StringUtils.isNotBlank(param.getIsItRedundant())){ list = list.stream().filter(l -> l.getItRedundant() == StringUtils.equals(param.getIsItRedundant(),Constant.STRING_ONE)).collect(Collectors.toList()); } // 过滤 牵头处室(单位) add lxf 2022/10/25 if(StringUtils.isNotBlank(param.getLeadDepId())){ BisInspPlanYearParam bisInspPlanYearParam = new BisInspPlanYearParam(); bisInspPlanYearParam.setLeadDepId(param.getLeadDepId()); List inspPlanYearList = bisInspPlanYearDao.findList(bisInspPlanYearParam); if(null != inspPlanYearList){ List idList = inspPlanYearList.stream().map(m -> m.getId()).collect(Collectors.toList()); list = list.stream().filter( l -> idList.contains(l.getPlanId()) ).collect(Collectors.toList()); } } } return list; } @Override public void export(HttpServletResponse response, BisInspPlanDtlParam bisInspPlanDtlParam) { String templateFilePath = templatePath + File.separator + "planDtlCheckSd.xls"; File file = new File(templateFilePath); if (file.exists()) { try { InputStream inputStream = new FileInputStream(file); Workbook workbook = WorkbookFactory.create(inputStream); exportFile(workbook, bisInspPlanDtlParam); writeToResponse(response, workbook, "山东详细检查计划.xls"); } catch (Exception e) { e.printStackTrace(); } } } private void exportFile(Workbook xssfWorkbook, BisInspPlanDtlParam bisInspPlanDtlParam) { List list = findDtlList(bisInspPlanDtlParam); Sheet sheet = xssfWorkbook.getSheetAt(0); String title = "详细检查计划"; if (bisInspPlanDtlParam.getChkYear() != null ) { if(null != bisInspPlanDtlParam.getMonthStr() && "".equals(bisInspPlanDtlParam.getMonthStr())){ title = bisInspPlanDtlParam.getChkYear() +"年"+ String.valueOf(Integer.parseInt(bisInspPlanDtlParam.getMonthStr()))+"月"+ title; }else{ title = bisInspPlanDtlParam.getChkYear() +"年" + title; } } CellStyle styleContent = xssfWorkbook.createCellStyle(); styleContent.setAlignment(HorizontalAlignment.CENTER); styleContent.setVerticalAlignment(VerticalAlignment.CENTER); setCellValue(sheet, 0, 1, title); if (list != null && list.size() > 0) { for (int i = 0; i < list.size(); i++) { Row row = sheet.createRow(3 + i); int cols = 16; for (int j = 0; j <= cols; j++) { Cell cell = row.createCell(j); cell.setCellStyle(styleContent); } } for (int i = 0; i < list.size(); i++) { BisInspPlanDtlDto planDtlDto = list.get(i); setAllCell(sheet, i, planDtlDto); } } } private void setAllCell(Sheet sheet, int i, BisInspPlanDtlDto planDtlDto) { setCellValue(sheet, 3 + i, 0, String.valueOf(i+1)); setCellValue(sheet, 3 + i, 1, String.valueOf(planDtlDto.getChkYear())); AttAdBase byAdcode = attAdBaseService.getByAdcode(planDtlDto.getDdAdCode()); setCellValue(sheet, 3 + i, 2, byAdcode.getAdName()); setCellValue(sheet, 3 + i, 3, byAdcode.getLabelFromAdGrad()); setCellValue(sheet, 3 + i, 4, planDtlDto.getChkName()); setCellValue(sheet, 3 + i, 5, planDtlDto.getNm()); setCellValue(sheet, 3 + i, 6, planDtlDto.getChkContent()); setCellValue(sheet, 3 + i, 7, simpleDateFormat.format(planDtlDto.getStTm())); setCellValue(sheet, 3 + i, 8, simpleDateFormat.format(planDtlDto.getEnTm())); setCellValue(sheet, 3 + i, 9, String.valueOf(null == planDtlDto.getChkPrjSize() ? 0:planDtlDto.getChkPrjSize())); setCellValue(sheet, 3 + i, 10, planDtlDto.getDpName()); setCellValue(sheet, 3 + i, 11, planDtlDto.getPlanJoinDpRlNames()); setCellValue(sheet, 3 + i, 12, planDtlDto.getPlanDpRlNames()); setCellValue(sheet, 3 + i, 13, planDtlDto.getChkType()); setCellValue(sheet, 3 + i, 14, "1".equals(planDtlDto.getOnlineChk())?"线上(水利监督信息系统)":"线下"); setCellValue(sheet, 3 + i, 15, null == planDtlDto.getItRedundant()? "否":planDtlDto.getItRedundant()?"是":"否"); setCellValue(sheet, 3 + i, 16, planDtlDto.getNote()); } private void setCellValue(Sheet sheet, int rownum, int cellnum, String value) { Cell cell = sheet.getRow(rownum).getCell(cellnum); cell.setCellValue(value); } private void writeToResponse(HttpServletResponse response, Workbook workbook, String name) throws IOException { // 修改模板内容导出新模板 response.setContentType("application/x-msdownload"); String fileNameURL = URLEncoder.encode(name, "UTF-8"); response.setHeader("Content-disposition", "attachment;filename=" + fileNameURL + ";filename*=utf-8''" + fileNameURL); OutputStream out = response.getOutputStream(); workbook.write(out); out.flush(); out.close(); } }