package cn.flightfeather.supervision.lightshare.service.Impl
|
|
import cn.flightfeather.supervision.domain.entity.*
|
import cn.flightfeather.supervision.domain.enumeration.SceneType
|
import cn.flightfeather.supervision.domain.enumeration.SelfPatrolTaskStatus
|
import cn.flightfeather.supervision.domain.mapper.*
|
import cn.flightfeather.supervision.infrastructure.utils.DateUtil
|
import cn.flightfeather.supervision.infrastructure.utils.FileUtil
|
import cn.flightfeather.supervision.infrastructure.utils.UUIDGenerator
|
import cn.flightfeather.supervision.lightshare.service.SelfPatrolService
|
import cn.flightfeather.supervision.lightshare.vo.BaseResponse
|
import cn.flightfeather.supervision.lightshare.vo.LedgerSubTypeVo
|
import cn.flightfeather.supervision.lightshare.vo.LedgerVo
|
import cn.flightfeather.supervision.lightshare.vo.SelfPatrolTaskVo
|
import com.fasterxml.jackson.core.type.TypeReference
|
import com.fasterxml.jackson.databind.ObjectMapper
|
import org.springframework.beans.factory.annotation.Value
|
import org.springframework.stereotype.Service
|
import org.springframework.web.multipart.MultipartFile
|
import tk.mybatis.mapper.entity.Example
|
import java.time.LocalDate
|
import java.time.LocalDateTime
|
import java.time.format.DateTimeFormatter
|
import java.util.*
|
|
@Service
|
class SelfPatrolServiceImpl(
|
private val selfPatrolTaskMapper: SelfPatrolTaskMapper,
|
private val selfPatrolRecordMapper: SelfPatrolRecordMapper,
|
private val selfPatrolMediaFileMapper: SelfPatrolMediaFileMapper,
|
private val userinfoMapper: UserinfoMapper,
|
private val ledgerSubTypeMapper: LedgerSubTypeMapper,
|
) : SelfPatrolService {
|
|
@Value("\${imgPath}")
|
lateinit var imgPath: String
|
|
private val notInvolvedPath = "ledgerIcons/ledger_not_involved.jpg"
|
|
override fun getPatrolType(sceneType: Int): BaseResponse<List<LedgerSubTypeVo>> {
|
val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
|
if (sceneType != SceneType.NoType.value) {
|
createCriteria().andEqualTo("lScenetype", sceneType)
|
.andEqualTo("lTypeid", -1)
|
}
|
})
|
val resultList = ArrayList<LedgerSubTypeVo>()
|
ledgerSubTypes.forEach {
|
val l = LedgerSubTypeVo(
|
it.lsSubtypeid,
|
it.lsName,
|
it.getlTypeid(),
|
it.getlTypename(),
|
needUpdate = it.getlNeedupdate(),
|
sceneType = it.getlScenetype(),
|
iconUrl = it.getlIconurl()
|
)
|
resultList.add(l)
|
}
|
return BaseResponse(true, data = resultList)
|
}
|
|
override fun publishTask(tasks: List<SelfPatrolTask>): BaseResponse<Boolean> {
|
var r = 0
|
val now = LocalDateTime.now()
|
val date = Date()
|
tasks.forEach {
|
it.spGuid = UUIDGenerator.generate16ShortUUID()
|
it.spTaskYear = now.year
|
it.spTaskMonth = now.monthValue
|
it.spCreateTime = date
|
it.spTaskStatus = SelfPatrolTaskStatus.Published.value
|
r += selfPatrolTaskMapper.insert(it)
|
}
|
|
return BaseResponse(r == tasks.size)
|
}
|
|
override fun getPublishedTask(userId: String, date: String?): BaseResponse<List<SelfPatrolTaskVo>> {
|
// val res = selfPatrolTaskMapper.selectByExample(Example(SelfPatrolTask::class.java).apply {
|
// createCriteria().andEqualTo("spFromUserId", userId).apply {
|
// date?.let {
|
// val time = LocalDate.parse(it)
|
// andEqualTo("spTaskYear", time.year).andEqualTo("spTaskMonth", time.monthValue)
|
// }
|
// }
|
// })
|
val ledgerTypes = ledgerSubTypeMapper.selectAll()
|
val time = LocalDate.parse(date)
|
val res = selfPatrolTaskMapper.getPublishedTask(userId, time?.year, time?.monthValue)
|
res.forEach {
|
it.sceneType = SceneType.getByValue(it.sceneTypeId).des
|
it.total = it.ledgerTypeId?.split(";")?.size ?: 0
|
it.ledgerTypeId?.split(";")?.forEach {l ->
|
if (it.ledgerTypeName.isNotBlank()) it.ledgerTypeName += ';'
|
it.ledgerTypeName += ledgerTypes.find { t -> t.lsSubtypeid.toString() == l }?.lsName
|
}
|
}
|
|
return BaseResponse(true, data = res)
|
}
|
|
override fun getToTask(userId: String, date: String?): BaseResponse<List<SelfPatrolTask?>> {
|
val res = selfPatrolTaskMapper.selectByExample(Example(SelfPatrolTask::class.java).apply {
|
createCriteria().andEqualTo("spToUserId", userId).apply {
|
date?.let {
|
val time = LocalDate.parse(it)
|
andEqualTo("spTaskYear", time.year).andEqualTo("spTaskMonth", time.monthValue)
|
}
|
}
|
orderBy("spCreateTime").desc()
|
})
|
|
return BaseResponse(true, data = res)
|
}
|
|
override fun getTaskRecord(taskId: String): BaseResponse<List<LedgerSubTypeVo>> {
|
val task = selfPatrolTaskMapper.selectByPrimaryKey(taskId) ?: return BaseResponse(false, "该应急自巡查任务不存在")
|
val sceneTypeId = task.spSceneTypeId
|
val typeId = task.spLedgerTypeId
|
val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
|
createCriteria().andEqualTo("lTypeid", -1)
|
.apply {
|
if (sceneTypeId != SceneType.NoType.value) {
|
andEqualTo("lScenetype", sceneTypeId)
|
}
|
andIn("lsSubtypeid", typeId.split(";"))
|
}
|
orderBy("lTypeid")
|
})
|
val records = selfPatrolRecordMapper.selectByExample(Example(SelfPatrolRecord::class.java).apply {
|
createCriteria().andEqualTo("spGuid", taskId)
|
})
|
|
val resultList = mutableListOf<LedgerSubTypeVo>()
|
ledgerSubTypes.forEach {
|
val l = LedgerSubTypeVo(
|
it.lsSubtypeid,
|
it.lsName,
|
it.getlTypeid(),
|
it.getlTypename(),
|
needUpdate = it.getlNeedupdate(),
|
sceneType = it.getlScenetype(),
|
iconUrl = it.getlIconurl(),
|
realTime = it.getlRealTime(),
|
description = it.getlDescription(),
|
notRelated = it.getlNotRelatedSwitch() ?: true,
|
multigroup = it.getlMultiGroup() ?: false
|
)
|
for (r in records) {
|
if (l.ledgerSubTypeId == r?.lsSubtypeid) {
|
l.ledgerFinished = true
|
l.upLoad = true
|
// l.checkStatus = r.lrVerifyrst?.toIntOrNull() ?: LedgerCheckStatus.UnCheck.value
|
l.onTime = r?.srIssubmitontime ?: false
|
l.verified
|
l.verifierName = r?.srVerifierrealname
|
l.verified = r?.srIsverify
|
l.verifyRst = r?.srVerifyrst
|
break
|
}
|
}
|
resultList.add(l)
|
}
|
|
return BaseResponse(true, data = resultList)
|
}
|
|
override fun uploadSelfPatrol(
|
userId: String,
|
taskId: String?,
|
list: String,
|
files: Array<MultipartFile>,
|
): BaseResponse<Boolean> {
|
val mapper = ObjectMapper()
|
val ledgerVos = mapper.readValue(list, object : TypeReference<List<LedgerVo>>() {})
|
ledgerVos.forEach {
|
it.id = it.id ?: UUIDGenerator.generate16ShortUUID()
|
it.fileType = it.fileType ?: 1
|
|
val userInfo = userinfoMapper.selectByPrimaryKey(userId)
|
userInfo?.extension2?.toInt()?.let { s -> it.sceneType = s }
|
|
val today = Calendar.getInstance().apply { time = Date() }
|
.get(Calendar.DAY_OF_MONTH)
|
val cal = Calendar.getInstance().apply { time = it.updateDate ?: Date() }
|
val updateYear = cal.get(Calendar.YEAR)
|
val updateMonth = cal.get(Calendar.MONTH) + 1
|
val updateDay = cal.get(Calendar.DAY_OF_MONTH)
|
|
//检查数据库是否已有记录,选择插入或更新
|
val tmp = selfPatrolRecordMapper.selectByExample(Example(SelfPatrolRecord::class.java).apply {
|
createCriteria().andEqualTo("lsSubtypeid", it.ledgerSubTypeId)
|
.andEqualTo("srYear", updateYear)
|
.andEqualTo("srMonth", updateMonth)
|
.andEqualTo("srSubmitid", userId)
|
.andEqualTo("spGuid", taskId)
|
})
|
var ledgerMedia: SelfPatrolMediaFile? = null
|
if (tmp.isEmpty()) {
|
checkSelfPatrolFinished(taskId, 1)
|
//生成台账更新记录
|
val ledgerRecord = SelfPatrolRecord().apply {
|
srGuid = it.id
|
spGuid = taskId
|
lsSubtypeid = it.ledgerSubTypeId
|
lsSubtypename = it.ledgerName
|
srYear = updateYear
|
srMonth = updateMonth.toByte()
|
srDay = updateDay.toByte()
|
srEasubmitkind = it.fileType?.toByte() ?: 1
|
srSubmitid = userId
|
srSubmitname = userInfo?.acountname ?: ""
|
srIssubmitontime = today <= 10
|
srSubmitdate = Date()
|
srUpdatetype = it.updateType
|
srExtension1 = it.sceneType.toString()
|
}
|
it.id = ledgerRecord.srGuid
|
selfPatrolRecordMapper.insert(ledgerRecord)
|
} else {
|
val record = tmp[0]
|
it.id = record?.srGuid
|
ledgerMedia = deleteLedgerFile(it.id)
|
record?.srExtension2 = null
|
selfPatrolRecordMapper.updateByPrimaryKey(record)
|
}
|
|
//对每张图片生成相应的路径并保存
|
var picPath = ""
|
val time = DateUtil.DateToString(Date(), DateUtil.DateStyle.YYYY_MM)
|
files.forEach { file ->
|
val fileName = file.originalFilename
|
val basePath = imgPath
|
val path = "$time/$userId/${it.ledgerName}/"
|
picPath += if (picPath.isEmpty()) {
|
"$path$fileName"
|
} else {
|
";$path$fileName"
|
}
|
try {
|
//调用文件保存方法
|
FileUtil.uploadFile(file.bytes, basePath + path, fileName!!)
|
} catch (e: Exception) {
|
e.printStackTrace()
|
}
|
}
|
|
//生成一条多媒体文件记录
|
if (ledgerMedia == null) {
|
ledgerMedia = SelfPatrolMediaFile().apply {
|
mfGuid = UUIDGenerator.generate16ShortUUID()
|
lrGuid = it.id
|
mfFiletype = it.fileType
|
mfPath1 = picPath
|
mfDescription1 = it.remark1
|
mfSavetime = Date()
|
mfIsdelete = false
|
}
|
//插入新的多媒体文件记录数据
|
selfPatrolMediaFileMapper.insert(ledgerMedia)
|
} else {
|
ledgerMedia.mfPath1 = picPath
|
ledgerMedia.mfDescription1 = it.remark1
|
ledgerMedia.mfSavetime = Date()
|
selfPatrolMediaFileMapper.updateByPrimaryKey(ledgerMedia)
|
}
|
|
return BaseResponse(true)
|
}
|
|
return BaseResponse(false)
|
}
|
|
override fun uploadNoSelfPatrol(
|
userId: String,
|
taskId: String?,
|
time: String,
|
remark: String?,
|
idList: List<Int>,
|
): BaseResponse<String> {
|
val date = LocalDate.parse(time, DateTimeFormatter.ofPattern("yyyy-MM-dd"))
|
val year = date.year
|
val month = date.monthValue
|
val day = date.dayOfMonth
|
val userInfo = userinfoMapper.selectByPrimaryKey(userId) ?: return BaseResponse(false, "用户不存在")
|
idList.forEach {
|
//去重判断
|
val r = selfPatrolRecordMapper.selectByExample(Example(SelfPatrolRecord::class.java).apply {
|
createCriteria().andEqualTo("srSubmitid", userId)
|
.andEqualTo("lsSubtypeid", it)
|
.andEqualTo("srYear", year)
|
.andEqualTo("srMonth", month)
|
})
|
if (r.size > 0) {
|
return@forEach
|
}
|
|
//获取台账类型信息
|
val ledgerType = ledgerSubTypeMapper.selectByPrimaryKey(it) ?: return@forEach
|
|
//生成台账更新记录
|
val ledgerRecord = SelfPatrolRecord().apply {
|
srGuid = UUIDGenerator.generate16ShortUUID()
|
spGuid = taskId
|
lsSubtypeid = ledgerType.lsSubtypeid
|
lsSubtypename = ledgerType.lsName
|
srYear = year
|
srMonth = month.toByte()
|
srDay = day.toByte()
|
srEasubmitkind = 1
|
srSubmitid = userId
|
srSubmitname = userInfo.acountname ?: ""
|
srIssubmitontime = day <= 10
|
srSubmitdate = Date()
|
srUpdatetype
|
srExtension1 = userInfo.extension2
|
srExtension2 = "notInvolved"
|
}
|
checkSelfPatrolFinished(taskId, 1)
|
selfPatrolRecordMapper.insert(ledgerRecord)
|
|
//生成一条多媒体文件记录
|
val ledgerMedia = SelfPatrolMediaFile().apply {
|
mfGuid = UUIDGenerator.generate16ShortUUID()
|
lrGuid = ledgerRecord.srGuid
|
mfFiletype = 1
|
mfPath1 = "ledgerIcons/self_patrol_not_involved.jpg"
|
mfDescription1 = remark
|
mfSavetime = Date()
|
mfIsdelete = false
|
}
|
selfPatrolMediaFileMapper.insert(ledgerMedia)
|
}
|
return BaseResponse(true)
|
}
|
|
override fun getDetail(userId: String, subTypeId: Int, taskId: String): BaseResponse<LedgerVo?> {
|
val records = selfPatrolRecordMapper.selectByExample(Example(SelfPatrolRecord::class.java).apply {
|
createCriteria().andEqualTo("srSubmitid", userId)
|
.andEqualTo("lsSubtypeid", subTypeId)
|
.andEqualTo("spGuid", taskId)
|
orderBy("srSubmitdate").desc()
|
})
|
val result = mutableListOf<LedgerVo>()
|
records.forEach {
|
if (it == null) return@forEach
|
|
val media = selfPatrolMediaFileMapper.selectByExample(
|
Example(SelfPatrolMediaFile::class.java).apply {
|
createCriteria().andEqualTo("lrGuid", it.srGuid)
|
.andEqualTo("mfIsdelete", false)
|
.andEqualTo("mfFiletype", it.srEasubmitkind)
|
orderBy("mfSavetime").desc()
|
}
|
)
|
val type = ledgerSubTypeMapper.selectByExample(
|
Example(LedgerSubType::class.java).apply {
|
createCriteria().andEqualTo("lsSubtypeid", it.lsSubtypeid)
|
}
|
)
|
result.add(LedgerVo().apply {
|
id = it.srGuid
|
this.ledgerSubTypeId = it.lsSubtypeid
|
ledgerName = it.lsSubtypename
|
ledgerTypeId = type?.get(0)?.getlTypeid()
|
ledgerType = type?.get(0)?.getlTypename()
|
ledgerFinished = true
|
isUpLoad = true
|
updateDate = it.srSubmitdate
|
updateType = it.srUpdatetype
|
fileType = it.srEasubmitkind.toInt()
|
path1 = media?.get(0)?.mfPath1
|
remark1 = media?.get(0)?.mfDescription1
|
path2 = media?.get(0)?.mfPath2
|
remark2 = media?.get(0)?.mfDescription2
|
this.sceneType = if(it.srExtension1 == null) SceneType.Restaurant.value else it.srExtension1.toInt()
|
})
|
}
|
return if (result.isEmpty()) BaseResponse(false, "记录不存在") else BaseResponse(true, data = result[0])
|
}
|
|
override fun getDetailList(taskId: String): BaseResponse<List<LedgerVo>> {
|
// 自巡查任务
|
val task = selfPatrolTaskMapper.selectByPrimaryKey(taskId) ?: return BaseResponse(false, "自巡查任务不存在")
|
// 自寻查任务包含的台账类型
|
val ledgerTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
|
createCriteria().andIn("lsSubtypeid", task.spLedgerTypeId.split(";"))
|
})
|
// 用户上传的自巡查记录
|
val records = selfPatrolRecordMapper.selectByExample(Example(SelfPatrolRecord::class.java).apply {
|
createCriteria().andEqualTo("spGuid", taskId)
|
orderBy("srSubmitdate").desc()
|
})
|
val result = mutableListOf<LedgerVo>()
|
ledgerTypes.forEach {type->
|
val it = records.find { record ->
|
record?.lsSubtypeid == type.lsSubtypeid
|
}
|
|
val media = if (it != null) {
|
selfPatrolMediaFileMapper.selectByExample(
|
Example(SelfPatrolMediaFile::class.java).apply {
|
createCriteria().andEqualTo("lrGuid", it?.srGuid)
|
.andEqualTo("mfIsdelete", false)
|
.andEqualTo("mfFiletype", it?.srEasubmitkind)
|
orderBy("mfSavetime").desc()
|
}
|
)
|
} else null
|
|
result.add(LedgerVo().apply {
|
id = it?.srGuid
|
this.ledgerSubTypeId = type.lsSubtypeid
|
ledgerName = type.lsName
|
ledgerTypeId = type.getlTypeid()
|
ledgerType = type.getlTypename()
|
ledgerFinished = it != null
|
isUpLoad = it != null
|
updateDate = it?.srSubmitdate
|
updateType = it?.srUpdatetype
|
fileType = it?.srEasubmitkind?.toInt()
|
path1 = media?.get(0)?.mfPath1
|
remark1 = media?.get(0)?.mfDescription1
|
path2 = media?.get(0)?.mfPath2
|
remark2 = media?.get(0)?.mfDescription2
|
this.sceneType = task.spSceneTypeId
|
})
|
}
|
return BaseResponse(true, data = result)
|
}
|
|
override fun checkSelfPatrolFinished(taskId: String?, justFinishedNum: Int) {
|
val task = selfPatrolTaskMapper.selectByPrimaryKey(taskId) ?: return
|
val ledgerNum = task.spLedgerTypeId.split(";").size
|
val recordNum = selfPatrolRecordMapper.selectCountByExample(Example(SelfPatrolRecord::class.java).apply {
|
createCriteria().andEqualTo("spGuid", taskId)
|
})
|
if (recordNum + justFinishedNum >= ledgerNum) {
|
task.spTaskStatus = SelfPatrolTaskStatus.Finished.value
|
selfPatrolTaskMapper.updateByPrimaryKey(task)
|
}
|
}
|
|
/**
|
* 删除台账的文件记录
|
* @param guid 台账记录id
|
*/
|
private fun deleteLedgerFile(guid: String?): SelfPatrolMediaFile? {
|
return selfPatrolMediaFileMapper.selectOne(SelfPatrolMediaFile().apply { lrGuid = guid })?.apply {
|
if (this.mfPath1 != notInvolvedPath) {
|
this.mfPath1.split(";").forEach { p ->
|
val path = imgPath + p
|
FileUtil.deleteFile(path)
|
}
|
// this.mfPath1 = notInvolvedPath
|
// ledgerMediaFileMapper.updateByPrimaryKey(this)
|
}
|
}
|
}
|
}
|