Преглед на файлове

Add Mail function

production_process
cyril.tsui преди 2 месеца
родител
ревизия
03138c8a05
променени са 16 файла, в които са добавени 329 реда и са изтрити 58 реда
  1. +40
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLog.kt
  2. +24
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLogLine.kt
  3. +8
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLogLineRepository.kt
  4. +8
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLogRepository.kt
  5. +48
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailTemplate.kt
  6. +12
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailTemplateRepository.kt
  7. +5
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/enums/MailTemplateType.kt
  8. +2
    -25
      src/main/java/com/ffii/fpsms/modules/common/mail/service/MailReminderService.kt
  9. +7
    -29
      src/main/java/com/ffii/fpsms/modules/common/mail/service/MailService.kt
  10. +62
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/service/MailTemplateService.kt
  11. +5
    -3
      src/main/java/com/ffii/fpsms/modules/common/mail/web/MailController.kt
  12. +25
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/web/MailTemplateController.kt
  13. +2
    -1
      src/main/java/com/ffii/fpsms/modules/common/mail/web/models/MailSaveRequest.kt
  14. +19
    -0
      src/main/java/com/ffii/fpsms/modules/common/mail/web/models/MailTemplateRequest.kt
  15. +24
    -0
      src/main/resources/db/changelog/changes/20250609_01_cyril/01_create_mail_template.sql
  16. +38
    -0
      src/main/resources/db/changelog/changes/20250609_01_cyril/02_create_mail_send_log.sql

+ 40
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLog.kt Целия файл

@@ -0,0 +1,40 @@
package com.ffii.fpsms.modules.common.mail.entity

import com.ffii.core.entity.BaseEntity
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size
import java.time.LocalDateTime

@Entity
@Table(name = "mail_send_log")
open class MailSendLog : BaseEntity<Long>() {

@NotNull
@ManyToOne
@JoinColumn(name = "tempId", nullable = false)
open var temp: MailSendLog? = null

@Size(max = 255)
@NotNull
@Column(name = "tempDesc", nullable = false)
open var tempDesc: String? = null

@Size(max = 255)
@Column(name = "senderMail")
open var senderMail: String? = null

@Column(name = "subject")
open var subject: String? = null

@Lob
@Column(name = "content")
open var content: String? = null

@Column(name = "sendDate")
open var sendDate: LocalDateTime? = null

@Lob
@Column(name = "errorMessage")
open var errorMessage: String? = null
}

+ 24
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLogLine.kt Целия файл

@@ -0,0 +1,24 @@
package com.ffii.fpsms.modules.common.mail.entity

import com.ffii.core.entity.BaseEntity
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size

@Entity
@Table(name = "mail_send_log_line")
open class MailSendLogLine : BaseEntity<Long>() {

@NotNull
@ManyToOne
@JoinColumn(name = "sendMailLogId", nullable = false)
open var sendMailLog: MailSendLog? = null

@Size(max = 255)
@Column(name = "toMail")
open var toMail: String? = null

@Lob
@Column(name = "errorMessage")
open var errorMessage: String? = null
}

+ 8
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLogLineRepository.kt Целия файл

@@ -0,0 +1,8 @@
package com.ffii.fpsms.modules.common.mail.entity

import com.ffii.core.support.AbstractRepository
import org.springframework.stereotype.Repository

@Repository
interface MailSendLogLineRepository : AbstractRepository<MailSendLogLine, Long> {
}

+ 8
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailSendLogRepository.kt Целия файл

@@ -0,0 +1,8 @@
package com.ffii.fpsms.modules.common.mail.entity

import com.ffii.core.support.AbstractRepository
import org.springframework.stereotype.Repository

@Repository
interface MailSendLogRepository : AbstractRepository<MailSendLog, Long> {
}

+ 48
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailTemplate.kt Целия файл

@@ -0,0 +1,48 @@
package com.ffii.fpsms.modules.common.mail.entity

import com.ffii.core.entity.BaseEntity
import jakarta.persistence.*
import jakarta.validation.constraints.NotNull
import jakarta.validation.constraints.Size

@Entity
@Table(name = "mail_template")
open class MailTemplate : BaseEntity<Long>() {
@Column(name = "`to`")
open var to: String? = null

@Column(name = "cc")
open var cc: String? = null

@Size(max = 255)
@NotNull
@Column(name = "code", nullable = false)
open var code: String? = null

@Size(max = 255)
@NotNull
@Column(name = "description", nullable = false)
open var description: String? = null

@Size(max = 30)
@Column(name = "type", length = 30)
open var type: String? = null

@Size(max = 255)
@Column(name = "params")
open var params: String? = null

@Column(name = "subjectCht")
open var subjectCht: String? = null

@Column(name = "subjectEng")
open var subjectEng: String? = null

@Lob
@Column(name = "contentCht")
open var contentCht: String? = null

@Lob
@Column(name = "contentEng")
open var contentEng: String? = null
}

