diff --git a/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/WebMvcConfig.java b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/WebMvcConfig.java index 5617a2d5..4bca8743 100644 --- a/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/WebMvcConfig.java +++ b/adc-da-jwtLogin/src/main/java/com/adc/da/login/security/WebMvcConfig.java @@ -188,6 +188,13 @@ public class WebMvcConfig implements WebMvcConfigurer { // 标准法规库-企标计划导出接口 addInterceptor.excludePathPatterns("/api/esRevisePlan/es-revise-plan/exportEsRevisePlanInfoExcel"); + // 内外部会议导出接口 + addInterceptor.excludePathPatterns("/api/lawss/insideOutsideMeeting/exportMeetingInfo"); + + // 政策课题导出接口 + addInterceptor.excludePathPatterns("/api/lawss/sarLawsTopic/exportLawsTopicInfo"); + + addInterceptor.excludePathPatterns("/api/lawss/sarLawsInformation/exportLawsInformationInfo"); // // 添加自定义拦截器,并拦截对应 url addInterceptor.addPathPatterns("/**"); diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/controller/InsideOutSideMeetingController.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/controller/InsideOutSideMeetingController.java index ba820d17..b0b3895a 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/controller/InsideOutSideMeetingController.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/controller/InsideOutSideMeetingController.java @@ -1,6 +1,10 @@ package com.adc.da.slrs.InsideOntSideMeeting.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; import com.adc.da.base.web.BaseController; import com.adc.da.common.ReadExcel; import com.adc.da.exception.AdcDaBaseException; @@ -10,22 +14,27 @@ import com.adc.da.http.Result; import com.adc.da.slrs.InsideOntSideMeeting.entity.InsideOutsideMeeting; import com.adc.da.slrs.InsideOntSideMeeting.entity.InsideOutsideMeetingVO; import com.adc.da.slrs.InsideOntSideMeeting.service.InsideOutsideMeetingService; -import com.adc.da.utils.util.InsideOutsideMeetingExportUtil; +import com.adc.da.util.UUIDUtils; +import com.adc.da.utils.util.FieldConvertUtil; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; -import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.util.IOUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; -import java.io.IOException; -import java.io.OutputStream; +import java.io.*; import java.text.ParseException; import java.util.Arrays; import java.util.List; @@ -44,6 +53,9 @@ public class InsideOutSideMeetingController extends BaseController getMeetingInfo(String meetingId){ @@ -110,7 +122,11 @@ public class InsideOutSideMeetingController extends BaseController meetingTopicList; diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/InsideOutsideMeetingVO.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/InsideOutsideMeetingVO.java index a596e3eb..d4297649 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/InsideOutsideMeetingVO.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/InsideOutsideMeetingVO.java @@ -1,5 +1,7 @@ package com.adc.da.slrs.InsideOntSideMeeting.entity; +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.excel.annotation.ExcelCollection; import com.adc.da.att.entity.AttFileEO; import com.adc.da.base.page.BasePage; import com.fasterxml.jackson.annotation.JsonFormat; @@ -22,17 +24,23 @@ public class InsideOutsideMeetingVO extends BasePage { private String id; + @Excel(name = "会议名称", needMerge = true) private String meetingName; + @Excel(name = "课题名称", needMerge = true) private String topicName; + @Excel(name = "会议主办单位", needMerge = true) private String meetingOrganizer; @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") + @Excel(name = "会议时间", exportFormat = "yyyy-MM-dd", needMerge = true) private Date meetingTime; + @Excel(name = "会议地点", needMerge = true) private String meetingAddress; + @Excel(name = "参会人员", needMerge = true) private String participants; private List participantsList; @@ -40,12 +48,20 @@ public class InsideOutsideMeetingVO extends BasePage { private List meetingMinutesList; + @Excel(name = "会议主要内容", needMerge = true) private String meetingContent; private String firstMeetingType; + @Excel(name = "1级会议类别", needMerge = true) + private String firstMeetingTypeName; + private String secondMeetingType; + @Excel(name = "2级会议类别", needMerge = true) + private String secondMeetingTypeName; + + @ExcelCollection(name = "会议议题") private List meetingTopicList; private String agendaName; diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/MeetingTopic.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/MeetingTopic.java index f030a1bc..dd9435f5 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/MeetingTopic.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/entity/MeetingTopic.java @@ -1,19 +1,17 @@ package com.adc.da.slrs.InsideOntSideMeeting.entity; +import cn.afterturn.easypoi.excel.annotation.Excel; import com.adc.da.base.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; -import java.util.Date; - /** * @author tjzdw * @description @@ -36,6 +34,7 @@ public class MeetingTopic extends BaseEntity { @ApiModelProperty(value = "议题名称") @TableField("AGENDA_NAME") + @Excel(name = "议题名称") private String agendaName; @ApiModelProperty(value = "议题材料") @@ -44,27 +43,16 @@ public class MeetingTopic extends BaseEntity { @ApiModelProperty(value = "汇报人") @TableField("REPORTER") + @Excel(name = "汇报人") private String reporter; @ApiModelProperty(value = "汇报单位") @TableField("REPORTING_UNIT") + @Excel(name = "汇报单位") private String reportingUnit; @ApiModelProperty(value = "议题主要内容") @TableField("AGENDA_CONTENT") + @Excel(name = "议题主要内容") private String agendaContent; - - @ApiModelProperty(value = "逻辑删除,0可用,1不可用") - @TableField("VALID_FLAG") - private Integer validFlag; - - @ApiModelProperty(value = "创建时间") - @TableField("CREATE_TIME") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - private Date createTime; - - @ApiModelProperty(value = "修改时间") - @TableField("MODIFY_TIME") - @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") - private Date modifyTime; } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/service/impl/InsideOutsideMeetingServiceImpl.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/service/impl/InsideOutsideMeetingServiceImpl.java index 391aac06..d3305cc3 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/service/impl/InsideOutsideMeetingServiceImpl.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/InsideOntSideMeeting/service/impl/InsideOutsideMeetingServiceImpl.java @@ -12,7 +12,12 @@ import com.adc.da.slrs.InsideOntSideMeeting.entity.MeetingTopic; import com.adc.da.slrs.InsideOntSideMeeting.service.InsideOutsideMeetingService; import com.adc.da.slrs.InsideOntSideMeeting.service.MeetingTopicService; import com.adc.da.slrs.sarLawsInformation.entity.SarLawsInformation; +import com.adc.da.slrs.sarUpdLog.entity.SarUpdLog; +import com.adc.da.slrs.sarUpdLog.service.ISarUpdLogService; +import com.adc.da.slrs.tsDictionaryType.entity.TsDicType; import com.adc.da.slrs.tsDictionaryType.service.ITsDicTypeService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; import com.adc.da.utils.util.FieldConvertUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; @@ -36,6 +41,7 @@ import java.lang.reflect.Method; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; /** * @author tjzdw @@ -47,34 +53,38 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl meetingMinutesList = new ArrayList<>(); - for (String attId : insideOutSideMeeting.getMeetingMinutes().split(",")) { + for (String attId : insideOutsideMeeting.getMeetingMinutes().split(",")) { AttFileEO fileInfo = attFileEOService.getFileInfo(attId); meetingMinutesList.add(fileInfo); } - insideOutSideMeeting.setMeetingMinutesList(meetingMinutesList); + insideOutsideMeeting.setMeetingMinutesList(meetingMinutesList); } + // 获取会议类别值 + getTypeByCode(insideOutsideMeeting); + // 获取会议课题列表 LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(MeetingTopic::getMeetingId, meetingId); List meetingTopicList = meetingTopicService.list(wrapper); - insideOutSideMeeting.setMeetingTopicList(meetingTopicList); + insideOutsideMeeting.setMeetingTopicList(meetingTopicList); } - return insideOutSideMeeting; + return insideOutsideMeeting; } @Transactional @@ -85,73 +95,78 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl topicWrapper = new LambdaUpdateWrapper<>(); + LambdaQueryWrapper topicWrapper = new LambdaQueryWrapper<>(); topicWrapper.eq(MeetingTopic::getMeetingId, meetingId); - topicWrapper.set(MeetingTopic::getValidFlag,1); - meetingTopicService.update(topicWrapper); + meetingTopicService.remove(topicWrapper); } return update; } @Transactional @Override - public Boolean updateMeetingInfo(InsideOutsideMeeting insideOutSideMeeting) { - if (StringUtils.isBlank(insideOutSideMeeting.getId())) { + public Boolean updateMeetingInfo(InsideOutsideMeeting insideOutsideMeeting) { + if (StringUtils.isBlank(insideOutsideMeeting.getId())) { return false; } - insideOutSideMeeting.setModifyTime(new Date()); - int update = this.baseMapper.updateById(insideOutSideMeeting); - if (update > 0) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(MeetingTopic::getMeetingId,insideOutSideMeeting.getId()); - // 先删除会议信息 - meetingTopicService.remove(wrapper); - // 再添加会议信息 - for (MeetingTopic meetingTopic : insideOutSideMeeting.getMeetingTopicList()) { - meetingTopic.setCreateTime(new Date()); - meetingTopic.setModifyTime(new Date()); - meetingTopic.setValidFlag(0); - meetingTopic.setMeetingId(insideOutSideMeeting.getId()); - meetingTopicService.save(meetingTopic); + InsideOutsideMeeting insideOutsideMeetingDB = this.baseMapper.selectById(insideOutsideMeeting.getId()); + List diffList = compareInsideOutsideMeeting(insideOutsideMeetingDB, insideOutsideMeeting); + if (diffList.size() > 0) { + insideOutsideMeeting.setModifyTime(new Date()); + int update = this.baseMapper.updateById(insideOutsideMeeting); + if (update > 0) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(MeetingTopic::getMeetingId,insideOutsideMeeting.getId()); + // 先删除会议信息 + meetingTopicService.remove(wrapper); + // 再添加会议信息 + for (MeetingTopic meetingTopic : insideOutsideMeeting.getMeetingTopicList()) { + meetingTopic.setMeetingId(insideOutsideMeeting.getId()); + meetingTopicService.save(meetingTopic); + } + // 存储修改记录 + SarUpdLog sarUpdLogEO = new SarUpdLog(); + sarUpdLogEO.setId(UUIDUtils.randomUUID20()); + sarUpdLogEO.setSarId(insideOutsideMeetingDB.getId()); + sarUpdLogEO.setSarType("INSIDE_OUTSIDE_MEETING"); + sarUpdLogEO.setCreationTime(new Date()); + sarUpdLogEO.setCreationUser(LoginUserUtil.getUserId()); + sarUpdLogEO.setContent(insideOutsideMeetingDB.getMeetingName() + "," + String.join(",",diffList)); + updLogService.save(sarUpdLogEO); } } return true; } + // 用于Excel文件导出 @Override public List queryAllMeeting(InsideOutsideMeetingVO insideOutsideMeetingVO) { List insideOutsideMeetingVOList = this.baseMapper.queryAllMeeting(insideOutsideMeetingVO); for (InsideOutsideMeetingVO meetingVO : insideOutsideMeetingVOList) { - if (StringUtils.isNotBlank(meetingVO.getMeetingMinutes())) { - List meetingMinutesList = new ArrayList<>(); - for (String attId : meetingVO.getMeetingMinutes().split(",")) { - AttFileEO fileInfo = attFileEOService.getFileInfo(attId); - meetingMinutesList.add(fileInfo); - } - meetingVO.setMeetingMinutesList(meetingMinutesList); - } + // 获取会议类别值 + getTypeByCode(meetingVO); } return insideOutsideMeetingVOList; } @Override public List queryMeetingById(List exportIdList) { - return this.baseMapper.queryMeetingById(exportIdList); + List insideOutsideMeetingVOList = this.baseMapper.queryMeetingById(exportIdList); + for (InsideOutsideMeetingVO meetingVO : insideOutsideMeetingVOList) { + getTypeByCode(meetingVO); + } + return insideOutsideMeetingVOList; } @Transactional @Override - public Integer addMeetingInfo(InsideOutsideMeeting insideOutSideMeeting) { - insideOutSideMeeting.setCreateTime(new Date()); - insideOutSideMeeting.setModifyTime(new Date()); - insideOutSideMeeting.setValidFlag(0); - int insert = this.baseMapper.insert(insideOutSideMeeting); - if (!insideOutSideMeeting.getMeetingTopicList().isEmpty()) { - for (MeetingTopic meetingTopic : insideOutSideMeeting.getMeetingTopicList()) { - meetingTopic.setMeetingId(insideOutSideMeeting.getId()); - meetingTopic.setCreateTime(new Date()); - meetingTopic.setModifyTime(new Date()); - meetingTopic.setValidFlag(0); + public Integer addMeetingInfo(InsideOutsideMeeting insideOutsideMeeting) { + insideOutsideMeeting.setCreateTime(new Date()); + insideOutsideMeeting.setModifyTime(new Date()); + insideOutsideMeeting.setValidFlag(0); + int insert = this.baseMapper.insert(insideOutsideMeeting); + if (!insideOutsideMeeting.getMeetingTopicList().isEmpty()) { + for (MeetingTopic meetingTopic : insideOutsideMeeting.getMeetingTopicList()) { + meetingTopic.setMeetingId(insideOutsideMeeting.getId()); meetingTopicService.save(meetingTopic); } } @@ -174,7 +189,21 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl insideOutsideMeetingVOList = this.baseMapper.queryByPage(page); + for (InsideOutsideMeetingVO insideOutsideMeeting : insideOutsideMeetingVOList) { + // 获取会议纪要文件对象 + if (StringUtils.isNotBlank(insideOutsideMeeting.getMeetingMinutes())) { + List meetingMinutesList = new ArrayList<>(); + for (String attId : insideOutsideMeeting.getMeetingMinutes().split(",")) { + AttFileEO fileInfo = attFileEOService.getFileInfo(attId); + meetingMinutesList.add(fileInfo); + } + insideOutsideMeeting.setMeetingMinutesList(meetingMinutesList); + } + // 获取会议类别值 + getTypeByCode(insideOutsideMeeting); + } + return insideOutsideMeetingVOList; } @Override @@ -282,6 +311,9 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl 500) { + return Result.error("单元格输入过长"); + } rowMap.put(headerCell.getStringCellValue(), cell.getStringCellValue()); } } else { @@ -290,50 +322,81 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl stringStringMap : importDataList) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.eq(InsideOutsideMeeting::getMeetingName, stringStringMap.get("会议名称")); - List insideOutsideMeetingList = this.baseMapper.selectList(wrapper); - if (insideOutsideMeetingList.size() > 0) { - InsideOutsideMeeting insideOutsideMeeting = insideOutsideMeetingList.get(0); + + // 获取需要校验的字段 + List firstMeetingTypeList = dicTypeService.selectAllDicTypeNameByDicCode("firstMeetingType"); + Set firstMeetingTypeNameSet = firstMeetingTypeList.stream().map(TsDicType::getDicTypeName).collect(Collectors.toSet()); + List secondMeetingTypeList = dicTypeService.selectAllDicTypeNameByDicCode("secondMeetingType"); + Set secondMeetingTypeNameSet = secondMeetingTypeList.stream().map(TsDicType::getDicTypeName).collect(Collectors.toSet()); + // 计数器,用于处理出现多条会议课题的情况 + int count = 0; +// InsideOutsideMeeting insideOutsideMeetingDB = null; + InsideOutsideMeeting insideOutsideMeeting = new InsideOutsideMeeting(); + List meetingTopicList = new ArrayList<>(); + for (Map dataMap : importDataList) { + String meetingName = dataMap.get("会议名称"); + // 如果会议名称为空,则表示该行为会议课题行,是之前会议的会议课题,不提交之前的会议信息。不为空则进入 + if (StringUtils.isNotBlank(meetingName)) { + // 如果计数器大于0,表示进入了新的会议信息中,提交之前的会议信息 + if (count > 0) { + insideOutsideMeeting.setMeetingTopicList(meetingTopicList); + addMeetingInfo(insideOutsideMeeting); + // 初始化会议课题列表 + meetingTopicList.clear(); + // 初始化会议对象 + insideOutsideMeeting = new InsideOutsideMeeting(); + // 计数器归零 + count = 0; + } + insideOutsideMeeting.setMeetingName(meetingName); + insideOutsideMeeting.setTopicName(dataMap.get("课题名称")); + insideOutsideMeeting.setMeetingOrganizer(dataMap.get("会议主办单位")); + insideOutsideMeeting.setMeetingTime(sdf.parse(dataMap.get("会议时间"))); + insideOutsideMeeting.setMeetingAddress(dataMap.get("会议地点")); + insideOutsideMeeting.setParticipants(dataMap.get("参会人员")); + insideOutsideMeeting.setMeetingContent(dataMap.get("会议主要内容")); + if (StringUtils.isNotBlank(dataMap.get("一级会议类别"))) { + if (!firstMeetingTypeNameSet.contains(dataMap.get("一级会议类别"))){ + return Result.error("一级会议类别不符合输入要求"); + } + for (TsDicType tsDicType : firstMeetingTypeList) { + if (dataMap.get("一级会议类别").equals(tsDicType.getDicTypeName())) { + insideOutsideMeeting.setFirstMeetingType(tsDicType.getDicTypeCode()); + } + } + } + if (StringUtils.isNotBlank(dataMap.get("二级会议类别"))) { + if (!secondMeetingTypeNameSet.contains(dataMap.get("二级会议类别"))){ + return Result.error("二级会议类别不符合输入要求"); + } + for (TsDicType tsDicType : secondMeetingTypeList) { + if (dataMap.get("二级会议类别").equals(tsDicType.getDicTypeName())) { + insideOutsideMeeting.setSecondMeetingType(tsDicType.getDicTypeCode()); + } + } + } + // 会议课题信息 MeetingTopic meetingTopic = new MeetingTopic(); - meetingTopic.setAgendaName(stringStringMap.get("议题名称")); - meetingTopic.setReporter("汇报人"); - meetingTopic.setReportingUnit("汇报单位"); - meetingTopic.setAgendaContent("议题主要内容"); - meetingTopic.setValidFlag(0); - meetingTopic.setMeetingId(insideOutsideMeeting.getId()); - meetingTopic.setCreateTime(new Date()); - meetingTopic.setModifyTime(new Date()); - meetingTopicService.save(meetingTopic); + meetingTopic.setAgendaName(dataMap.get("议题名称")); + meetingTopic.setReporter(dataMap.get("汇报人")); + meetingTopic.setReportingUnit(dataMap.get("汇报单位")); + meetingTopic.setAgendaContent(dataMap.get("议题主要内容")); + meetingTopicList.add(meetingTopic); + count++; } else { - InsideOutsideMeeting insideOutsideMeeting = new InsideOutsideMeeting(); - insideOutsideMeeting.setMeetingTopicList(new ArrayList<>()); - insideOutsideMeeting.setMeetingName(stringStringMap.get("会议名称")); - insideOutsideMeeting.setTopicName(stringStringMap.get("课题名称")); - insideOutsideMeeting.setMeetingOrganizer(stringStringMap.get("会议主办单位")); - insideOutsideMeeting.setMeetingTime(sdf.parse(stringStringMap.get("会议时间"))); - insideOutsideMeeting.setMeetingAddress(stringStringMap.get("会议地点")); - insideOutsideMeeting.setParticipants(stringStringMap.get("参会人员")); - insideOutsideMeeting.setMeetingContent(stringStringMap.get("会议主要内容")); - insideOutsideMeeting.setFirstMeetingType(stringStringMap.get("一级会议类别")); - insideOutsideMeeting.setSecondMeetingType(stringStringMap.get("二级会议类别")); - insideOutsideMeeting.setValidFlag(0); - insideOutsideMeeting.setCreateTime(new Date()); - insideOutsideMeeting.setModifyTime(new Date()); - this.baseMapper.insert(insideOutsideMeeting); + // 进入else 表示该行是会议课题行 MeetingTopic meetingTopic = new MeetingTopic(); - meetingTopic.setAgendaName(stringStringMap.get("议题名称")); - meetingTopic.setReporter("汇报人"); - meetingTopic.setReportingUnit("汇报单位"); - meetingTopic.setAgendaContent("议题主要内容"); - meetingTopic.setValidFlag(0); - meetingTopic.setMeetingId(insideOutsideMeeting.getId()); - meetingTopic.setCreateTime(new Date()); - meetingTopic.setModifyTime(new Date()); - meetingTopicService.save(meetingTopic); + meetingTopic.setAgendaName(dataMap.get("议题名称")); + meetingTopic.setReporter(dataMap.get("汇报人")); + meetingTopic.setReportingUnit(dataMap.get("汇报单位")); + meetingTopic.setAgendaContent(dataMap.get("议题主要内容")); + meetingTopicList.add(meetingTopic); + count++; } } + // 插入最后一条记录 + insideOutsideMeeting.setMeetingTopicList(meetingTopicList); + addMeetingInfo(insideOutsideMeeting); return Result.success("导入完成"); } @@ -364,10 +427,10 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl compareInsideOutsideMeeting(InsideOutsideMeeting oldMeeting, InsideOutsideMeeting newMeeting) { List changes = new ArrayList<>(); // 不需要比较的字段 - String[] ignoreFields = {"id","validFlag","createTime","modifyTime","meetingTopicList"}; + String[] ignoreFields = {"id","validFlag","createTime","modifyTime", "firstMeetingTypeName", "secondMeetingTypeName"}; List ignoreFieldList = Arrays.asList(ignoreFields); // 获取SarLawsInformation类的所有字段 - Field[] fields = SarLawsInformation.class.getDeclaredFields(); + Field[] fields = InsideOutsideMeeting.class.getDeclaredFields(); for (Field field : fields) { if (!ignoreFieldList.contains(field.getName())) { try { @@ -382,7 +445,7 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl oldFileList = (List)method.invoke(oldMeeting); + List oldFileNameList = new ArrayList<>(); + if (oldFileList != null && oldFileList.size() > 0) { + for (Object oldFile : oldFileList) { + AttFileEO oldFile1 = (AttFileEO) oldFile; + oldFileNameList.add(oldFile1.getOldFileName()); + } + } // 获取字段名称 ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; - changes.add(annotationsByType.value() + "由\"" + oldTypeName + "\"改为\"" + String.join(",",fileNameList) + "\""); + changes.add(annotationsByType.value() + "由\"" + String.join(",",oldFileNameList) + "\"改为\"" + String.join(",",fileNameList) + "\""); } else if ("meetingTopicList".equals(field.getName())) { -// // 获取会议列表内容 -// String fieldName = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1); -// Method method = SarLawsInformation.class.getMethod("get" + fieldName); -// List oldMeetingTopicList = (List)method.invoke(oldMeeting); -// List newMeetingTopicList = (List)method.invoke(newMeeting); -// for (Object meetingTopic : oldMeetingTopicList) { -// meetingTopicService.compareMeetingTopic(meetingTopic, oldMeeting); -// } - ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; - changes.add(annotationsByType.value() + "由\"" + oldValue + "\"改为\"" + newValue + "\""); + changes.add(annotationsByType.value() + "被变更"); } else { ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; @@ -429,4 +490,23 @@ public class InsideOutsideMeetingServiceImpl extends ServiceImpl compareMeetingTopic(InsideOutsideMeeting oldTopic, InsideOutsideMeeting newTopic) { List changes = new ArrayList<>(); // 不需要比较的字段 - String[] ignoreFields = {"id","meetingId","validFlag","createTime","modifyTime"}; + String[] ignoreFields = {"id","meetingId"}; List ignoreFieldList = Arrays.asList(ignoreFields); // 获取SarLawsInformation类的所有字段 Field[] fields = SarLawsInformation.class.getDeclaredFields(); diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/controller/SarLawsInformationController.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/controller/SarLawsInformationController.java index ba9f4f7d..54b6a43d 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/controller/SarLawsInformationController.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/controller/SarLawsInformationController.java @@ -1,17 +1,41 @@ package com.adc.da.slrs.sarLawsInformation.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; import com.adc.da.base.web.BaseController; +import com.adc.da.common.ReadExcel; +import com.adc.da.exception.AdcDaBaseException; import com.adc.da.http.PageInfo; import com.adc.da.http.ResponseMessage; import com.adc.da.http.Result; import com.adc.da.slrs.sarLawsInformation.entity.SarLawsInformation; import com.adc.da.slrs.sarLawsInformation.service.SarLawsInformationService; +import com.adc.da.util.UUIDUtils; +import com.adc.da.utils.util.FieldConvertUtil; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.ParseException; +import java.util.Arrays; import java.util.List; /** @@ -23,9 +47,14 @@ import java.util.List; @RequestMapping("/${restPath}/lawss/sarLawsInformation") public class SarLawsInformationController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SarLawsInformationController.class); + @Resource private SarLawsInformationService informationService; + @Value("${file.path}") + private String filePath; + @ApiOperation(value = "根据政策资料ID查询资料信息") @GetMapping("/getLawsInformationInfo") public ResponseMessage getLawsInformationInfo(String id){ @@ -69,4 +98,120 @@ public class SarLawsInformationController extends BaseController exportLawsInformationInfo(SarLawsInformation sarLawsInformation, HttpServletResponse response, + HttpServletRequest request) { + OutputStream os = null; + Workbook workbook = null; + List datas; + try { + if(StringUtils.isEmpty(sarLawsInformation.getExportName())||sarLawsInformation.getExportName().equals("null")){ + sarLawsInformation.setExportName("政策法规资料信息"); + } + response.setHeader("Content-Disposition", + "attachment; filename=" + ReadExcel.encodeFileName(sarLawsInformation.getExportName()+".xlsx", + request)); + // 导出数据,若指定了值则使用ids字段条件导出,否则根据条件导出 + if (StrUtil.isNotBlank(sarLawsInformation.getExportIds())) { + List idList = Arrays.asList(sarLawsInformation.getExportIds().split(",")); + datas = informationService.getLawsInformationByIds(idList); + } else { + // 导出所有数据 + datas = informationService.getAllLawsInformation(sarLawsInformation); + } + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setSheetName(sarLawsInformation.getExportName()); + workbook = ExcelExportUtil.exportExcel(exportParams,SarLawsInformation.class,datas); + os = response.getOutputStream(); + workbook.write(os); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + throw new AdcDaBaseException("下载文件失败,请重试"); + } finally { + IOUtils.closeQuietly(os); + } + return Result.success(); + } + + @ApiOperation("Excel文件导入政策资料信息") + @PostMapping("/importLawsInformationInfo") + public ResponseMessage importLawsInformationInfo(@RequestParam(value = "file",required = false) MultipartFile file) throws ParseException { + if (file == null) { + return Result.error("文件为空,请重新上传"); + } + return informationService.importLawsInformationInfo(file); + } + + @ApiOperation(value = "政策法规资料导入模板下载") + @GetMapping("/exportTemplateFile") + public void exportTemplateFile(String fileName,HttpServletResponse response, HttpServletRequest request)throws Exception{ + + OutputStream os = null; + OutputStream excelOS = null; + HSSFWorkbook workbook = new HSSFWorkbook(); + String fileOriName = "政策法规资料导入模板"; + if (StringUtils.isNotEmpty(fileName)) { + fileOriName = fileName; + } + try{ + //创建临时文件夹 + String fileNowPath = filePath + "/tempZip/" + UUIDUtils.randomUUID20() + "/" + fileOriName; + File nowFile = new File(fileNowPath); + if (nowFile.exists()){ + nowFile.delete(); + } + nowFile.mkdirs(); + String fileName2 = "导入模板.xls"; + HSSFSheet sheetItems = workbook.createSheet("模板"); + sheetItems.setDefaultColumnWidth(13); + Row rowHeader = sheetItems.createRow(1);//开始创建标题行 + sheetItems.addMergedRegion(new CellRangeAddress(0, 0, 0, 8)); + Row row2 = sheetItems.createRow(0);//开始创建填写说明 + String exportFieldName = FieldConvertUtil.exportFieldLawsInformation; + if (StringUtils.isNotBlank(exportFieldName)) { + String[] headerArr = exportFieldName.split(","); + for (int i=0;i < headerArr.length; i++) { + rowHeader.createCell(i).setCellValue(headerArr[i]); + } + } + Cell cellA2 = row2.createCell(0); + cellA2.setCellValue(FieldConvertUtil.exportLawsInformationDesc); + //sheetItems.setColumnWidth(0, 20 * 150); + row2.setHeight((short) (100 * 25)); + HSSFCellStyle cellStyle =workbook.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.LEFT); + cellStyle.setVerticalAlignment(VerticalAlignment.TOP); + cellStyle.setWrapText(true); + cellA2.setCellStyle(cellStyle); + String repFileName = fileName2.replaceAll("/","_"); + excelOS = new FileOutputStream(fileNowPath + "/" + repFileName); + response.setHeader("Content-Disposition", + "attachment; filename=\""+ ReadExcel.encodeFileName(fileOriName+".zip", request) +"\""); + response.setContentType("application/force-download"); + response.flushBuffer(); + os = response.getOutputStream(); + workbook.write(excelOS); + excelOS.flush(); + excelOS.close(); + ZipUtil.zip(fileNowPath,fileNowPath+".zip"); + FileInputStream fis = new FileInputStream(fileNowPath+".zip"); + int len = 0; + while ((len = fis.read()) != -1) { + os.write(len); + } + os.flush(); + os.close(); // 后开先关 + fis.close(); // 先开后关 + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new com.adc.da.exception.AdcDaBaseException("下载文件失败,请重试"); + } finally { + IOUtils.closeQuietly(os); + IOUtils.closeQuietly(excelOS); + } + } } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/dao/SarLawsInformationDao.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/dao/SarLawsInformationDao.java index 337149b8..184679d4 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/dao/SarLawsInformationDao.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/dao/SarLawsInformationDao.java @@ -18,6 +18,8 @@ public interface SarLawsInformationDao extends BaseMapper { Integer queryByPageCount(SarLawsInformation page); List queryByPage(SarLawsInformation page); + + List getAllLawsInformation(SarLawsInformation sarLawsInformation); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/entity/SarLawsInformation.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/entity/SarLawsInformation.java index 5e66844c..8883148f 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/entity/SarLawsInformation.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/entity/SarLawsInformation.java @@ -1,5 +1,7 @@ package com.adc.da.slrs.sarLawsInformation.entity; +import cn.afterturn.easypoi.excel.annotation.Excel; +import com.adc.da.att.entity.AttFileEO; import com.adc.da.base.page.BasePage; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; @@ -7,6 +9,7 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; import java.util.Date; +import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; @@ -43,6 +46,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "一级资料类别名称") @TableField(exist = false) + @Excel(name = "一级资料类别", orderNum = "0") private String firstTypeName; /** @@ -57,6 +61,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "二级资料类别名称") @TableField(exist = false) + @Excel(name = "二级资料类别", orderNum = "1") private String secondTypeName; /** @@ -71,6 +76,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "三级资料类别名称") @TableField(exist = false) + @Excel(name = "三级资料类别", orderNum = "2") private String thirdTypeName; /** @@ -85,6 +91,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "四级资料类别名称") @TableField(exist = false) + @Excel(name = "四级资料类别", orderNum = "3") private String fourthTypeName; /** @@ -92,6 +99,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "资料名称") @TableField(value = "NAME") + @Excel(name = "资料名称", orderNum = "4") private String name; /** @@ -99,6 +107,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "资料归属部门") @TableField(value = "DEPARTMENT") + @Excel(name = "资料归属部门", orderNum = "5") private String department; /** @@ -106,6 +115,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "作者") @TableField(value = "AUTHOR") + @Excel(name = "作者", orderNum = "6") private String author; /** @@ -115,6 +125,7 @@ public class SarLawsInformation extends BasePage implements Serializable { @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") @TableField(value = "UPLOAD_TIME") + @Excel(name = "上传时间", orderNum = "7", exportFormat = "yyyy-MM-dd") private Date uploadTime; /** @@ -122,6 +133,7 @@ public class SarLawsInformation extends BasePage implements Serializable { */ @ApiModelProperty(value = "资料说明") @TableField(value = "DESCRIPTION") + @Excel(name = "资料说明", orderNum = "8") private String description; /** @@ -134,9 +146,9 @@ public class SarLawsInformation extends BasePage implements Serializable { /** * 资料文件名称 */ - @ApiModelProperty(value = "资料文件名称") + @ApiModelProperty(value = "资料文件对象列表") @TableField(exist = false) - private String informationFileName; + private List informationFileList; /** * 可查看者,若设置为空则所有用户均可查看,若设置人员后,仅有可查看者可以查看文件信息。 @@ -219,6 +231,15 @@ public class SarLawsInformation extends BasePage implements Serializable { @TableField(exist = false) private String collectId; + // Excel导出使用字段 + @ApiModelProperty("导出文件名") + @TableField(exist = false) + private String exportName; + + @ApiModelProperty("导出的文件Ids") + @TableField(exist = false) + private String exportIds; + @TableField(exist = false) private static final long serialVersionUID = 1L; } \ No newline at end of file diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/SarLawsInformationService.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/SarLawsInformationService.java index e8797d2c..d2affd3e 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/SarLawsInformationService.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/SarLawsInformationService.java @@ -1,7 +1,9 @@ package com.adc.da.slrs.sarLawsInformation.service; +import com.adc.da.http.ResponseMessage; import com.adc.da.slrs.sarLawsInformation.entity.SarLawsInformation; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -21,4 +23,20 @@ public interface SarLawsInformationService extends IService Boolean deleteInformation(String id); Boolean updateLawsInformationInfo(SarLawsInformation lawsInformation); + + /** + * 根据法规资料id列表查询资料信息,用于导出,不包含文件信息 + * @param idList 法规资料Id列表 + * @return 法规资料列表 + */ + List getLawsInformationByIds(List idList); + + /** + * 查询法规资料信息,用于导出,不包含文件信息 + * @param sarLawsInformation 法规资料对象,用于查询 + * @return 法规资料列表 + */ + List getAllLawsInformation(SarLawsInformation sarLawsInformation); + + ResponseMessage importLawsInformationInfo(MultipartFile file); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/impl/SarLawsInformationServiceImpl.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/impl/SarLawsInformationServiceImpl.java index c806097b..4cd5ecf0 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/impl/SarLawsInformationServiceImpl.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsInformation/service/impl/SarLawsInformationServiceImpl.java @@ -1,31 +1,53 @@ package com.adc.da.slrs.sarLawsInformation.service.impl; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ImportParams; import com.adc.da.att.entity.AttFileEO; import com.adc.da.att.service.IAttFileEOService; +import com.adc.da.common.FileUnZip; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; import com.adc.da.person.entity.TsPersonCollect; import com.adc.da.person.service.IPersonCollectEOService; import com.adc.da.slrs.sarLawsInformationCenterTree.entity.SarLawsInformationCenterTree; import com.adc.da.slrs.sarLawsInformationCenterTree.service.SarLawsInformationCenterTreeService; import com.adc.da.slrs.sarUpdLog.entity.SarUpdLog; import com.adc.da.slrs.sarUpdLog.service.ISarUpdLogService; +import com.adc.da.slrs.sarUser.entity.TsUser; +import com.adc.da.slrs.sarUser.service.ITsUserService; +import com.adc.da.slrs.tsDictionaryType.entity.TsDicType; import com.adc.da.slrs.tsDictionaryType.service.ITsDicTypeService; import com.adc.da.util.LoginUserUtil; import com.adc.da.util.UUIDUtils; +import com.adc.da.utils.util.FieldConvertUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.adc.da.slrs.sarLawsInformation.entity.SarLawsInformation; import com.adc.da.slrs.sarLawsInformation.service.SarLawsInformationService; import com.adc.da.slrs.sarLawsInformation.dao.SarLawsInformationDao; import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; import java.lang.reflect.Field; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; +import java.text.SimpleDateFormat; import java.util.*; +import java.util.stream.Collectors; /** * @author tjzdw @@ -46,6 +68,10 @@ public class SarLawsInformationServiceImpl extends ServiceImpl fileNameList = new ArrayList<>(); + List fileNameList = new ArrayList<>(); for (String attId : split) { AttFileEO fileInfo = attFileEOService.getFileInfo(attId); - fileNameList.add(fileInfo.getOldFileName()); + fileNameList.add(fileInfo); } - sarLawsInformation.setInformationFileName(String.join(",",fileNameList)); + sarLawsInformation.setInformationFileList(fileNameList); } // 查询体系节点信息 if (StringUtils.isNotBlank(sarLawsInformation.getTreeNodeId())) { @@ -89,10 +115,20 @@ public class SarLawsInformationServiceImpl extends ServiceImpl sarLawsInformationList = this.baseMapper.queryByPage(page); for (SarLawsInformation sarLawsInformation : sarLawsInformationList) { + // 将字典编号变更为字典值 convertCodeToName(sarLawsInformation); + // 查询文件信息 + if (StringUtils.isNotBlank(sarLawsInformation.getInformationFile())) { + String[] split = sarLawsInformation.getInformationFile().split(","); + List fileNameList = new ArrayList<>(); + for (String attId : split) { + AttFileEO fileInfo = attFileEOService.getFileInfo(attId); + fileNameList.add(fileInfo); + } + sarLawsInformation.setInformationFileList(fileNameList); + } } return sarLawsInformationList; } @@ -101,8 +137,14 @@ public class SarLawsInformationServiceImpl extends ServiceImpl wrapper = new LambdaQueryWrapper<>(); @@ -146,6 +188,204 @@ public class SarLawsInformationServiceImpl extends ServiceImpl getLawsInformationByIds(List idList) { + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.in(SarLawsInformation::getId, idList); + List sarLawsInformationList = this.baseMapper.selectList(wrapper); + for (SarLawsInformation sarLawsInformation : sarLawsInformationList) { + // 将字典编号变更为字典值 + convertCodeToName(sarLawsInformation); + } + return sarLawsInformationList; + } + + @Override + public List getAllLawsInformation(SarLawsInformation sarLawsInformation) { + List sarLawsInformationList = this.baseMapper.getAllLawsInformation(sarLawsInformation); + for (SarLawsInformation lawsInformation : sarLawsInformationList) { + // 将字典编号变更为字典值 + convertCodeToName(lawsInformation); + // 查询文件信息 + if (StringUtils.isNotBlank(lawsInformation.getInformationFile())) { + String[] split = lawsInformation.getInformationFile().split(","); + List fileNameList = new ArrayList<>(); + for (String attId : split) { + AttFileEO fileInfo = attFileEOService.getFileInfo(attId); + fileNameList.add(fileInfo); + } + lawsInformation.setInformationFileList(fileNameList); + } + } + return sarLawsInformationList; + } + + @Override + public ResponseMessage importLawsInformationInfo(MultipartFile file) { + //获取文件全称 + String fileNameStr = file.getOriginalFilename(); + //获取最后.的位置 + assert fileNameStr != null; + int pos = fileNameStr.lastIndexOf("."); + //获取压缩文件名称并以小写显示 + String fileStr = fileNameStr.substring(pos + 1).toLowerCase(); + //校验是否是zip文件 + if (!fileStr.equals("zip")) { + return Result.error("请上传zip格式的文件"); + } + //进行拼接获取文件名称 + String fileName = fileNameStr.substring(0, pos); + //获取路径和文件名称 + String path = filePath + "/" + fileName; + + File saveDirectory = new File(path); + //判断saveDirectory中是否是文件夹 + if (!saveDirectory.isDirectory()) { + saveDirectory.mkdir(); + } + //将文件写入到指定路径中 + try { + FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path + "/" + fileNameStr)); + } catch (IOException e) { + return Result.error("文件存储失败!"); + } + //解压缩 + String zipEntryName = null; + try { + zipEntryName = FileUnZip.unZipFiles(path + "/" + fileNameStr, path); + FileUnZip.delete(new File(path + "/" + fileNameStr)); + } catch (IOException e) { + return Result.error("文件解压失败"); + } + //获取文件信息 + List fileList = readImpExcelFile(zipEntryName); + //判断获取到的文件数量 + if (fileList.size() != 1) { + return Result.error("上传的文件只能有一个"); + } + File importFile = fileList.get(0); + if (!importFile.getName().contains(".xls") && !importFile.getName().contains(".xlsx")) { + return Result.error("文件必须是EXCEL文件"); + } + Workbook workbook = null; + try { + workbook = WorkbookFactory.create(importFile); + } catch (IOException e) { + FileUnZip.deleteDir(saveDirectory); + return Result.error("导入失败,需要导入的数据有问题或导入的企标标号和企标名称已存在"); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Sheet sheet = workbook.getSheetAt(0); + if (sheet == null) { + return Result.error("工作表为空"); + } + StringBuilder sb = new StringBuilder(); + List headerList = new ArrayList<>(); + // 获取excel表头 + Row headerRow = sheet.getRow(1); + for (int i = 0; i < 8; i++) { + headerList.add(headerRow.getCell(i).getStringCellValue()); + } + + // 判断表头字段是否相同 + if (!String.join(",",headerList).equals(FieldConvertUtil.exportFieldLawsInformation)) { + try { + workbook.close(); + } catch (IOException e) { + return Result.error("文件关闭出错"); + } + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + return Result.error("fail", "读取失败,请严格按照模板文件导入数据"); + } + + ImportParams importParams = new ImportParams(); + importParams.setTitleRows(1); + List sarLawsInformationList = ExcelImportUtil.importExcel(readImpExcelFile(zipEntryName).get(0), SarLawsInformation.class, importParams); + // 获取需要校验的字段 + List firstMaterialTypeList = dicTypeService.selectAllDicTypeNameByDicCode("firstMaterialType"); + Set firstMaterialTypeNameSet = firstMaterialTypeList.stream().map(TsDicType::getDicTypeName).collect(Collectors.toSet()); + List secondMaterialTypeList = dicTypeService.selectAllDicTypeNameByDicCode("secondMaterialType"); + Set secondMaterialTypeNameSet = secondMaterialTypeList.stream().map(TsDicType::getDicTypeName).collect(Collectors.toSet()); + List thirdMaterialTypeList = dicTypeService.selectAllDicTypeNameByDicCode("thirdMaterialType"); + Set thirdMaterialTypeNameSet = thirdMaterialTypeList.stream().map(TsDicType::getDicTypeName).collect(Collectors.toSet()); + List fourthMaterialTypeList = dicTypeService.selectAllDicTypeNameByDicCode("fourthMaterialType"); + Set fourthMaterialTypeNameSet = fourthMaterialTypeList.stream().map(TsDicType::getDicTypeName).collect(Collectors.toSet()); + // 遍历索引 + int index = 1; + // 去除空数据 + List sarLawsInformationListNew = new ArrayList<>(); + for (SarLawsInformation sarLawsInformation : sarLawsInformationList) { + if (StringUtils.isNotBlank(sarLawsInformation.getName())) { + sarLawsInformationListNew.add(sarLawsInformation); + } + } + for (SarLawsInformation sarLawsInformation : sarLawsInformationListNew){ + // 把excel表中的类别名转换为类别编号,并对类别名做检测 + if (StringUtils.isNotBlank(sarLawsInformation.getFirstTypeName())) { + List firstTypeCodeList = new ArrayList<>(); + for (String firstTypeName : sarLawsInformation.getFirstTypeName().split(",")) { + if (!firstMaterialTypeNameSet.contains(firstTypeName)){ + return Result.error("第" + index + "条记录的一级会议类别不符合输入要求"); + } + for (TsDicType tsDicType : firstMaterialTypeList) { + if (firstTypeName.equals(tsDicType.getDicTypeName())) { + firstTypeCodeList.add(tsDicType.getDicTypeCode()); + } + } + } + sarLawsInformation.setFirstType(String.join(",", firstTypeCodeList)); + } + if (StringUtils.isNotBlank(sarLawsInformation.getSecondTypeName())) { + List secondTypeCodeList = new ArrayList<>(); + for (String secondTypeName : sarLawsInformation.getSecondTypeName().split(",")) { + if (!secondMaterialTypeNameSet.contains(secondTypeName)){ + return Result.error("第" + index + "条记录的二级会议类别不符合输入要求"); + } + for (TsDicType tsDicType : secondMaterialTypeList) { + if (secondTypeName.equals(tsDicType.getDicTypeName())) { + secondTypeCodeList.add(tsDicType.getDicTypeCode()); + } + } + } + sarLawsInformation.setSecondType(String.join(",", secondTypeCodeList)); + } + if (StringUtils.isNotBlank(sarLawsInformation.getThirdTypeName())) { + List thirdTypeCodeList = new ArrayList<>(); + for (String thirdTypeName : sarLawsInformation.getThirdTypeName().split(",")) { + if (!thirdMaterialTypeNameSet.contains(thirdTypeName)){ + return Result.error("第" + index + "条记录的三级会议类别不符合输入要求"); + } + for (TsDicType tsDicType : thirdMaterialTypeList) { + if (thirdTypeName.equals(tsDicType.getDicTypeName())) { + thirdTypeCodeList.add(tsDicType.getDicTypeCode()); + } + } + } + sarLawsInformation.setThirdType(String.join(",", thirdTypeCodeList)); + } + if (StringUtils.isNotBlank(sarLawsInformation.getFourthTypeName())) { + List fourthTypeCodeList = new ArrayList<>(); + for (String fourthTypeName : sarLawsInformation.getFourthTypeName().split(",")) { + if (!fourthMaterialTypeNameSet.contains(fourthTypeName)){ + return Result.error("第" + index + "条记录的四级会议类别不符合输入要求"); + } + for (TsDicType tsDicType : fourthMaterialTypeList) { + if (fourthTypeName.equals(tsDicType.getDicTypeName())) { + fourthTypeCodeList.add(tsDicType.getDicTypeCode()); + } + } + } + sarLawsInformation.setFourthType(String.join(",", fourthTypeCodeList)); + } + // 索引 +1 + index++; + // 存入数据库 + addLawsInformation(sarLawsInformation); + } + return Result.success("导入成功"); + } + public void convertCodeToName(SarLawsInformation sarLawsInformation) { List firstTypeList = new ArrayList<>(); for (String type : sarLawsInformation.getFirstType().split(",")) { @@ -187,7 +427,7 @@ public class SarLawsInformationServiceImpl extends ServiceImpl changes = new ArrayList<>(); // 不需要比较的字段 String[] ignoreFields = {"id","firstTypeName","secondTypeName","thirdTypeName","fourthTypeName","uploadTime", - "informationFileName","createAndApproveBy","treeNodeId","treeNodeName","validFlag","createTime", + "informationFileList","createAndApproveBy","treeNodeId","treeNodeName","validFlag","createTime", "modifyTime","sortField","sortMode","collectId","serialVersionUID"}; List ignoreFieldList = Arrays.asList(ignoreFields); // 获取SarLawsInformation类的所有字段 @@ -227,10 +467,17 @@ public class SarLawsInformationServiceImpl extends ServiceImpl oldFileList = (List)method.invoke(oldInfo); + List oldFileNameList = new ArrayList<>(); + if (oldFileList != null && oldFileList.size() > 0) { + for (Object oldFile : oldFileList) { + AttFileEO oldFile1 = (AttFileEO) oldFile; + oldFileNameList.add(oldFile1.getOldFileName()); + } + } // 获取字段名称 ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; - changes.add(annotationsByType.value() + "由\"" + oldTypeName + "\"改为\"" + String.join(",",fileNameList) + "\""); + changes.add(annotationsByType.value() + "由\"" + String.join(",",oldFileNameList) + "\"改为\"" + String.join(",",fileNameList) + "\""); } else { ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; @@ -245,6 +492,23 @@ public class SarLawsInformationServiceImpl extends ServiceImpl readImpExcelFile(String path) { + File file = new File(path); + List resultlist = new ArrayList<>(); + if (file.isDirectory()) { + File[] files = file.listFiles(); + for (File fi : files) { + // 对文件进行过滤,读取所有文件 + String name = fi.getName(); + //文件不为空 添加 + if (name != null){ + resultlist.add(fi); + } + } + } + return resultlist; + } } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/controller/SarLawsTopicController.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/controller/SarLawsTopicController.java index c09cfdc4..ca54cae9 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/controller/SarLawsTopicController.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/controller/SarLawsTopicController.java @@ -1,19 +1,44 @@ package com.adc.da.slrs.sarLawsTopic.controller; +import cn.afterturn.easypoi.excel.ExcelExportUtil; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import cn.hutool.core.util.StrUtil; +import cn.hutool.core.util.ZipUtil; import com.adc.da.base.web.BaseController; +import com.adc.da.common.ReadExcel; +import com.adc.da.exception.AdcDaBaseException; import com.adc.da.http.PageInfo; import com.adc.da.http.ResponseMessage; import com.adc.da.http.Result; +import com.adc.da.slrs.sarLawsInformation.entity.SarLawsInformation; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopic; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopicVO; import com.adc.da.slrs.sarLawsTopic.service.SarLawsTopicService; +import com.adc.da.util.UUIDUtils; +import com.adc.da.utils.util.FieldConvertUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.hssf.usermodel.HSSFCellStyle; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.ss.util.CellRangeAddress; +import org.apache.poi.util.IOUtils; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletResponse; +import java.io.*; +import java.text.ParseException; +import java.util.Arrays; import java.util.List; /** @@ -26,9 +51,14 @@ import java.util.List; @RequestMapping("/${restPath}/lawss/sarLawsTopic") public class SarLawsTopicController extends BaseController { + private static final Logger logger = LoggerFactory.getLogger(SarLawsTopicController.class); + @Resource private SarLawsTopicService lawsTopicService; + @Value("${file.path}") + private String filePath; + @ApiOperation(value = "根据政策课题ID查询会议信息") @GetMapping("/getLawsTopicInfo") public ResponseMessage getLawsTopicInfo(String id) throws Exception{ @@ -72,4 +102,120 @@ public class SarLawsTopicController extends BaseController { Boolean updateResult = lawsTopicService.updateLawsTopicInfo(lawsTopic); return updateResult ? Result.success() : Result.error("更新失败"); } + + @ApiOperation("导出政策课题信息") + @GetMapping("/exportLawsTopicInfo") + public ResponseMessage exportLawsTopicInfo(SarLawsTopicVO sarLawsTopicVO, HttpServletResponse response, + HttpServletRequest request) { + OutputStream os = null; + Workbook workbook = null; + List datas; + try { + if(StringUtils.isEmpty(sarLawsTopicVO.getExportName())||sarLawsTopicVO.getExportName().equals("null")){ + sarLawsTopicVO.setExportName("政策课题信息"); + } + response.setHeader("Content-Disposition", + "attachment; filename=" + ReadExcel.encodeFileName(sarLawsTopicVO.getExportName()+".xlsx", + request)); + // 导出数据,若指定了值则使用ids字段条件导出,否则根据条件导出 + if (StrUtil.isNotBlank(sarLawsTopicVO.getExportIds())) { + List idList = Arrays.asList(sarLawsTopicVO.getExportIds().split(",")); + datas = lawsTopicService.getLawsTopicByIds(idList); + } else { + // 导出所有数据 + datas = lawsTopicService.getAllLawsTopic(sarLawsTopicVO); + } + ExportParams exportParams = new ExportParams(); + exportParams.setType(ExcelType.XSSF); + exportParams.setSheetName(sarLawsTopicVO.getExportName()); + workbook = ExcelExportUtil.exportExcel(exportParams, SarLawsTopicVO.class, datas); + os = response.getOutputStream(); + workbook.write(os); + os.flush(); + } catch (IOException e) { + logger.error(e.getMessage(), e); + throw new AdcDaBaseException("下载文件失败,请重试"); + } finally { + IOUtils.closeQuietly(os); + } + return Result.success(); + } + + @ApiOperation("Excel文件导入政策资料信息") + @PostMapping("/importLawsTopicInfo") + public ResponseMessage importLawsTopicInfo(@RequestParam(value = "file",required = false) MultipartFile file) throws ParseException { + if (file == null) { + return Result.error("文件为空,请重新上传"); + } + return lawsTopicService.importLawsTopicInfo(file); + } + + @ApiOperation(value = "政策课题导入模板下载") + @GetMapping("/exportTemplateFile") + public void exportTemplateFile(String fileName,HttpServletResponse response, HttpServletRequest request)throws Exception{ + + OutputStream os = null; + OutputStream excelOS = null; + HSSFWorkbook workbook = new HSSFWorkbook(); + String fileOriName = "政策课题导入模板"; + if (StringUtils.isNotEmpty(fileName)) { + fileOriName = fileName; + } + try{ + //创建临时文件夹 + String fileNowPath = filePath + "/tempZip/" + UUIDUtils.randomUUID20() + "/" + fileOriName; + File nowFile = new File(fileNowPath); + if (nowFile.exists()){ + nowFile.delete(); + } + nowFile.mkdirs(); + String fileName2 = "导入模板.xls"; + HSSFSheet sheetItems = workbook.createSheet("模板"); + sheetItems.setDefaultColumnWidth(13); + Row rowHeader = sheetItems.createRow(1);//开始创建标题行 + sheetItems.addMergedRegion(new CellRangeAddress(0, 0, 0, 13)); + Row row2 = sheetItems.createRow(0);//开始创建填写说明 + String exportFieldName = FieldConvertUtil.exportFieldLawsTopic; + if (StringUtils.isNotBlank(exportFieldName)) { + String[] headerArr = exportFieldName.split(","); + for (int i=0;i < headerArr.length; i++) { + rowHeader.createCell(i).setCellValue(headerArr[i]); + } + } + Cell cellA2 = row2.createCell(0); + cellA2.setCellValue(FieldConvertUtil.exportLawsInformationDesc); + //sheetItems.setColumnWidth(0, 20 * 150); + row2.setHeight((short) (100 * 25)); + HSSFCellStyle cellStyle =workbook.createCellStyle(); + cellStyle.setAlignment(HorizontalAlignment.LEFT); + cellStyle.setVerticalAlignment(VerticalAlignment.TOP); + cellStyle.setWrapText(true); + cellA2.setCellStyle(cellStyle); + String repFileName = fileName2.replaceAll("/","_"); + excelOS = new FileOutputStream(fileNowPath + "/" + repFileName); + response.setHeader("Content-Disposition", + "attachment; filename=\""+ ReadExcel.encodeFileName(fileOriName+".zip", request) +"\""); + response.setContentType("application/force-download"); + response.flushBuffer(); + os = response.getOutputStream(); + workbook.write(excelOS); + excelOS.flush(); + excelOS.close(); + ZipUtil.zip(fileNowPath,fileNowPath+".zip"); + FileInputStream fis = new FileInputStream(fileNowPath+".zip"); + int len = 0; + while ((len = fis.read()) != -1) { + os.write(len); + } + os.flush(); + os.close(); // 后开先关 + fis.close(); // 先开后关 + } catch (Exception e) { + logger.error(e.getMessage(), e); + throw new com.adc.da.exception.AdcDaBaseException("下载文件失败,请重试"); + } finally { + IOUtils.closeQuietly(os); + IOUtils.closeQuietly(excelOS); + } + } } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/dao/SarLawsTopicMapper.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/dao/SarLawsTopicMapper.java index 506dd9ff..ddbd8f2b 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/dao/SarLawsTopicMapper.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/dao/SarLawsTopicMapper.java @@ -4,6 +4,7 @@ import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopic; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopicVO; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; import java.util.List; @@ -19,6 +20,10 @@ public interface SarLawsTopicMapper extends BaseMapper { Integer queryByPageCount(SarLawsTopicVO page); List queryByPage(SarLawsTopicVO page); + + List getLawsTopicByIds(@Param("idList") List idList); + + List getAllLawsTopic(SarLawsTopicVO sarLawsTopicVO); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsContactInformation.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsContactInformation.java index 6b0d4584..c5c7db0a 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsContactInformation.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsContactInformation.java @@ -1,5 +1,6 @@ package com.adc.da.slrs.sarLawsTopic.entity; +import cn.afterturn.easypoi.excel.annotation.Excel; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -36,30 +37,35 @@ public class SarLawsContactInformation implements Serializable { * 姓名 */ @TableField(value = "NAME") + @Excel(name = "姓名", orderNum = "0", type = 1) private String name; /** * 单位 */ @TableField(value = "DEPARTMENT") + @Excel(name = "单位", orderNum = "1", type = 1) private String department; /** * 电话 */ @TableField(value = "PHONE") + @Excel(name = "电话", orderNum = "2", type = 1) private String phone; /** * 邮箱 */ @TableField(value = "EMAIL") + @Excel(name = "邮箱", orderNum = "3", type = 1) private String email; /** * 身份 */ @TableField(value = "IDENTITY") + @Excel(name = "身份", orderNum = "4", type = 1) private String identity; @TableField(exist = false) diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopic.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopic.java index 14dc22c4..9ceb0cff 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopic.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopic.java @@ -1,5 +1,6 @@ package com.adc.da.slrs.sarLawsTopic.entity; +import com.adc.da.att.entity.AttFileEO; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; @@ -9,6 +10,7 @@ import java.util.Date; import java.util.List; import com.fasterxml.jackson.annotation.JsonFormat; +import io.swagger.annotations.ApiModelProperty; import lombok.Data; /** @@ -21,36 +23,42 @@ public class SarLawsTopic implements Serializable { /** * 主键 */ + @ApiModelProperty(value = "主键") @TableId(value = "ID", type = IdType.ID_WORKER_STR) private String id; /** * 课题名称 */ + @ApiModelProperty(value = "课题名称") @TableField(value = "TOPIC_NAME") private String topicName; /** * 课题承办单位 */ + @ApiModelProperty(value = "课题承办单位") @TableField(value = "ORGANIZER") private String organizer; /** * 课题指导单位 */ + @ApiModelProperty(value = "课题指导单位") @TableField(value = "GUIDANCE_UNIT") private String guidanceUnit; /** * 课题参与单位 */ + @ApiModelProperty(value = "课题参与单位") @TableField(value = "PARTICIPATING_UNIT") private String participatingUnit; /** * 开始时间 */ + @ApiModelProperty(value = "开始时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @TableField(value = "START_TIME") private Date startTime; @@ -58,6 +66,7 @@ public class SarLawsTopic implements Serializable { /** * 结题时间 */ + @ApiModelProperty(value = "结题时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @TableField(value = "CLOSE_TIME") private Date closeTime; @@ -65,162 +74,162 @@ public class SarLawsTopic implements Serializable { /** * 课题状态 */ + @ApiModelProperty(value = "课题状态") @TableField(value = "TOPIC_STATUS") private String topicStatus; /** * 课题费用(万元) */ + @ApiModelProperty(value = "课题费用") @TableField(value = "TOPIC_COST") private String topicCost; /** * 协议 */ + @ApiModelProperty("协议文件") @TableField(value = "AGREEMENT") private String agreement; - /** - * 协议真实文件名 - */ + @ApiModelProperty(value = "协议文件列表") @TableField(exist = false) - private String agreementName; + private List agreementList; /** * 课题组会议列表 */ + @ApiModelProperty(value = "课题组会议列表") @TableField(exist = false) private List meetingList; /** * 课题组研究方案 */ + @ApiModelProperty(value = "课题研究方案") @TableField(value = "RESEARCH_PLAN") private String researchPlan; - /** - * 课题组研究方案真实文件名 - */ + @ApiModelProperty(value = "课题组研究方案文件列表") @TableField(exist = false) - private String researchPlanName; + private List researchPlanList; /** * 课题组研究成果 */ + @ApiModelProperty(value = "课题组研究成果") @TableField(value = "RESEARCH_FINDINGS") private String researchFindings; /** * 课题组研究成果真实文件名 */ + @ApiModelProperty(value = "课题组研究成果文件列表") @TableField(exist = false) - private String researchFindingsName; + private List researchFindingsList; /** * 课题组其他 */ + @ApiModelProperty(value = "课题组其他文件") @TableField(value = "RESEARCH_GROUP_OTHER") private String researchGroupOther; - /** - * 课题组其他真实文件名 - */ + @ApiModelProperty(value = "课题组其他文件列表") @TableField(exist = false) - private String researchGroupOtherName; + private List researchGroupOtherList; /** * 课题组会议资料 */ + @ApiModelProperty(value = "课题组会议资料") @TableField(value = "CONFERENCE_MATERIALS") private String conferenceMaterials; - /** - * 课题组会议资料真实文件名 - */ + @ApiModelProperty(value = "课题组会议资料文件列表") @TableField(exist = false) - private String conferenceMaterialsName; + private List conferenceMaterialsList; /** * 课题组联系方式 */ + @ApiModelProperty(value = "课题组联系方式列表") @TableField(exist = false) private List topicContactInformationList; /** * 内部资料立项报告 */ + @ApiModelProperty(value = "内部资料立项报告") @TableField(value = "INSIDE_PROJECT_PROPOSAL_REPORT") private String insideProjectProposalRepost; - /** - * 内部资料立项报告真实文件名 - */ + @ApiModelProperty(value = "内部资料立项报告文件列表") @TableField(exist = false) - private String insideProjectProposalRepostName; + private List insideProjectProposalRepostList; /** * 内部资料研究方案 */ + @ApiModelProperty(value = "内部资料研究方案") @TableField(value = "INSIDE_RESEARCH_PLAN") private String insideResearchPlan; - /** - * 内部资料研究方案真实文件名 - */ + @ApiModelProperty(value = "内部资料研究方案文件列表") @TableField(exist = false) - private String insideResearchPlanName; + private List insideResearchPlanList; /** * 内部资料会议资料 */ + @ApiModelProperty(value = "内部资料会议资料") @TableField(value = "INSIDE_CONFERENCE_MATERIALS") private String insideConferenceMaterials; - /** - * 内部资料会议资料真实文件名 - */ + @ApiModelProperty(value = "内部资料会议资料文件列表") @TableField(exist = false) - private String insideConferenceMaterialsName; + private List insideConferenceMaterialsList; /** * 内部会议研究成果 */ + @ApiModelProperty(value = "内部会议研究成果") @TableField(value = "INSIDE_RESEARCH_FINDINGS") private String insideResearchFindings; - /** - * 内部会议研究成果真实文件名 - */ + @ApiModelProperty(value = "内部会议研究成果文件列表") @TableField(exist = false) - private String insideResearchFindingsName; + private List insideResearchFindingsList; /** * 内部会议其他 */ + @ApiModelProperty(value = "内部会议其他文件") @TableField(value = "INSIDE_OTHER") private String insideOther; - /** - * 内部会议其他真实文件名 - */ + @ApiModelProperty(value = "内部会议其他文件列表") @TableField(exist = false) - private String insideOtherName; + private List insideOtherList; /** * 内部联系方式 */ + @ApiModelProperty(value = "内部联系方式列表") @TableField(exist = false) private List insideContactInformationList; /** * 逻辑删除,0可用,1不可用 */ + @ApiModelProperty(value = "逻辑删除") @TableField(value = "VALID_FLAG") private Integer validFlag; /** * 创建时间 */ + @ApiModelProperty(value = "创建时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "CREATE_TIME") private Date createTime; @@ -228,6 +237,7 @@ public class SarLawsTopic implements Serializable { /** * 修改时间 */ + @ApiModelProperty(value = "修改时间") @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss") @TableField(value = "MODIFY_TIME") private Date modifyTime; diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicMeeting.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicMeeting.java index b0a749d5..cd7d6cde 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicMeeting.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicMeeting.java @@ -1,13 +1,12 @@ package com.adc.da.slrs.sarLawsTopic.entity; +import cn.afterturn.easypoi.excel.annotation.Excel; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import java.io.Serializable; -import java.util.Date; -import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; /** @@ -33,30 +32,35 @@ public class SarLawsTopicMeeting implements Serializable { * 会议名称 */ @TableField(value = "MEETING_NAME") + @Excel(name = "会议名称", orderNum = "0", type = 1) private String meetingName; /** * 会议时间 */ @TableField(value = "MEETING_TIME") + @Excel(name = "会议时间", orderNum = "1", type = 1) private String meetingTime; /** * 会议地点 */ @TableField(value = "MEETING_ADDRESS") + @Excel(name = "会议地点", orderNum = "2", type = 1) private String meetingAddress; /** * 参会人员(内部) */ @TableField(value = "PARTICIPANTS") + @Excel(name = "参会人员(内部)", orderNum = "3", type = 1) private String participants; /** * 会议主要内容 */ @TableField(value = "MEETING_CONTENT") + @Excel(name = "会议主要内容", orderNum = "4", type = 1) private String meetingContent; @TableField(exist = false) diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicVO.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicVO.java index 553b40fa..ecc187da 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicVO.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/entity/SarLawsTopicVO.java @@ -1,5 +1,8 @@ package com.adc.da.slrs.sarLawsTopic.entity; +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.excel.annotation.ExcelCollection; +import com.adc.da.att.entity.AttFileEO; import com.adc.da.base.page.BasePage; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -27,21 +30,25 @@ public class SarLawsTopicVO extends BasePage { /** * 课题名称 */ + @Excel(name = "课题名称", orderNum = "0", type = 1, needMerge = true) private String topicName; /** * 课题承办单位 */ + @Excel(name = "课题承办单位", orderNum = "1",type = 1, needMerge = true) private String organizer; /** * 课题指导单位 */ + @Excel(name = "课题指导单位", orderNum = "2", type = 1, needMerge = true) private String guidanceUnit; /** * 课题参与单位 */ + @Excel(name = "课题参与单位", orderNum = "3", type = 1, needMerge = true) private String participatingUnit; /** @@ -49,6 +56,7 @@ public class SarLawsTopicVO extends BasePage { */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "开始时间", orderNum = "4", exportFormat = "yyyy-MM-dd", needMerge = true) private Date startTime; /** @@ -56,16 +64,19 @@ public class SarLawsTopicVO extends BasePage { */ @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd") @DateTimeFormat(pattern = "yyyy-MM-dd") + @Excel(name = "结题时间", orderNum = "5", exportFormat = "yyyy-MM-dd", needMerge = true) private Date closeTime; /** * 课题状态 */ + @Excel(name = "课题状态", orderNum = "6", type = 1, needMerge = true) private String topicStatus; /** * 课题费用(万元) */ + @Excel(name = "课题费用(万元)", orderNum = "7", type = 1, needMerge = true) private String topicCost; /** @@ -73,9 +84,12 @@ public class SarLawsTopicVO extends BasePage { */ private String agreement; + private List agreementList; + /** * 课题组会议列表 */ + @ExcelCollection(name = "课题组会议列表", orderNum = "8") private List meetingList; /** @@ -111,24 +125,33 @@ public class SarLawsTopicVO extends BasePage { */ private String researchPlan; + private List researchPlanList; + /** * 课题组研究成果 */ private String researchFindings; + private List researchFindingsList; + /** * 课题组其他 */ private String researchGroupOther; + private List researchGroupOtherList; + /** * 课题组会议资料 */ private String conferenceMaterials; + private List conferenceMaterialsList; + /** * 课题组联系方式 */ + @ExcelCollection(name = "课题组联系方式", orderNum = "9") private List topicContactInformationList; // 课题组用户名称 @@ -147,29 +170,40 @@ public class SarLawsTopicVO extends BasePage { */ private String insideProjectProposalRepost; + private List insideProjectProposalRepostList; + /** * 内部资料研究方案 */ private String insideResearchPlan; + private List insideResearchPlanList; + /** * 内部资料会议资料 */ private String insideConferenceMaterials; + private List insideConferenceMaterialsList; + /** * 内部会议研究成果 */ private String insideResearchFindings; + private List insideResearchFindingsList; + /** * 内部会议其他 */ private String insideOther; + private List insideOtherList; + /** * 内部联系方式 */ + @ExcelCollection(name = "内部联系方式", orderNum = "10") private List insideContactInformationList; // 内部人员名称 @@ -206,4 +240,10 @@ public class SarLawsTopicVO extends BasePage { private String startTimeOperator = "="; private String closeTimeOperator = "="; + + // 导出使用的属性 + // 导出文件名 + private String exportName; + // 导出的ID列表字符串 + private String exportIds; } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/SarLawsTopicService.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/SarLawsTopicService.java index 812a94e4..bd9b409c 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/SarLawsTopicService.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/SarLawsTopicService.java @@ -1,8 +1,11 @@ package com.adc.da.slrs.sarLawsTopic.service; +import com.adc.da.http.ResponseMessage; +import com.adc.da.slrs.sarLawsInformation.entity.SarLawsInformation; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopic; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopicVO; import com.baomidou.mybatisplus.extension.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.util.List; @@ -22,4 +25,10 @@ public interface SarLawsTopicService extends IService { Boolean updateLawsTopicInfo(SarLawsTopic lawsTopic); List queryByPage(SarLawsTopicVO sarLawsTopicVO); + + List getLawsTopicByIds(List idList); + + List getAllLawsTopic(SarLawsTopicVO sarLawsTopicVO); + + ResponseMessage importLawsTopicInfo(MultipartFile file); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/impl/SarLawsTopicServiceImpl.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/impl/SarLawsTopicServiceImpl.java index de7c04ed..7e94b4ad 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/impl/SarLawsTopicServiceImpl.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/sarLawsTopic/service/impl/SarLawsTopicServiceImpl.java @@ -1,28 +1,49 @@ package com.adc.da.slrs.sarLawsTopic.service.impl; +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ImportParams; import com.adc.da.att.entity.AttFileEO; import com.adc.da.att.service.impl.AttFileEOServiceImpl; +import com.adc.da.common.FileUnZip; +import com.adc.da.http.ResponseMessage; +import com.adc.da.http.Result; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsContactInformation; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopicMeeting; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopicVO; import com.adc.da.slrs.sarLawsTopic.service.SarLawsContactInformationService; import com.adc.da.slrs.sarLawsTopic.service.SarLawsTopicMeetingService; +import com.adc.da.slrs.sarUpdLog.entity.SarUpdLog; +import com.adc.da.slrs.sarUpdLog.service.ISarUpdLogService; +import com.adc.da.util.LoginUserUtil; +import com.adc.da.util.UUIDUtils; +import com.adc.da.utils.util.FieldConvertUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.adc.da.slrs.sarLawsTopic.entity.SarLawsTopic; import com.adc.da.slrs.sarLawsTopic.service.SarLawsTopicService; import com.adc.da.slrs.sarLawsTopic.dao.SarLawsTopicMapper; +import io.swagger.annotations.ApiModelProperty; +import org.apache.commons.io.FileUtils; import org.apache.commons.lang3.StringUtils; +import org.apache.poi.ss.usermodel.Row; +import org.apache.poi.ss.usermodel.Sheet; +import org.apache.poi.ss.usermodel.Workbook; +import org.apache.poi.ss.usermodel.WorkbookFactory; +import org.springframework.beans.BeanUtils; +import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Field; +import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.Date; -import java.util.List; +import java.text.SimpleDateFormat; +import java.util.*; /** * @author tjzdw @@ -37,33 +58,17 @@ public class SarLawsTopicServiceImpl extends ServiceImpl aClass = sarLawsTopic.getClass(); - for (String fileField : fileFieldArray) { - fileField = fileField.substring(0,1).toUpperCase() + fileField.substring(1); - Method getMethod = aClass.getMethod("get" + fileField); - String attIds = (String) getMethod.invoke(sarLawsTopic, null); - if (StringUtils.isNotBlank(attIds)) { - String[] split = attIds.split(","); - List tempList = new ArrayList<>(); - for (String attId : split) { - AttFileEO fileInfo = attFileEOService.getFileInfo(attId); - tempList.add(fileInfo.getOldFileName()); - } - Method setMethod = aClass.getMethod("set" + fileField + "Name", String.class); - String join = String.join(",", tempList); - System.out.println(fileField+":"+join); - setMethod.invoke(sarLawsTopic,join); - } - } // 查询课题组会议 LambdaQueryWrapper meetingWrapper = new LambdaQueryWrapper<>(); meetingWrapper.eq(SarLawsTopicMeeting::getLawsTopicId, lawsTopicId); @@ -72,15 +77,17 @@ public class SarLawsTopicServiceImpl extends ServiceImpl topicGroupWrapper = new LambdaQueryWrapper<>(); topicGroupWrapper.eq(SarLawsContactInformation::getLawsTopicId, lawsTopicId); - topicGroupWrapper.eq(SarLawsContactInformation::getGroupType,"lawsTopic"); + topicGroupWrapper.eq(SarLawsContactInformation::getGroupType,"topicGroup"); List lawsTopicContactInformation = contactInformationService.list(topicGroupWrapper); sarLawsTopic.setTopicContactInformationList(lawsTopicContactInformation); // 查询内部联系房方式 LambdaQueryWrapper insideWrapper = new LambdaQueryWrapper<>(); - topicGroupWrapper.eq(SarLawsContactInformation::getLawsTopicId, lawsTopicId); - topicGroupWrapper.eq(SarLawsContactInformation::getGroupType,"lawsTopic"); - List insideContactInformation = contactInformationService.list(topicGroupWrapper); + insideWrapper.eq(SarLawsContactInformation::getLawsTopicId, lawsTopicId); + insideWrapper.eq(SarLawsContactInformation::getGroupType,"inside"); + List insideContactInformation = contactInformationService.list(insideWrapper); sarLawsTopic.setInsideContactInformationList(insideContactInformation); + // 获取文件信息 + getFileListByAttFile(sarLawsTopic); return sarLawsTopic; } @@ -93,22 +100,28 @@ public class SarLawsTopicServiceImpl extends ServiceImpl compareList = compareLawsTopic(lawsTopicInfoDB, lawsTopic); + if (compareLawsTopic(lawsTopicInfoDB, lawsTopic).size() == 0) { return true; } - // 先删除关联信息 - LambdaQueryWrapper topicWrapper = new LambdaQueryWrapper<>(); - topicWrapper.eq(SarLawsTopicMeeting::getLawsTopicId,lawsTopic.getId()); - meetingService.remove(topicWrapper); - LambdaQueryWrapper informationWrapper = new LambdaQueryWrapper<>(); - informationWrapper.eq(SarLawsContactInformation::getLawsTopicId,lawsTopic.getId()); - contactInformationService.remove(informationWrapper); - // 再添加关联信息 - for (SarLawsTopicMeeting meeting : lawsTopic.getMeetingList()) { - meeting.setLawsTopicId(lawsTopic.getId()); - meetingService.save(meeting); + lawsTopic.setModifyTime(new Date()); + int update = this.baseMapper.updateById(lawsTopic); + // 比较列表字段是否经过修改,如果经过修改,先删除,再添加 + if (compareList.contains("课题组会议列表被变更")) { + LambdaQueryWrapper topicWrapper = new LambdaQueryWrapper<>(); + topicWrapper.eq(SarLawsTopicMeeting::getLawsTopicId,lawsTopic.getId()); + meetingService.remove(topicWrapper); + for (SarLawsTopicMeeting meeting : lawsTopic.getMeetingList()) { + meeting.setLawsTopicId(lawsTopic.getId()); + meetingService.save(meeting); + } } - for (SarLawsContactInformation information : lawsTopic.getTopicContactInformationList()) { - information.setGroupType("topicGroup"); - information.setLawsTopicId(lawsTopic.getId()); - contactInformationService.save(information); + if (compareList.contains("课题组联系方式列表被变更")) { + LambdaQueryWrapper informationWrapper = new LambdaQueryWrapper<>(); + informationWrapper.eq(SarLawsContactInformation::getLawsTopicId,lawsTopic.getId()); + informationWrapper.eq(SarLawsContactInformation::getGroupType,"topicGroup"); + contactInformationService.remove(informationWrapper); + for (SarLawsContactInformation information : lawsTopic.getTopicContactInformationList()) { + information.setGroupType("topicGroup"); + information.setLawsTopicId(lawsTopic.getId()); + contactInformationService.save(information); + } } - for (SarLawsContactInformation information : lawsTopic.getInsideContactInformationList()) { - information.setGroupType("inside"); - information.setLawsTopicId(lawsTopic.getId()); - contactInformationService.save(information); + if (compareList.contains("内部联系方式列表被变更")) { + LambdaQueryWrapper informationWrapper = new LambdaQueryWrapper<>(); + informationWrapper.eq(SarLawsContactInformation::getLawsTopicId,lawsTopic.getId()); + informationWrapper.eq(SarLawsContactInformation::getGroupType,"inside"); + contactInformationService.remove(informationWrapper); + for (SarLawsContactInformation information : lawsTopic.getInsideContactInformationList()) { + information.setGroupType("inside"); + information.setLawsTopicId(lawsTopic.getId()); + contactInformationService.save(information); + } } + // 存储修改记录 + SarUpdLog sarUpdLogEO = new SarUpdLog(); + sarUpdLogEO.setId(UUIDUtils.randomUUID20()); + sarUpdLogEO.setSarId(lawsTopicInfoDB.getId()); + sarUpdLogEO.setSarType("LAWS_TOPIC"); + sarUpdLogEO.setCreationTime(new Date()); + sarUpdLogEO.setCreationUser(LoginUserUtil.getUserId()); + sarUpdLogEO.setContent(lawsTopicInfoDB.getTopicName() + "," + String.join(",",compareList)); + updLogService.save(sarUpdLogEO); return true; } @@ -185,7 +219,264 @@ public class SarLawsTopicServiceImpl extends ServiceImpl sarLawsTopicVOList = this.baseMapper.queryByPage(page); + for (SarLawsTopicVO lawsTopicVO : sarLawsTopicVOList) { + getFileListByAttFile(lawsTopicVO); + } + return sarLawsTopicVOList; + } + + @Override + public List getLawsTopicByIds(List idList) { + return this.baseMapper.getLawsTopicByIds(idList); + } + + @Override + public List getAllLawsTopic(SarLawsTopicVO sarLawsTopicVO) { + return this.baseMapper.getAllLawsTopic(sarLawsTopicVO); + } + + @Override + public ResponseMessage importLawsTopicInfo(MultipartFile file) { + //获取文件全称 + String fileNameStr = file.getOriginalFilename(); + //获取最后.的位置 + assert fileNameStr != null; + int pos = fileNameStr.lastIndexOf("."); + //获取压缩文件名称并以小写显示 + String fileStr = fileNameStr.substring(pos + 1).toLowerCase(); + //校验是否是zip文件 + if (!fileStr.equals("zip")) { + return Result.error("请上传zip格式的文件"); + } + //进行拼接获取文件名称 + String fileName = fileNameStr.substring(0, pos); + //获取路径和文件名称 + String path = filePath + "/" + fileName; + + File saveDirectory = new File(path); + //判断saveDirectory中是否是文件夹 + if (!saveDirectory.isDirectory()) { + saveDirectory.mkdir(); + } + //将文件写入到指定路径中 + try { + FileUtils.copyInputStreamToFile(file.getInputStream(), new File(path + "/" + fileNameStr)); + } catch (IOException e) { + return Result.error("文件存储失败!"); + } + //解压缩 + String zipEntryName = null; + try { + zipEntryName = FileUnZip.unZipFiles(path + "/" + fileNameStr, path); + FileUnZip.delete(new File(path + "/" + fileNameStr)); + } catch (IOException e) { + return Result.error("文件解压失败"); + } + //获取文件信息 + List fileList = readImpExcelFile(zipEntryName); + //判断获取到的文件数量 + if (fileList.size() != 1) { + return Result.error("上传的文件只能有一个"); + } + File importFile = fileList.get(0); + if (!importFile.getName().contains(".xls") && !importFile.getName().contains(".xlsx")) { + return Result.error("文件必须是EXCEL文件"); + } + Workbook workbook = null; + try { + workbook = WorkbookFactory.create(importFile); + } catch (IOException e) { + FileUnZip.deleteDir(saveDirectory); + return Result.error("导入失败,需要导入的数据有问题或导入的企标标号和企标名称已存在"); + } + SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); + Sheet sheet = workbook.getSheetAt(0); + if (sheet == null) { + return Result.error("工作表为空"); + } + StringBuilder sb = new StringBuilder(); + // 获取excel表头 + List headerList = new ArrayList<>(); + Row headerRow = sheet.getRow(1); + for (int i = 0; i < 22; i++) { + headerList.add(headerRow.getCell(i).getStringCellValue()); + } + // 获取关联表表头 + Row relationRow = sheet.getRow(2); + List relationList = new ArrayList<>(); + for (int i = 7; i < 22; i++) { + relationList.add(relationRow.getCell(i).getStringCellValue()); + } + + // 判断表头字段是否相同 + if (!String.join(",",headerList).equals(FieldConvertUtil.exportFieldLawsTopic) + && !String.join(",",relationList).equals(FieldConvertUtil.exportFieldLawsTopicRelation)) { + try { + workbook.close(); + } catch (IOException e) { + return Result.error("文件关闭出错"); + } + //删除原上传文件 + FileUnZip.deleteDir(saveDirectory); + return Result.error("fail", "读取失败,请严格按照模板文件导入数据"); + } + + ImportParams importParams = new ImportParams(); + importParams.setTitleRows(1); + importParams.setHeadRows(2); + List lawsTopicVOList = ExcelImportUtil.importExcel(readImpExcelFile(zipEntryName).get(0), SarLawsTopicVO.class, importParams); + // 去除空数据 + for (SarLawsTopicVO lawsTopicVO : lawsTopicVOList) { + if (StringUtils.isNotBlank(lawsTopicVO.getTopicName())) { + // 存入数据库 + SarLawsTopic sarLawsTopic = new SarLawsTopic(); + BeanUtils.copyProperties(lawsTopicVO,sarLawsTopic); + if (sarLawsTopic.getStartTime() != null && sarLawsTopic.getCloseTime() != null) { + sarLawsTopic.setTopicStatus("已结题"); + } else { + sarLawsTopic.setTopicStatus("进行中"); + } + addLawsTopicInfo(sarLawsTopic); + } + } + return Result.success("导入成功"); + } + + // 通过反射获取文件内容 + public void getFileListByAttFile(SarLawsTopic lawsTopic) { + String[] fileField = {"agreement","researchPlan","researchFindings","researchGroupOther","conferenceMaterials", + "insideProjectProposalRepost","insideResearchPlan","insideConferenceMaterials","insideResearchFindings","insideOther"}; + try { + for (String field : fileField) { + String getMethod = "get" + StringUtils.capitalize(field); + Method method = SarLawsTopic.class.getMethod(getMethod); + String fileAttId = String.valueOf(method.invoke(lawsTopic)); + if (StringUtils.isNotBlank(fileAttId) && !"null".equals(fileAttId)) { + List fileList = new ArrayList<>(); + for (String attId : fileAttId.split(",")) { + AttFileEO fileInfo = attFileEOService.getFileInfo(attId); + fileList.add(fileInfo); + } + String setMethod = "set" + StringUtils.capitalize(field) + "List"; + method = SarLawsTopic.class.getMethod(setMethod, List.class); + method.invoke(lawsTopic, fileList); + } + } + }catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + e.printStackTrace(); + } + } + + public void getFileListByAttFile(SarLawsTopicVO lawsTopic) { + String[] fileField = {"agreement","researchPlan","researchFindings","researchGroupOther","conferenceMaterials", + "insideProjectProposalRepost","insideResearchPlan","insideConferenceMaterials","insideResearchFindings","insideOther"}; + try { + for (String field : fileField) { + String getMethod = "get" + StringUtils.capitalize(field); + Method method = SarLawsTopicVO.class.getMethod(getMethod); + String fileAttId = String.valueOf(method.invoke(lawsTopic)); + if (StringUtils.isNotBlank(fileAttId) && !"null".equals(fileAttId)) { + List fileList = new ArrayList<>(); + for (String attId : fileAttId.split(",")) { + AttFileEO fileInfo = attFileEOService.getFileInfo(attId); + fileList.add(fileInfo); + } + String setMethod = "set" + StringUtils.capitalize(field) + "List"; + method = SarLawsTopicVO.class.getMethod(setMethod, List.class); + method.invoke(lawsTopic, fileList); + } + } + }catch (NoSuchMethodException | InvocationTargetException | IllegalAccessException e) { + e.printStackTrace(); + } + } + + /** + * 比较两个SarLawsTopic 对象 + * @param oldLawsTopic 数据库中存储的对象 + * @param newLawsTopic 更新后的对象 + * @return 差异 + */ + public List compareLawsTopic(SarLawsTopic oldLawsTopic, SarLawsTopic newLawsTopic) { + List changes = new ArrayList<>(); + // 不需要比较的字段 + String[] ignoreFields = {"id","validFlag","createTime","modifyTime","agreementList","researchPlanList", + "researchFindingsList","researchGroupOtherList","conferenceMaterialsList","insideProjectProposalRepostList", + "insideResearchPlanList","insideConferenceMaterialsList","insideResearchFindingsList","insideOtherList","serialVersionUID"}; + String[] fileAttIdFields = {"agreement","researchPlan","researchFindings","researchGroupOther","conferenceMaterials", + "insideProjectProposalRepost","insideResearchPlan","insideConferenceMaterials","insideResearchFindings","insideOther"}; + List ignoreFieldList = Arrays.asList(ignoreFields); + List fileAttIdFieldList = Arrays.asList(fileAttIdFields); + // 获取SarLawsTopic类的所有字段 + Field[] fields = SarLawsTopic.class.getDeclaredFields(); + for (Field field : fields) { + if (!ignoreFieldList.contains(field.getName())) { + try { + field.setAccessible(true); + String oldValue = String.valueOf(field.get(oldLawsTopic)); + String newValue = String.valueOf(field.get(newLawsTopic)); + if (!Objects.equals(oldValue, newValue)) { + // 对比文件字段 + if (fileAttIdFieldList.contains(field.getName())) { + List fileNameList = new ArrayList<>(); + if (StringUtils.isNotBlank(newValue)) { + String[] split = newValue.split(","); + for (String attId : split) { + AttFileEO fileInfo = attFileEOService.getFileInfo(attId); + fileNameList.add(fileInfo.getOldFileName()); + } + } + // 获取文件字段名称 + String fieldName = field.getName().substring(0, 1).toUpperCase() + field.getName().substring(1); + Method method = SarLawsTopic.class.getMethod("get" + fieldName + "List"); + // 获取旧的文件名 + List oldFileList = (List)method.invoke(oldLawsTopic); + List oldFileNameList = new ArrayList<>(); + if (oldFileList != null && oldFileList.size() > 0) { + for (Object oldFile : oldFileList) { + AttFileEO oldFile1 = (AttFileEO) oldFile; + oldFileNameList.add(oldFile1.getOldFileName()); + } + } + // 获取字段名称 + ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; + changes.add(annotationsByType.value() + "由\"" + String.join(",",oldFileNameList) + "\"改为\"" + String.join(",",fileNameList) + "\""); + // 对比列表字段 + } else if ("meetingList".equals(field.getName()) || "topicContactInformationList".equals(field.getName()) + || "insideContactInformationList".equals(field.getName())) { + ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; + changes.add(annotationsByType.value() + "被变更"); + } else { + // 对比其他字段 + ApiModelProperty annotationsByType = field.getAnnotationsByType(ApiModelProperty.class)[0]; + changes.add(annotationsByType.value() + "由\"" + oldValue + "\"改为\"" + newValue + "\""); + } + } + } catch (IllegalAccessException | NoSuchMethodException | InvocationTargetException e) { + // 处理异常 + e.printStackTrace(); + } + } + } + return changes; + } + + private static List readImpExcelFile(String path) { + File file = new File(path); + List resultlist = new ArrayList<>(); + if (file.isDirectory()) { + File[] files = file.listFiles(); + for (File fi : files) { + // 对文件进行过滤,读取所有文件 + String name = fi.getName(); + //文件不为空 添加 + if (name != null){ + resultlist.add(fi); + } + } + } + return resultlist; } } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/dao/TsDicTypeDao.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/dao/TsDicTypeDao.java index 98141619..245c7d03 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/dao/TsDicTypeDao.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/dao/TsDicTypeDao.java @@ -3,8 +3,10 @@ package com.adc.da.slrs.tsDictionaryType.dao; import com.adc.da.slrs.tsDictionaryType.entity.TsDicType; import com.adc.da.slrs.tsDictionaryType.entity.TsSearchMenu; import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import org.apache.ibatis.annotations.MapKey; import java.util.List; +import java.util.Map; /** *

@@ -18,4 +20,6 @@ public interface TsDicTypeDao extends BaseMapper { public List getSearchMenu(); String selectDicTypeNameByDicCode(String typeCode); + + List selectAllDicTypeNameByDicCode(String dicCode); } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/ITsDicTypeService.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/ITsDicTypeService.java index ac04a9fe..6d281d7e 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/ITsDicTypeService.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/ITsDicTypeService.java @@ -5,6 +5,7 @@ import com.adc.da.slrs.tsDictionaryType.entity.TsSearchMenu; import com.baomidou.mybatisplus.extension.service.IService; import java.util.List; +import java.util.Map; /** *

@@ -25,4 +26,11 @@ public interface ITsDicTypeService extends IService { */ public String getDicTypeNameByDicCode(String typeCode); + /** + * 根据字典值类别查询指定类别的所有类别名 + * @param dicCode 字典类别编号 + * @return 字典值列表 + */ + List selectAllDicTypeNameByDicCode(String dicCode); + } diff --git a/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/impl/TsDicTypeServiceImpl.java b/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/impl/TsDicTypeServiceImpl.java index cc94a502..dd3343b2 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/impl/TsDicTypeServiceImpl.java +++ b/adc-da-slrs/src/main/java/com/adc/da/slrs/tsDictionaryType/service/impl/TsDicTypeServiceImpl.java @@ -9,6 +9,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; +import java.util.Map; /** *

@@ -30,4 +31,9 @@ public class TsDicTypeServiceImpl extends ServiceImpl i public String getDicTypeNameByDicCode(String typeCode) { return this.baseMapper.selectDicTypeNameByDicCode(typeCode); } + + @Override + public List selectAllDicTypeNameByDicCode(String dicCode) { + return this.baseMapper.selectAllDicTypeNameByDicCode(dicCode); + } } diff --git a/adc-da-slrs/src/main/java/com/adc/da/utils/util/ExcelExportUtil.java b/adc-da-slrs/src/main/java/com/adc/da/utils/util/ExcelExportUtil.java new file mode 100644 index 00000000..11c4ed27 --- /dev/null +++ b/adc-da-slrs/src/main/java/com/adc/da/utils/util/ExcelExportUtil.java @@ -0,0 +1,112 @@ +package com.adc.da.utils.util; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import cn.afterturn.easypoi.excel.entity.ExportParams; +import cn.afterturn.easypoi.excel.entity.enmus.ExcelType; +import com.adc.da.slrs.processModel.utils.TrainFormDate; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; +import org.apache.poi.ss.usermodel.*; +import org.apache.poi.xssf.usermodel.XSSFWorkbook; + +import java.lang.reflect.Field; +import java.util.Collection; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +/** + * @author tjzdw + * @description + * @date 2023/10/28 + */ +@Slf4j +public class ExcelExportUtil { + + private ExcelExportUtil() { + } + + /** + * 导出Excel文件 + * @param params 导出参数,主要包含,导出的文件名,导出类型 + * @param tClass 导出文件的对象类 + * @param datas 数据 + * @return 工作簿 + */ + public static Workbook exportWithData(ExportParams params, Class tClass , List datas) { + Workbook wb = null; + + if (params.getType().equals(ExcelType.XSSF)) { + wb = new XSSFWorkbook(); + } else { + wb = new HSSFWorkbook(); + } + + // 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet + Sheet sheet = wb.createSheet(params.getSheetName()); + + // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制 + Row row = sheet.createRow(0); + + // 第四步,创建单元格,并设置值表头 设置表头居中 + CellStyle style = wb.createCellStyle(); + style.setAlignment(HorizontalAlignment.CENTER); + //声明列对象 + Cell cell = null; + Map map = new HashMap<>(); + Map mapField = new HashMap<>(); + Field[] fields = tClass.getDeclaredFields(); + for (Field field : fields) { + field.setAccessible(true); + Excel excel = field.getAnnotation(Excel.class); + if (null != excel) { + map.put(Integer.valueOf(excel.orderNum()), excel); + mapField.put(Integer.valueOf(excel.orderNum()), field); + } + } + //创建标题行 + DataFormat df = wb.createDataFormat(); + for (Integer i : map.keySet()) { + sheet.setColumnWidth(i, (int) (map.get(i).width() * 256)); + cell = row.createCell(i); + cell.setCellValue(map.get(i).name()); + if (null != map.get(i).exportFormat()) { + CellStyle style1 = wb.createCellStyle(); + style1.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式 + style1.setDataFormat(df.getFormat(map.get(i).exportFormat())); + sheet.setDefaultColumnStyle(i, style1); + } + cell.setCellStyle(style); + } + //赋值数据 + int rowNum = 1; + for (Object o : datas) { + Row row1 = sheet.createRow(rowNum); + for (Integer i : map.keySet()) { + Cell cell1 = row1.createCell(i); + Field field = null; + try { + field = o.getClass().getDeclaredField(mapField.get(i).getName()); + } catch (NoSuchFieldException e) { + log.warn(e.getMessage()); + } + if (null != field) { + field.setAccessible(true); + try { + Object fieldVal = field.get(o); + if (null != map.get(i).exportFormat() && !"".equals(map.get(i).exportFormat())) { + cell1.setCellValue("null".equals(String.valueOf(fieldVal)) ? "" : TrainFormDate.dealWithTimeZoneyyyy(String.valueOf(fieldVal), map.get(i).exportFormat())); + } else { + cell1.setCellValue("null".equals(String.valueOf(fieldVal)) ? "" : String.valueOf(fieldVal)); + } + } catch (IllegalAccessException e) { + log.warn(e.getMessage()); + } + } + } + System.out.println(o.toString()); + rowNum++; + } + return wb; + } +} diff --git a/adc-da-slrs/src/main/java/com/adc/da/utils/util/FieldConvertUtil.java b/adc-da-slrs/src/main/java/com/adc/da/utils/util/FieldConvertUtil.java index 8aa7f09b..ed53e2a6 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/utils/util/FieldConvertUtil.java +++ b/adc-da-slrs/src/main/java/com/adc/da/utils/util/FieldConvertUtil.java @@ -63,6 +63,14 @@ public class FieldConvertUtil { // 内外部会议关联表 表头 public static String exportFieldNamesMeetingTopic = "议题名称,汇报人,汇报单位,议题主要内容"; + // 政策法规资料 表头 + public static String exportFieldLawsInformation = "一级资料类别,二级资料类别,三级资料类别,四级资料类别,资料名称,资料归属部门,作者,资料说明"; + + // 政策课题 表头 + public static String exportFieldLawsTopic = "课题名称,课题承办单位,课题指导单位,课题参与单位,开始时间,结题时间,课题费用(万元),课题组会议列表,课题组联系方式,内部联系方式"; + // 政策课题关联表 表头 + public static String exportFieldLawsTopicRelation = "会议名称,会议时间,会议地点,参会人员(内部),会议主要内容,姓名,单位,电话,邮箱,身份,姓名,单位,电话,邮箱,身份"; + public static String exportBaseFieldNamesBussCode = "起草部门,废止日期,代替企标编号,复审日期,起草人,被代替企标编号,采用标准,文件上传人员,采标程度,引用标准,适用车型,能源类型,适用产品线,上传时间,体系类别,备案日期,关联模块-乘用车VPPS编码,关联模块--乘用车vpps中文名称,关联模块--卡车VPPS编码,关联模块--卡车vpps中文名称"; public static String exportAttrFieldNamesBuss = "SVPPS,规范性引用文件,废止日期,复审日期,密级,授权,相关部门," + @@ -85,6 +93,11 @@ public class FieldConvertUtil { "7.关联模块-乘用车VPPS编码和关联模块--卡车VPPS编码是填写数据库中已有的编码从而带出乘用车VPPS名称和卡车VPPS名称\n" + "8.发布稿,编制说明,历史版本,其他文件,修改单,关联文件为附件文件,需要放在Excel文档同级目录中"; + // TODO + public static String exportInsideOutsideMeetingDesc = "内部会议,外部会议"; + + public static String exportLawsInformationDesc = ""; + public static String exportFieldName = "*企标类别,*企标编号,*标准年份,*企标名称,企标英文名称,*文本状态,发布日期,企标实施日期,起草部门,起草人,适用车型,能源类型,适用产品线,体系类别,关联模块-乘用车VPPS编码,关联模块--卡车VPPS编码,发布稿,编制说明,历史版本,其他文件,修改单,代替企标编号,采用标准,采标程度,引用标准,关联文件,"; /*** diff --git a/adc-da-slrs/src/main/java/com/adc/da/utils/util/InsideOutsideMeetingExportUtil.java b/adc-da-slrs/src/main/java/com/adc/da/utils/util/InsideOutsideMeetingExportUtil.java index cd5ad4dc..444d5895 100644 --- a/adc-da-slrs/src/main/java/com/adc/da/utils/util/InsideOutsideMeetingExportUtil.java +++ b/adc-da-slrs/src/main/java/com/adc/da/utils/util/InsideOutsideMeetingExportUtil.java @@ -138,10 +138,10 @@ public class InsideOutsideMeetingExportUtil { value = insideOutsideMeeting.getMeetingContent(); break; case "一级会议类别": - value = insideOutsideMeeting.getFirstMeetingType(); + value = insideOutsideMeeting.getFirstMeetingTypeName(); break; case "二级会议类别": - value = insideOutsideMeeting.getSecondMeetingType(); + value = insideOutsideMeeting.getSecondMeetingTypeName(); break; default: value = null; diff --git a/adc-da-slrs/src/main/resources/mybatis/mapper/InsideOntSideMeeting/InsideOntSideMeeting.xml b/adc-da-slrs/src/main/resources/mybatis/mapper/InsideOntSideMeeting/InsideOntSideMeeting.xml index fe46192a..5d069c4e 100644 --- a/adc-da-slrs/src/main/resources/mybatis/mapper/InsideOntSideMeeting/InsideOntSideMeeting.xml +++ b/adc-da-slrs/src/main/resources/mybatis/mapper/InsideOntSideMeeting/InsideOntSideMeeting.xml @@ -26,9 +26,6 @@ - - - @@ -39,7 +36,7 @@ iom.ID,iom.MEETING_NAME,iom.TOPIC_NAME,iom.MEETING_ORGANIZER,iom.MEETING_TIME,iom.MEETING_ADDRESS, iom.PARTICIPANTS,iom.MEETING_MINUTES,iom.MEETING_CONTENT,iom.FIRST_MEETING_TYPE,iom.SECOND_MEETING_TYPE, mt.ID as mtId,mt.MEETING_ID,mt.AGENDA_NAME,mt.AGENDA_MATERIALS,mt.REPORTER,mt.REPORTING_UNIT, - mt.AGENDA_CONTENT,mt.VALID_FLAG,mt.CREATE_TIME,mt.MODIFY_TIME, + mt.AGENDA_CONTENT, iom.VALID_FLAG,iom.CREATE_TIME,iom.MODIFY_TIME diff --git a/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsInformation/SarLawsInformationMapper.xml b/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsInformation/SarLawsInformationMapper.xml index e73d9012..aed4403b 100644 --- a/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsInformation/SarLawsInformationMapper.xml +++ b/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsInformation/SarLawsInformationMapper.xml @@ -71,4 +71,12 @@ order by ${sortField} ${sortMode} limit ${pager.startIndex-1},${pageSize} + diff --git a/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsTopic/SarLawsTopicMapper.xml b/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsTopic/SarLawsTopicMapper.xml index 8aa24169..606e448c 100644 --- a/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsTopic/SarLawsTopicMapper.xml +++ b/adc-da-slrs/src/main/resources/mybatis/mapper/sarLawsTopic/SarLawsTopicMapper.xml @@ -4,7 +4,7 @@ "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> - + @@ -205,4 +205,26 @@ order by slt.${sortField} ${sortMode} limit ${pager.startIndex-1},${pageSize} + + diff --git a/adc-da-slrs/src/main/resources/mybatis/mapper/tsDictionaryType/TsDicTypeMapper.xml b/adc-da-slrs/src/main/resources/mybatis/mapper/tsDictionaryType/TsDicTypeMapper.xml index 3e637c31..916d5ba1 100644 --- a/adc-da-slrs/src/main/resources/mybatis/mapper/tsDictionaryType/TsDicTypeMapper.xml +++ b/adc-da-slrs/src/main/resources/mybatis/mapper/tsDictionaryType/TsDicTypeMapper.xml @@ -14,6 +14,11 @@ + + + + + select DIC_TYPE_NAME from ts_dictype where DIC_TYPE_CODE = #{typeCode} +