Browse Source

排产后发送邮件给仓库

ecss-tx
han\hanst 1 month ago
parent
commit
5aa8ddaba5
  1. 33
      src/main/java/com/xujie/sys/modules/erf/service/impl/ErfApprovalReminderServiceImpl.java
  2. 110
      src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java
  3. 9
      src/main/java/com/xujie/sys/modules/sys/dao/SysUserDao.java
  4. 12
      src/main/resources/mapper/sys/SysUserDao.xml

33
src/main/java/com/xujie/sys/modules/erf/service/impl/ErfApprovalReminderServiceImpl.java

@ -25,6 +25,7 @@ import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.time.LocalDate;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter; import java.time.format.DateTimeFormatter;
import java.util.*; import java.util.*;
@ -528,32 +529,38 @@ public class ErfApprovalReminderServiceImpl implements ErfApprovalReminderServic
emailBody.append("<h3>尊敬的 ").append(plannerName).append(" 计划员:</h3>"); emailBody.append("<h3>尊敬的 ").append(plannerName).append(" 计划员:</h3>");
emailBody.append("<p>您好!系统检测到您有 <b>").append(applyList.size()).append("</b> 个待排产的工程实验试验单,请及时安排排产。</p>"); emailBody.append("<p>您好!系统检测到您有 <b>").append(applyList.size()).append("</b> 个待排产的工程实验试验单,请及时安排排产。</p>");
emailBody.append("<hr/>"); emailBody.append("<hr/>");
emailBody.append("<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse; width: 100%;'>");
emailBody.append("<thead style='background-color: #2196F3; color: white;'>");
emailBody.append("<table border='1' cellpadding='6' cellspacing='0' style='border-collapse:collapse; width:100%; font-size:13px;'>");
emailBody.append("<thead style='background-color:#2196F3; color:white;'>");
emailBody.append("<tr>"); emailBody.append("<tr>");
emailBody.append("<th>序号</th>"); emailBody.append("<th>序号</th>");
emailBody.append("<th>项目号</th>");
emailBody.append("<th>试验单号</th>"); emailBody.append("<th>试验单号</th>");
emailBody.append("<th>事业部</th>");
emailBody.append("<th>试验名称</th>");
emailBody.append("<th>实验类型</th>");
emailBody.append("<th>创建人</th>");
emailBody.append("<th>创建时间</th>");
emailBody.append("<th>项目名称</th>");
emailBody.append("<th>安排生产工序</th>");
emailBody.append("<th>数量</th>");
emailBody.append("<th>备注</th>");
emailBody.append("<th>需求日期</th>");
emailBody.append("<th>工程师</th>");
emailBody.append("</tr>"); emailBody.append("</tr>");
emailBody.append("</thead>"); emailBody.append("</thead>");
emailBody.append("<tbody>"); emailBody.append("<tbody>");
int index = 1; int index = 1;
for (ErfExpApply apply : applyList) { for (ErfExpApply apply : applyList) {
String expectedFinishDateStr = apply.getExpectedFinishDate() != null
? DateTimeFormatter.ofPattern("yyyy-MM-dd")
.format(apply.getExpectedFinishDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime())
: "";
emailBody.append("<tr>"); emailBody.append("<tr>");
emailBody.append("<td>").append(index++).append("</td>"); emailBody.append("<td>").append(index++).append("</td>");
emailBody.append("<td>").append(apply.getApplyNo()).append("</td>");
emailBody.append("<td>").append(apply.getBuNo() != null ? apply.getBuNo() : "").append("</td>");
emailBody.append("<td>").append(apply.getProjectNo() != null ? apply.getProjectNo() : "").append("</td>");
emailBody.append("<td>").append(apply.getApplyNo() != null ? apply.getApplyNo() : "").append("</td>");
emailBody.append("<td>").append(apply.getTitle() != null ? apply.getTitle() : "").append("</td>"); emailBody.append("<td>").append(apply.getTitle() != null ? apply.getTitle() : "").append("</td>");
emailBody.append("<td>").append(apply.getExperimentType() != null ? apply.getExperimentType() : "").append("</td>");
emailBody.append("<td>").append(apply.getProcessRequirement() != null ? apply.getProcessRequirement() : "").append("</td>");
emailBody.append("<td>").append(apply.getQuantityReq() != null ? apply.getQuantityReq() : "").append("</td>");
emailBody.append("<td>").append(apply.getRemark() != null ? apply.getRemark() : "").append("</td>");
emailBody.append("<td>").append(expectedFinishDateStr).append("</td>");
emailBody.append("<td>").append(apply.getCreatorName() != null ? apply.getCreatorName() : "").append("</td>"); emailBody.append("<td>").append(apply.getCreatorName() != null ? apply.getCreatorName() : "").append("</td>");
emailBody.append("<td>").append(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm")
.format(apply.getCreateTime().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime()))
.append("</td>");
emailBody.append("</tr>"); emailBody.append("</tr>");
} }

