feiyu02
2025-08-14 f373bbf83d9d2a7e5f96118d7dcd658c9fea8bc8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package cn.flightfeather.supervision.business.import
 
import cn.flightfeather.supervision.common.exception.BizException
import cn.flightfeather.supervision.common.utils.Constant
import cn.flightfeather.supervision.common.utils.ExcelUtil
import cn.flightfeather.supervision.domain.ds1.entity.*
import cn.flightfeather.supervision.domain.ds1.repository.RegionRep
import cn.flightfeather.supervision.lightshare.vo.SceneDetail
import com.google.gson.Gson
import org.apache.poi.ss.usermodel.CellType
import org.springframework.stereotype.Component
import java.io.InputStream
import java.util.*
 
/**
 * 场景信息导入工具
 */
@Component
class SceneImport(
    private val regionRep: RegionRep,
) {
    // 场景共有信息
    private val headers =
        listOf(
            ExcelUtil.MyHeader("编号(可省略)", CellType.NUMERIC, true),
            ExcelUtil.MyHeader("名称", CellType.STRING),
            ExcelUtil.MyHeader("类型", CellType.STRING),
            ExcelUtil.MyHeader("地址", CellType.STRING),
            ExcelUtil.MyHeader("经度(高德)", CellType.NUMERIC),
            ExcelUtil.MyHeader("纬度(高德)", CellType.NUMERIC),
            ExcelUtil.MyHeader("省", CellType.STRING),
            ExcelUtil.MyHeader("市", CellType.STRING),
            ExcelUtil.MyHeader("区", CellType.STRING),
            ExcelUtil.MyHeader("街镇", CellType.STRING),
            ExcelUtil.MyHeader("联系人", CellType.STRING),
            ExcelUtil.MyHeader("联系电话", CellType.STRING)
        )
 
    // 工地信息
    private val headersType1 = listOf(
        ExcelUtil.MyHeader("工程类型", CellType.STRING),
        ExcelUtil.MyHeader("建设状态", CellType.STRING),
        ExcelUtil.MyHeader("施工阶段", CellType.STRING),
        ExcelUtil.MyHeader("开工时间", CellType.STRING),
        ExcelUtil.MyHeader("完工时间", CellType.STRING),
        ExcelUtil.MyHeader("剩余工期", CellType.STRING),
        ExcelUtil.MyHeader("占地面积", CellType.NUMERIC),
        ExcelUtil.MyHeader("施工面积", CellType.NUMERIC),
        ExcelUtil.MyHeader("每月施工面积", CellType.NUMERIC),
        ExcelUtil.MyHeader("业主单位", CellType.STRING),
        ExcelUtil.MyHeader("业主单位联系人", CellType.STRING),
        ExcelUtil.MyHeader("业主单位联系电话", CellType.STRING),
        ExcelUtil.MyHeader("施工单位", CellType.STRING),
        ExcelUtil.MyHeader("施工单位联系人", CellType.STRING),
        ExcelUtil.MyHeader("施工单位联系电话", CellType.STRING),
        ExcelUtil.MyHeader("安全员", CellType.STRING),
        ExcelUtil.MyHeader("安全员电话", CellType.STRING),
    )
 
    /**
     * 通过文件读取场景信息
     */
    fun readFromFile(file: InputStream): List<SceneDetail> {
        val result = mutableListOf<SceneDetail>()
        try {
            ExcelUtil.readXLXS(file, headers) {
                val data = SceneDetail().apply {
                    scense = Scense().apply {
                        guid = null
                        name = it.getCell(1)?.stringCellValue?.trim()
                        typeid = null
                        type = it.getCell(2)?.stringCellValue?.trim()
                        scensesubtypeid = null
                        scensesubtype = null
                        location = it.getCell(3)?.stringCellValue?.trim()
                        longitude = it.getCell(4)?.numericCellValue?.toBigDecimal()
                        latitude = it.getCell(5)?.numericCellValue?.toBigDecimal()
                        provincecode = null
                        provincename = it.getCell(6)?.stringCellValue?.trim()
                        citycode = null
                        cityname = it.getCell(7)?.stringCellValue?.trim()
                        districtcode = null
                        districtname = it.getCell(8)?.stringCellValue?.trim()
                        towncode = null
                        townname = it.getCell(9)?.stringCellValue?.trim()
                        contactst = it.getCell(11)?.stringCellValue?.trim()
                        contactswx = null
                        contacts = it.getCell(10)?.stringCellValue?.trim()
                        createdate = Date()
                        updatedate = Date()
                        extension1 = "1"
                        extension2 = null
                        index = it.getCell(0)?.numericCellValue?.toInt()
                        remark = null
                    }
                    scense?.typeid = Constant.SceneType.getByName(scense?.type)?.value?.toByte()
                        ?: throw BizException(errorStr(it.rowNum + 1, 3, "场景类型不存在"))
                    scense?.provincecode = regionRep.findProvince(scense?.provincename)?.provincecode
                        ?: throw BizException(errorStr(it.rowNum + 1, 7, "省份错误或系统未曾配置"))
                    scense?.citycode = regionRep.findCity(scense?.cityname)?.citycode
                        ?: throw BizException(errorStr(it.rowNum + 1, 8, "城市错误或系统未曾配置"))
                    scense?.districtcode = regionRep.findDistrict(scense?.districtname)?.districtcode
                        ?: throw BizException(errorStr(it.rowNum + 1, 9, "区县错误或系统未曾配置"))
                    scense?.towncode = regionRep.findTown(scense?.townname)?.towncode
                        ?: throw BizException(errorStr(it.rowNum + 1, 10, "街镇错误或系统未曾配置"))
 
                    when (scense?.typeid.toString()) {
                        Constant.SceneType.TYPE1.value -> {
                            subScene = SceneConstructionSite().apply {
                                csProjectType = it.getCell(12)?.stringCellValue?.trim()
                                csStatus = it.getCell(13)?.stringCellValue?.trim()
                                siExtension1 = it.getCell(14)?.stringCellValue?.trim()
                                csStartTime = it.getCell(15)?.stringCellValue?.trim()
                                csEndTime = it.getCell(16)?.stringCellValue?.trim()
                                csLeftTime = it.getCell(17)?.stringCellValue?.trim()
                                csFloorSpace = it.getCell(18)?.numericCellValue?.toString()
                                csConstructionArea = it.getCell(19)?.numericCellValue?.toString()
                                csConstructionAreaPerMonth = it.getCell(20)?.numericCellValue?.toString()
                                csEmployerUnit = it.getCell(21)?.stringCellValue?.trim()
                                csEmployerContacts = it.getCell(22)?.stringCellValue?.trim()
                                csEmployerContactsTel = it.getCell(23)?.stringCellValue?.trim()
                                csConstructionUnit = it.getCell(24)?.stringCellValue?.trim()
                                csConstructionContacts = it.getCell(25)?.stringCellValue?.trim()
                                csConstructionContactsTel = it.getCell(26)?.stringCellValue?.trim()
                                csSecurityOfficer = it.getCell(27)?.stringCellValue?.trim()
                                csSecurityOfficerTel = it.getCell(28)?.stringCellValue?.trim()
                            }
                        }
                        Constant.SceneType.TYPE2.value -> {
 
                        }
                        Constant.SceneType.TYPE3.value -> {
 
                        }
                        Constant.SceneType.TYPE14.value -> {
 
                        }
                    }
                }
 
                result.add(data)
            }
        } catch (e: IllegalStateException) {
            throw BizException("excel文件内容错误,数据转换失败!", e)
        }
        return result
    }
 
    private fun errorStr(row: Int, col: Int, str: String): String {
        return "第${row}行,第${col}列单元格错误,${str}"
    }
}