+ 12
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/entity/MailTemplateRepository.kt Целия файл

@@ -0,0 +1,12 @@
package com.ffii.fpsms.modules.common.mail.entity

import com.ffii.core.support.AbstractRepository
import org.springframework.stereotype.Repository
import java.io.Serializable

@Repository
interface MailTemplateRepository : AbstractRepository<MailTemplate, Long> {
fun findAllByDeletedIsFalse(): List<MailTemplate>

fun findByIdAndDeletedIsFalse(id: Serializable): MailTemplate?
}

+ 5
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/enums/MailTemplateType.kt Целия файл

@@ -0,0 +1,5 @@
package com.ffii.fpsms.modules.common.mail.enums

enum class MailTemplateType(val value: String) {
PURCHASE_ORDER("po"),
}

+ 2
- 25
src/main/java/com/ffii/fpsms/modules/common/mail/service/MailReminderService.kt Целия файл

@@ -23,43 +23,20 @@ open class MailReminderService(
val settingsService: SettingsService,
) {
protected val logger: Log = LogFactory.getLog(javaClass)
private val FULLTIME = "FT"
private val PARTTIME = "PT"
private val dateFormat: DateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd")

private fun isSettingsConfigValid(): Boolean {
try {
val username = settingsService.findByName(SettingNames.MAIL_SMTP_USERNAME).orElseThrow().value
val pw = settingsService.findByName(SettingNames.MAIL_SMTP_USERNAME).orElseThrow().value
val pw = settingsService.findByName(SettingNames.MAIL_SMTP_PASSWORD).orElseThrow().value
return !username.isNullOrEmpty() && !pw.isNullOrEmpty()
} catch (e: Error) {
return false
}
}
private fun createHTMLTable(naughtyList: MutableList<TableRow>): String {
val tableStarter = StringBuilder(" <table width='100%' border='1' align='center'> ")
val header = StringBuilder(
" <tr> "
+ " <th>StaffId</th> "
+ " <th>Name</th> "
+ " <th>Missing Dates</th> "
+ " </tr> "
)
tableStarter.append(header)
for (per in naughtyList) {
tableStarter.append(
" <tr> "
+ " <td>${per.staffId}</td>"
+ " <td>${per.name}</td>"
+ " <td>${per.missingDates.joinToString(", ")}</td>"
+ " </tr> "
)
}
val footer = StringBuilder(" </table> ")
return tableStarter.toString()
}

open fun createEmailRequest(content: String, emailTo: List<String>) {
if (!isSettingsConfigValid()) return;
// val subject = settingsService.findByName(SettingNames.TIMESHEET_MAIL_SUBJECT).orElseThrow().value
// val template = settingsService.findByName(SettingNames.TIMESHEET_MAIL_TEMPLATE).orElseThrow().value
// val cc = settingsService.findByName(SettingNames.TIMESHEET_MAIL_CC).orElseThrow().value.split(",")


+ 7
- 29
src/main/java/com/ffii/fpsms/modules/common/mail/service/MailService.kt Целия файл

@@ -5,7 +5,7 @@ import com.ffii.core.utils.LocaleUtils
import com.ffii.fpsms.modules.common.ErrorCodes
import com.ffii.fpsms.modules.common.SettingNames
import com.ffii.fpsms.modules.common.mail.pojo.MailRequest
import com.ffii.fpsms.modules.common.mail.web.models.MailSave
import com.ffii.fpsms.modules.common.mail.web.models.MailSaveRequest
import com.ffii.fpsms.modules.settings.entity.Settings
import com.ffii.fpsms.modules.settings.entity.SettingsRepository
import com.ffii.fpsms.modules.settings.service.SettingsService
@@ -32,6 +32,7 @@ open class MailService(
private val settingsService: SettingsService,
private val passwordEncoder: PasswordEncoder,
private val settingsRepository: SettingsRepository,
private val mailTemplateService: MailTemplateService,
) {
protected val logger: Log = LogFactory.getLog(javaClass)

@@ -171,45 +172,22 @@ open class MailService(
asyncSend(mutableListOf(mailRequest))
}

open fun saveMail(mailSave: MailSave): List<Settings> {
open fun saveMail(request: MailSaveRequest): List<Settings> {
// ------------------ save mail settings ------------------ //
val settings = mutableListOf<Settings>()

mailSave.settings.forEach { setting ->
request.settings.forEach { setting ->
val tempSetting = settingsRepository.findById(setting.id).orElseThrow()
settings += tempSetting.apply {
value = setting.value
}
}

// ------------------ save timesheet mail details ------------------ //
// val mailCc = settingsRepository.findByName("TIMESHEET.mail.cc").orElseThrow()
//
// settings += mailCc.apply {
// value = mailSave.template.cc
// }
//
// val mailBcc = settingsRepository.findByName("TIMESHEET.mail.bcc").orElseThrow()
//
// settings += mailBcc.apply {
// value = mailSave.template.bcc
// }
//
// val mailSubject = settingsRepository.findByName("TIMESHEET.mail.subject").orElseThrow()
//
// settings += mailSubject.apply {
// value = mailSave.template.subject
// }
//
// val mailTemplate = settingsRepository.findByName("TIMESHEET.mail.template").orElseThrow()
//
// settings += mailTemplate.apply {
// value = mailSave.template.template
// }

// ------------------ save all ------------------ //
settingsRepository.saveAll(settings)

// ------------------ save mail templates' details ------------------ //
mailTemplateService.saveMailTemplates(request.templates)

return settings
}
}

+ 62
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/service/MailTemplateService.kt Целия файл

@@ -0,0 +1,62 @@
package com.ffii.fpsms.modules.common.mail.service

import com.ffii.fpsms.modules.common.mail.entity.MailTemplate
import com.ffii.fpsms.modules.common.mail.entity.MailTemplateRepository
import com.ffii.fpsms.modules.common.mail.web.models.MailTemplateRequest
import org.springframework.stereotype.Service

@Service
open class MailTemplateService(
private val mailTemplateRepository: MailTemplateRepository,
) {
fun allMailTemplates(): List<MailTemplate> {
return mailTemplateRepository.findAllByDeletedIsFalse();
}

fun findById(id: Long): MailTemplate? {
return mailTemplateRepository.findByIdAndDeletedIsFalse(id);
}

fun saveMailTemplate(request: MailTemplateRequest): MailTemplate {
val mailTemplate = request.id?.let { findById(it) } ?: MailTemplate()

mailTemplate.apply {
to = request.to
cc = request.cc
code = request.code
description = request.description
type = request.type
params = request.params
subjectCht = request.subjectCht
subjectEng = request.subjectEng
contentCht = request.contentCht
contentEng = request.contentEng
}

val response = mailTemplateRepository.saveAndFlush(mailTemplate)

return response
}

fun saveMailTemplates(requests: List<MailTemplateRequest>) {
val mailTemplates: List<MailTemplate> = mutableListOf()
requests.forEach { request ->
val mailTemplate = request.id?.let { findById(it) } ?: MailTemplate()

mailTemplate.apply {
to = request.to
cc = request.cc
code = request.code
description = request.description
type = request.type
params = request.params
subjectCht = request.subjectCht
subjectEng = request.subjectEng
contentCht = request.contentCht
contentEng = request.contentEng
}.let { mailTemplates.plus(it) }
}

mailTemplateRepository.saveAll(mailTemplates)
}
}

+ 5
- 3
src/main/java/com/ffii/fpsms/modules/common/mail/web/MailController.kt Целия файл

@@ -1,8 +1,10 @@
package com.ffii.fpsms.modules.common.mail.web

import com.ffii.fpsms.modules.common.mail.entity.MailTemplate
import com.ffii.fpsms.modules.common.mail.service.MailReminderService
import com.ffii.fpsms.modules.common.mail.service.MailService
import com.ffii.fpsms.modules.common.mail.web.models.MailSave
import com.ffii.fpsms.modules.common.mail.service.MailTemplateService
import com.ffii.fpsms.modules.common.mail.web.models.MailSaveRequest
import com.ffii.fpsms.modules.common.mail.web.models.Setting
import com.ffii.fpsms.modules.settings.entity.Settings
import com.ffii.fpsms.modules.settings.service.SettingsService
@@ -16,7 +18,7 @@ import java.util.Date
class MailController(
private val settingsService: SettingsService,
private val mailService: MailService,
private val mailReminderService: MailReminderService,
private val mailReminderService: MailReminderService
) {
@GetMapping("/setting")
fun mailSetting(): List<Settings> {
@@ -29,7 +31,7 @@ class MailController(
}

@PostMapping("/save")
fun saveMail(@Valid @RequestBody mailSave: MailSave): List<Settings> {
fun saveMail(@Valid @RequestBody mailSave: MailSaveRequest): List<Settings> {
return mailService.saveMail(mailSave)
}
}

+ 25
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/web/MailTemplateController.kt Целия файл

@@ -0,0 +1,25 @@
package com.ffii.fpsms.modules.common.mail.web

import com.ffii.fpsms.modules.common.mail.entity.MailTemplate
import com.ffii.fpsms.modules.common.mail.web.models.MailTemplateRequest
import com.ffii.fpsms.modules.common.mail.service.MailTemplateService
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RequestMapping("/mailTemplates")
@RestController
class MailTemplateController(
private val mailTemplateService: MailTemplateService,
) {
@GetMapping
fun allMailTemplates(): List<MailTemplate> {
return mailTemplateService.allMailTemplates();
}

@PostMapping("/save")
fun saveMailTemplate(request: MailTemplateRequest): MailTemplate {
return mailTemplateService.saveMailTemplate(request);
}
}

+ 2
- 1
src/main/java/com/ffii/fpsms/modules/common/mail/web/models/MailSaveRequest.kt Целия файл

@@ -15,7 +15,8 @@ data class Template (
val template: String?,
)

data class MailSave (
data class MailSaveRequest (
val settings: List<Setting>,
val templates: List<MailTemplateRequest>,
// val template: Template
)

+ 19
- 0
src/main/java/com/ffii/fpsms/modules/common/mail/web/models/MailTemplateRequest.kt Целия файл

@@ -0,0 +1,19 @@
package com.ffii.fpsms.modules.common.mail.web.models

import jakarta.validation.constraints.NotNull

data class MailTemplateRequest(
val id: Long?,
val to: String?,
val cc: String?,
@field:NotNull(message = "code cannot be null")
val code: String,
@field:NotNull(message = "description cannot be null")
val description: String?,
val type: String?,
val params: String?,
val subjectCht: String?,
val subjectEng: String?,
val contentCht: String?,
val contentEng: String?,
)

+ 24
- 0
src/main/resources/db/changelog/changes/20250609_01_cyril/01_create_mail_template.sql Целия файл

@@ -0,0 +1,24 @@
-- liquibase formatted sql
-- changeset cyril:create mail template

CREATE TABLE `mail_template`
(
`id` INT NOT NULL AUTO_INCREMENT,
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`createdBy` VARCHAR(30) NULL DEFAULT NULL,
`version` INT NOT NULL DEFAULT '0',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modifiedBy` VARCHAR(30) NULL DEFAULT NULL,
`deleted` TINYINT(1) NOT NULL DEFAULT '0',
`to` VARCHAR(255) NULL,
`cc` VARCHAR(255) NULL,
`code` VARCHAR(255) NOT NULL,
`description` VARCHAR(255) NOT NULL,
`type` VARCHAR(30) NULL,
`params` VARCHAR(255) NULL,
`subjectCht` VARCHAR(255) NULL,
`subjectEng` VARCHAR(255) NULL,
`contentCht` TEXT NULL,
`contentEng` TEXT NULL,
CONSTRAINT pk_mail_template PRIMARY KEY (id)
);

+ 38
- 0
src/main/resources/db/changelog/changes/20250609_01_cyril/02_create_mail_send_log.sql Целия файл

@@ -0,0 +1,38 @@
-- liquibase formatted sql
-- changeset cyril:create send mail log

CREATE TABLE `mail_send_log`
(
`id` INT NOT NULL AUTO_INCREMENT,
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`createdBy` VARCHAR(30) NULL DEFAULT NULL,
`version` INT NOT NULL DEFAULT '0',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modifiedBy` VARCHAR(30) NULL DEFAULT NULL,
`deleted` TINYINT(1) NOT NULL DEFAULT '0',
`tempId` INT NOT NULL,
`tempDesc` VARCHAR(255) NOT NULL,
`senderMail` VARCHAR(255) NULL,
`subject` VARCHAR(255) NULL,
`content` TEXT NULL,
`sendDate` DATETIME NULL,
`errorMessage` TEXT NULL,
CONSTRAINT pk_mail_send_log PRIMARY KEY (id),
CONSTRAINT `FK_MAIL_SEND_LOG_ON_TEMPID` FOREIGN KEY (`tempId`) REFERENCES `mail_send_log` (`id`)
);

CREATE TABLE `mail_send_log_line`
(
`id` INT NOT NULL AUTO_INCREMENT,
`created` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`createdBy` VARCHAR(30) NULL DEFAULT NULL,
`version` INT NOT NULL DEFAULT '0',
`modified` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
`modifiedBy` VARCHAR(30) NULL DEFAULT NULL,
`deleted` TINYINT(1) NOT NULL DEFAULT '0',
`sendMailLogId` INT NOT NULL,
`toMail` VARCHAR(255) NULL,
`errorMessage` TEXT NULL,
CONSTRAINT pk_mail_send_log_line PRIMARY KEY (id),
CONSTRAINT `FK_MAIL_SEND_LOG_LINE_ON_SENDMAILLOGID` FOREIGN KEY (`sendMailLogId`) REFERENCES `mail_send_log` (`id`)
);

Зареждане…
Отказ
Запис