From d4aa91ce442ce658324a7b0d52cbbba17e0a43df Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cwangzihua=E2=80=9D?= Date: Wed, 14 Jan 2026 14:44:20 +0800 Subject: [PATCH] =?UTF-8?q?fix:=E6=97=A0=E5=A4=84=E7=BD=9A=E8=AF=81?= =?UTF-8?q?=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- yun-admin/pom.xml | 42 +++ .../module/letter/service/LetterService.java | 14 +- .../module/penalty/dao/PenaltyLawyerDao.java | 5 + .../domain/form/PenaltyApplyQueryForm.java | 2 + .../penalty/service/PenaltyApplyService.java | 17 +- .../penalty/service/PenaltyLawyerService.java | 5 +- .../service/ServiceApplicationsService.java | 8 +- .../system/department/dao/DepartmentDao.java | 2 + .../department/domain/vo/DepartmentVO.java | 4 +- .../department/service/DepartmentService.java | 13 + .../word/WordApplicationsController.java | 91 ++++++ .../module/word/WordCertificateService.java | 269 ++++++++++++++++++ .../penaltyapply/PenaltyApplyMapper.xml | 3 + .../penaltyapply/PenaltyLawyerMapper.xml | 5 + .../service/ServiceApplicationsMapper.xml | 6 +- .../system/department/DepartmentMapper.xml | 6 + .../templates/certificate_template.docx | Bin 0 -> 11844 bytes .../resources/templates/official_seal.png | Bin 0 -> 2506 bytes 18 files changed, 476 insertions(+), 16 deletions(-) create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java create mode 100644 yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java create mode 100644 yun-admin/src/main/resources/templates/certificate_template.docx create mode 100644 yun-admin/src/main/resources/templates/official_seal.png diff --git a/yun-admin/pom.xml b/yun-admin/pom.xml index 4df37b0..c81bc7f 100644 --- a/yun-admin/pom.xml +++ b/yun-admin/pom.xml @@ -27,6 +27,48 @@ easyexcel 3.2.1 + + com.itextpdf + kernel + 7.0.3 + + + com.itextpdf + io + 7.0.3 + + + com.itextpdf + layout + 7.0.3 + + + com.itextpdf + pdfa + 7.0.3 + + + + org.apache.poi + poi + 5.2.3 + + + org.apache.poi + poi-ooxml + 5.2.3 + + + + fr.opensagres.xdocreport + org.apache.poi.xwpf.converter.pdf + 1.0.6 + + + fr.opensagres.xdocreport + fr.opensagres.poi.xwpf.converter.pdf-gae + 2.0.2 + diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java index 299ca41..4c5dd83 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/letter/service/LetterService.java @@ -130,9 +130,9 @@ public class LetterService { // 获取当前年份 String year = String.valueOf(letterEntity.getCreateTime().getYear()); - contentHtml = contentHtml.replace("我自愿", employeeEntity.getActualName()+"自愿"); - contentHtml = contentHtml.replace("申报年度", "申报"+year + "年度"); - contentText = contentText.replace("我自愿", employeeEntity.getActualName()+"自愿"); + contentHtml = contentHtml.replace("我自愿", "我[ "+employeeEntity.getActualName()+" ]自愿"); + contentHtml = contentHtml.replace("申报年度", "申报[ "+year + " ]年度"); + contentText = contentText.replace("我自愿", "我[ "+employeeEntity.getActualName()+" ]自愿"); contentText = contentText.replace("申报年度", "申报"+year + "年度"); // 替换模板中的占位符 - 律师个人承诺书 contentHtml = contentHtml.replace("承诺人(签字):              日期:  ", "承诺人(签字):" + employeeEntity.getActualName() + "       日期:" + letterEntity.getCreateTime().toLocalDate().toString()); @@ -149,13 +149,13 @@ public class LetterService { String year = String.valueOf(letterEntity.getCreateTime().getYear()); // 替换模板中的占位符 - 律师事务所承诺书 - contentHtml = contentHtml.replace("律师事务所", departmentEntity.getDepartmentName()); - contentHtml = contentHtml.replace("年度", year + "年度"); + contentHtml = contentHtml.replace("律师事务所", "[ "+departmentEntity.getDepartmentName()+" ]"); + contentHtml = contentHtml.replace("年度", "[ "+year + " ]年度"); contentHtml = contentHtml.replace("主任(签字):", "主任(签字):" + employeeEntity.getActualName()); contentHtml = contentHtml.replace("日期", " 日期:" + letterEntity.getCreateTime().toLocalDate().toString()); - contentText = contentText.replace("律师事务所", departmentEntity.getDepartmentName()); - contentText = contentText.replace("年度", year + "年度"); + contentText = contentText.replace("律师事务所", "[ "+departmentEntity.getDepartmentName()+" ]"); + contentText = contentText.replace("年度", "[ "+year + " ]年度"); contentText = contentText.replace("主任(签字):", "主任(签字):" + employeeEntity.getActualName()); contentText = contentText.replace("日期", " 日期:" + letterEntity.getCreateTime().toLocalDate()); diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java index 125fb54..f4dede2 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/dao/PenaltyLawyerDao.java @@ -1,6 +1,8 @@ package net.lab1024.sa.admin.module.penalty.dao; import java.util.List; + +import com.alibaba.fastjson.JSONObject; import net.lab1024.sa.admin.module.penalty.domain.entity.PenaltyLawyerEntity; import net.lab1024.sa.admin.module.penalty.domain.form.PenaltyLawyerQueryForm; import net.lab1024.sa.admin.module.penalty.domain.vo.PenaltyLawyerVO; @@ -9,6 +11,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; +import javax.validation.Valid; + /** * 处罚人 Dao * @@ -29,4 +33,5 @@ public interface PenaltyLawyerDao extends BaseMapper { */ List queryPage(Page page, @Param("queryForm") PenaltyLawyerQueryForm queryForm); + List selectLawyerPunishList(@Param("licenseNo") String licenseNo); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java index 317d857..1184adb 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/domain/form/PenaltyApplyQueryForm.java @@ -33,4 +33,6 @@ public class PenaltyApplyQueryForm extends PageParam { * 状态(0-未提交,1-已提交,2-审核中,3-已批准,5-已驳回) */ private Integer status; + + private Long userId; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java index 2678570..1d3bf28 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyApplyService.java @@ -13,8 +13,12 @@ import net.lab1024.sa.admin.module.penalty.domain.vo.PenaltyApplyVO; import net.lab1024.sa.admin.module.system.department.service.DepartmentService; import net.lab1024.sa.admin.module.system.employee.domain.entity.EmployeeEntity; import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; +import net.lab1024.sa.admin.module.system.login.domain.RequestEmployee; +import net.lab1024.sa.admin.module.system.role.domain.vo.RoleVO; +import net.lab1024.sa.admin.module.system.role.service.RoleEmployeeService; import net.lab1024.sa.admin.util.AdminRequestUtil; import net.lab1024.sa.base.common.code.UserErrorCode; +import net.lab1024.sa.base.common.enumeration.UserTypeEnum; import net.lab1024.sa.base.common.util.SmartBeanUtil; import net.lab1024.sa.base.common.util.SmartPageUtil; import net.lab1024.sa.base.common.domain.ResponseDTO; @@ -43,11 +47,18 @@ public class PenaltyApplyService { private PenaltyLawyerService penaltyLawyerService; @Resource private EmployeeService employeeService; + @Resource + private RoleEmployeeService roleEmployeeService; /** * 分页查询 */ public PageResult queryPage(PenaltyApplyQueryForm queryForm) { Page page = SmartPageUtil.convert2PageQuery(queryForm); + RequestEmployee requestUser = AdminRequestUtil.getRequestUser(); + List roleIdList = roleEmployeeService.getRoleIdList(requestUser.getEmployeeId()); + if (!UserTypeEnum.CEO.getDesc().equals(roleIdList.get(0).getRoleCode())) { + queryForm.setUserId(requestUser.getEmployeeId()); + } List list = penaltyApplyDao.queryPage(page, queryForm); return SmartPageUtil.convert2PageResult(page, list); } @@ -59,7 +70,7 @@ public class PenaltyApplyService { Long userId = AdminRequestUtil.getRequestUser().getUserId(); EmployeeEntity entity = employeeService.getById(userId); //判断有没有处罚 - Boolean query = penaltyLawyerService.query(entity.getCertificateNumber()); + Boolean query = penaltyLawyerService.query(entity.getActualName()); if (query){ return ResponseDTO.error(UserErrorCode.FORM_REPEAT_SUBMIT_PENALTY); } @@ -111,4 +122,8 @@ public class PenaltyApplyService { penaltyApplyDao.updateById(penaltyApplyEntity); return ResponseDTO.ok(); } + + public PenaltyApplyEntity selectOne(Integer id) { + return penaltyApplyDao.selectById(id); + } } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java index e24eb48..a76aab9 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/penalty/service/PenaltyLawyerService.java @@ -2,6 +2,7 @@ package net.lab1024.sa.admin.module.penalty.service; import java.util.List; +import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import net.lab1024.sa.admin.module.penalty.dao.PenaltyLawyerDao; import net.lab1024.sa.admin.module.penalty.domain.entity.PenaltyLawyerEntity; @@ -87,8 +88,8 @@ public class PenaltyLawyerService { return ResponseDTO.ok(); } - public Boolean query(@Valid String licenseNo) { - List penaltyLawyerEntities = penaltyLawyerDao.selectList(new LambdaQueryWrapper().eq(PenaltyLawyerEntity::getLicenseNo, licenseNo)); + public Boolean query(String licenseNo) { + List penaltyLawyerEntities = penaltyLawyerDao.selectLawyerPunishList(licenseNo); if (CollectionUtils.isNotEmpty(penaltyLawyerEntities)) { return true; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java index 3ae8814..5c8bd14 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/service/service/ServiceApplicationsService.java @@ -568,8 +568,12 @@ public class ServiceApplicationsService { serviceApplicationsEntity.setAssociationAuditTime(LocalDateTime.now()); serviceApplicationsEntity.setAssociationAuditOpinion(updateForm.getAssociationAuditOpinion()); } else { - // 其他角色(如律所管理员):修改律所审核状态 - serviceApplicationsEntity.setFirmAuditStatus(updateForm.getFirmAuditStatus()); + if (ReviewEnum.REFUSE.getValue() == updateForm.getAssociationAuditStatus()){ + serviceApplicationsEntity.setFirmAuditStatus(ReviewEnum.REFUSE.getValue()); + }else { + // 其他角色(如律所管理员):修改律所审核状态 + serviceApplicationsEntity.setFirmAuditStatus(updateForm.getFirmAuditStatus()); + } serviceApplicationsEntity.setFirmAuditUser(requestUser.getEmployeeId()); serviceApplicationsEntity.setFirmAuditTime(LocalDateTime.now()); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java index 4d8de53..1981607 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/dao/DepartmentDao.java @@ -26,4 +26,6 @@ public interface DepartmentDao extends BaseMapper { List listAll(); DepartmentVO selectDepartmentVO(@Param("departmentId")Long departmentId); + + DepartmentVO selectCreditCodeById(@Param("departmentName")String departmentName); } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java index f58d41b..c439aeb 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/domain/vo/DepartmentVO.java @@ -37,5 +37,7 @@ public class DepartmentVO implements Serializable { @Schema(description = "创建时间") private LocalDateTime createTime; - + //社会统一信用代码 + @Schema(description = "社会统一信用代码") + private String creditCode; } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java index 9098c96..83d81bb 100644 --- a/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/system/department/service/DepartmentService.java @@ -147,4 +147,17 @@ public class DepartmentService { DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); return departmentEntity; } + + public DepartmentVO getById(Long departmentId) { + DepartmentEntity departmentEntity = departmentDao.selectById(departmentId); + DepartmentVO departmentVO = new DepartmentVO(); + DepartmentVO departmentVO1 = departmentDao.selectCreditCodeById(departmentEntity.getDepartmentName()); + departmentVO.setDepartmentName(departmentEntity.getDepartmentName()); + if (departmentVO1 != null) { + departmentVO.setCreditCode(departmentVO1.getCreditCode()); + }else { + departmentVO.setCreditCode(""); + } + return departmentVO; + } } diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java new file mode 100644 index 0000000..1f94266 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordApplicationsController.java @@ -0,0 +1,91 @@ +package net.lab1024.sa.admin.module.word; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import net.lab1024.sa.admin.module.penalty.domain.entity.PenaltyApplyEntity; +import net.lab1024.sa.admin.module.penalty.service.PenaltyApplyService; +import net.lab1024.sa.admin.module.service.domain.form.*; +import net.lab1024.sa.admin.module.service.domain.vo.LawyerStatisticsVO; +import net.lab1024.sa.admin.module.service.domain.vo.ServiceApplicationsVO; +import net.lab1024.sa.admin.module.service.domain.vo.ServiceReportStatisticsVO; +import net.lab1024.sa.admin.module.service.service.ServiceApplicationsService; +import net.lab1024.sa.admin.module.system.department.domain.vo.DepartmentVO; +import net.lab1024.sa.admin.module.system.department.service.DepartmentService; +import net.lab1024.sa.admin.module.system.employee.domain.entity.EmployeeEntity; +import net.lab1024.sa.admin.module.system.employee.service.EmployeeService; +import net.lab1024.sa.base.common.domain.PageResult; +import net.lab1024.sa.base.common.domain.ResponseDTO; +import net.lab1024.sa.base.common.domain.ValidateList; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import javax.servlet.http.HttpServletResponse; +import javax.validation.Valid; +import java.math.BigDecimal; +import java.util.List; + +/** + * 无处罚证明开具 Controller + * + * @Author wzh + * @Date 2025-12-20 14:44:06 + * @Copyright 1.0 + */ + +@RestController +@Tag(name = "无处罚证明开具") +public class WordApplicationsController { + @Resource + WordCertificateService wordCertificateService; + @Resource + private PenaltyApplyService penaltyApplyService; + @Resource + EmployeeService employeeService; + @Resource + DepartmentService departmentService; + @Operation(summary = "无处罚证明下载 @author wzh") + @GetMapping("/wordCertificate/export/{id}") + public void wordCertificateExport(HttpServletResponse response, @PathVariable Integer id, + @RequestParam(defaultValue = "word") String format) throws Exception { + //查询出当前的开具证明信息 + PenaltyApplyEntity penaltyApplyEntity = penaltyApplyService.selectOne(id); + //查询用户姓名执业证号 + EmployeeEntity byId = employeeService.getById(penaltyApplyEntity.getUserId()); + //机构信息 + DepartmentVO departmentVO = departmentService.getById(byId.getDepartmentId()); + WordCertificateService.CertificateData certificateData = new WordCertificateService.CertificateData( + departmentVO.getDepartmentName(), + departmentVO.getCreditCode(), + byId.getActualName(), + byId.getCertificateNumber(), + penaltyApplyEntity.getCreateTime() + ); + + byte[] fileContent; + String fileName; + String contentType; + + if ("pdf".equalsIgnoreCase(format)) { + // 生成PDF文档 + fileContent = wordCertificateService.generateCertificateAsPdf(certificateData); + fileName = "certificate.pdf"; + contentType = "application/pdf"; + } else { + // 生成Word文档 + fileContent = wordCertificateService.generateCertificate(certificateData); + fileName = "certificate.docx"; + contentType = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + } + + // 设置文档响应头 + response.setContentType(contentType); + response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"; filename*=UTF-8''" + fileName); + + response.setContentLength(fileContent.length); + + // 将文件内容写入响应输出流 + response.getOutputStream().write(fileContent); + response.getOutputStream().flush(); + } +} diff --git a/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java new file mode 100644 index 0000000..1033471 --- /dev/null +++ b/yun-admin/src/main/java/net/lab1024/sa/admin/module/word/WordCertificateService.java @@ -0,0 +1,269 @@ +package net.lab1024.sa.admin.module.word; + +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; +import lombok.extern.slf4j.Slf4j; +import org.apache.poi.util.Units; +import org.apache.poi.xwpf.converter.pdf.PdfConverter; +import org.apache.poi.xwpf.converter.pdf.PdfOptions; +import org.apache.poi.xwpf.usermodel.ParagraphAlignment; +import org.apache.poi.xwpf.usermodel.XWPFDocument; +import org.apache.poi.xwpf.usermodel.XWPFParagraph; +import org.apache.poi.xwpf.usermodel.XWPFRun; +import org.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.*; +import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDrawing; +import org.springframework.core.io.ClassPathResource; +import org.springframework.core.io.Resource; +import org.springframework.util.FileCopyUtils; +import org.springframework.stereotype.Service; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.InputStream; +import java.math.BigInteger; +import java.time.LocalDate; +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.util.HashMap; +import java.util.Map; + +/** + * @program: yun-parent + * @description: 模板生成 + * @author: Mr.Wang + * @create: 2026-01-13 16:38 + **/ +@Service +@Slf4j +public class WordCertificateService { + + private static final String TEMPLATE_PATH = "templates/certificate_template.docx"; + private static final String SEAL_PATH = "templates/official_seal.png"; + /** + * 生成Word格式的证书 + */ + public byte[] generateCertificate(CertificateData data) throws Exception { + XWPFDocument document = prepareDocument(data); + + // 保存到字节数组 + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + document.write(outputStream); + document.close(); + + return outputStream.toByteArray(); + } + + /** + * 生成PDF格式的证书 + */ + public byte[] generateCertificateAsPdf(CertificateData data) throws Exception { + XWPFDocument document = prepareDocument(data); + + // 转换为PDF + ByteArrayOutputStream pdfOutputStream = new ByteArrayOutputStream(); + PdfConverter.getInstance().convert(document, pdfOutputStream, PdfOptions.create()); + document.close(); + + return pdfOutputStream.toByteArray(); + } + + /** + * 准备文档(用于Word或PDF生成) + */ + private XWPFDocument prepareDocument(CertificateData data) throws Exception { + Resource templateResource = new ClassPathResource(TEMPLATE_PATH); + XWPFDocument document = new XWPFDocument(templateResource.getInputStream()); + + // 1. 替换文本占位符 + replaceTextPlaceholders(document, data); + + // 2. 插入电子章图片 + insertSealImage(document); + + return document; + } + + /** + * 替换文本占位符 + */ + private void replaceTextPlaceholders(XWPFDocument document, CertificateData data) { + // 准备替换数据 + Map replacements = new HashMap<>(); + //律所名称 + replacements.put("${certificateNo}", data.getCertificateNo()); + //信用社代码 + replacements.put("${purpose}", data.getPurpose()); + //律师名称 + replacements.put("${name}", data.getName()); + //身份证号码 + replacements.put("${idCard}", data.getIdCard()); + //时间 + replacements.put("${queryTime}", data.getLocalDateTime().format( + DateTimeFormatter.ofPattern("yyyy年MM月dd日"))); + + // 遍历所有段落进行替换 + for (XWPFParagraph paragraph : document.getParagraphs()) { + String text = paragraph.getText(); + if (text != null && text.contains("${")) { + for (Map.Entry entry : replacements.entrySet()) { + text = text.replace(entry.getKey(), entry.getValue()); + } + + // 清空原有内容 + for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) { + paragraph.removeRun(i); + } + + // 添加新内容 + XWPFRun run = paragraph.createRun(); + run.setText(text); + run.setFontFamily("宋体"); + run.setFontSize(12); + } + } + } + + /** + * 插入电子章图片(正确的方法) + */ + private void insertSealImage(XWPFDocument document) throws Exception { + try { + // 1. 读取电子章图片 + Resource sealResource = new ClassPathResource(SEAL_PATH); + if (!sealResource.exists()) { + log.warn("电子章图片不存在"); + insertTextSeal(document); + return; + } + + byte[] sealBytes = FileCopyUtils.copyToByteArray(sealResource.getInputStream()); + + // 2. 查找插入位置 + for (XWPFParagraph paragraph : document.getParagraphs()) { + String text = paragraph.getText(); + if (text != null && text.contains("${电子章}")) { + // 清除占位符文本 + for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) { + paragraph.removeRun(i); + } + + // 创建居中的运行来放置图片 + XWPFRun run = paragraph.createRun(); + run.getParagraph().setAlignment(ParagraphAlignment.CENTER); + + // 添加图片数据并获取关系ID + String blipId = document.addPictureData( + new ByteArrayInputStream(sealBytes), + XWPFDocument.PICTURE_TYPE_PNG + ); + + // 设置图片尺寸(150×150像素) + int width = 150; + int height = 150; + + // 使用addPicture方法插入图片 + run.addPicture( + new ByteArrayInputStream(sealBytes), + XWPFDocument.PICTURE_TYPE_PNG, + "official_seal.png", + Units.toEMU(width), + Units.toEMU(height) + ); + + // 获取图片对象并设置为浮于文字上方 + CTDrawing drawing = run.getCTR().getDrawingArray(0); + if (drawing.sizeOfAnchorArray() > 0) { + CTInline inline = drawing.getInlineArray(0); + + // 创建锚定对象 + CTAnchor anchor = drawing.addNewAnchor(); + + // 设置位置 + anchor.addNewSimplePos().setX(0); + anchor.addNewSimplePos().setY(0); + + // 设置相对于页面 + CTPosH posH = anchor.addNewPositionH(); + posH.setRelativeFrom(STRelFromH.PAGE); + posH.setPosOffset(0); + + CTPosV posV = anchor.addNewPositionV(); + posV.setRelativeFrom(STRelFromV.PAGE); + posV.setPosOffset(0); + + // 设置环绕方式为无(浮于文字上方) + anchor.addNewWrapNone(); + + // 设置在文字上方 + anchor.setBehindDoc(false); + // 删除原来的内联对象 + drawing.removeInline(0); + } + // 添加图片说明文字 + addSealCaption(paragraph); + + break; + } + } + + } catch (Exception e) { + log.error("插入电子章失败: {}", e.getMessage(), e); + insertTextSeal(document); + } + } + /** + * 添加图片说明文字到指定段落 + */ + private void addSealCaption(XWPFParagraph paragraph) { + XWPFRun run = paragraph.createRun(); + run.setFontFamily("宋体"); + run.setFontSize(11); + run.setColor("000000"); + } + + /** + * 插入文字替代的电子章 + */ + private void insertTextSeal(XWPFDocument document) { + for (XWPFParagraph paragraph : document.getParagraphs()) { + String text = paragraph.getText(); + if (text != null && text.contains("(此处插入电子章)")) { + for (int i = paragraph.getRuns().size() - 1; i >= 0; i--) { + paragraph.removeRun(i); + } + + XWPFRun run = paragraph.createRun(); + run.setText("(电子公章)"); + run.setFontFamily("宋体"); + run.setFontSize(12); + run.setColor("FF0000"); + run.setBold(true); + + break; + } + } + } + /** + * 格式化日期 + */ + private String formatDate(LocalDate date) { + if (date == null) return ""; + return date.format(DateTimeFormatter.ofPattern("yyyy年MM月dd日")); + } + + /** + * 证书数据类 + */ + @Data + @AllArgsConstructor + @NoArgsConstructor + public static class CertificateData { + private String certificateNo; + private String purpose; + private String name; + private String idCard; + private LocalDateTime localDateTime; // 修正字段名为驼峰命名 + } + +} \ No newline at end of file diff --git a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml index 51e291a..6581d96 100644 --- a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml +++ b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyApplyMapper.xml @@ -42,6 +42,9 @@ AND tp_apply.apply_date <= #{queryForm.applyDateEnd} + + AND tp_apply.user_id = #{queryForm.userId} + diff --git a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml index 87352b4..2ab85dc 100644 --- a/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml +++ b/yun-admin/src/main/resources/mapper/penaltyapply/PenaltyLawyerMapper.xml @@ -30,6 +30,11 @@ FROM t_penalty_lawyer + diff --git a/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml b/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml index db6b693..5cb9f02 100644 --- a/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml +++ b/yun-admin/src/main/resources/mapper/service/ServiceApplicationsMapper.xml @@ -67,10 +67,10 @@ and beneficiary_count = #{queryForm.beneficiaryCount} - and organizer_name = #{queryForm.organizerName} + and organizer_name like CONCAT('%', #{queryForm.organizerName}, '%') - and organizer_contact = #{queryForm.organizerContact} + and organizer_contact like CONCAT('%', #{queryForm.organizerContact}, '%') and certificate_number = #{queryForm.certificateNumber} @@ -171,7 +171,7 @@ update t_service_applications set association_audit_status = #{associationAuditStatus}, association_audit_time = now() - where application_id in + where association_audit_status = 0 and application_id in #{item} diff --git a/yun-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml b/yun-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml index 939008a..3a016ef 100644 --- a/yun-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml +++ b/yun-admin/src/main/resources/mapper/system/department/DepartmentMapper.xml @@ -29,6 +29,12 @@ left join t_department parent_department on t_department.parent_id = parent_department.department_id where t_department.department_id = #{departmentId} + \ No newline at end of file diff --git a/yun-admin/src/main/resources/templates/certificate_template.docx b/yun-admin/src/main/resources/templates/certificate_template.docx new file mode 100644 index 0000000000000000000000000000000000000000..da1eb204f5a23b0582f4a9ee03547c4aa90f0896 GIT binary patch literal 11844 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 U#qd*!z5oCK07*qoM6N<$g65~uga7~l literal 0 HcmV?d00001