feiyu02
2024-11-19 752e00503f672ddfe2066afb6c235721a3a912b5
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/Impl/LedgerServiceImpl.kt
@@ -3,12 +3,14 @@
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.domain.repository.LedgerMediaFileRep
import cn.flightfeather.supervision.domain.repository.LedgerRep
import cn.flightfeather.supervision.domain.repository.UserInfoRep
import cn.flightfeather.supervision.infrastructure.utils.DateUtil
import cn.flightfeather.supervision.infrastructure.utils.FileUtil
import cn.flightfeather.supervision.infrastructure.utils.UUIDGenerator
@@ -17,9 +19,16 @@
import com.fasterxml.jackson.core.type.TypeReference
import com.fasterxml.jackson.databind.ObjectMapper
import com.github.pagehelper.PageHelper
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.io.File
import java.io.FileNotFoundException
import java.time.LocalDate
import java.time.LocalDateTime
import java.time.ZoneId
import java.time.format.DateTimeFormatter
import java.util.*
import javax.servlet.http.HttpServletResponse
import kotlin.collections.ArrayList
@@ -27,11 +36,19 @@
@Service
class LedgerServiceImpl(
        val ledgerSubTypeMapper: LedgerSubTypeMapper,
        val userinfoMapper: UserinfoMapper,
        val ledgerRecordMapper: LedgerRecordMapper,
        val ledgerMediaFileMapper: LedgerMediaFileMapper
):LedgerService {
    val ledgerSubTypeMapper: LedgerSubTypeMapper,
    val userinfoMapper: UserinfoMapper,
    val ledgerRecordMapper: LedgerRecordMapper,
    val ledgerMediaFileMapper: LedgerMediaFileMapper,
    private val ledgerMediaFileRep: LedgerMediaFileRep,
    private val userInfoRep: UserInfoRep,
    private val ledgerRep: LedgerRep,
) : LedgerService {
    @Value("\${imgPath}")
    lateinit var imgPath: String
    private val notInvolvedPath = "ledgerIcons/ledger_not_involved.jpg"
    override fun getLedgerType(sceneType: Int): ArrayList<LedgerSubTypeVo> {
        val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
@@ -42,13 +59,13 @@
        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()
                it.lsSubtypeid,
                it.lsName,
                it.getlTypeid(),
                it.getlTypename(),
                needUpdate = it.getlNeedupdate(),
                sceneType = it.getlScenetype(),
                iconUrl = it.getlIconurl()
            )
            resultList.add(l)
        }
@@ -56,10 +73,15 @@
    }
    override fun getUserLedgerSummary(userId: String, sceneType: Int, time: String): List<LedgerSubTypeVo> {
        val c = Calendar.getInstance().apply { this.time = DateUtil.StringToDate(time) }
        val year = c.get(Calendar.YEAR)
        val month = c.get(Calendar.MONTH) + 1
        val ledgerSubTypes = ledgerSubTypeMapper.selectByExample(Example(LedgerSubType::class.java).apply {
            if (sceneType != SceneType.NoType.value) {
                createCriteria().andEqualTo("lScenetype", sceneType)
            }
            orderBy("lTypeid")
        })
        val records = getLedgerRecords(userId, null, sceneType, time)
        val resultList = mutableListOf<LedgerSubTypeVo>()
@@ -72,17 +94,28 @@
                needUpdate = it.getlNeedupdate(),
                sceneType = it.getlScenetype(),
                iconUrl = it.getlIconurl(),
                realTime = it.getlRealTime()
                realTime = it.getlRealTime(),
                description = it.getlDescription(),
                notRelated = it.getlNotRelatedSwitch() ?: true,
                multigroup = it.getlMultiGroup() ?: false
            )
            for (r in records) {
                if (l.ledgerSubTypeId == r.lsSubtypeid) {
                    // FIXME: 2023/5/6 规则变动,但为了不影响之前的记录,时间为2023年4月及之前的不适用新规则
                    if (year >= 2023 && month > 4) {
                        if (r.lrExtension2 == "notInvolved" && r.lrYear <= year && r.lrMonth < month.toByte()) {
                            continue
                        }
                    }
                    l.ledgerFinished = true
                    l.upLoad = true
//                    l.checkStatus = r.lrVerifyrst?.toIntOrNull() ?: LedgerCheckStatus.UnCheck.value
                    l.onTime = r.lrIssubmitontime
                    l.verified
                    l.verifierName = r.lrVerifierrealname
                    l.verified = r.lrIsverify
                    l.verifyRst = l.verifyRst
                    l.verifyRst = r.lrVerifyrst
                    l.involved = r.lrExtension2 != "notInvolved"
                    break
                }
            }