110
src/main/java/com/xujie/sys/modules/erf/service/impl/ErfExpApplyServiceImpl.java

@ -616,6 +616,9 @@ public class ErfExpApplyServiceImpl extends ServiceImpl<ErfExpApplyMapper, ErfEx
erfFlowEngineService.moveToNextNode(data.getApplyNo(), "计划员排产", null); erfFlowEngineService.moveToNextNode(data.getApplyNo(), "计划员排产", null);
log.info("排产完成,已自动流转到下一节点"); log.info("排产完成,已自动流转到下一节点");
// 排产完成后向仓库角色用户发送邮件通知
sendWarehouseNotification(entity);
log.info("计划员排产完成"); log.info("计划员排产完成");
} }
@ -1528,6 +1531,113 @@ public class ErfExpApplyServiceImpl extends ServiceImpl<ErfExpApplyMapper, ErfEx
} }
} }
/**
* 排产完成后向仓库角色用户发送邮件通知
* 邮件内容包含试验单信息表格和原材料清单
*
* @param entity 试验单实体
*/
private void sendWarehouseNotification(ErfExpApply entity) {
try {
MailSendAddressData mailSendData = qcMapper.getSendMailFromAddress();
if (mailSendData == null) {
log.error("邮件发送配置未设置,无法发送仓库通知邮件");
return;
}
// 查询角色名称为"仓库"且备注为"工程实验申请"的用户邮箱列表
List<UserEmailInfoDto> warehouseUsers = sysUserDao.getUserEmailListByRoleNameAndRemark("仓库", "工程实验申请");
if (warehouseUsers == null || warehouseUsers.isEmpty()) {
log.warn("未找到仓库角色(备注=工程实验申请)的用户,跳过发送邮件");
return;
}
String todayStr = DateTimeFormatter.ofPattern("yyyy-MM-dd").format(LocalDateTime.now());
String expectedFinishDateStr = entity.getExpectedFinishDate() != null
? DateTimeFormatter.ofPattern("yyyy-MM-dd")
.format(entity.getExpectedFinishDate().toInstant().atZone(java.time.ZoneId.systemDefault()).toLocalDateTime())
: "";
// 构建试验单信息表格
String mainTable = buildPlannerNotificationTable(entity, todayStr, expectedFinishDateStr);
// 构建原材料清单表格
List<ErfExpRawMaterial> rawMaterials = erfExpRawMaterialService.getRawMaterialListByApplyNo(entity.getApplyNo());
String rawMaterialTable = buildRawMaterialTable(rawMaterials);
String subject = String.format("【排产通知】%s - %s",
entity.getApplyNo(), entity.getTitle() != null ? entity.getTitle() : "");
List<String> successEmails = new ArrayList<>();
for (UserEmailInfoDto warehouseUser : warehouseUsers) {
try {
String body = "<html><body>"
+ "<h3>尊敬的 " + warehouseUser.getUsername() + ":</h3>"
+ "<p>您好!以下工程实验试验单已完成排产,请做好相应备料准备。</p>"
+ "<hr/>" + mainTable
+ "<br/><h4>原材料清单:</h4>" + rawMaterialTable
+ "<br/><p style='color:#888;'>发送时间:"
+ LocalDateTime.now().format(DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"))
+ "</p></body></html>";
MailUtil.sendMail(subject, body, new String[]{warehouseUser.getEmail()}, mailSendData);
successEmails.add(warehouseUser.getEmail());
log.info("已向仓库用户 {} ({}) 发送排产通知邮件,试验单: {}",
warehouseUser.getUsername(), warehouseUser.getEmail(), entity.getApplyNo());
} catch (Exception e) {
log.error("向仓库用户 {} 发送邮件失败: {}", warehouseUser.getEmail(), e.getMessage());
}
}
if (!successEmails.isEmpty()) {
SendMailRecord mailRecord = new SendMailRecord();
mailRecord.setType("工程实验申请排产通知");
mailRecord.setDocumentNo(entity.getApplyNo());
mailRecord.setRecipient(String.join(";", successEmails));
mailRecord.setSendDate(new Date());
qcMapper.saveSendMailRecord(mailRecord);
}
} catch (Exception e) {
log.error("发送仓库排产通知邮件失败,试验单: {}, 错误: {}", entity.getApplyNo(), e.getMessage(), e);
}
}
/**
* 构建原材料清单 HTML 表格
*
* @param rawMaterials 原材料清单列表
* @return HTML 表格字符串
*/
private String buildRawMaterialTable(List<ErfExpRawMaterial> rawMaterials) {
StringBuilder sb = new StringBuilder();
sb.append("<table border='1' cellpadding='6' cellspacing='0' ")
.append("style='border-collapse:collapse; width:100%; font-size:13px;'>")
.append("<thead style='background-color:#4CAF50; color:white;'><tr>")
.append("<th>序号</th><th>物料编码</th><th>物料描述</th><th>数量</th><th>计量单位</th><th>备注</th>")
.append("</tr></thead><tbody>");
if (rawMaterials == null || rawMaterials.isEmpty()) {
sb.append("<tr><td colspan='6' style='text-align:center;'>暂无原材料</td></tr>");
} else {
int index = 1;
for (ErfExpRawMaterial rm : rawMaterials) {
sb.append("<tr>")
.append("<td>").append(index++).append("</td>")
.append("<td>").append(rm.getPartNo() != null ? rm.getPartNo() : "").append("</td>")
.append("<td>").append(rm.getPartDesc() != null ? rm.getPartDesc() : "").append("</td>")
.append("<td>").append(rm.getQuantity() != null ? rm.getQuantity().toPlainString() : "").append("</td>")
.append("<td>").append(rm.getUmid() != null ? rm.getUmid() : "").append("</td>")
.append("<td>").append(rm.getRemark() != null ? rm.getRemark() : "").append("</td>")
.append("</tr>");
}
}
sb.append("</tbody></table>");
return sb.toString();
}
private String buildPlannerNotificationTable(ErfExpApply entity, String todayStr, String expectedFinishDateStr) { private String buildPlannerNotificationTable(ErfExpApply entity, String todayStr, String expectedFinishDateStr) {
return "<table border='1' cellpadding='6' cellspacing='0' " return "<table border='1' cellpadding='6' cellspacing='0' "
+ "style='border-collapse:collapse; width:100%; font-size:13px;'>" + "style='border-collapse:collapse; width:100%; font-size:13px;'>"

9
src/main/java/com/xujie/sys/modules/sys/dao/SysUserDao.java

@ -55,6 +55,15 @@ public interface SysUserDao extends BaseMapper<SysUserEntity> {
*/ */
List<UserEmailInfoDto> getUserEmailListByRoleName(@Param("roleName") String roleName); List<UserEmailInfoDto> getUserEmailListByRoleName(@Param("roleName") String roleName);
/**
* 根据角色名称和角色备注查询用户邮件信息
*
* @param roleName 角色名称
* @param roleRemark 角色备注
* @return 用户邮件信息列表
*/
List<UserEmailInfoDto> getUserEmailListByRoleNameAndRemark(@Param("roleName") String roleName, @Param("roleRemark") String roleRemark);
/** /**
* 根据用户ID查询用户邮件信息 * 根据用户ID查询用户邮件信息
* *

12
src/main/resources/mapper/sys/SysUserDao.xml

@ -88,6 +88,18 @@
AND su.email != '' AND su.email != ''
</select> </select>
<!-- 根据角色名称和角色备注查询用户邮件信息 -->
<select id="getUserEmailListByRoleNameAndRemark" resultType="com.xujie.sys.modules.sys.dto.UserEmailInfoDto">
SELECT su.user_id, su.username, su.email
FROM sys_user su
INNER JOIN sys_user_role sur ON su.user_id = sur.user_id
INNER JOIN sys_role sr ON sur.role_id = sr.role_id
WHERE sr.role_name = #{roleName}
AND sr.remark = #{roleRemark}
AND su.email IS NOT NULL
AND su.email != ''
</select>
<!-- 根据用户ID查询用户邮件信息 --> <!-- 根据用户ID查询用户邮件信息 -->
<select id="getUserEmailInfoById" resultType="com.xujie.sys.modules.sys.dto.UserEmailInfoDto"> <select id="getUserEmailInfoById" resultType="com.xujie.sys.modules.sys.dto.UserEmailInfoDto">
SELECT user_id, username, email SELECT user_id, username, email

Loading…
Cancel
Save