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