package com.example.jz.service.impl; import com.alibaba.excel.EasyExcel; import com.alibaba.excel.context.AnalysisContext; import com.alibaba.excel.event.AnalysisEventListener; import com.alibaba.excel.metadata.data.ImageData; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.util.IoUtils; import com.alibaba.excel.util.StringUtils; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.example.jz.dao.*; import com.example.jz.modle.PageParam; import com.example.jz.modle.dto.AddReportDto; import com.example.jz.modle.dto.AddReportLoadDto; import com.example.jz.modle.dto.ReportParamDto; import com.example.jz.modle.entity.*; import com.example.jz.modle.vo.ExportExcelReportVo; import com.example.jz.modle.vo.NewCauseVo; import com.example.jz.modle.vo.ReportListVo; import com.example.jz.modle.vo.ReportVXVO; import com.example.jz.service.MinIOService; import com.example.jz.service.ReportService; import com.example.jz.service.UserService; import lombok.SneakyThrows; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.context.annotation.Bean; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.multipart.MultipartFile; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; import java.io.Serializable; import java.net.URL; import java.net.URLEncoder; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.function.Consumer; import java.util.stream.Collectors; /** * 报案表(Report)表服务实现类 * * @author makejava * @since 2022-07-13 11:52:58 */ @Service("reportService") public class ReportServiceImpl extends ServiceImpl implements ReportService { @Autowired private ReportDao reportDao; @Autowired private GroupDao groupDao; @Autowired private GroupUserDao groupUserDao; @Resource CauseDao causeDao; @Resource UserDao userDao; @Resource UserService userService; @Resource ReportService reportService; @Resource MinIOService minIOService; /** * 审核报案 * * @param report * @return */ @Override @Transactional(rollbackFor = Exception.class) public Boolean audit(Report report) { // 1. 更新报案表 report.setStatus(1); report.setIsInGroup(1); reportDao.updateById(report); // 2. 更新群用户表 Group group = groupDao.selectOne(new LambdaQueryWrapper<>(Group.class) .eq(Group::getCauseId, report.getCauseId())); if (!groupUserDao.selectUserList(group.getId()).contains(report.getUserId())) { GroupUser groupUser = new GroupUser().setGroupId(group.getId()).setUserId(report.getId()).setCtime(new Date()).setBanSpeech(0); return groupUserDao.insert(groupUser) == 1 ? true : false; } return true; } @Override public void leaveGroup(Integer id, Integer groupId) { Report report = new Report(); report.setIsInGroup(0); report.setId(id); reportDao.updateById(report); groupUserDao.delete(new QueryWrapper().eq("user_id", id).eq("group_id", groupId)); } // @Override // @SneakyThrows // public void exportReporter(Integer id, HttpServletResponse response) { // //查询报案人相关信息通过案件 // List reports = reportDao.selectList(new QueryWrapper().eq("cause_id", id).orderByDesc()); // ArrayList exportExcelReportVos = new ArrayList<>(); // reports.forEach( // new Consumer() { // @Override // public void accept(Report a) { // ExportExcelReportVo exportExcelReportVo = new ExportExcelReportVo(); // User user = userDao.selectOne(new QueryWrapper().eq("id", a.getUserId())); // BeanUtils.copyProperties(a, exportExcelReportVo); // exportExcelReportVo.setUserIdcard(user.getUserIdcard()); // exportExcelReportVo.setUserMobile(user.getUserMobile()); // exportExcelReportVo.setRealName(user.getRealName()); // WriteCellData> objectWriteCellData = new WriteCellData<>(); // ArrayList imageDataList = new ArrayList<>(); // if (StringUtils.isNotBlank(a.getReportMaterials())) { // String[] urls = a.getReportMaterials().split(","); // if (urls.length == 1) { // int width = 600; // try { // ImageData imageData = new ImageData(); // imageData.setImage(IoUtils.toByteArray(new URL(minIOService.getPreviewFileUrl(urls[0])).openConnection().getInputStream())); // imageData.setRight(width / 2); // imageDataList.add(imageData); // } catch (Exception e) { // throw new RuntimeException(e); // } // } else { // for (int i = 0; i < urls.length; i++) { // int width = 600; // try { // ImageData imageData = new ImageData(); // imageData.setImage(IoUtils.toByteArray(new URL(minIOService.getPreviewFileUrl(urls[i])).openConnection().getInputStream())); // imageData.setLeft(width / urls.length * i); // imageData.setRight(width - width / urls.length * (i + 1)); // imageDataList.add(imageData); // } catch (Exception e) { // throw new RuntimeException(e); // } // } // } // } // objectWriteCellData.setImageDataList(imageDataList); // exportExcelReportVo.setWriteCellData(objectWriteCellData); // exportExcelReportVos.add(exportExcelReportVo); // } // } // ); // String name = causeDao.selectOne(new QueryWrapper().eq("id", id)).getName(); // response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); // response.setCharacterEncoding("utf-8"); // response.setHeader("Content-disposition", "attachment;filename=" + LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd")) + URLEncoder.encode(name + ".xlsx", "utf-8")); // EasyExcel.write(response.getOutputStream(), ExportExcelReportVo.class).sheet("材料导出").doWrite(exportExcelReportVos); // } @Override public Page getPage(Page page, ReportParamDto reportParamDto) { return reportDao.getPage(page, reportParamDto); } @Override public ReportListVo getReportListVoById(Serializable id) { return reportDao.getReportListVoById(id); } @Override public Page getPageByGroupId(Page page, ReportParamDto reportParamDto, Integer causeId) { Long size = (page.getCurrent() - 1) * page.getSize(); Long current = page.getSize(); Page aaa = new PageParam<>(); List list = reportDao.getPageByGroupId(reportParamDto, causeId, size, current); list.forEach(item -> { if (item.getIsInGroup() == 1) { item.setGroupId(groupDao.selectOne(new QueryWrapper().eq("cause_id", causeId)).getId()); } }); aaa.setRecords(list); Integer pageByGroupIdCount = reportDao.getPageByGroupIdCount(reportParamDto, causeId); aaa.setTotal(pageByGroupIdCount); aaa.getRecords().stream().forEach(x -> x.setIdcard(x.getIdcard().replaceAll("(?<=[\\d]{3})\\d(?=[\\d]{4})", "*"))); return aaa; } @Override @Transactional public Boolean addReport(AddReportDto addReportDto) { User user = userDao.selectOne(new LambdaQueryWrapper(User.class).eq(User::getUserIdcard, addReportDto.getIdcard())); if (user == null) { // 如果用户不存在 则添加用户 user = new User().setUserIdcard(addReportDto.getIdcard()).setUserMobile(addReportDto.getMobile()).setRealName(addReportDto.getReporterName()) .setModifyTime(new Date()).setUserRegtime(new Date()).setPic(addReportDto.getPic()).setCtime(new Date()); userService.save(user); } // 添加人员进群组 // groupUserDao.insert(new GroupUser() // .setGroupId(groupDao.selectOne(new QueryWrapper().eq("cause_id", addReportDto.getCauseId())).getId()) // .setUserId(user.getId()).setCtime(new Date()) // .setBanSpeech(0)); // 添加报案信息 Report report = new Report(); BeanUtils.copyProperties(addReportDto, report); report .setCreator(userDao.selectOne(new QueryWrapper().eq("login_username", SecurityContextHolder.getContext().getAuthentication().getPrincipal())).getId()) .setUserId(user.getId()) .setCtime(new Date()) .setStatus(0) .setIsInGroup(0) .setReportMethod("现场报案") .setIsCommission("0") .setReportTime(new Date()) .setCauseId(addReportDto.getCauseId()); return reportService.save(report); } @Override public List listGroup(Integer id) { return reportDao.selectListGroup(id); } @Override @SneakyThrows public void loadFileReport(MultipartFile multipartFile, Integer causeId) { EasyExcel.read(multipartFile.getInputStream(), AddReportLoadDto.class, new AnalysisEventListener() { @Override public void invoke(AddReportLoadDto data, AnalysisContext context) { if (com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(data.getReporterName()) && com.baomidou.mybatisplus.core.toolkit.StringUtils.isNotBlank(data.getIdcard())) { AddReportDto addReportDto = new AddReportDto(); BeanUtils.copyProperties(data, addReportDto); addReportDto.setCauseId(causeId); addReport(addReportDto); } } @Override public void doAfterAllAnalysed(AnalysisContext context) { } }) .autoCloseStream(true) .doReadAll(); } @Override @Transactional(rollbackFor = Exception.class) public Boolean reject(Integer id, String reason) { Report report = reportDao.selectReportByReportId(id); // 1. 更新报案表 report.setStatus(2); report.setIsInGroup(2); report.setRemarks(reason); reportDao.updateById(report); return true; } @Override public ReportVXVO getRejectReportById(Integer id) { ReportVXVO reportVXVO = new ReportVXVO(); Report report = reportDao.selectOne(new LambdaQueryWrapper().eq(Report::getId, id)); User user = userDao.selectOne(new LambdaQueryWrapper().eq(User::getId, report.getUserId())); BeanUtils.copyProperties(report, reportVXVO); reportVXVO.setLocation(user.getLocation()); reportVXVO.setWorkingLocation(user.getWorkingLocation()); reportVXVO.setSex(user.getSex()); reportVXVO.setRealName(user.getRealName()); reportVXVO.setUserIdCard(user.getUserIdcard()); reportVXVO.setDescription(causeDao.selectOne(new LambdaQueryWrapper().eq(Cause::getId, reportDao.selectOne(new LambdaQueryWrapper().eq(Report::getId, id)).getCauseId())).getName()); return reportVXVO; } @Override public NewCauseVo rejectCauseList(Integer id) { Report report = reportDao.selectOne(new LambdaQueryWrapper().eq(Report::getId, id)); Cause cause = causeDao.selectOne(new LambdaQueryWrapper().eq(Cause::getId, report.getCauseId())); NewCauseVo newCauseVo = new NewCauseVo(); newCauseVo.setId(cause.getId()); newCauseVo.setName(cause.getName()); return newCauseVo; } }