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;
}
}