@@ -92,9 +125,10 @@
        return resultList
    }
    override fun getLedgerDetail(userId: String, ledgerSubTypeId: Int?, sceneType: Int,
                                 startTime: String, endTime: String,
                                 page: Int?, perPage: Int, response: HttpServletResponse
    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>()
@@ -117,32 +151,32 @@
        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) }
                    }
                .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) {
                    .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()
                    }
                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)
                    }
                Example(LedgerSubType::class.java).apply {
                    createCriteria().andEqualTo("lsSubtypeid", it.lsSubtypeid)
                }
            )
            result.add(LedgerVo().apply {
                id = it.lrGuid
@@ -159,7 +193,7 @@
                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()
                this.sceneType = if (it.lrExtension1 == null) SceneType.Restaurant.value else it.lrExtension1.toInt()
            })
        }
@@ -170,24 +204,41 @@
    }
    override fun getLedgerDetail2(userId: String, ledgerSubTypeId: Int?, sceneType: Int, time: String): List<LedgerVo> {
        val records = getLedgerRecords(userId, ledgerSubTypeId, sceneType, time)
    override fun getLedgerDetail2(
        userId: String,
        ledgerSubTypeId: Int?,
        sceneType: Int,
        time: String?,
    ): List<LedgerVo> {
        val records = if (time != null) {
            getLedgerRecords(userId, ledgerSubTypeId, sceneType, time)
        } else {
            // FIXME: 2022/10/13 暂时只支持ledgerSubTypeId不为null的情况
            if (ledgerSubTypeId == null) return emptyList()
            PageHelper.startPage<LedgerRecord>(1, 1)
            ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
                createCriteria().andEqualTo("lrSubmitid", userId)
                    .andEqualTo("lsSubtypeid", ledgerSubTypeId)
                orderBy("lrSubmitdate").desc()
            })
        }
        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()
                    }
            )
                Example(LedgerMediaFile::class.java).apply {
                    createCriteria().andEqualTo("lrGuid", it.lrGuid)
                        .andEqualTo("mfIsdelete", false)
                        .andEqualTo("mfFiletype", it.lrEasubmitkind)
                    orderBy("mfSavetime").desc()
                }
            )?.takeIf { it.isNotEmpty() }?.get(0)
            val type = ledgerSubTypeMapper.selectByExample(
                    Example(LedgerSubType::class.java).apply {
                        createCriteria().andEqualTo("lsSubtypeid", it.lsSubtypeid)
                    }
                Example(LedgerSubType::class.java).apply {
                    createCriteria().andEqualTo("lsSubtypeid", it.lsSubtypeid)
                }
            )
            result.add(LedgerVo().apply {
                id = it.lrGuid
                this.ledgerSubTypeId = it.lsSubtypeid
                ledgerName = it.lsSubtypename
@@ -198,43 +249,117 @@
                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()
                path1 = media?.mfPath1
                remark1 = media?.mfDescription1
                path2 = media?.mfPath2
                remark2 = media?.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 {
    override fun uploadLedger(userId: String, ledgerVo: LedgerVo, files: List<Pair<ByteArray, String>>): Boolean {
        val user = userInfoRep.getUser(userId)
        ledgerVo.apply {
            if (fileType == null) fileType = 1
            user?.extension2?.toInt()?.let { s -> sceneType = s }
        }
        val historyRecord = ledgerRep.selectRecord(userId, ledgerVo.ledgerSubTypeId, ledgerVo.updateDate)
        var ledgerMedia: LedgerMediaFile? = null
        if (historyRecord == null) {
            //生成台账更新记录
            val ledgerRecord = ledgerVo.toLedgerRecord(user)
            ledgerVo.id = ledgerRecord.lrGuid
            ledgerRep.insertRecord(ledgerRecord)
            //生成一条多媒体文件记录
            val filePath = ledgerMediaFileRep.saveFile(userId, ledgerVo, files)
            ledgerMediaFileRep.insert(ledgerVo, filePath)
        } else {
            ledgerVo.id = historyRecord.lrGuid
            ledgerMedia = deleteLedgerFile(historyRecord.lrGuid)
            // 去除不涉及标志或复制标志
            historyRecord.lrSubmitdate = Date()
            historyRecord.lrExtension2 = null
            ledgerRep.updateRecord(historyRecord)
            //更新的多媒体文件记录数据
            val filePath = ledgerMediaFileRep.saveFile(userId, ledgerVo, files)
            ledgerMedia?.mfPath1 = filePath
            ledgerMedia?.mfDescription1 = ledgerVo.remark1
            ledgerMedia?.mfSavetime = Date()
            ledgerMediaFileRep.update(ledgerMedia)
        }
        return true
    }
    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>>(){})
        val ledgerVos = mapper.readValue<List<LedgerVo>>(ledgerVoList, 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 }
            userInfo?.extension2?.toInt()?.let { s -> it.sceneType = s }
            val today = Calendar.getInstance().apply { time = Date() }
                    .get(Calendar.DAY_OF_MONTH)
                .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 = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
                createCriteria().andEqualTo("lsSubtypeid", it.ledgerSubTypeId)
                    .andEqualTo("lrYear", updateYear)
                    .andEqualTo("lrMonth", updateMonth)
                    .andEqualTo("lrSubmitid", userId)
            })
            var ledgerMedia: LedgerMediaFile? = null
            if (tmp.isEmpty()) {
                //生成台账更新记录
                val ledgerRecord = LedgerRecord().apply {
                    lrGuid = UUIDGenerator.generate16ShortUUID()
                    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()
                }
                it.id = ledgerRecord.lrGuid
                ledgerRecordMapper.insert(ledgerRecord)
            } else {
                val record = tmp[0]
                it.id = record.lrGuid
                ledgerMedia = deleteLedgerFile(record.lrGuid)
                // 去除不涉及标志或复制标志
                record.lrExtension2 = null
                ledgerRecordMapper.updateByPrimaryKey(record)
            }
            //对每张图片生成相应的路径并保存
            var picPath = ""
            val time = DateUtil.DateToString(Date(), DateUtil.DateStyle.YYYY_MM)
            files.forEach {file->
            files.forEach { file ->
                val fileName = file.originalFilename
                //TODO 此处的文件路径需要修改为动态配置
                val basePath = "D:/02product/05ledger/images/"
//                val basePath = "D:/02product/05ledger/images/"
                val basePath = imgPath
                val path = "$time/$userId/${it.ledgerName}/"
                picPath += if (picPath.isEmpty()) {
                    "$path$fileName"
@@ -244,59 +369,30 @@
                try {
                    //调用文件保存方法
                    FileUtil.uploadFile(file.bytes, basePath + path, fileName!!)
                } catch (e: Exception) {
                } catch (e: FileNotFoundException) {
                    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)
            //生成台账更新记录
            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)
            if (ledgerMedia == null) {
                ledgerMedia = LedgerMediaFile().apply {
                    mfGuid = UUIDGenerator.generate16ShortUUID()
                    lrGuid = it.id
                    mfFiletype = it.fileType
                    mfPath1 = picPath
                    mfDescription1 = it.remark1
                    mfSavetime = Date()
                    mfIsdelete = false
                }
                //插入新的多媒体文件记录数据
                ledgerMediaFileMapper.insert(ledgerMedia)
            } else {
                ledgerRecordMapper.updateByPrimaryKey(ledgerRecord)
                ledgerMedia.mfPath1 = picPath
                ledgerMedia.mfDescription1 = it.remark1
                ledgerMedia.mfSavetime = Date()
                //更新的多媒体文件记录数据
                ledgerMediaFileMapper.updateByPrimaryKey(ledgerMedia)
            }
            return true
@@ -305,13 +401,79 @@
        return false
    }
    override fun uploadNoLedger(
        userId: String,
        time: String,
        remark: String?,
        ledgerIdList: 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, "用户不存在")
        ledgerIdList.forEach {
            //去重判断,当该类型台账已存在时,采用覆盖更新操作
            val r = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
                createCriteria().andEqualTo("lrSubmitid", userId)
                    .andEqualTo("lsSubtypeid", it)
                    .andEqualTo("lrYear", year)
                    .andEqualTo("lrMonth", month)
            })
            var record = if (r.size > 0) r[0] else null
            //生成台账更新记录
            if (record != null) {
                record.lrExtension2 = "notInvolved"
                ledgerRecordMapper.updateByPrimaryKey(record)
                deleteLedgerFile(record.lrGuid)?.let { m ->
                    m.mfPath1 = notInvolvedPath
                    ledgerMediaFileMapper.updateByPrimaryKey(m)
                }
            } else {
                //获取台账类型信息
                val ledgerType = ledgerSubTypeMapper.selectByPrimaryKey(it) ?: return@forEach
                record = LedgerRecord().apply {
                    lrGuid = record?.lrGuid ?: UUIDGenerator.generate16ShortUUID()
                    lsSubtypeid = ledgerType.lsSubtypeid
                    lsSubtypename = ledgerType.lsName
                    lrYear = year
                    lrMonth = month.toByte()
                    lrDay = day.toByte()
                    lrEasubmitkind = 1
                    lrSubmitid = userId
                    lrSubmitname = userInfo.acountname ?: ""
                    lrIssubmitontime = day <= 10
                    lrSubmitdate = Date()
                    lrUpdatetype
                    lrExtension1 = userInfo.extension2
                    lrExtension2 = "notInvolved"
                }
                ledgerRecordMapper.insert(record)
                //生成一条多媒体文件记录
                val ledgerMedia = LedgerMediaFile().apply {
                    mfGuid = UUIDGenerator.generate16ShortUUID()
                    lrGuid = record.lrGuid
                    mfFiletype = 1
                    mfPath1 = notInvolvedPath
                    mfDescription1 = remark
                    mfSavetime = Date()
                    mfIsdelete = false
                }
                ledgerMediaFileMapper.insert(ledgerMedia)
            }
        }
        return BaseResponse(true)
    }
    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)
                .andEqualTo("lrSubmitid", userId)
            orderBy("lrYear").desc().orderBy("lrMonth").desc().orderBy("lrDay").desc()
        }).takeIf { it.isNotEmpty() }?.get(0)
