feiyu02
2024-11-08 d2727f231319a48019bc3b87439136ab49b97b9b
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/SearchServiceImpl.kt
@@ -1,17 +1,34 @@
package cn.flightfeather.supervision.lightshare.service.impl
import cn.flightfeather.supervision.business.bgtask.ReportTaskCtrl
import cn.flightfeather.supervision.business.report.DataSource
import cn.flightfeather.supervision.business.report.DbMapper
import cn.flightfeather.supervision.business.report.file.ReportOne
import cn.flightfeather.supervision.business.report.file.ReportThree
import cn.flightfeather.supervision.business.report.file.ReportTwo
import cn.flightfeather.supervision.business.report.template.*
import cn.flightfeather.supervision.common.exception.BizException
import cn.flightfeather.supervision.common.utils.*
import cn.flightfeather.supervision.domain.ds1.entity.*
import cn.flightfeather.supervision.domain.ds1.mapper.*
import cn.flightfeather.supervision.domain.ds1.repository.EvaluationRep
import cn.flightfeather.supervision.domain.ds1.repository.EvaluationRuleRep
import cn.flightfeather.supervision.domain.ds1.repository.SceneRep
import cn.flightfeather.supervision.domain.ds2.mapper.LedgerRecordMapper
import cn.flightfeather.supervision.domain.ds2.mapper.LedgerSubTypeMapper
import cn.flightfeather.supervision.domain.ds2.mapper.UserMapMapper
import cn.flightfeather.supervision.lightshare.service.SearchService
import cn.flightfeather.supervision.lightshare.service.TaskService
import cn.flightfeather.supervision.lightshare.vo.*
import com.github.pagehelper.PageHelper
import org.springframework.beans.BeanUtils
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
import tk.mybatis.mapper.entity.Example
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.net.URLEncoder
import java.nio.charset.StandardCharsets
import java.util.*
import javax.servlet.http.HttpServletResponse
@@ -25,51 +42,127 @@
    val userinfoMapper: UserinfoMapper,
    val subtaskMapper: SubtaskMapper,
    val scenseMapper: ScenseMapper,
    val sceneConstructionSiteMapper: SceneConstructionSiteMapper,
    val sceneMixingPlantMapper: SceneMixingPlantMapper,
    val sceneStorageYardMapper: SceneStorageYardMapper,
    val sceneWharfMapper: SceneWharfMapper,
    val problemlistMapper: ProblemlistMapper,
    val problemtypeMapper: ProblemtypeMapper,
    val townMapper: TownMapper,
    val mediafileMapper: MediafileMapper,
    val scoreMapper: ScoreMapper,
    val inspectionMapper: InspectionMapper,
    val taskMapper: TaskMapper
): SearchService {
    val taskMapper: TaskMapper,
    val monitorobjectversionMapper: MonitorobjectversionMapper,
    val evaluationruleMapper: EvaluationruleMapper,
    val evaluationsubruleMapper: EvaluationsubruleMapper2,
    val evaluationMapper: EvaluationMapper,
    val itemevaluationMapper: ItemevaluationMapper,
    val ledgerSubTypeMapper: LedgerSubTypeMapper,
    val ledgerRecordMapper: LedgerRecordMapper,
    val userMapMapper: UserMapMapper,
    val taskService: TaskService,
    private val evaluationRep: EvaluationRep,
    private val evaluationRuleRep: EvaluationRuleRep,
    private val sceneRep: SceneRep,
    @Value("\${filePath}") var filePath: String,
    @Value("\${imgPath}") var imgPath: String,
    private val dbMapper: DbMapper,
    private val reportTaskCtrl: ReportTaskCtrl,
) : SearchService {
    private val dateUtil = DateUtil()
    override fun writeToFile(config: ExcelConfigVo, mode: Int) {
        val dbMapper = DbMapper(
            scenseMapper,
            problemlistMapper,
            problemtypeMapper,
            subtaskMapper,
            monitorobjectversionMapper,
            sceneConstructionSiteMapper,
            sceneMixingPlantMapper,
            sceneStorageYardMapper,
            sceneWharfMapper,
            taskMapper,
            evaluationruleMapper, evaluationsubruleMapper, evaluationMapper, itemevaluationMapper,
            ledgerSubTypeMapper, ledgerRecordMapper, userinfoMapper, userMapMapper, townMapper
        )
        val dataSource = DataSource(config, dbMapper)
        val t = when (mode) {
            8 -> ReportOne(dataSource)
            9 -> ReportTwo(dataSource)
            10 -> ReportThree(dataSource)
    override fun writeToFile(config: ExcelConfigVo) {
        val fileName = "e:/${DateUtil().DateToString(Date(), "yyyy-MM-ddhhmmss")}.xls"
        val out = FileOutputStream(fileName)
        val heads = getTableTitles()
        val contents = getTableContents(config)
        ExcelUtil.write2(out, heads, contents)
            else -> null
        }
//        t?.execute()
        t?.toFile("target/")
    }
    override fun getExcel(config: ExcelConfigVo, response: HttpServletResponse): HttpServletResponse {
    override fun getExcel(config: ExcelConfigVo, response: HttpServletResponse): Boolean {
        val dataSource = DataSource(config, dbMapper)
        val t = when (config.mode) {
            1 -> ReportOne(dataSource)
            2 -> ReportTwo(dataSource)
            3 -> ReportThree(dataSource)
        val fileName = "${DateUtil().DateToString(Date(), "yyyy-MM-dd hh:mm:ss")}.xls"
        response.apply {
            setHeader("Content-Disposition", "attachment;filename=$fileName")
            setHeader("fileName", fileName)
            contentType = "application/vnd.ms-excel;charset=UTF-8"
            setHeader("Pragma", "no-cache")
            setHeader("Cache-Control", "no-cache")
            setDateHeader("Expires", 0)
            else -> ReportOne(dataSource)
        }
        val heads = getTableTitles()
        val contents = getTableContents(config)
        val out = response.outputStream
        ExcelUtil.write2(out, heads, contents)
        return response
        val fileName = t.getReportName()
        val p = "$filePath/autoscore/"
        val file = File(p + fileName)
        if (config.forceUpdate || !file.exists()) {
            val downloadUrl = "/autoscore/${fileName}"
            reportTaskCtrl.startTask(t, downloadUrl)
            return false
        } else {
            val fName = Base64.getEncoder().encodeToString(fileName.toByteArray())
            response.apply {
                setHeader("Content-Disposition", "attachment;filename=$fName")
                setHeader("fileName", fName)
                addHeader("Access-Control-Expose-Headers", "fileName")
                contentType = "application/vnd.ms-excel;charset=UTF-8"
                setHeader("Pragma", "no-cache")
                setHeader("Cache-Control", "no-cache")
                setDateHeader("Expires", 0)
            }
            response.outputStream.write(file.readBytes())
            return true
        }
    }
    override fun getSubTaskDetail(config: ExcelConfigVo): SubTaskTableVo {
        val titles = getTableTitles2()
        val content = getTableContents2(config)
        val dbMapper = DbMapper(
            scenseMapper,
            problemlistMapper,
            problemtypeMapper,
            subtaskMapper,
            monitorobjectversionMapper,
            sceneConstructionSiteMapper,
            sceneMixingPlantMapper,
            sceneStorageYardMapper,
            sceneWharfMapper,
            taskMapper,
            evaluationruleMapper, evaluationsubruleMapper, evaluationMapper, itemevaluationMapper,
            ledgerSubTypeMapper, ledgerRecordMapper, userinfoMapper, userMapMapper, townMapper
        )
//        val dataSource = DataSource(config, dbMapper)
//        val t = when (config.mode) {
////            1 -> ReportOne(dataSource)
////            2 -> ReportTwo(dataSource)
////            3 -> ReportThree(dataSource)
//            4->DailyReportSummary()
//            else -> ReportOne(dataSource)
//        }
//        val fileName = t.getReportName()
//        val fName = URLEncoder.encode(fileName, "UTF-8")
//
//        val p = Constant.DEFAULT_FILE_PATH + "/files/autoscore/"
//        val file = File(p + fileName)
//        if (config.forceUpdate || !file.exists()) {
//            t.toFile(p)
//        }
        return SubTaskTableVo(titles, content)
        return SubTaskTableVo(emptyList(), emptyList())
    }
    override fun downloadPic(config: ExcelConfigVo, response: HttpServletResponse): HttpServletResponse {
@@ -94,19 +187,19 @@
                }
            } else {
                createCriteria()
                        .andEqualTo("tguid", config.topTaskGuid)
                        .andGreaterThanOrEqualTo("planstarttime", config.startTime)
                        .andLessThanOrEqualTo("planendtime", config.endTime).apply {
                            config.provinceCode?.let {
                                andEqualTo("provincecode", it)
                            }
                            config.cityCode?.let {
                                andEqualTo("citycode", it)
                            }
                            config.districtCode?.let {
                                andEqualTo("districtcode", it)
                            }
                    .andEqualTo("tguid", config.topTaskGuid)
                    .andGreaterThanOrEqualTo("planstarttime", config.startTime)
                    .andLessThanOrEqualTo("planendtime", config.endTime).apply {
                        config.provinceCode?.let {
                            andEqualTo("provincecode", it)
                        }
                        config.cityCode?.let {
                            andEqualTo("citycode", it)
                        }
                        config.districtCode?.let {
                            andEqualTo("districtcode", it)
                        }
                    }
            }
            orderBy("planstarttime")
        }
@@ -118,7 +211,7 @@
            //根据场景条件筛选
            val need = if (config.sceneType != null) {
                scene.typeid == config.sceneType.toByte()
                scene.typeid == config.sceneType?.toByte()
            } else {
                true
            }
@@ -153,8 +246,9 @@
        }
        //建立第一层目录,包含所有的任务
        val time = DateUtil().DateToString(Date(), "yyyy-MM-dd_HH-mm-ss")
        var basePath = Constant.DEFAULT_FILE_PATH + File.separator + "images" + File.separator + "temp" + File.separator + time
        val time = DateUtil.DateToString(Date(), "yyyy-MM-dd_HH-mm-ss")
        var basePath =
            imgPath + File.separator + "temp" + File.separator + time
        var file = File(basePath)
        var i = 1
        while (file.exists() && i <= 100) {
@@ -163,7 +257,7 @@
            i++
        }
        if (file.exists()) {
            FileUtil().delAllFile(basePath)
            FileUtil.delAllFile(basePath)
        } else {
            file.mkdirs()
        }
@@ -180,7 +274,7 @@
                i++
            }
            if (sFile.exists()) {
                FileUtil().delAllFile(subTaskFilePath)
                FileUtil.delAllFile(subTaskFilePath)
            } else {
                sFile.mkdirs()
            }
@@ -196,7 +290,7 @@
                    i++
                }
                if (pFile.exists()) {
                    FileUtil().delAllFile(pPath)
                    FileUtil.delAllFile(pPath)
                } else {
                    pFile.mkdirs()
                }
