package com.fdkankan.fusion.service.impl; import cn.dev33.satoken.stp.StpUtil; import cn.hutool.core.date.DatePattern; import cn.hutool.core.date.DateUtil; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; import com.deepoove.poi.XWPFTemplate; import com.deepoove.poi.config.Configure; import com.deepoove.poi.config.ConfigureBuilder; import com.deepoove.poi.data.TextRenderData; import com.deepoove.poi.data.style.Style; import com.deepoove.poi.xwpf.NiceXWPFDocument; import com.fdkankan.fusion.common.FilePath; import com.fdkankan.fusion.common.ResultCode; import com.fdkankan.fusion.common.util.DateUtils; import com.fdkankan.fusion.common.util.ShellUtil; import com.fdkankan.fusion.common.util.XwpTemplateUtils; import com.fdkankan.fusion.entity.*; import com.fdkankan.fusion.exception.BusinessException; import com.fdkankan.fusion.mapper.ICaseInquestCriminalMapper; import com.fdkankan.fusion.response.CaseInquestCriminalVo; import com.fdkankan.fusion.response.CaseInquestVo; import com.fdkankan.fusion.response.WitnessVo; import com.fdkankan.fusion.service.*; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.apache.poi.xwpf.usermodel.UnderlinePatterns; import org.springframework.beans.BeanUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.io.InputStream; import java.util.Date; import java.util.List; /** *

* 服务实现类 *

* * @author * @since 2024-10-18 */ @Service @Slf4j public class CaseInquestCriminalServiceImpl extends ServiceImpl implements ICaseInquestCriminalService { @Autowired ITmUserService tmUserService; @Autowired ICaseService caseService; @Autowired ITmDepartmentService tmDepartmentService; @Autowired ICaseNumService caseNumService; @Autowired IScenePlusService scenePlusService; @Autowired ICaseFilesService caseFilesService; @Override public CaseInquestCriminal getByInquestFileId(Integer caseId) { LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); wrapper.eq(CaseInquestCriminal::getInquestFileId,caseId); CaseInquestCriminal caseInquestCriminal = this.getOne(wrapper); return caseInquestCriminal; } @Override public void saveByParam(CaseInquestCriminal caseInquestCriminal) { if(caseInquestCriminal.getInquestFileId() == null){ CaseFiles caseFiles = caseFilesService.addByInquest(caseInquestCriminal); caseInquestCriminal.setInquestFileId(caseFiles.getFilesId()); }else { CaseInquestCriminal byInquestFileId = getByInquestFileId(caseInquestCriminal.getInquestFileId()); caseInquestCriminal.setId(byInquestFileId.getId()); } this.saveOrUpdate(caseInquestCriminal); //生产doc文档 try { Integer inquestFileId = caseInquestCriminal.getInquestFileId(); CaseFiles caseFiles = caseFilesService.getById(inquestFileId); XWPFTemplate template = this.getWordByTemplate(caseInquestCriminal); String localPath = String.format(FilePath.MNTPATH+FilePath.DOC_OSS_PATH,caseFiles.getFilesId(),caseFiles.getFilesTitle()+".docx"); template.writeToFile(localPath ); ShellUtil.yunUpload(localPath,localPath.replace(FilePath.MNTPATH,"")); }catch (Exception e){ log.info("caseInquestCriminal-保存生成doc文档出错:error",e); } } @Override public XWPFTemplate getWordByTemplate(CaseInquestCriminal caseInquest) { InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream("template/inquest_criminal-template.docx"); // 渲染模板 CaseInquestCriminalVo vo = new CaseInquestCriminalVo(); BeanUtils.copyProperties(caseInquest,vo); //[{"unit":"四维","name":"张三","typeLabel":"笔录人","type":0,"job":"植物一"}] String recorderInfo = "%s:姓名 %s 单位 %s 职务 %s\n"; StringBuilder recorderInfoMsg = new StringBuilder(); for (Object object : vo.getRecorderInfo()) { JSONObject obj = (JSONObject) object; String format = String.format(recorderInfo,obj.getString("typeLabel"), obj.getString("name"), obj.getString("unit"), obj.getString("job")); recorderInfoMsg.append(format); } TextRenderData text = new TextRenderData("000000",recorderInfoMsg.toString()); Style style = text.getStyle(); style.setUnderlinePatterns(UnderlinePatterns.SINGLE); vo.setRecorderInfoText(text); //[{"unit":"四维","job":"植物一"}] String signatureInfo = "本人签名: 单位 %s 职务 %s\n"; StringBuilder signatureInfoMsg = new StringBuilder(); for (Object object : vo.getSignatureInfo()) { JSONObject obj = (JSONObject) object; String format = String.format(signatureInfo, obj.getString("unit"), obj.getString("job")); signatureInfoMsg.append(format); } TextRenderData text2 = new TextRenderData("000000",signatureInfoMsg.toString()); Style style2 = text2.getStyle(); style2.setUnderlinePatterns(UnderlinePatterns.SINGLE); vo.setSignatureInfoText(text2); //[{"birthday":"2024-10-15T16:00:00.000Z","address":"dfsdfdsdsdsdsds","sex":0}] //[{"sex":0,"birthday":"","address":""},{"sex":0,"birthday":"","address":""}] String witnessInfo = "本人签名: 性别 %s 出生日期 %s 住址 %s\n"; StringBuilder witnessInfoMsg = new StringBuilder(); for (Object object : vo.getWitnessInfo()) { JSONObject obj = (JSONObject) object; String birthday = DateUtil.format(obj.getDate("birthday"), DatePattern.CHINESE_DATE_FORMAT) == null?"":DateUtil.format(obj.getDate("birthday"), DatePattern.CHINESE_DATE_FORMAT); String format = String.format(witnessInfo, XwpTemplateUtils.getSexStr(obj.getInteger("sex")), birthday,obj.getString("address")); witnessInfoMsg.append(format); } TextRenderData text3 = new TextRenderData("000000",witnessInfoMsg.toString()); Style style3 = text3.getStyle(); style3.setUnderlinePatterns(UnderlinePatterns.SINGLE); vo.setWitnessInfoText(text3); ConfigureBuilder builder = Configure.builder(); builder.useSpringEL(false); //builder.setValidErrorHandler(new Configure.DiscardHandler()); XWPFTemplate compile = XWPFTemplate.compile(inputStream, builder.build()); compile.render(vo); return compile; } }