@@ -319,7 +481,7 @@
            ledgerMediaFileMapper.selectByExample(Example(LedgerMediaFile::class.java).apply {
                createCriteria().andEqualTo("lrGuid", it.lrGuid)
            }).forEach {
                it.mfPath1?.split(";")?.let {list ->
                it.mfPath1?.split(";")?.let { list ->
                    result.addAll(list)
                }
            }
@@ -334,14 +496,19 @@
        PageHelper.startPage<LedgerRecord>(1, 1)
        val record = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
            createCriteria().andIn("lsSubtypeid", ledgerType)
                    .andEqualTo("lrSubmitid", userId)
                .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> {
    override 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)
@@ -364,21 +531,29 @@
        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
            var endMon = startMon + p - 1
            if (endMon > month) endMon = month
            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)
                            }
                        }
                )
                    .andEqualTo("lrYear", year)
                    .andGreaterThanOrEqualTo("lrMonth", startMon.toByte())
                    .andLessThanOrEqualTo("lrMonth", endMon.toByte())
                    .andIn("lsSubtypeid", v)
            })
            records.addAll(r)
            val monMap = mutableMapOf<Int, LedgerRecord>()
            r.forEach {
                if (monMap.containsKey(it.lsSubtypeid)) {
                    val record = monMap[it.lsSubtypeid]!!
                    if (record.lrMonth < it.lrMonth) {
                        monMap[it.lsSubtypeid] = it
                    }
                } else {
                    monMap[it.lsSubtypeid] = it
                }
            }
            monMap.forEach { (_, u) ->
                records.add(u)
            }
        }
        return records