@@ -205,11 +299,12 @@
                mediafileMapper.selectByExample(Example(Mediafile::class.java).apply {
                    createCriteria().andEqualTo("businessguid", p.guid)
                }).forEach { m ->
                    val picPath = Constant.DEFAULT_FILE_PATH + File.separator + "images" + File.separator + m.extension1 + m.guid + ".jpg"
                    val picPath =
                        imgPath + File.separator + m.extension1 + m.guid + ".jpg"
                    val fromFile = File(picPath)
                    val picName = p.problemname + "_" + p.location + "($y).jpg"
                    val toFile = File(pPath + File.separator + picName)
                    FileUtil().copy(fromFile, toFile)
                    FileUtil.copy(fromFile, toFile)
                    y++
                }
            }
@@ -241,15 +336,12 @@
        return response
    }
    override fun downloadPic2(
        sceneType: Int,
        topTaskId: String,
        response: HttpServletResponse
    ): HttpServletResponse {
    override fun downloadPic2(sceneType: Int, topTaskId: String, response: HttpServletResponse): HttpServletResponse {
        //建立第一层目录,包含所有的任务
        val topTask = taskMapper.selectByPrimaryKey(topTaskId)
        val time = DateUtil().DateToString(Date(), "yyyy-MM-dd_HH-mm-ss")
        val basePath = Constant.DEFAULT_FILE_PATH + File.separator + "images" + File.separator + "temp" + File.separator + topTask.name
        val time = DateUtil.DateToString(Date(), "yyyy-MM-dd_HH-mm-ss")
        val basePath =
            imgPath + File.separator + "temp" + File.separator + topTask.name
        val file = File(basePath)
        if (!file.exists()) {
            file.mkdirs()
@@ -268,7 +360,7 @@
                //建立一个子任务文件夹
                var subTaskFilePath = "${basePath}${File.separator}(${
                    dateUtil.DateToString(
                    DateUtil.DateToString(
                        it.planstarttime,
                        DateUtil.DateStyle.YYYY_MM_DD_CN
                    )
@@ -281,7 +373,7 @@
                    i++
                }
                if (sFile.exists()) {
                    FileUtil().delAllFile(subTaskFilePath)
                    FileUtil.delAllFile(subTaskFilePath)
                } else {
                    sFile.mkdirs()
                }
@@ -311,18 +403,18 @@
                            i++
                        }
                        if (pFile.exists()) {
                            FileUtil().delAllFile(pPath)
                            FileUtil.delAllFile(pPath)
                        } else {
                            pFile.mkdirs()
                        }
                        u.forEach { f ->
                            val picPath =
                                Constant.DEFAULT_FILE_PATH + File.separator + "images" + File.separator + f.extension1 + f.guid + ".jpg"
                                imgPath + File.separator + f.extension1 + f.guid + ".jpg"
                            val fromFile = File(picPath)
                            val picName = f.description
                            val toFile = File(pPath + File.separator + picName)
                            FileUtil().copy(fromFile, toFile)
                            FileUtil.copy(fromFile, toFile)
                        }
                    }
                }
