feiyu02
2024-11-08 d2727f231319a48019bc3b87439136ab49b97b9b
src/main/kotlin/cn/flightfeather/supervision/lightshare/service/impl/UserinfoServiceImpl.kt
@@ -1,24 +1,41 @@
package cn.flightfeather.supervision.lightshare.service.impl
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.common.utils.PinYin
import cn.flightfeather.supervision.common.utils.UUIDGenerator
import cn.flightfeather.supervision.domain.ds1.entity.Scense
import cn.flightfeather.supervision.domain.ds1.entity.Userinfo
import cn.flightfeather.supervision.domain.ds1.mapper.ScenseMapper
import cn.flightfeather.supervision.domain.ds1.mapper.UserinfoMapper
import cn.flightfeather.supervision.domain.ds1.repository.SceneRep
import cn.flightfeather.supervision.domain.ds1.repository.TaskRep
import cn.flightfeather.supervision.domain.ds1.repository.UserInfoSVRep
import cn.flightfeather.supervision.domain.ds2.entity.UserinfoTZ
import cn.flightfeather.supervision.domain.ds2.repository.UserInfoTZRep
import cn.flightfeather.supervision.lightshare.service.UserinfoService
import cn.flightfeather.supervision.lightshare.vo.AreaVo
import cn.flightfeather.supervision.lightshare.vo.DataHead
import com.github.pagehelper.PageHelper
import org.springframework.beans.BeanUtils
import org.springframework.stereotype.Service
import tk.mybatis.mapper.entity.Example
import kotlin.random.Random
import kotlin.random.nextInt
@Service
class UserinfoServiceImpl(val userinfoMapper: UserinfoMapper, private val scenseMapper: ScenseMapper) : UserinfoService {
class UserinfoServiceImpl(
    val userinfoMapper: UserinfoMapper,
    private val scenseMapper: ScenseMapper,
    private val userInfoSVRep: UserInfoSVRep,
    private val userInfoTZRep: UserInfoTZRep,
) : UserinfoService {
    //根据userinfo条件查询
    override fun findOneByName(userinfo: Userinfo): Userinfo? {
        val example = Example(Userinfo::class.java)
        val criteria = example.createCriteria()
        criteria.andEqualTo("acountname", userinfo.acountname)
                .andEqualTo("password", userinfo.password)
            .andEqualTo("password", userinfo.password)
        val result = userinfoMapper.selectByExample(example)
        return if (result.isNotEmpty()) {
            result[0]
@@ -30,9 +47,12 @@
        }
    }
    override fun findByType(typeId: Byte): List<Userinfo> {
    override fun findByType(typeId: Byte, enable: Boolean?): List<Userinfo> {
        val result = userinfoMapper.selectByExample(Example(Userinfo::class.java).apply {
            createCriteria().andEqualTo("usertypeid", typeId)
                .apply {
                    enable?.let { andEqualTo("isenable", it) }
                }
        })
        return result
@@ -54,13 +74,65 @@
    override fun delete(id: String): Int = userinfoMapper.deleteByPrimaryKey(id)
    override fun search(areaVo: AreaVo, keyword: String, userType: Int?, page: Int?, perPage: Int?)
            : Pair<DataHead, List<Userinfo?>> {
        val p = PageHelper.startPage<Userinfo>(page ?: 1, perPage ?: 30)
        val result = userInfoSVRep.searchUser(areaVo, keyword.trim(), Constant.UserType.fromValue(userType))
        result.forEach { it?.password = null }
        return DataHead(p.pageNum, p.pages, p.total) to result
    }
    override fun createAccount(sceneId: String): Userinfo {
        findByScene(sceneId)?.let { return it }
        scenseMapper.selectByPrimaryKey(sceneId)?.let {
            createAccount(it)
        }
        return Userinfo()
    }
    override fun findByScene(sceneId: String): Userinfo? {
        userinfoMapper.selectByExample(Example(Userinfo::class.java).apply {
            createCriteria().andEqualTo("dGuid", sceneId)
        })?.takeIf { it.isNotEmpty() }?.let { return it[0] }
        return null
    }
    override fun getUName(sceneName: String): String {
        var uName = PinYin.getPinYinHeader(sceneName)
        var suffix = ""
        var repeated: Boolean
        var i = 1
        do {
            userinfoMapper.selectByExample(Example(Userinfo::class.java).apply {
                createCriteria().andEqualTo("acountname", uName + suffix)
            }).let {
                repeated = it.isNotEmpty()
                if (repeated) {
                    suffix = Random.nextInt(100..999).toString()
                }
            }
            i++
        } while (repeated && i < 20)
        if (repeated) uName = UUIDGenerator.generateShortUUID()
        return uName + suffix
    }
    override fun autoCreateAccount() {
        val sceneList = scenseMapper.selectNoAccountScene()
        sceneList.forEach {
            createAccount(it)
        }
    }
    override fun createAccount(scence: Scense):Userinfo {
        scence.let {
            // 判断该场景是否已有对应账户
            val user = userInfoSVRep.findUser(it.guid)
            if (user != null) return user
            val sceneName = it.name ?: return Userinfo()
            val uName = getUName(sceneName)
            val userInfo = Userinfo().apply {
                guid = UUIDGenerator.generate16ShortUUID()
                acountname = uName
@@ -77,66 +149,31 @@
            val r = userinfoMapper.insert(userInfo)
            if (r == 1) {
                return userInfo
            } else {
                return Userinfo()
            }
        }
        return Userinfo()
    }
    override fun findByScene(sceneId: String): Userinfo? {
        userinfoMapper.selectByExample(Example(Userinfo::class.java).apply {
            createCriteria().andEqualTo("dGuid", sceneId)
        })?.takeIf { it.isNotEmpty() }?.let { return it[0] }
        return null
    }
    private fun getUName(sceneName: String): String {
        var uName = PinYin.getPinYinHeader(sceneName)
        var repeated = false
        var i = 1
        do {
            userinfoMapper.selectByExample(Example(Userinfo::class.java).apply {
                createCriteria().andEqualTo("acountname", uName)
            }).let {
                repeated = it.isNotEmpty()
                if (repeated) {
                    uName += i
                }
            }
            i++
        } while (repeated && i < 20)
        if (repeated) uName = UUIDGenerator.generateShortUUID()
        return uName
    }
    override fun autoCreateAccount() {
        val sceneList = scenseMapper.selectNoAccountScene()
        sceneList.forEach {
            createAccount(it)
    override fun createAccountTZ(userinfo: Userinfo, scence: Scense): UserinfoTZ {
        val userinfoTZ = UserinfoTZ()
        BeanUtils.copyProperties(userinfo, userinfoTZ)
        // 使用新的id
        userinfoTZ.guid = UUIDGenerator.generate16ShortUUID()
        // 添加区县描述
        // FIXME: 2024/4/23 目前在BaseInfo基础信息中已存储完整的行政区划,后续应将此处记录去除
        userinfoTZ.extension1 = userinfoTZ.remark
        userinfoTZ.remark = null
        // 场景类型转换
        userinfoTZ.extension2 = Constant.SceneType.typeMap(scence.typeid)?.toString()
        // 根据acountname和realname进行重复判断
        userInfoTZRep.findOne(UserinfoTZ().apply {
            acountname = userinfoTZ.acountname
            realname = userinfoTZ.realname
        }).takeIf { it == null }.run {
            // 当没有查询结果时,插入新账户信息
            userInfoTZRep.insert(userinfoTZ)
        }
    }
    private fun createAccount(sence: Scense) {
        sence.let {
            val sceneName = it.name ?: return
            val uName = getUName(sceneName)
            val userInfo = Userinfo().apply {
                guid = UUIDGenerator.generate16ShortUUID()
                acountname = uName
                realname = sceneName
                password = "123456"
                usertypeid = 3
                usertype = "企业"
                dGuid = it.guid
                departmentname = sceneName
                isenable = true
                remark = it.districtname
            }
            val r = userinfoMapper.insert(userInfo)
            if (r == 1) {
                println("${userInfo.guid}--${userInfo.acountname}--${userInfo.realname}")
            }
        }
        return userinfoTZ
    }
}