src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/EvaluationServiceImpl.kt
@@ -1,6 +1,16 @@
package cn.flightfeather.supervision.lightshare.service.impl
import cn.flightfeather.supervision.business.AutoScore2
import cn.flightfeather.supervision.business.bgtask.AopTaskCtrl
import cn.flightfeather.supervision.business.autooutput.score.AopEvaluation
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.common.exception.ResponseErrorException
import cn.flightfeather.supervision.common.executor.BgTaskStatus
import cn.flightfeather.supervision.domain.ds1.entity.Domainitem
import cn.flightfeather.supervision.domain.ds1.entity.Evaluation
import cn.flightfeather.supervision.domain.ds1.entity.Subtask
@@ -10,38 +20,60 @@
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.common.utils.DateUtil
import cn.flightfeather.supervision.common.utils.Domain
import cn.flightfeather.supervision.domain.ds1.repository.EvaluationRep
import cn.flightfeather.supervision.domain.ds1.repository.TaskRep
import cn.flightfeather.supervision.lightshare.service.EvaluationService
import cn.flightfeather.supervision.lightshare.service.SearchService
import cn.flightfeather.supervision.lightshare.service.SubtaskService
import cn.flightfeather.supervision.lightshare.vo.AreaVo
import cn.flightfeather.supervision.lightshare.vo.SubtaskVo
import cn.flightfeather.supervision.lightshare.vo.*
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.beans.factory.annotation.Value
import org.springframework.stereotype.Service
import tk.mybatis.mapper.entity.Example
import java.io.File
import java.net.URLEncoder
import java.util.*
import javax.servlet.http.HttpServletResponse
import kotlin.Comparator
@Service
class EvaluationServiceImpl(val evaluationMapper: EvaluationMapper) : EvaluationService {
class EvaluationServiceImpl(
    private val evaluationMapper: EvaluationMapper,
    private val evaluationRep: EvaluationRep,
    private val taskRep: TaskRep,
    private val aopTaskCtrl: AopTaskCtrl,
    private val searchService: SearchService,
    private val dbMapper: DbMapper,
    @Value("\${filePath}") private val filePath: String,
    private val reportTaskCtrl: ReportTaskCtrl,
) : EvaluationService {
    @Autowired
    lateinit var subtaskService: SubtaskService
    @Autowired
    lateinit var domainitemMapper: DomainitemMapper
    @Autowired
    lateinit var subtaskMapper: SubtaskMapper
    @Autowired
    lateinit var aopEvaluation: AopEvaluation
    private var isAutoScoreRunning = false
    //获取某顶层任务下某个场景的街道评分排名
    override fun getRankOfTown(tguid: String, scensetypeid: String?): List<AreaVo> {
    override fun getRankOfTown(tguid: String, scensetypeid: String?): List<EvaluateResVo> {
        val evaluationlist = getRankInfo(tguid, scensetypeid, null)
        var areaVolist = mutableListOf<AreaVo>()
        var areaVolist = mutableListOf<EvaluateResVo>()
        //考核类型是规范考核
        if (evaluationlist.isNotEmpty() &&
                Objects.equals(evaluationlist.get(0).ertype, Constant.RuleType.STANDARD.value)) {
            Objects.equals(evaluationlist.get(0).ertype, Constant.RuleType.STANDARD.value)
        ) {
            //获取规范考核的考核界限(问题数量)
            val example = Example(Domainitem::class.java)
            val criteria = example.createCriteria()
            criteria.andEqualTo("dcguid", Domain.STANDARDLEVEL.value)
            val standardlevel:String? = domainitemMapper.selectByExample(example).get(0).value
            val standardlevel: String? = domainitemMapper.selectByExample(example).get(0).value
            //按街镇计算严重不规范场景数量并按百分比排序
            while (evaluationlist.isNotEmpty()) {
                val tmplist = mutableListOf<Evaluation>()
@@ -49,11 +81,11 @@
                val iterator: MutableIterator<Evaluation> = tmplist.iterator()
                val evaluation = evaluationlist.get(0)//获取一种街镇
                var areaVo = AreaVo()
                var areaVo = EvaluateResVo()
                areaVo = transform(areaVo, evaluation)
                while (iterator.hasNext()){
                while (iterator.hasNext()) {
                    val tmp = iterator.next()
                    if (Objects.equals(tmp.towncode, evaluation.towncode)){
                    if (Objects.equals(tmp.towncode, evaluation.towncode)) {
                        if (tmp.resultscorebef!!.toInt() >= standardlevel!!.toInt())
                            areaVo.notstandardnum++
                        areaVo.allsensenum++
@@ -67,7 +99,8 @@
        }
        //考核类型是评分考核
        else if (evaluationlist.isNotEmpty() &&
                Objects.equals(evaluationlist.get(0).ertype, Constant.RuleType.SCORE.value)){
            Objects.equals(evaluationlist.get(0).ertype, Constant.RuleType.SCORE.value)
        ) {
            //获取评分考核的评分界限
            val example = Example(Domainitem::class.java)
            val criteria = example.createCriteria()
@@ -81,9 +114,9 @@
                val iterator: MutableIterator<Evaluation> = tmplist.iterator()
                val evaluation = evaluationlist.get(0)//获取一种街镇
                var areaVo = AreaVo()
                var areaVo = EvaluateResVo()
                areaVo = transform(areaVo, evaluation)
                while (iterator.hasNext()){
                while (iterator.hasNext()) {
                    val tmp = iterator.next()
                    if (Objects.equals(tmp.towncode, evaluation.towncode)) {
                        if (tmp.resultscorebef!!.toInt() < scorelevellist.get(scorelevellist.size - 1).text!!.toInt())
@@ -119,7 +152,7 @@
    override fun delete(id: String): Int = evaluationMapper.deleteByPrimaryKey(id)
    //获取指定区域(顶层任务)指定场景的评分信息
    fun getRankInfo(tguid: String, scensetypeid: String?, ruletypeid: ByteArray?):MutableList<Evaluation>{
    fun getRankInfo(tguid: String, scensetypeid: String?, ruletypeid: ByteArray?): MutableList<Evaluation> {
        val evaluationlist = mutableListOf<Evaluation>()
        val subtaskVolist = subtaskService.findByTaskID(tguid)
        subtaskVolist.forEach {
@@ -131,11 +164,11 @@
                criteria.andEqualTo("scensetypeid", scensetypeid)
            if (ruletypeid != null)//评分类型
                criteria.andEqualTo("ertype", ruletypeid)
            else{
            else {
                criteria.andEqualTo("ertype", Constant.RuleType.STANDARD.value)
                val result = evaluationMapper.selectByExample(example)//查询是否有规范性评分表
                //没有规范表就查询评分表
                if (result.isEmpty()){
                if (result.isEmpty()) {
                    val example1 = Example(Evaluation::class.java)
                    val criteria1 = example1.createCriteria()
                    criteria1.andEqualTo("stguid", it.stguid)//子任务id
@@ -145,8 +178,7 @@
                    val result1 = evaluationMapper.selectByExample(example1)
                    if (result1.size == 1)
                        evaluationlist.add(result1.get(0))
                }
                else
                } else
                    if (result.size == 1)
                        evaluationlist.add(result.get(0))
            }
@@ -155,7 +187,7 @@
    }
    //Evaluation传递数据给AreaVo
    fun transform(areaVo: AreaVo, evaluation: Evaluation):AreaVo{
    fun transform(areaVo: EvaluateResVo, evaluation: Evaluation): EvaluateResVo {
        areaVo.provincecode = evaluation.provincecode
        areaVo.provincename = evaluation.provincename
        areaVo.citycode = evaluation.citycode
@@ -168,34 +200,19 @@
    }
    //按街道严重不规范场景百分比排序
    fun sort(areaVolist: MutableList<AreaVo>):MutableList<AreaVo>{
        Collections.sort(areaVolist, object : Comparator<AreaVo>{
            override fun compare(o1: AreaVo?, o2: AreaVo?): Int {
    fun sort(areaVolist: MutableList<EvaluateResVo>): MutableList<EvaluateResVo> {
        Collections.sort(areaVolist, object : Comparator<EvaluateResVo> {
            override fun compare(o1: EvaluateResVo?, o2: EvaluateResVo?): Int {
                var num1 = 0.0
                if (o1!!.allsensenum != 0)
                    num1 = (o1.notstandardnum/o1.allsensenum).toDouble()
                    num1 = (o1.notstandardnum / o1.allsensenum).toDouble()
                var num2 = 0.0
                if (o2!!.allsensenum != 0)
                    num2 = (o2.notstandardnum/o2.allsensenum).toDouble()
                    num2 = (o2.notstandardnum / o2.allsensenum).toDouble()
                return compareValues(num1, num2)
            }
        })
        return areaVolist
    }
    override fun getTopTaskByScene(sceneId: String?): String? {
        val example = Example(Evaluation::class.java)
        val criteria = example.createCriteria()
        criteria.andEqualTo("sguid", sceneId)
        example.orderBy("evaluatetime").desc()
        val evaluationlist = evaluationMapper.selectByExample(example)
        var subtask = SubtaskVo()
        if (evaluationlist.isNotEmpty()) {
            val stguid = evaluationlist[0].stguid
            if (stguid != null)
                subtask = subtaskService.findByID(stguid)
        }
        return subtask.tguid
    }
    override fun autoScore(districtCode: String, time: String): List<String> {
@@ -244,9 +261,71 @@
        return resultList
    }
    override fun autoScore3(tGuid: String, sceneTypeId: String): String {
        if (isAutoScoreRunning) return "自动评分执行中,请等待完成"
        isAutoScoreRunning = true
//        val t = Constant.ScenseType.getByValue(sceneTypeId)
//        autoScore.sceneType = t
//        autoScore.topTaskGrade(tGuid)
        aopEvaluation.executeByTopTask(tGuid, sceneTypeId.toInt())
        isAutoScoreRunning = false
        return "自动评分完成"
    }
    override fun findByInspectionId(inspectionId: String): List<Evaluation> {
        return evaluationMapper.selectByExample(Example(Evaluation::class.java).apply {
            createCriteria().andEqualTo("iguid", inspectionId)
        })
    }
    override fun autoEvaluate(areaVo: AreaVo): BgTaskStatus? {
        //执行自动评估
        return aopTaskCtrl.startNewTask(areaVo)
    }
    override fun findAutoEvaluation(areaVo: AreaVo): List<AutoScoreResultVo?>? {
        //1. 查找历史记录,查看评估是否已存在
//        areaVo.scensetypeid ?: throw ResponseErrorException("查询时必须选择一个场景类型")
//        val task = taskRep.findOneTask(areaVo) ?: throw ResponseErrorException("查询时必须选择一个场景类型")
        return evaluationRep.findAutoScore(areaVo)
    }
    override fun downloadAutoEvaluation(areaVo: AreaVo, response: HttpServletResponse): Boolean {
        areaVo.scensetypeid ?: throw ResponseErrorException("必须选择一个场景类型")
        val topTask = taskRep.findOneTask(areaVo) ?: throw ResponseErrorException("未找到符合条件的顶层任务")
        val config = ExcelConfigVo(
            topTask.tguid ?: "",
            topTask.starttime,
            topTask.endtime,
            topTask.provincecode,
            topTask.citycode,
            topTask.districtcode,
            topTask.towncode,
            areaVo.scensetypeid?.toInt()
        )
        val dataSource = DataSource(config, dbMapper)
        val t = ReportTwo(dataSource)
        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
        }
    }
}