package cn.flightfeather.supervision.lightshare.service.Impl
|
|
import cn.flightfeather.supervision.domain.entity.LedgerMediaFile
|
import cn.flightfeather.supervision.domain.entity.LedgerRecord
|
import cn.flightfeather.supervision.domain.entity.LedgerSubType
|
import cn.flightfeather.supervision.domain.enumeration.LedgerCheckStatus
|
import cn.flightfeather.supervision.domain.enumeration.SceneType
|
import cn.flightfeather.supervision.domain.mapper.LedgerMediaFileMapper
|
import cn.flightfeather.supervision.domain.mapper.LedgerRecordMapper
|
import cn.flightfeather.supervision.domain.mapper.LedgerSubTypeMapper
|
import cn.flightfeather.supervision.domain.mapper.UserinfoMapper
|
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.LedgerService
|
import cn.flightfeather.supervision.lightshare.vo.*
|
import com.fasterxml.jackson.core.type.TypeReference
|
import com.fasterxml.jackson.databind.ObjectMapper
|
import com.github.pagehelper.PageHelper
|
import org.springframework.stereotype.Service
|
import org.springframework.web.multipart.MultipartFile
|
import tk.mybatis.mapper.entity.Example
|
import java.util.*
|
import javax.servlet.http.HttpServletResponse
|
import kotlin.collections.ArrayList
|
import kotlin.math.ceil
|
|
@Service
|
class LedgerServiceImpl(
|
val ledgerSubTypeMapper: LedgerSubTypeMapper,
|
val userinfoMapper: UserinfoMapper,
|
val ledgerRecordMapper: LedgerRecordMapper,
|
val ledgerMediaFileMapper: LedgerMediaFileMapper
|
):LedgerService {
|
|
override fun getLedgerType(sceneType: Int): ArrayList<LedgerSubTypeVo> {
|
val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
|
if (sceneType != SceneType.NoType.value) {
|
createCriteria().andEqualTo("lScenetype", sceneType)
|
}
|
})
|
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 resultList
|
}
|
|
override fun getUserLedgerSummary(userId: String, sceneType: Int, time: String): List<LedgerSubTypeVo> {
|
val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
|
if (sceneType != SceneType.NoType.value) {
|
createCriteria().andEqualTo("lScenetype", sceneType)
|
}
|
})
|
val records = getLedgerRecords(userId, null, sceneType, time)
|
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()
|
)
|
for (r in records) {
|
if (l.ledgerSubTypeId == r.lsSubtypeid) {
|
l.ledgerFinished = true
|
l.upLoad = true
|
// l.checkStatus = r.lrVerifyrst?.toIntOrNull() ?: LedgerCheckStatus.UnCheck.value
|
l.verified
|
l.verifierName = r.lrVerifierrealname
|
l.verified = r.lrIsverify
|
l.verifyRst = l.verifyRst
|
break
|
}
|
}
|
resultList.add(l)
|
}
|
|
return resultList
|
}
|
|
override fun getLedgerDetail(userId: String, ledgerSubTypeId: Int?, sceneType: Int,
|
startTime: String, endTime: String,
|
page: Int?, perPage: Int, response: HttpServletResponse
|
): ArrayList<LedgerVo> {
|
val result = ArrayList<LedgerVo>()
|
|
response.setIntHeader("totalPage", 1)
|
response.setIntHeader("currentPage", page ?: 1)
|
|
//fixme 此处暂时强制为1页
|
if (page != null && page > 1) {
|
return result
|
}
|
|
val startDate = DateUtil().StringToDate(startTime)
|
val endDate = DateUtil().StringToDate(endTime)
|
val cal = Calendar.getInstance().apply { time = startDate }
|
val year = cal.get(Calendar.YEAR)
|
val month = cal.get(Calendar.MONTH) + 1
|
|
// val records = ledgerRecordMapper.selectByUser(userId, year, month.toByte(), ledgerSubTypeId,
|
// sceneType.toString(), page?.minus(1)?.times(perPage), perPage)
|
|
val records = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andEqualTo("lrSubmitid", userId)
|
.andEqualTo("lrYear", year)
|
.andEqualTo("lrMonth", month.toByte())
|
.apply {
|
ledgerSubTypeId?.let { andEqualTo("lsSubtypeid", it) }
|
}
|
if (sceneType == SceneType.Restaurant.value) {
|
and(createCriteria().andIsNull("lrExtension1")
|
.orEqualTo("lrExtension1", sceneType.toString()))
|
}else if (sceneType != SceneType.NoType.value) {
|
and(createCriteria().andEqualTo("lrExtension1", sceneType.toString()))
|
}
|
})
|
|
records.forEach {
|
val media = ledgerMediaFileMapper.selectByExample(
|
Example(LedgerMediaFile::class.java).apply {
|
createCriteria().andEqualTo("lrGuid", it.lrGuid)
|
.andEqualTo("mfIsdelete", false)
|
.andEqualTo("mfFiletype", it.lrEasubmitkind)
|
orderBy("mfSavetime").desc()
|
}
|
)
|
val type = ledgerSubTypeMapper.selectByExample(
|
Example(LedgerSubType::class.java).apply {
|
createCriteria().andEqualTo("lsSubtypeid", it.lsSubtypeid)
|
}
|
)
|
result.add(LedgerVo().apply {
|
id = it.lrGuid
|
this.ledgerSubTypeId = it.lsSubtypeid
|
ledgerName = it.lsSubtypename
|
ledgerTypeId = type?.get(0)?.getlTypeid()
|
ledgerType = type?.get(0)?.getlTypename()
|
ledgerFinished = true
|
isUpLoad = true
|
updateDate = it.lrSubmitdate
|
updateType = it.lrUpdatetype
|
fileType = it.lrEasubmitkind.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.lrExtension1 == null) SceneType.Restaurant.value else it.lrExtension1.toInt()
|
})
|
}
|
|
// val counts = ledgerRecordMapper.selectCountByExample(Example(LedgerRecord::class.java))
|
// val totalPage = Math.ceil(counts.toDouble() / perPage.toDouble()).toInt()
|
|
return result
|
|
}
|
|
override fun getLedgerDetail2(userId: String, ledgerSubTypeId: Int?, sceneType: Int, time: String): List<LedgerVo> {
|
val records = getLedgerRecords(userId, ledgerSubTypeId, sceneType, time)
|
val result = ArrayList<LedgerVo>()
|
records.forEach {
|
val media = ledgerMediaFileMapper.selectByExample(
|
Example(LedgerMediaFile::class.java).apply {
|
createCriteria().andEqualTo("lrGuid", it.lrGuid)
|
.andEqualTo("mfIsdelete", false)
|
.andEqualTo("mfFiletype", it.lrEasubmitkind)
|
orderBy("mfSavetime").desc()
|
}
|
)
|
val type = ledgerSubTypeMapper.selectByExample(
|
Example(LedgerSubType::class.java).apply {
|
createCriteria().andEqualTo("lsSubtypeid", it.lsSubtypeid)
|
}
|
)
|
result.add(LedgerVo().apply {
|
id = it.lrGuid
|
this.ledgerSubTypeId = it.lsSubtypeid
|
ledgerName = it.lsSubtypename
|
ledgerTypeId = type?.get(0)?.getlTypeid()
|
ledgerType = type?.get(0)?.getlTypename()
|
ledgerFinished = true
|
isUpLoad = true
|
updateDate = it.lrSubmitdate
|
updateType = it.lrUpdatetype
|
fileType = it.lrEasubmitkind.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.lrExtension1 == null) SceneType.Restaurant.value else it.lrExtension1.toInt()
|
})
|
}
|
return result
|
}
|
|
override fun uploadLedger(userId: String, ledgerVoList: String, files: Array<MultipartFile>):Boolean {
|
|
val mapper = ObjectMapper()
|
|
val ledgerVos = mapper.readValue<List<LedgerVo>>(ledgerVoList, object :TypeReference<List<LedgerVo>>(){})
|
|
ledgerVos.forEach {
|
val userInfo = userinfoMapper.selectByPrimaryKey(userId)
|
val today = Calendar.getInstance().apply { time = Date() }
|
.get(Calendar.DAY_OF_MONTH)
|
val cal = Calendar.getInstance().apply { time = it.updateDate }
|
val updateYear = cal.get(Calendar.YEAR)
|
val updateMonth = cal.get(Calendar.MONTH) + 1
|
val updateDay = cal.get(Calendar.DAY_OF_MONTH)
|
//生成台账更新记录
|
val ledgerRecord = LedgerRecord().apply {
|
lrGuid = it.id
|
lsSubtypeid = it.ledgerSubTypeId
|
lsSubtypename = it.ledgerName
|
lrYear = updateYear
|
lrMonth = updateMonth.toByte()
|
lrDay = updateDay.toByte()
|
lrEasubmitkind = it.fileType?.toByte() ?: 1
|
lrSubmitid = userId
|
lrSubmitname = userInfo?.acountname ?: ""
|
lrIssubmitontime = today <= 10
|
lrSubmitdate = Date()
|
lrUpdatetype = it.updateType
|
lrExtension1 = it.sceneType.toString()
|
}
|
|
//检查数据库是否已有记录,选择插入或更新
|
val tmp = ledgerRecordMapper.selectByPrimaryKey(ledgerRecord.lrGuid)
|
if (tmp == null || tmp.lrGuid == null) {
|
ledgerRecordMapper.insert(ledgerRecord)
|
} else {
|
ledgerRecordMapper.updateByPrimaryKey(ledgerRecord)
|
}
|
|
//对每张图片生成相应的路径并保存
|
var picPath = ""
|
val time = DateUtil().DateToString(Date(), DateUtil.DateStyle.YYYY_MM)
|
files.forEach {file->
|
val fileName = file.originalFilename
|
//TODO 此处的文件路径需要修改为动态配置
|
val basePath = "D:/02product/05ledger/images/"
|
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()
|
}
|
}
|
|
//生成一条多媒体文件记录
|
val ledgerMedia = LedgerMediaFile().apply {
|
mfGuid = UUIDGenerator.generate16ShortUUID()
|
lrGuid = it.id
|
mfFiletype = it.fileType
|
mfPath1 = picPath
|
mfDescription1 = it.remark1
|
mfSavetime = Date()
|
mfIsdelete = false
|
}
|
|
//查询是否已有记录,对已有记录将其标记为"删除"
|
val example = Example(LedgerMediaFile::class.java)
|
val criteria = example.createCriteria()
|
criteria.andEqualTo("lrGuid", it.id)
|
.andEqualTo("mfIsdelete", false)
|
val result = ledgerMediaFileMapper.selectByExample(example)
|
result.forEach {mediaFile ->
|
mediaFile.mfIsdelete = true
|
ledgerMediaFileMapper.updateByPrimaryKey(mediaFile)
|
}
|
|
//插入新的多媒体文件记录数据
|
ledgerMediaFileMapper.insert(ledgerMedia)
|
|
return true
|
}
|
|
return false
|
}
|
|
override fun getLedgerImg(userId: String, ledgerType: Int): List<String> {
|
val result = mutableListOf<String>()
|
|
PageHelper.startPage<LedgerRecord>(1, 1)
|
val record = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andEqualTo("lsSubtypeid", ledgerType)
|
.andEqualTo("lrSubmitid", userId)
|
orderBy("lrYear").desc().orderBy("lrMonth").desc().orderBy("lrDay").desc()
|
}).takeIf { it.isNotEmpty() }?.get(0)
|
|
record?.let {
|
ledgerMediaFileMapper.selectByExample(Example(LedgerMediaFile::class.java).apply {
|
createCriteria().andEqualTo("lrGuid", it.lrGuid)
|
}).forEach {
|
it.mfPath1?.split(";")?.let {list ->
|
result.addAll(list)
|
}
|
}
|
}
|
|
return result
|
}
|
|
override fun getLedgerImgs(userId: String, ledgerType: List<Int>): List<LedgerVo> {
|
val result = mutableListOf<String>()
|
|
PageHelper.startPage<LedgerRecord>(1, 1)
|
val record = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andIn("lsSubtypeid", ledgerType)
|
.andEqualTo("lrSubmitid", userId)
|
orderBy("lrYear").desc().orderBy("lrMonth").desc().orderBy("lrDay").desc()
|
})
|
|
return emptyList()
|
}
|
|
private fun getLedgerRecords(userId: String, ledgerSubTypeId: Int?, sceneType: Int, time: String): List<LedgerRecord> {
|
val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
|
if (ledgerSubTypeId != null) {
|
createCriteria().andEqualTo("lsSubtypeid", ledgerSubTypeId)
|
} else if (sceneType != SceneType.NoType.value) {
|
createCriteria().andEqualTo("lScenetype", sceneType)
|
}
|
})
|
val c = Calendar.getInstance().apply { this.time = DateUtil().StringToDate(time) }
|
val year = c.get(Calendar.YEAR)
|
val month = c.get(Calendar.MONTH) + 1
|
val map = mutableMapOf<Int, MutableList<Int>>()
|
ledgerSubTypes.forEach {
|
val p = it.getlPeriod()
|
if (!map.containsKey(p)) {
|
map[p] = mutableListOf()
|
}
|
map[p]?.add(it.lsSubtypeid)
|
}
|
val records = mutableListOf<LedgerRecord>()
|
map.forEach { (p, v) ->
|
// FIXME: 2020/11/10 此处根据周期和当前月份计算得到当前月份所在周期的始末月,只适用于周期小于等于12个月的情况。后续待修改
|
val startMon = ceil(month.toDouble() / p).toInt().minus(1).times(p).plus(1)
|
val endMon = startMon + p - 1
|
val r = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andEqualTo("lrSubmitid", userId)
|
.andEqualTo("lrYear", year)
|
.andGreaterThanOrEqualTo("lrMonth", startMon.toByte())
|
.andLessThanOrEqualTo("lrMonth", endMon.toByte())
|
and(
|
createCriteria().apply {
|
v.forEach {
|
orEqualTo("lsSubtypeid", it)
|
}
|
}
|
)
|
})
|
records.addAll(r)
|
}
|
|
return records
|
}
|
|
override fun copyLedger(userId: String, time: String, copyLedgerList: List<CopyLedgerVo>): BaseResponse<String> {
|
val year = time.split("-")[0]
|
val month = time.split("-")[1]
|
copyLedgerList.forEach {
|
//去重判断
|
val r = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andEqualTo("lrSubmitid", userId)
|
.andEqualTo("lsSubtypeid", it.subTypeId)
|
.andEqualTo("lrYear", year)
|
.andEqualTo("lrMonth", month)
|
})
|
if (r.size > 0) {
|
return@forEach
|
}
|
|
val y = it.time?.split("-")?.get(0) ?: return@forEach
|
val m = it.time?.split("-")?.get(1) ?: return@forEach
|
ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andEqualTo("lrSubmitid", userId)
|
.andEqualTo("lsSubtypeid", it.subTypeId)
|
.andEqualTo("lrYear", y)
|
.andEqualTo("lrMonth", m)
|
}).forEach record@ {lr ->
|
//获取记录对应的文件信息
|
val fileList = ledgerMediaFileMapper.selectByExample(Example(LedgerMediaFile::class.java).apply {
|
createCriteria().andEqualTo("lrGuid", lr.lrGuid)
|
})
|
if (fileList.size == 0) return@record
|
val file = fileList[0] ?: return@record
|
|
//修改记录信息,复制为新的台账
|
lr.lrGuid = UUIDGenerator.generate16ShortUUID()
|
lr.lrYear = year.toInt()
|
lr.lrMonth = month.toByte()
|
lr.lrIssubmitontime = true
|
lr.lrSubmitdate = Date()
|
lr.lrExtension2 = "copy"//表明是复制的台账
|
ledgerRecordMapper.insert(lr)
|
|
//修改对应的文件信息
|
file.apply {
|
mfGuid = UUIDGenerator.generate16ShortUUID()
|
lrGuid = lr.lrGuid
|
mfSavetime = Date()
|
}
|
ledgerMediaFileMapper.insert(file)
|
}
|
}
|
|
return BaseResponse(true)
|
}
|
|
override fun checkLedger(verifierId: String, remark: String?, recordList: List<LedgerCheckVo>): BaseResponse<Boolean> {
|
val recordIdList = mutableListOf<String?>()
|
recordList.forEach { recordIdList.add(it.recordId) }
|
val records = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
|
createCriteria().andIn("lrGuid", recordIdList)
|
.andIsNotNull("lrGuid")
|
})
|
return if (records.isEmpty()) {
|
BaseResponse(false, "所选记录不存在")
|
} else {
|
records.forEach {
|
for (r in recordList) {
|
if (r.recordId == it.lrGuid) {
|
it.lrVerifierid = verifierId
|
it.lrVerifierrealname
|
it.lrVerifydate = Date()
|
it.lrIsverify = r.result
|
it.lrVerifyrst = r.remark
|
it.lrAiverifytime = if (it.lrAiverifytime == null) 0 else it.lrAiverifytime++
|
it.lrIsai = false
|
|
ledgerRecordMapper.updateByPrimaryKey(it)
|
continue
|
}
|
}
|
}
|
BaseResponse(true)
|
}
|
}
|
}
|