@@ -387,6 +562,7 @@
    override fun copyLedger(userId: String, time: String, copyLedgerList: List<CopyLedgerVo>): BaseResponse<String> {
        val year = time.split("-")[0]
        val month = time.split("-")[1]
        val date = DateUtil.StringToDate(time, DateUtil.DateStyle.YYYY_MM)
        copyLedgerList.forEach {
            //去重判断
            val r = ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
@@ -406,7 +582,7 @@
                    .andEqualTo("lsSubtypeid", it.subTypeId)
                    .andEqualTo("lrYear", y)
                    .andEqualTo("lrMonth", m)
            }).forEach record@ {lr ->
            }).forEach record@{ lr ->
                //获取记录对应的文件信息
                val fileList = ledgerMediaFileMapper.selectByExample(Example(LedgerMediaFile::class.java).apply {
                    createCriteria().andEqualTo("lrGuid", lr.lrGuid)
@@ -419,7 +595,7 @@
                lr.lrYear = year.toInt()
                lr.lrMonth = month.toByte()
                lr.lrIssubmitontime = true
                lr.lrSubmitdate = Date()
                lr.lrSubmitdate = date
                lr.lrExtension2 = "copy"//表明是复制的台账
                ledgerRecordMapper.insert(lr)
@@ -436,7 +612,11 @@
        return BaseResponse(true)
    }
    override fun checkLedger(verifierId: String, remark: String?, recordList: List<LedgerCheckVo>): BaseResponse<Boolean> {
    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 {
@@ -465,4 +645,21 @@
            BaseResponse(true)
        }
    }
    /**
     * 删除台账的文件记录
     * @param lrGuid 台账记录id
     */
    private fun deleteLedgerFile(lrGuid: String): LedgerMediaFile? {
        return ledgerMediaFileRep.select(lrGuid)?.apply {
            if (this.mfPath1 != notInvolvedPath) {
                this.mfPath1.split(";").forEach { p ->
                    val path = imgPath + p
                    FileUtil.deleteFile(path)
                }
//                this.mfPath1 = notInvolvedPath
//                ledgerMediaFileMapper.updateByPrimaryKey(this)
            }
        }
    }
}