@@ -358,7 +450,13 @@
        return response
    }
    override fun searchScore4JingAn(token: String, year: Int, month: Int, page: Int?, perPage: Int?): BaseResponse<List<ScoreVo>> {
    override fun searchScore4JingAn(
        token: String,
        year: Int,
        month: Int,
        page: Int?,
        perPage: Int?,
    ): BaseResponse<List<ScoreVo>> {
        if (token != "jingan") {
            return BaseResponse(false)
        }
@@ -381,305 +479,12 @@
        return BaseResponse(true, head = DataHead(p.pageNum, p.pages), data = result)
    }
    private fun getTableTitles(): List<String> = listOf(
            "序号", "任务", "场景", "经度", "纬度",
            "类型",
            "开始时间", "结束时间",
            "状态", "组长",
            "组员", "问题类型","问题详情", "街镇", "审核"
    )
    /**
     * 相比于getTableContents() ,删减了部分列
     */
    private fun getTableTitles2(): List<String> = listOf(
//            "序号",
            "任务",
//            "场景", "经度", "纬度",
            "类型",
            "开始时间",
//            "结束时间",
            "状态", "组长",
            "组员", "问题类型","问题详情", "街镇", "审核"
    )
    private fun getTableContents(config: ExcelConfigVo): List<Array<Any>> {
        val townName = if (config.townCode == null) {
            null
        } else {
            val l = townMapper.selectByExample(Example(Town::class.java).apply {
                createCriteria().andEqualTo("towncode", config.townCode)
            })
            if (l.isNotEmpty()) {
                l[0].townname
            } else {
                null
            }
        }
        val subTaskExample = Example(Subtask::class.java).apply {
            if (config.subTaskIdList != null && config.subTaskIdList.isNotEmpty()) {
                createCriteria().apply {
                    config.subTaskIdList.forEach {
                        orEqualTo("stguid", it)
                    }
                }
            } else {
                createCriteria()
                        .andEqualTo("tguid", config.topTaskGuid)
                        .andGreaterThanOrEqualTo("planstarttime", config.startTime)
                        .andLessThanOrEqualTo("planendtime", config.endTime).apply {
                            config.provinceCode?.let {
                                andEqualTo("provincecode", it)
                            }
                            config.cityCode?.let {
                                andEqualTo("citycode", it)
                            }
                            config.districtCode?.let {
                                andEqualTo("districtcode", it)
                            }
//                            config.townCode?.let {
//                                andEqualTo("towncode", it)
//                            }
                        }
            }
            orderBy("planstarttime")
        }
        val contents = mutableListOf<Array<Any>>()
        val subTasks = mutableListOf<Subtask>()
        var i = 1
        subtaskMapper.selectByExample(subTaskExample).forEach {
            //查询该任务对应的场景
            val scene = scenseMapper.selectByPrimaryKey(it.scenseid)
            //根据场景条件筛选
            val need = if (config.sceneType != null) {
                scene.typeid == config.sceneType.toByte()
            } else {
                true
            }
            if (need) {
                //记录查询到子任务
                subTasks.add(it)
                val problemTypes = mutableListOf<String>()
                val problems = mutableListOf<String>()
                val districts = mutableListOf<String>()
                val checkStatus= mutableListOf<String>()
                //查询子任务对应的问题,并且根据条件进行筛选
                val problemlistExample = Example(Problemlist::class.java).apply {
                    createCriteria().andEqualTo("stguid", it.stguid).apply {
                        config.problemName?.let {p->
                            andEqualTo("problemname", p)
                        }
                        townName?.let {t->
                            andLike("location", "%$t%")
                        }
                    }
                }
                var y=1
                problemlistMapper.selectByExample(problemlistExample).forEach problemType@{p->
                    val result = problemtypeMapper.selectByPrimaryKey(p.ptguid)
                    if (config.problemTypeName != null) {
                        if (result.typename != config.problemTypeName) {
                            return@problemType
                        }
                    }
                    problemTypes.add(result.typename ?: "")
                    problems.add("$y、${p.problemname}")
                    districts.add(p.location ?: "")
                    val status = when (p.extension3) {
                        Constant.PROBLEM_UNCHECKED -> "未审核"
                        Constant.PROBLEM_CHECK_PASS-> "通过"
                        Constant.PROBLEM_CHECK_FAIL -> "未通过"
                        else->"未审核"
                    }
                    checkStatus.add(status)
                    y++
                }
                //当有问题作为筛选条件时,如果没有找到对应问题,则该次任务去除
                if ( (config.problemTypeName != null || config.problemName != null || townName != null)
                        && (problemTypes.isEmpty() && problems.isEmpty())) {
                    return@forEach
                }
                val rowContent = arrayOf<Any>(
                        "$i", it.name ?: "", it.scensename ?: "", scene.longitude.toString(), scene.latitude.toString(),
                        scene.type ?: "",
                        DateUtil().DateToString(it.executionstarttime, "yyyy-MM-dd HH:mm:ss") ?: "", DateUtil().DateToString(it.executionendtime, "yyyy-MM-dd hh:mm:ss") ?: "",
                        it.status ?: "", it.assessorrealname?.replace("#", "、") ?: "",
                        it.executorrealtimes?.replace("#", "、") ?: "", problemTypes.toTypedArray(), problems.toTypedArray(), districts.toTypedArray(), checkStatus.toTypedArray()
                )
                contents.add(rowContent)
                i++
            }
        }
        return contents
    }
    /**
     * 相比于getTableContents() ,删减了部分列
     */
    private fun getTableContents2(config: ExcelConfigVo): List<Array<Any>> {
        val townName = if (config.townCode == null) {
            null
        } else {
            val l = townMapper.selectByExample(Example(Town::class.java).apply {
                createCriteria().andEqualTo("towncode", config.townCode)
            })
            if (l.isNotEmpty()) {
                l[0].townname
            } else {
                null
            }
        }
        val subTaskExample = Example(Subtask::class.java).apply {
            if (config.subTaskIdList != null && config.subTaskIdList.isNotEmpty()) {
                createCriteria().apply {
                    config.subTaskIdList.forEach {
                        orEqualTo("stguid", it)
                    }
                }
            } else {
                createCriteria()
                        .andEqualTo("tguid", config.topTaskGuid)
                        .andGreaterThanOrEqualTo("planstarttime", config.startTime)
                        .andLessThanOrEqualTo("planendtime", config.endTime).apply {
                            config.provinceCode?.let {
                                andEqualTo("provincecode", it)
                            }
                            config.cityCode?.let {
                                andEqualTo("citycode", it)
                            }
                            config.districtCode?.let {
                                andEqualTo("districtcode", it)
                            }
//                            config.townCode?.let {
//                                andEqualTo("towncode", it)
//                            }
                        }
            }
            orderBy("planstarttime")
        }
        val contents = mutableListOf<Array<Any>>()
        val subTasks = mutableListOf<Subtask>()
        var i = 1
        subtaskMapper.selectByExample(subTaskExample).forEach {
            //查询该任务对应的场景
            val scene = scenseMapper.selectByPrimaryKey(it.scenseid)
            //根据场景条件筛选
            val need = if (config.sceneType != null) {
                scene.typeid == config.sceneType.toByte()
            } else {
                true
            }
            if (need) {
                //记录查询到子任务
                subTasks.add(it)
                val problemTypes = mutableListOf<String>()
                val problems = mutableListOf<String>()
                val districts = mutableListOf<String>()
                val checkStatus= mutableListOf<String>()
                //查询子任务对应的问题,并且根据条件进行筛选
                val problemlistExample = Example(Problemlist::class.java).apply {
                    createCriteria().andEqualTo("stguid", it.stguid).apply {
                        config.problemName?.let {p->
                            andEqualTo("problemname", p)
                        }
                        townName?.let {t->
                            andLike("location", "%$t%")
                        }
                    }
                }
                var y=1
                problemlistMapper.selectByExample(problemlistExample).forEach problemType@{p->
                    val result = problemtypeMapper.selectByPrimaryKey(p.ptguid)
                    if (config.problemTypeName != null) {
                        if (result?.typename != config.problemTypeName) {
                            return@problemType
                        }
                    }
                    problemTypes.add(result?.typename ?: "")
                    problems.add("$y、${p.problemname}")
                    districts.add(p.location ?: "")
                    val status = when (p.extension3) {
                        Constant.PROBLEM_UNCHECKED -> "未审核"
                        Constant.PROBLEM_CHECK_PASS-> "通过"
                        Constant.PROBLEM_CHECK_FAIL -> "未通过"
                        else->"未审核"
                    }
                    checkStatus.add(status)
                    y++
                }
                //当有问题作为筛选条件时,如果没有找到对应问题,则该次任务去除
                if ( (config.problemTypeName != null || config.problemName != null || townName != null)
                        && (problemTypes.isEmpty() && problems.isEmpty())) {
                    return@forEach
                }
//                val lineMaxSize =3
//
//                val leader = it.assessorrealname?.split("#")
//                val leaderStr = StringBuilder()
//                for (t in 0 until (leader?.size ?: 0)) {
//                    if (t > 0) {
//                        leaderStr.append("、")
//                    }
//                    if (t == lineMaxSize - 1) {
//                        leaderStr.append("\r\n")
//                    }
//                    leaderStr.append(leader?.get(t))
//                }
//
//                val member = it.executorrealtimes?.split("#")
//                val memberStr = StringBuilder()
//                for (t in 0 until (member?.size ?: 0)) {
//                    if (t > 0) {
//                        memberStr.append("、")
//                    }
//                    if (t == lineMaxSize - 1) {
//                        memberStr.append("\r\n")
//                    }
//                    memberStr.append(member?.get(t))
//                }
                val rowContent = arrayOf<Any>(
//                        "$i",
                        it.name ?: "",
//                        it.scensename ?: "", scene.longitude.toString(), scene.latitude.toString(),
                        scene.type ?: "",
                        DateUtil().DateToString(it.executionstarttime, "yyyy-MM-dd HH:mm:ss") ?: "",
//                        DateUtil().DateToString(it.executionendtime, "yyyy-MM-dd hh:mm:ss") ?: "",
                        it.status ?: "", it.assessorrealname?.replace("#", "、") ?: "",
                        it.executorrealtimes?.replace("#", "、") ?: "", problemTypes.toTypedArray(), problems.toTypedArray(), districts.toTypedArray(), checkStatus.toTypedArray()
                )
                contents.add(rowContent)
                i++
            }
        }
        return contents
    }
    override fun searchSubTaskByKeyword(userId: String, keyword: String, page: Int, perPage: Int): BaseResponse<List<SubtaskVo>> {
    override fun searchSubTaskByKeyword(
        userId: String,
        keyword: String,
        page: Int,
        perPage: Int,
    ): BaseResponse<List<SubtaskVo>> {
        val userInfo = userinfoMapper.selectByPrimaryKey(userId)
        if (userInfo.usertypeid?.toInt() == 3) return BaseResponse(false, "企业用户无查询权限")//企业用户无法查询
        val result = mutableListOf<SubtaskVo>()
@@ -688,7 +493,8 @@
            createCriteria().andLike("name", "%${keyword}%")
                .apply {
                    when (userInfo.usertypeid?.toInt()) {
                        0 -> {} //管理员用户查询无其他限制
                        0 -> {
                        } //管理员用户查询无其他限制
                        1 -> andLike("executorguids", "%${userId}%")//对于一般的巡查人员,只能查询到自己参与的子任务
                        2 -> andEqualTo("districtcode", userInfo.dGuid)//此处对于政府用户,dGuid存储的是区县编号
                    }
@@ -700,6 +506,73 @@
            result.add(vo)
        }
        return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages) ,data = result)
        return BaseResponse(true, head = DataHead(pageInfo.pageNum, pageInfo.pages), data = result)
    }
    override fun getDailyReport(config: ExcelConfigVo): BaseTableVo {
        if (config.districtCode == null || config.startTime == null) return BaseTableVo(emptyList(), emptyList())
        val dbMapper = DbMapper(
            scenseMapper,
            problemlistMapper,
            problemtypeMapper,
            subtaskMapper,
            monitorobjectversionMapper,
            sceneConstructionSiteMapper,
            sceneMixingPlantMapper,
            sceneStorageYardMapper,
            sceneWharfMapper,
            taskMapper,
            evaluationruleMapper, evaluationsubruleMapper, evaluationMapper, itemevaluationMapper,
            ledgerSubTypeMapper, ledgerRecordMapper, userinfoMapper, userMapMapper, townMapper
        )
        val task =
            taskService.getByDistrictCode(config.districtCode, config.startTime).takeIf { it.isNotEmpty() }?.get(0)
        config.topTaskGuid = task?.tguid ?: ""
        config.allScene = false
        val dataSource = mutableListOf<DataSource>()
//        config.sceneType = Constant.SceneType.TYPE1.value.toInt()
        dataSource.add(DataSource(config, dbMapper))
//        val config2 = config.copy(sceneType = Constant.ScenseType.TYPE2.value.toInt())
//        dataSource.add(DataSource(config2, dbMapper))
//
//        val config3 = config.copy(sceneType = Constant.ScenseType.TYPE3.value.toInt())
//        dataSource.add(DataSource(config3, dbMapper))
//
//        val config4 = config.copy(sceneType = Constant.ScenseType.TYPE14.value.toInt())
//        dataSource.add(DataSource(config4, dbMapper))
        val t = DailyReportSummary(dataSource)
        t.execute()
        val result = t.toTableRows()
        return BaseTableVo(result.first, result.second)
    }
    override fun getScoreDetail(subTaskId: String): ScoreDetail {
        //场景信息
        val scene = sceneRep.findBySubTask(subTaskId)
        //总分
        val evaluation = evaluationRep.findBySubtask(subTaskId)
        //子规则逐条得分
        val subRuleScores = evaluationRep.findItemEvaluation(subTaskId)
        if (subRuleScores.isEmpty()) throw BizException("无评估记录")
        //评分总规则
        val rule = evaluationRuleRep.findAutoEvaluationRule(subTaskId) ?: throw BizException("未找到相关自动评估规则")
        //总规则对应的评分子规则
        val subRules = evaluationRuleRep.findSubRule(rule.guid)
        //查询结果
        val result = ScoreDetail()
        result.status = if (scene?.extension1.equals("1")) "在建" else "完工"
        result.updateTime = evaluation?.updatedate
        subRules.forEach {
            it.ertype ?: return@forEach
            result.addDetail(result.details, it, it.ertype!! - 1, subRuleScores, true)
        }
        result.calScore()
        return result
    }
}