feiyu02
2025-09-17 8c15c9cc0d6474ed77e313258f9b09f7f2d6366e
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/ScenseServiceImpl.kt
@@ -1,28 +1,45 @@
package cn.flightfeather.supervision.lightshare.service.impl
import cn.flightfeather.supervision.business.import.SceneImport
import cn.flightfeather.supervision.business.location.LocationRoadNearby
import cn.flightfeather.supervision.common.exception.BizException
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.domain.ds1.entity.*
import cn.flightfeather.supervision.domain.ds1.mapper.*
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.domain.ds1.repository.SceneRep
import cn.flightfeather.supervision.domain.ds2.entity.UserMap
import cn.flightfeather.supervision.domain.ds2.repository.BaseInfoRep
import cn.flightfeather.supervision.domain.ds2.repository.UserMapRep
import cn.flightfeather.supervision.lightshare.service.*
import cn.flightfeather.supervision.lightshare.vo.*
import com.github.pagehelper.PageHelper
import com.google.gson.Gson
import org.jetbrains.kotlin.utils.addToStdlib.ifNotEmpty
import org.springframework.beans.BeanUtils
import org.springframework.beans.factory.annotation.Autowired
import org.springframework.stereotype.Service
import org.springframework.transaction.annotation.Transactional
import org.springframework.web.multipart.MultipartFile
import tk.mybatis.mapper.entity.Example
import tk.mybatis.mapper.util.StringUtil
import java.io.ByteArrayInputStream
import java.util.*
import kotlin.collections.ArrayList
@Service
class ScenseServiceImpl(
        val scenseMapper: ScenseMapper,
        val sceneConstructionSiteMapper: SceneConstructionSiteMapper,
        val sceneDeviceMapper: SceneDeviceMapper,
        val sceneMixingPlantMapper: SceneMixingPlantMapper,
        val sceneStorageYardMapper: SceneStorageYardMapper,
        val sceneWharfMapper: SceneWharfMapper,
        val userinfoService: UserinfoService
    val scenseMapper: ScenseMapper,
    val sceneConstructionSiteMapper: SceneConstructionSiteMapper,
    val sceneDeviceMapper: SceneDeviceMapper,
    val sceneMixingPlantMapper: SceneMixingPlantMapper,
    val sceneStorageYardMapper: SceneStorageYardMapper,
    val sceneWharfMapper: SceneWharfMapper,
    val userinfoService: UserinfoService,
    private val locationRoadNearby: LocationRoadNearby,
    private val sceneImport: SceneImport,
    private val sceneRep: SceneRep,
    private val baseInfoRep: BaseInfoRep,
    private val userMapRep: UserMapRep,
) : ScenseService {
    @Autowired
@@ -66,6 +83,7 @@
        val name = scense.name ?: ""
        val example = Example(Scense::class.java)
        val criteria = example.createCriteria()
        criteria.andEqualTo("typeid", scense.typeid)
        //如果有type信息,就构建type查询
        if (StringUtil.isNotEmpty(scense.type)) {
            criteria.andEqualTo("type", scense.type)
@@ -82,6 +100,10 @@
        if (StringUtil.isNotEmpty(scense.towncode)) {
            criteria.andEqualTo("towncode", scense.towncode)
        }
        if (StringUtil.isNotEmpty(scense.extension1)) {
            criteria.andEqualTo("extension1", scense.extension1)
        }
        criteria.andEqualTo("index", scense.index)
        //name查询
        criteria.andLike("name", "%$name%")
        val re = scenseMapper.selectByExample(example)
@@ -130,12 +152,13 @@
    }
    override fun save(scense: Scense): Int {
        // TODO: 2021/7/20 新增场景的同时生成账户
        val r = scenseMapper.insert(scense)
        if (r == 1) {
            scense.guid?.let { userinfoService.createAccount(it) }
        return try {
            createScene(scense)
            1
        } catch (e: BizException) {
            println(e.message)
            0
        }
        return r
    }
    override fun update(scense: Scense): Int = scenseMapper.updateByPrimaryKeySelective(scense)
@@ -260,14 +283,14 @@
    override fun getSceneDetail(sceneId: String): BaseResponse<SceneDetail> {
        val sceneDetail = SceneDetail()
        val scene = scenseMapper.selectByPrimaryKey(sceneId)
        val scene = sceneRep.findScene(sceneId = sceneId)
        sceneDetail.scense = scene
        val mapper = when (scene.typeid.toString()) {
            Constant.ScenseType.TYPE1.value -> sceneConstructionSiteMapper
            Constant.ScenseType.TYPE2.value -> sceneWharfMapper
            Constant.ScenseType.TYPE3.value -> sceneMixingPlantMapper
            Constant.ScenseType.TYPE14.value -> sceneStorageYardMapper
        val mapper = when (scene?.typeid.toString()) {
            Constant.SceneType.TYPE1.value -> sceneConstructionSiteMapper
            Constant.SceneType.TYPE2.value -> sceneWharfMapper
            Constant.SceneType.TYPE3.value -> sceneMixingPlantMapper
            Constant.SceneType.TYPE14.value -> sceneStorageYardMapper
            else -> null
        }
@@ -304,8 +327,9 @@
            var r = 0
            var isUpdate = true
            when (typeId.toString()) {
                Constant.ScenseType.TYPE1.value -> {
                Constant.SceneType.TYPE1.value -> {
                    val subScene = Gson().fromJson(sceneDetailStr.subScene, SceneConstructionSite::class.java)
                    subScene.csUpdateTime = Date()
                    if (subScene.getsGuid() != null) {
                        val record = sceneConstructionSiteMapper.selectByPrimaryKey(subScene.getsGuid())
                        isUpdate = record != null
@@ -316,7 +340,7 @@
                        }
                    }
                }
                Constant.ScenseType.TYPE2.value -> {
                Constant.SceneType.TYPE2.value -> {
                    val subScene = Gson().fromJson(sceneDetailStr.subScene, SceneWharf::class.java)
                    if (subScene.getsGuid() != null) {
                        val record = sceneWharfMapper.selectByPrimaryKey(subScene.getsGuid())
@@ -328,7 +352,7 @@
                        }
                    }
                }
                Constant.ScenseType.TYPE3.value -> {
                Constant.SceneType.TYPE3.value -> {
                    val subScene = Gson().fromJson(sceneDetailStr.subScene, SceneMixingPlant::class.java)
                    if (subScene.getsGuid() != null) {
                        val record = sceneMixingPlantMapper.selectByPrimaryKey(subScene.getsGuid())
@@ -340,7 +364,7 @@
                        }
                    }
                }
                Constant.ScenseType.TYPE14.value -> {
                Constant.SceneType.TYPE14.value -> {
                    val subScene = Gson().fromJson(sceneDetailStr.subScene, SceneStorageYard::class.java)
                    if (subScene.getsGuid() != null) {
                        val record = sceneStorageYardMapper.selectByPrimaryKey(subScene.getsGuid())
@@ -369,7 +393,6 @@
                areaVo.towncode?.let { andEqualTo("towncode", it) }
                areaVo.scensetypeid?.let { andEqualTo("typeid", it) }
                areaVo.sceneName?.let { andLike("name", "%${it}%") }
            }
            areaVo.online?.let {
                and(createCriteria().apply {
@@ -384,4 +407,63 @@
        })
        return BaseResponse(true, head = DataHead(p.pageNum, p.pages, p.total), data = list)
    }
    override fun searchByCoordinate(lng: Double, lat: Double, radius: Double): List<Scense> {
        return locationRoadNearby.searchByRadius(Pair(lng, lat), radius)
    }
    override fun importSceneInfo(files: Array<MultipartFile>): Boolean {
        if (files.isEmpty()) throw BizException("未正确上传文件,接口调用错误")
        val f = ByteArrayInputStream(files[0].bytes)
        val scenes = sceneImport.readFromFile(f)
        if (scenes.isEmpty()) throw BizException("文件内容为空")
        // 查找场景名称是否重复
        val names = scenes.map { it.scense?.name }
        sceneRep.findSceneList(names).map { it?.name }.ifNotEmpty {
            val str = this.joinToString(",")
            throw BizException("存在重复场景,如下:${str}")
        }
        scenes.forEach {
            it.scense ?: return@forEach
            createOneScene(it.scense!!)
            sceneRep.insertOrUpdateSubScene(it.scense!!.typeid?.toInt(), it.scense!!.guid, it.subScene)
        }
        return true
    }
    override fun createScene(scense: Scense): Scense {
        val names = listOf(scense.name)
        sceneRep.findSceneList(names).map { it?.name }.ifNotEmpty {
            val str = this.joinToString(",")
            throw BizException("存在重复场景,如下:${str}")
        }
        createOneScene(scense)
        return scense
    }
    override fun createOneScene(scense: Scense) {
        //1. 插入场景表
        scense.townname = scense.townname?.trim()
        sceneRep.insert(scense)
        //2. 生成对应账户信息
        val userInfo = userinfoService.createAccount(scense)
        createTZUserInfo(userInfo, scense)
    }
    override fun createTZUserInfo(userInfo: Userinfo, scense: Scense) {
        //1. 生成飞羽环境系统对应账户和基础信息
        val userInfoTZ = userinfoService.createAccountTZ(userInfo, scense)
        val baseInfo = baseInfoRep.create(userInfoTZ, scense)
        //2. 生成用户匹配信息
        userMapRep.insert(UserMap().apply {
            tzUserId = userInfoTZ.guid
            tzUserName = userInfoTZ.realname
            svUserId = userInfo.guid
            svUserName = userInfo.realname
            umCreateTime = Date()
        })
    }
}