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 0000000..da1eb20 Binary files /dev/null and b/yun-admin/src/main/resources/templates/certificate_template.docx differ diff --git a/yun-admin/src/main/resources/templates/official_seal.png b/yun-admin/src/main/resources/templates/official_seal.png new file mode 100644 index 0000000..c81d647 Binary files /dev/null and b/yun-admin/src/main/resources/templates/official_seal.png differ