diff --git a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/AdjudicationController.java b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/AdjudicationController.java index 8b861b6..024a64e 100644 --- a/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/AdjudicationController.java +++ b/ruoyi-admin/src/main/java/com/ruoyi/web/controller/wisdomarbitrate/AdjudicationController.java @@ -6,10 +6,7 @@ import com.ruoyi.wisdomarbitrate.domain.CaseApplication; import com.ruoyi.wisdomarbitrate.service.IAdjudicationService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.validation.annotation.Validated; -import org.springframework.web.bind.annotation.PostMapping; -import org.springframework.web.bind.annotation.RequestBody; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/adjudication") @@ -26,8 +23,27 @@ public class AdjudicationController extends BaseController { public AjaxResult createDocument(@Validated @RequestBody CaseApplication caseApplication){ return adjudicationService.createDocument(caseApplication); } - @PostMapping("/") - public AjaxResult sendDocumentByEmail(){ - return adjudicationService.sendDocumentByEmail(); + + /** + * 裁决书送达(电子邮件) + * @param id 案件id + * @param appEmail 申请人邮箱 + * @param resEmail 被申请人邮箱 + * @return + */ + @PostMapping("/delivery") + public AjaxResult sendDocumentByEmail(Long id,String appEmail,String resEmail){ + return adjudicationService.sendDocumentByEmail(id,appEmail,resEmail); + } + + /** + * 根据快递单号查询物流信息 + * @param trackingNum 单号 + * @param phoneLastFour 收/寄件人手机号后四位,顺丰快递需填写本字段。 + * @return + */ + @GetMapping("/logistics") + public AjaxResult getLogisticsInfo(String trackingNum,Integer phoneLastFour){ + return adjudicationService.getLogisticsInfo(trackingNum,phoneLastFour); } } diff --git a/ruoyi-admin/src/main/resources/application.yml b/ruoyi-admin/src/main/resources/application.yml index 17c2d28..b82b349 100644 --- a/ruoyi-admin/src/main/resources/application.yml +++ b/ruoyi-admin/src/main/resources/application.yml @@ -92,30 +92,16 @@ spring: resources: static-locations: file:/home/ruoyi/ mail: - # 邮件服务地址 host: smtp.163.com - # 默认端口25,可不写 port: 25 - # 编码格式 - default-encoding: utf-8 - # 发送者用户名 - username: xxx@163.com - # 授权码,刚才获取的代码 - password: xxx - # 其它参数 - # properties: - # mail: - # smtp: - # # 如果是用 SSL 方式,需要配置如下属性 - # ssl: - # enable: true - # required: true - # # 邮件接收时间的限制,单位毫秒 - # timeout: 10000 - # # 连接时间的限制,单位毫秒 - # connectiontimeout: 10000 - # # 邮件发送时间的限制,单位毫秒 - # writetimeout: 10000 + username: hjbjava@163.com + password: BSRSSEPJWGNNVYYL + default-encoding: UTF-8 + properties: + mail: + smtp: + socketFactoryClass: javax.net.ssl.SSLSocketFactory + debug: false # token配置 token: diff --git a/ruoyi-common/pom.xml b/ruoyi-common/pom.xml index 7f49eaa..4efdee7 100644 --- a/ruoyi-common/pom.xml +++ b/ruoyi-common/pom.xml @@ -159,6 +159,21 @@ 3.1.4 + + javax.activation + activation + 1.1.1 + + + + + javax.mail + mail + 1.4.7 + + + + \ No newline at end of file diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/EmailOutUtil.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EmailOutUtil.java new file mode 100644 index 0000000..f796034 --- /dev/null +++ b/ruoyi-common/src/main/java/com/ruoyi/common/utils/EmailOutUtil.java @@ -0,0 +1,187 @@ +package com.ruoyi.common.utils; + + +import lombok.Data; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; + +import org.springframework.mail.javamail.JavaMailSender; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.stereotype.Component; + +import javax.mail.MessagingException; +import javax.mail.internet.MimeMessage; +import javax.validation.constraints.NotNull; +import java.io.File; +import java.io.IOException; +import java.util.List; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +/** + * @ClassName EmailInUtil + * @Description 邮件发送工具 + */ +@Component +@Data +@Slf4j +public class EmailOutUtil { + private static Pattern emailPattern = Pattern.compile("^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\\.[a-zA-Z0-9_-]+)+$"); + // private static Pattern phonePattern = Pattern.compile("0?(13|14|15|18)[0-9]{9}"); + private static Pattern phonePattern = Pattern.compile("^1\\d{10}$"); + + +// @Autowired +// private JavaMailSender mailSender; + + // 发送发邮箱地址(外网地址) +// @Value("${spring.mail-out-network.from}") +// private static String fromOut; + @Value("${spring.mail.host}") + private String hostOut; + @Value("${spring.mail.username}") + private String usernameOut; + @Value("${spring.mail.password}") + private String passwordOut; + @Value("${spring.mail.port}") + private Integer portOut; + + public JavaMailSender rebuildMailSender() { + JavaMailSenderImpl mailSender = new JavaMailSenderImpl(); + mailSender.setHost(hostOut); + mailSender.setUsername(usernameOut); + mailSender.setPassword(passwordOut); + mailSender.setPort(portOut); + mailSender.setProtocol("smtp"); + mailSender.setDefaultEncoding("UTF-8"); + return mailSender; + } + + /** + * 发送纯文本邮件信息 + * + * @param to 接收方 + * @param subject 邮件主题 + * @param content 邮件内容(发送内容) + */ + public void sendMessage(String to, String subject, String content, String from, JavaMailSender mailSender) { + // 创建一个邮件对象 + SimpleMailMessage msg = new SimpleMailMessage(); + msg.setFrom(from); + msg.setTo(to); + // 设置邮件主题 + msg.setSubject(subject); + // 设置邮件内容 + msg.setText(content); + // 发送邮件 + mailSender.send(msg); + ////System.out.println("发送成功:" + from + ":to:" + to); + } + + /** + * 发送带附件的邮件信息 + * + * @param to 接收方 + * @param subject 邮件主题 + * @param content 邮件内容(发送内容) + * @param fileList 文件集合 // 可发送多个附件 + */ + public void sendMessageCarryFiles(String to, String subject, String content, List fileList, String from, @NotNull JavaMailSender mailSender) { + MimeMessage mimeMessage = mailSender.createMimeMessage(); + try { + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(from); + helper.setTo(to); + // 设置邮件主题 + helper.setSubject(subject); + // 设置邮件内容 + helper.setText(content); + // 添加附件(多个) + if (fileList != null && fileList.size() > 0) { + for (File file : fileList) { + helper.addAttachment(file.getName(), file); + } + } + } catch (MessagingException e) { + e.printStackTrace(); + } + // 发送邮件 + mailSender.send(mimeMessage); + } + + /** + * 发送带附件的邮件信息 + * + * @param to 接收方 + * @param subject 邮件主题 + * @param content 邮件内容(发送内容) + * @param file 单个文件 + */ + public void sendMessageCarryFile(String to, String subject, String content, File file, String from, JavaMailSender mailSender) { + MimeMessage mimeMessage = mailSender.createMimeMessage(); + try { + MimeMessageHelper helper = new MimeMessageHelper(mimeMessage, true); + helper.setFrom(from); + helper.setTo(to); + // 设置邮件主题 + helper.setSubject(subject); + // 设置邮件内容 + helper.setText(content); + // 单个附件 + helper.addAttachment(file.getName(), file); + } catch (MessagingException e) { + e.printStackTrace(); + } + // 发送邮件 + mailSender.send(mimeMessage); + } + + /** + * 初始化内外网邮件发送对象 + * + * @param num + */ +// public static JavaMailSender initJavaMailSender(Integer num) { +// if (num != null && num == 1) { +// //内网 +// return rebuildMailSender(hostIn, usernameIn, passwordIn, Integer.parseInt(portIn), "smtps"); +// } else { +// //外网 +// return rebuildMailSender(hostOut, usernameOut, passwordOut, Integer.parseInt(portOut), "smtps"); +// } +// } + +// public static String getInnerFrom() { +// return EmailInUtil; +// } +// +// public static String getOutterFrom() { +// return fromOut; +// } + + /** + * 验证邮箱格式 + * + * @param str + * @return + */ + public static boolean isEmail(String str) { + boolean flag = false; + Matcher matcher = emailPattern.matcher(str); + if (matcher.matches()) { + flag = true; + } + return flag; + } + + public static boolean isPhoneNumber(String str) { + boolean flag = false; + Matcher matcher = phonePattern.matcher(str); + if (matcher.matches()) { + flag = true; + } + return flag; + } +} diff --git a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SendMailUtils.java b/ruoyi-common/src/main/java/com/ruoyi/common/utils/SendMailUtils.java deleted file mode 100644 index 71cba3e..0000000 --- a/ruoyi-common/src/main/java/com/ruoyi/common/utils/SendMailUtils.java +++ /dev/null @@ -1,49 +0,0 @@ -//package com.ruoyi.common.utils; -// -// -//import jakarta.mail.internet.MimeMessage; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.core.io.FileSystemResource; -//import org.springframework.mail.javamail.JavaMailSender; -//import org.springframework.mail.javamail.MimeMessageHelper; -//import org.springframework.stereotype.Component; -// -//import java.io.File; -//import java.util.List; -// -//@Component -//public class SendMailUtils { -// private static final String SENDER = "xxx@163.com"; -// @Autowired -// private JavaMailSender mailSender; -// /** -// * 发送带附件的邮件 -// * -// * @param to 收件人 -// * @param subject 主题 -// * @param content 内容 -// * @param fileList 附件 -// */ -// public void sendFileMail(String to, String subject, String content, List fileList) { -// MimeMessage message = mailSender.createMimeMessage(); -// try { -// //true表示需要创建一个multipart message -// MimeMessageHelper helper = new MimeMessageHelper(message, true); -// helper.setFrom(SENDER); -// helper.setTo(to); -// helper.setSubject(subject); -// helper.setText(content, true); -// -// if (fileList != null && fileList.size() > 0) { -// for (File file : fileList) { -// FileSystemResource fileSystemResource = new FileSystemResource(file); -// String fileName = fileSystemResource.getFilename(); -// helper.addAttachment(fileName, fileSystemResource); -// } -// } -// mailSender.send(message); -// } catch (MessagingException e) { -// System.out.println("发送带附件的邮件时发生异常!" + e); -// } -// } -//} diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/IAdjudicationService.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/IAdjudicationService.java index 9d9c4bb..675cc72 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/IAdjudicationService.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/IAdjudicationService.java @@ -6,6 +6,7 @@ import com.ruoyi.wisdomarbitrate.domain.CaseApplication; public interface IAdjudicationService { AjaxResult createDocument(CaseApplication caseApplication); - AjaxResult sendDocumentByEmail(); + AjaxResult sendDocumentByEmail(Long id,String appEmail,String resEmail); + AjaxResult getLogisticsInfo(String trackingNum,Integer phoneLastFour); } diff --git a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/AdjudicationServiceImpl.java b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/AdjudicationServiceImpl.java index d621364..87072c8 100644 --- a/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/AdjudicationServiceImpl.java +++ b/ruoyi-system/src/main/java/com/ruoyi/wisdomarbitrate/service/impl/AdjudicationServiceImpl.java @@ -3,6 +3,7 @@ package com.ruoyi.wisdomarbitrate.service.impl; import com.deepoove.poi.config.Configure; import com.ruoyi.common.constant.CaseApplicationConstants; import com.ruoyi.common.core.domain.AjaxResult; +import com.ruoyi.common.utils.EmailOutUtil; import com.ruoyi.common.utils.WordUtil; import com.ruoyi.wisdomarbitrate.domain.*; import com.ruoyi.wisdomarbitrate.mapper.ArbitrateRecordMapper; @@ -12,9 +13,14 @@ import com.ruoyi.wisdomarbitrate.mapper.CaseAttachMapper; import com.ruoyi.wisdomarbitrate.service.IAdjudicationService; import org.apache.poi.xwpf.usermodel.*; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.mail.MailSendException; +import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; import java.io.*; +import java.net.HttpURLConnection; +import java.net.URL; +import java.net.URLEncoder; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.StandardCopyOption; @@ -25,6 +31,8 @@ import java.util.*; @Service public class AdjudicationServiceImpl implements IAdjudicationService { + private final String apiUrl = "http://api.cainiaoapi.com/api/exp/v1/index"; + @Autowired private CaseApplicationMapper caseApplicationMapper; @Autowired @@ -33,13 +41,15 @@ public class AdjudicationServiceImpl implements IAdjudicationService { private ArbitrateRecordMapper arbitrateRecordMapper; @Autowired private CaseAttachMapper caseAttachMapper; + @Autowired + private EmailOutUtil emailOutUtil; @Override public AjaxResult createDocument(CaseApplication caseApplication) { try { Map datas = new HashMap<>(); Long id = caseApplication.getId(); - if (id == null){ + if (id == null) { return null; } //获取案件详细信息 @@ -53,8 +63,8 @@ public class AdjudicationServiceImpl implements IAdjudicationService { CaseAffiliate caseAffiliate = new CaseAffiliate(); caseAffiliate.setCaseAppliId(id); List caseAffiliates = caseAffiliateMapper.selectCaseAffiliate(caseAffiliate); - if (caseAffiliates != null && caseAffiliates.size() > 0){ - for (CaseAffiliate affiliate : caseAffiliates){ + if (caseAffiliates != null && caseAffiliates.size() > 0) { + for (CaseAffiliate affiliate : caseAffiliates) { //获取身份类型 int identityType = affiliate.getIdentityType(); if (identityType == 1) { //申请人 @@ -62,34 +72,34 @@ public class AdjudicationServiceImpl implements IAdjudicationService { datas.put("appIDNo", affiliate.getIdentityNum()); datas.put("appAddress", affiliate.getContactAddress()); datas.put("appAgentName", affiliate.getNameAgent()); - datas.put("appAgentIDNo",affiliate.getIdentityNumAgent()); - }else if (identityType == 2){ //被申请人 + datas.put("appAgentIDNo", affiliate.getIdentityNumAgent()); + } else if (identityType == 2) { //被申请人 datas.put("resName", affiliate.getName()); datas.put("resIDNo", affiliate.getIdentityNum()); datas.put("resAddress", affiliate.getContactAddress()); datas.put("resAgentName", affiliate.getNameAgent()); - datas.put("resAgentIDNo",affiliate.getIdentityNumAgent()); + datas.put("resAgentIDNo", affiliate.getIdentityNumAgent()); } } } String arbitratorName = caseApplication1.getArbitratorName(); - datas.put("caseName",caseApplication1.getCaseName()); - datas.put("arbitratorName",arbitratorName); + datas.put("caseName", caseApplication1.getCaseName()); + datas.put("arbitratorName", arbitratorName); Date hearDate = caseApplication1.getHearDate(); if (hearDate != null) { LocalDate localDate = hearDate.toInstant() .atZone(ZoneId.systemDefault()) .toLocalDate(); - datas.put("hearYear", localDate.getYear()); - datas.put("hearMonths", localDate.getMonthValue()); - datas.put("hearDay", localDate.getDayOfMonth()); - }else { - datas.put("hearYear", null); - datas.put("hearMonths", null); - datas.put("hearDay", null); + datas.put("hearYear", localDate.getYear()); + datas.put("hearMonths", localDate.getMonthValue()); + datas.put("hearDay", localDate.getDayOfMonth()); + } else { + datas.put("hearYear", null); + datas.put("hearMonths", null); + datas.put("hearDay", null); } - datas.put("appArbitrationClaims", caseApplication1.getArbitratClaims()); - if (arbitrateRecord1!=null){ + datas.put("appArbitrationClaims", caseApplication1.getArbitratClaims()); + if (arbitrateRecord1 != null) { datas.put("evidenDetermi", arbitrateRecord1.getEvidenDetermi()); datas.put("factDetermi", arbitrateRecord1.getFactDetermi()); datas.put("caseSketch", arbitrateRecord1.getCaseSketch()); @@ -97,10 +107,10 @@ public class AdjudicationServiceImpl implements IAdjudicationService { datas.put("rulingFollows", arbitrateRecord1.getRulingFollows()); } datas.put("legalProvisions", "仲裁法"); - if (arbitratorName==null){ + if (arbitratorName == null) { datas.put("arbitratorName1", null); datas.put("arbitratorName2", null); - }else if (arbitratorName.contains(",")){ + } else if (arbitratorName.contains(",")) { String[] nameArray = arbitratorName.split(","); String firstName = nameArray[0]; String secondName = nameArray[1]; @@ -115,10 +125,10 @@ public class AdjudicationServiceImpl implements IAdjudicationService { datas.put("year", now.getYear()); datas.put("months", now.getMonthValue()); datas.put("day", now.getDayOfMonth()); - String modalFilePath = "/data/arbitrate-document/template/仲裁裁决书模板.docx"; - //String modalFilePath = "D:/develop/仲裁裁决书模板 (2).docx"; - String saveFolderPath = "/data/arbitrate-document/formal/" + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth(); - //String saveFolderPath = "D:/data/" + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth(); + //String modalFilePath = "/data/arbitrate-document/template/仲裁裁决书模板.docx"; + String modalFilePath = "D:/develop/仲裁裁决书模板 (2).docx"; + //String saveFolderPath = "/data/arbitrate-document/formal/" + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth(); + String saveFolderPath = "D:/data/" + now.getYear() + "/" + now.getMonthValue() + "/" + now.getDayOfMonth(); String fileName = UUID.randomUUID().toString().replace("-", "") + ".docx"; String resultFilePath = saveFolderPath + "/" + fileName; // 创建日期目录 @@ -129,7 +139,7 @@ public class AdjudicationServiceImpl implements IAdjudicationService { Path sourcePath = new File(modalFilePath).toPath(); Path destinationPath = new File(resultFilePath).toPath(); Files.copy(sourcePath, destinationPath, StandardCopyOption.REPLACE_EXISTING); - String docFilePath = WordUtil.getDocFilePath(datas,modalFilePath,resultFilePath); + String docFilePath = WordUtil.getDocFilePath(datas, modalFilePath, resultFilePath); //修改案件状态 caseApplication1.setCaseStatus(CaseApplicationConstants.VERPRIF_ARBITRATION); caseApplicationMapper.submitCaseApplication(caseApplication1); @@ -141,8 +151,8 @@ public class AdjudicationServiceImpl implements IAdjudicationService { .annexType(3) .build(); int i = caseAttachMapper.save(caseAttach); - if (i>0){ - if (arbitrateRecord1!=null){ + if (i > 0) { + if (arbitrateRecord1 != null) { Integer annexId = caseAttach.getAnnexId(); //将附件id保存到仲裁记录表里面 arbitrateRecord1.setAnnexId(annexId); @@ -157,7 +167,81 @@ public class AdjudicationServiceImpl implements IAdjudicationService { } @Override - public AjaxResult sendDocumentByEmail() { + public AjaxResult sendDocumentByEmail(Long id, String appEmail, String resEmail) { + CaseApplication caseApplication = new CaseApplication(); + caseApplication.setId(id); + CaseApplication caseApplication1 = caseApplicationMapper.selectCaseApplication(caseApplication); + if (caseApplication1 == null) { + return AjaxResult.error("未查询到相关案件"); + } + + //根据案件id查询裁决书 + try { + List fileList = new ArrayList<>(); + List caseAttachList = caseAttachMapper.queryAnnexPathByCaseId(id); + if (caseAttachList != null && caseAttachList.size() > 0) { + for (CaseAttach caseAttach : caseAttachList) { + if (caseAttach.getAnnexType() == 3) { + String annexPath = caseAttach.getAnnexPath(); + fileList.add(new File(annexPath)); + } + } + } + //电子邮件送达 + JavaMailSender javaMailSender = emailOutUtil.rebuildMailSender(); + if (appEmail != null) { + emailOutUtil.sendMessageCarryFiles(appEmail, "案件裁决书", "您的裁决书已送达,详情请查阅附件", fileList + , "hjbjava@163.com", javaMailSender); + } + if (resEmail != null) { + emailOutUtil.sendMessageCarryFiles(resEmail, "案件裁决书", "您的裁决书已送达,详情请查阅附件", fileList + , "hjbjava@163.com", javaMailSender); + } + //修改案件状态 + caseApplication1.setCaseStatus(CaseApplicationConstants.CASE_FILING); + caseApplicationMapper.submitCaseApplication(caseApplication1); + return AjaxResult.success("仲裁文书送达成功"); + } catch (MailSendException e) { + return AjaxResult.error("发送失败,请检查文件路径"); + } + } + + @Override + public AjaxResult getLogisticsInfo(String trackingNum, Integer phoneLastFour) { + try { + //快递单号查询 + String key = "70ba5c7b327f71fccd5924f70e3e7b7f"; + String com = "auto"; + // 构造查询字符串参数 + String queryParameters = String.format("key=%s&com=%s&no=%s&phone=%d", + URLEncoder.encode(key, "UTF-8"), + URLEncoder.encode(com, "UTF-8"), + URLEncoder.encode(trackingNum, "UTF-8"), + phoneLastFour); + // 拼接到API URL中 + String fullUrl = apiUrl + "?" + queryParameters; + URL url = new URL(fullUrl); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("GET"); + int responseCode = connection.getResponseCode(); + if (responseCode == HttpURLConnection.HTTP_OK) { + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + String line; + StringBuilder response = new StringBuilder(); + while ((line = reader.readLine()) != null) { + response.append(line); + } + reader.close(); + // 处理返回的响应数据 + return AjaxResult.success(response); + } else { + // 请求失败 + return AjaxResult.error("请求失败,错误码:" + responseCode); + } + } catch (IOException e) { + e.printStackTrace(); + + } return null; } } \ No newline at end of file