From aed297a5fbc8df9dab01b28da21f872ee546b43c Mon Sep 17 00:00:00 2001
From: feiyu02 <risaku@163.com>
Date: 星期一, 13 十月 2025 16:15:11 +0800
Subject: [PATCH] 2025.10.13 1. 统一调整controller层的返回类型,通过添加全局响应增强器GlobalResponseAdvice来管理返回结果; 2. 新增mybatis-generator自定义插件,实现给数据库实体entity自动添加swagger注解@ApiModel和@ApiModelProperty
---
src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt | 424 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 files changed, 405 insertions(+), 19 deletions(-)
diff --git a/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt b/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt
index 0e23fd0..96f71fa 100644
--- a/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt
+++ b/src/main/kotlin/cn/flightfeather/supervision/business/report/DataSource.kt
@@ -1,31 +1,417 @@
package cn.flightfeather.supervision.business.report
-import cn.flightfeather.supervision.domain.ds1.entity.Problemlist
-import cn.flightfeather.supervision.domain.ds1.entity.Problemtype
-import cn.flightfeather.supervision.domain.ds1.entity.Scense
-import cn.flightfeather.supervision.domain.ds1.entity.Subtask
+import cn.flightfeather.supervision.common.utils.Constant
+import cn.flightfeather.supervision.common.utils.DateUtil
+import cn.flightfeather.supervision.domain.ds1.entity.*
+import cn.flightfeather.supervision.domain.ds1.mapper.*
+import cn.flightfeather.supervision.domain.ds2.entity.LedgerRecord
+import cn.flightfeather.supervision.domain.ds2.entity.LedgerSubType
+import cn.flightfeather.supervision.domain.ds2.entity.UserMap
+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.vo.ExcelConfigVo
+import org.springframework.stereotype.Component
+import tk.mybatis.mapper.entity.Example
+import java.time.LocalDateTime
+import java.time.ZoneId
/**
* 鎶ュ憡鎵�闇�婧愭暟鎹�
- * 鐢熸垚鎶ュ憡鏃讹紝鎵�闇�瑕佺殑鏁版嵁婧�
+ * 鐢熸垚鎶ュ憡鏃讹紝缁熶竴鑾峰彇鍚勫熀纭�鏁版嵁
+ * @param config 鐢熸垚鎶ュ憡鐨勫弬鏁�
*/
-class DataSource {
+class DataSource(val config: ExcelConfigVo, val dbMapper: DbMapper){
- private var subTask: Subtask? = null
+ private val sourceList = mutableListOf<Subtask>()
- /**
- * 鎸囧畾褰撳墠杩涜缁熻鐨勪富浣撳璞�
- */
- fun mainObj(subtask: Subtask) {
- this.subTask = subTask
+ var year = 0
+
+ var month = 0
+
+ var area = ""
+
+ val rowData = RowData()
+
+ init {
+// if (config.districtCode == null) {
+// throw IllegalStateException("鍙傛暟缂哄皯鍖哄幙缂栫爜:[districtCode]")
+// }
+// if (config.sceneType == null) {
+// throw IllegalStateException("鍙傛暟缂哄皯鍦烘櫙绫诲瀷:[sceneType]")
+// }
+ getSource(config)
}
- //鍦烘櫙鍩烘湰淇℃伅
- var scene: Scense? = null
+ fun loop(callback: (index:Int, rowData: RowData) -> Unit) {
+// reset()
+ for (i in sourceList.indices) {
+// rowData.recordLastScene()
+ rowData.index = i
+ rowData.subTask = sourceList[i]
+ rowData.clear()
+ callback(i, rowData)
+ }
+ }
- //闂绫诲瀷
- var problemTypes = mutableListOf<Problemtype>()
+ /**
+ * 閲嶇疆
+ */
+ fun reset() {
+ rowData.index = 0
+ rowData.subTask = if (sourceList.isEmpty()) null else sourceList.first()
+ rowData.clear()
+ }
- //鍏蜂綋鐨勯棶棰�
- var problems = mutableListOf<Problemlist>()
-}
\ No newline at end of file
+ /**
+ * 鏁版嵁缁熻鐨勬椂闂村拰鍖哄煙鍚嶇О
+ */
+ fun areaName(): String {
+ val t = dbMapper.taskMapper.selectByPrimaryKey(config.topTaskGuid)
+ return "${DateUtil.DateToString(config.startTime, DateUtil.DateStyle.YYYY_MM_CN)}${t.districtname}${if (area != t.districtname) area else ""}${Constant.SceneType.getDes(config.sceneType)}"
+ }
+
+ /**
+ * 鑾峰彇鎶ュ憡鏁版嵁婧愶紙宸℃煡浠诲姟锛�
+ */
+ private fun getSource(config: ExcelConfigVo) {
+// if (config.sceneType == null) return
+
+ val result = mutableListOf<Subtask>()
+
+ if (config.townCode != null) {
+ dbMapper.townMapper.selectByExample(Example(Town::class.java).apply {
+ createCriteria().andEqualTo("towncode", config.townCode)
+ })?.takeIf { it.isNotEmpty() }?.get(0)?.let { area = it.townname ?: "" }
+ }
+
+ dbMapper.taskMapper.selectByPrimaryKey(config.topTaskGuid)?.let {
+ val time = LocalDateTime.ofInstant(it.starttime?.toInstant(), ZoneId.systemDefault())
+ this.year = time.year
+ this.month = time.monthValue
+ if (area.isBlank()) area = it.districtname ?: ""
+ }
+
+ // 缁熻鎬讳换鍔′笅鎵�鏈夊満鏅�
+ if (config.allScene) {
+ //1. 鏌ユ壘鐗瑰畾鐨勫贰鏌ヤ换鍔℃垨鑰呮墍鏈夌殑璁″垝宸℃煡浠诲姟
+ val taskSceneIdList = dbMapper.scenseMapper.getSceneByType(config.topTaskGuid, config.sceneType,
+ config.townCode).map { it.guid ?: "" }
+
+ val subTaskList = dbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+ createCriteria().apply {
+ if (taskSceneIdList.isNotEmpty()) andIn("scenseid", taskSceneIdList)
+ }.andEqualTo("tguid", config.topTaskGuid)
+ })
+ // 缁欒繕鏈贰鏌ョ殑鍦烘櫙鐢熸垚绌虹殑瀛愪换鍔″璞�
+ if (taskSceneIdList.isNotEmpty()) {
+ taskSceneIdList.forEach {
+ var subtask: Subtask? = null
+ for (s in subTaskList) {
+ if (s.scenseid == it) {
+ subtask = s
+ result.add(s)
+ }
+ }
+ if (subtask == null) {
+ result.add(Subtask().apply { scenseid = it })
+ }
+ }
+ } else {
+ result.addAll(subTaskList)
+ }
+ }
+ else {
+ val subTaskList = dbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+ createCriteria().apply {
+ if (config.subTaskIdList?.isNotEmpty() == true) andIn("stguid", config.subTaskIdList)
+ config.startTime?.let { andGreaterThanOrEqualTo("planstarttime", it) }
+ config.endTime?.let { andLessThanOrEqualTo("planendtime", it) }
+ config.districtCode?.let { andEqualTo("districtcode", it) }
+ andEqualTo("tguid", config.topTaskGuid)
+ }
+ })
+ result.addAll(subTaskList)
+ }
+
+ sourceList.addAll(result)
+ }
+
+
+ inner class RowData(){
+ var index = 0
+
+ var subTask: Subtask? = null
+
+ private var lastScene: Scense? = null
+
+ //鍦烘櫙鍩烘湰淇℃伅
+ val scene: Scense?
+ get() {
+ if (_scene == null) {
+ _scene = dbMapper.scenseMapper.selectByPrimaryKey(subTask?.scenseid)
+ }
+ return _scene
+ }
+ private var _scene: Scense? = null
+
+ //鍚勫満鏅壒鏈夌殑鍩烘湰淇℃伅
+ val baseScene: BaseScene?
+ get() {
+ if (_baseScene == null) {
+ _baseScene = when (this.scene?.typeid.toString()) {
+ Constant.SceneType.TYPE1.value -> {
+ dbMapper.sceneConstructionSiteMapper.selectByPrimaryKey(scene?.guid)
+ }
+ Constant.SceneType.TYPE2.value -> {
+ dbMapper.sceneWharfMapper.selectByPrimaryKey(scene?.guid)
+ }
+ Constant.SceneType.TYPE3.value -> {
+ dbMapper.sceneMixingPlantMapper.selectByPrimaryKey(scene?.guid)
+ }
+ Constant.SceneType.TYPE14.value -> {
+ dbMapper.sceneStorageYardMapper.selectByPrimaryKey(scene?.guid)
+ }
+ else -> null
+ }
+ }
+ return _baseScene
+ }
+ private var _baseScene: BaseScene? = null
+
+ //鍏蜂綋鐨勯棶棰�
+ val problems: List<Problemlist>
+ get() {
+ if (noRecord()) return mutableListOf()
+
+ if (_problems == null) {
+ val r = dbMapper.problemlistMapper.selectByExample(Example(Problemlist::class.java).apply {
+ createCriteria().andEqualTo("stguid", subTask?.stguid)
+ })
+ _problems = r
+ }
+ return _problems ?: emptyList()
+ }
+ private var _problems: List<Problemlist>? = null
+
+ //璇勪及鎬诲垎
+ val evaluation: Evaluation?
+ get() {
+ if (_evaluation == null) {
+ if (noRecord()) return null
+
+ dbMapper.evaluationMapper.selectByExample(Example(Evaluation::class.java).apply {
+ createCriteria().andEqualTo("stguid", subTask?.stguid)
+ })?.takeIf { it.isNotEmpty() }?.let { _evaluation = it[0] }
+ }
+ return _evaluation
+ }
+ private var _evaluation: Evaluation? = null
+
+ //璇勪及缁嗗垯寰楀垎
+ val itemevaluationList: List<Itemevaluation>
+ get() {
+ if (_itemevaluationList == null) {
+ val r = dbMapper.itemevaluationMapper.selectByExample(Example(Itemevaluation::class.java).apply {
+ createCriteria().andEqualTo("stguid", subTask?.stguid)
+ })
+ _itemevaluationList = r
+ println("-------------------itemevaluationList--------------------------------")
+ }
+ return _itemevaluationList ?: emptyList()
+ }
+ private var _itemevaluationList: List<Itemevaluation>? = null
+
+ //闂绫诲瀷
+ val problemTypes: List<Problemtype>
+ get() {
+ if (_problemTypes == null) {
+ val r = dbMapper.problemtypeMapper.selectByExample(Example(Problemtype::class.java).apply {
+ createCriteria().andEqualTo("scensetypeid", scene?.typeid)
+ .andEqualTo("districtcode", scene?.districtcode)
+ orderBy("extension1")
+ })
+ _problemTypes = r
+ }
+ return _problemTypes ?: emptyList()
+ }
+ private var _problemTypes: List<Problemtype>? = null
+
+ //鑷姩璇勫垎瑙勫垯涓�绾у垎绫�
+ val topItems: List<Evaluationsubrule2>
+ get() {
+ if (_topItems == null) {
+ val tempTopItems = mutableListOf<Evaluationsubrule2>()
+ val secRules = mutableListOf<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>()
+ val rule = dbMapper.evaluationruleMapper.selectByExample(Example(Evaluationrule::class.java).apply {
+ createCriteria()
+ .andEqualTo("tasktypeid", 99)
+ .andEqualTo("scensetypeid", scene?.typeid)
+ })
+ if (rule.isNotEmpty()) {
+ val ruleId = rule[0].guid
+ val rules = dbMapper.evaluationsubruleMapper.selectByExample(Example(Evaluationsubrule2::class.java).apply {
+ createCriteria().andEqualTo("erguid", ruleId)
+ })
+ rules.forEach {
+ if (it.ertype == 2) {
+ tempTopItems.add(it)
+ }
+ }
+ tempTopItems.sortBy { it.displayid }
+
+ var t = 0
+ tempTopItems.forEach {
+ t += it.maxscore ?: 0
+ val tempRules = mutableListOf<Evaluationsubrule2>()
+ for (i in rules) {
+ if (i.fatherid == it.guid && i.ertype == 3) {
+ tempRules.add(i)
+ }
+ }
+ //璇勫垎澶ч」濡傛灉娌℃湁鎵惧埌璇勫垎灏忛」锛屽垯璇存槑鍏剁洿鎺ュ搴旀渶灏忚瘎鍒嗛」锛屽叾鏈韩鍙樻垚璇勫垎椤�
+ if (tempRules.isEmpty()) {
+ tempRules.add(it)
+ }
+ tempRules.sortBy { t -> t.displayid }
+ tempRules.forEach { temp ->
+ val tempSubRules = mutableListOf<Evaluationsubrule2>()
+ for (i in rules) {
+ if (i.fatherid == temp.guid && i.ertype == 4) {
+ tempSubRules.add(i)
+ }
+ }
+ tempSubRules.sortBy { ts -> ts.displayid }
+ secRules.add(Pair(temp, tempSubRules))
+ }
+ }
+ }
+ this._rules = secRules
+ _topItems = tempTopItems
+ }
+ return _topItems ?: emptyList()
+ }
+ private var _topItems: List<Evaluationsubrule2>? = null
+
+ //鑷姩璇勫垎瑙勫垯浜岀骇鍜屼笁绾у垎绫�
+ val rules: List<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>
+ get() {
+ if (_rules == null) {
+ this.topItems
+ }
+ return _rules ?: emptyList()
+ }
+ private var _rules: List<Pair<Evaluationsubrule2, MutableList<Evaluationsubrule2>>>? = null
+
+ //蹇呭~鍙拌处鏁伴噺
+ val ledgerCount: Int
+ get() {
+ if (_ledgerCount == -1) {
+ val tzSceneType = Constant.SceneType.typeMap(scene?.typeid)
+ _ledgerCount = dbMapper.ledgerSubTypeMapper.selectCountByExample(Example(LedgerSubType::class.java).apply {
+ createCriteria().andEqualTo("lScenetype", tzSceneType).andEqualTo("lNeedupdate", true)
+ })
+ }
+ return _ledgerCount
+ }
+ private var _ledgerCount = -1
+
+ //鐢ㄦ埛瀹為檯鎻愪氦鍙拌处鏁伴噺
+ val ledgerRecords: List<LedgerRecord>
+ get() {
+ if (_ledgerRecordNum == null) {
+ val userInfo = dbMapper.userinfoMapper.selectByExample(Example(Userinfo::class.java).apply {
+ createCriteria().andEqualTo("dGuid", subTask?.scenseid)
+ })?.takeIf { l -> l.isNotEmpty() }?.get(0)
+
+ val tzUserId = dbMapper.userMapMapper.selectByExample(Example(UserMap::class.java).apply {
+ createCriteria().andEqualTo("svUserId", userInfo?.guid)
+ })?.takeIf { m-> m.isNotEmpty() }?.get(0)?.tzUserId
+
+ if (tzUserId != null) {
+ _ledgerRecordNum = dbMapper.ledgerRecordMapper.selectByExample(Example(LedgerRecord::class.java).apply {
+ createCriteria().andEqualTo("lrYear", year)
+ .andEqualTo("lrMonth", month)
+ .andEqualTo("lrSubmitid", tzUserId)
+ })
+ }
+ }
+ return _ledgerRecordNum ?: emptyList()
+ }
+ private var _ledgerRecordNum: List<LedgerRecord>? = null
+
+ /**
+ * 鑾峰彇褰撳墠宸℃煡浠诲姟鐨勪笂鏈熷贰鏌ヨ褰�
+ */
+ fun lastOne(): RowData {
+ val last = RowData()
+ val r = dbMapper.subtaskMapper.selectByExample(Example(Subtask::class.java).apply {
+ createCriteria().andEqualTo("scenseid", subTask?.scenseid)
+ .andLessThan("planstarttime", subTask?.planstarttime)
+ orderBy("planstarttime").desc()
+ })
+ if (r.isNotEmpty()) {
+ val thisMonth = LocalDateTime.ofInstant(subTask?.planstarttime?.toInstant(), ZoneId.systemDefault()).withDayOfMonth(1).toLocalDate()
+ val lastMonth = LocalDateTime.ofInstant(r[0]?.planstarttime?.toInstant(), ZoneId.systemDefault()).withDayOfMonth(1).toLocalDate()
+ if (lastMonth.plusMonths(1).isEqual(thisMonth)) {
+ last.subTask = r[0]
+ }
+ }
+ return last
+ }
+
+ /**
+ * 璁板綍涓婁竴涓満鏅�
+ */
+ fun recordLastScene() {
+ lastScene = scene
+ }
+
+ /**
+ * 娓呯┖褰撳墠澶勭悊鐨勫璞$殑鐩稿叧鏁版嵁婧�
+ */
+ fun clear() {
+ _scene = null
+ _baseScene = null
+ _problems = null
+ _evaluation = null
+ _itemevaluationList = null
+ _ledgerRecordNum = null
+ if (lastScene != null && lastScene?.typeid != scene?.typeid) {
+ _problemTypes = null
+ _topItems = null
+ _rules = null
+ _ledgerCount = -1
+ }
+ recordLastScene()
+ }
+
+ /**
+ * 鍒ゆ柇鍦烘櫙鏄惁宸℃煡鐩戠锛屾湁鏃犲贰鏌ヨ褰�
+ */
+ fun noRecord() = subTask?.stguid == null
+ }
+}
+
+@Component
+data class DbMapper(
+ val scenseMapper: ScenseMapper,
+ val problemlistMapper: ProblemlistMapper,
+ val problemtypeMapper: ProblemtypeMapper,
+ val subtaskMapper: SubtaskMapper,
+ val monitorobjectversionMapper: MonitorobjectversionMapper,
+ val sceneConstructionSiteMapper: SceneConstructionSiteMapper,
+ val sceneMixingPlantMapper: SceneMixingPlantMapper,
+ val sceneStorageYardMapper: SceneStorageYardMapper,
+ val sceneWharfMapper: SceneWharfMapper,
+ val taskMapper: TaskMapper,
+ val evaluationruleMapper: EvaluationruleMapper,
+ val evaluationsubruleMapper: EvaluationsubruleMapper2,
+ val evaluationMapper: EvaluationMapper,
+ val itemevaluationMapper: ItemevaluationMapper,
+ val ledgerSubTypeMapper: LedgerSubTypeMapper,
+ val ledgerRecordMapper: LedgerRecordMapper,
+ val userinfoMapper: UserinfoMapper,
+ val userMapMapper: UserMapMapper,
+ val townMapper: TownMapper,
+)
--
Gitblit v1.9.3