Appearance
POST /dm-device/device/main/import
Content-Type: multipart/form-data
触发按钮:无
入参
传递对象:MultipartFile
| 字段 | 类型 | 必填 | 多选 | 校验规则 | 说明 |
|---|---|---|---|---|---|
| file | MultipartFile | 否 | 否 | - | Excel 文件 |
出参
传递对象:ResultData<ImportResultInfo><导入结果对象>
无
前端校验规则
文件上传校验
└── file
├── accept:.xlsx,.xls
├── 文件格式限制:file.name 需以 .xlsx 或 .xls 结尾,否则直接拦截
├── 文件大小限制:file.size / 1024 / 1024 < 5
└── 上传数量限制:仅保留最后一次选择的 1 个文件
提交拦截校验
└── import
└── fileList 为空时直接拦截提交后端逻辑
业务流程:解析设备导入数据 -> 校验并映射设备主数据 -> 区分新增与更新台账 -> 批量落库并补记履历/计量台账
├── 解析设备导入数据
│ ├── Excel导入回调:ExcelImportHandler.execute :720-721
│ └── 返回导入失败明细:handleImportData :737-747
├── 校验并映射设备主数据
│ ├── 加载线体映射:LineClient.getAllToMap :781
│ │ └── 查询可用线体:LineServiceImpl.getLineMap :279-297
│ ├── 加载机型映射:ProductModelClient.getModalToMap :782
│ │ └── 查询有效机型:ProductModelServiceImpl.getModalToMap :117-130
│ ├── 加载产品线映射:ProductLineClient.queryList :709
│ │ └── 查询有效产品线:ProductLineServiceImpl.findProductLineList :320-328
│ ├── 查询有效设备类型:DeviceTypeService.list :796
│ ├── 匹配设备类型并补齐规格:handleImportData :814-825
│ ├── 按设备编号识别既有台账:DeviceMainService.list :830-831
│ ├── 绑定产品线:handleImportData :846-854
│ ├── 绑定管理部门:DeptClient.queryByDeptName :860
│ │ └── 查询未删除部门:DepartmentController.queryByDeptName :123-127
│ ├── 绑定负责人:UserClient.queryUserByName :872
│ │ └── 查询用户:UserServiceImpl.queryUserByName :331-339
│ ├── 绑定线体:handleImportData :881-891
│ ├── 绑定机型:handleImportData :894-902
│ ├── 生成变更对比键:handleImportData :904-906
│ └── 存在无效数据则终止导入:handleImportData :944-950
├── 新建设备台账
│ ├── 生成设备编号与序列号:DeviceMainServiceImpl.getDeviceCodeAndNum :1467-1475
│ │ ├── RedisService.getDeviceCodeSeqNo :1472
│ │ ├── RedisKey: DEVICE_MAIN_CODE_XL + deviceSpecification :193-196
│ │ └── 编号规则
│ │ └── deviceCode = deviceSpecification + 4位序列号
│ ├── 生成设备台账号:RedisService.getCommonSeqNo :967
│ │ ├── RedisKey: COMMON_SEQ_PREFIX + DEVICE_CODE + ":" + TABLE_DEVICE_MAIN :169-172
│ │ └── 编号规则
│ │ └── 6位流水号
│ ├── 新增设备履历:DeviceRecordService.creatRecord :974
│ │ └── 保存履历:DeviceRecordService.save :113
│ ├── 按计量标记补建计量台账:DeviceMainServiceImpl.addMeasureMain :1349-1358
│ │ ├── 查询计量台账:DeviceMeasureService.getOne :1350-1351
│ │ └── 保存计量台账:DeviceMeasureService.save :1358
│ └── 批量新增设备:DeviceMainService.saveBatch :981
└── 更新既有设备台账
├── 关键信息变更时补记改造履历
│ └── 记录改造履历:DeviceRecordService.updateCreatRecord :995
│ └── 保存履历:DeviceRecordService.save :127
├── 按计量标记补建计量台账:DeviceMainServiceImpl.addMeasureMain :1349-1358
│ ├── 查询计量台账:DeviceMeasureService.getOne :1350-1351
│ └── 保存计量台账:DeviceMeasureService.save :1358
└── 批量更新设备:DeviceMainService.updateBatchById :1007后端校验规则
业务约束校验
└── 校验导入数据不能为空且导入条数不得超过10000条:handleImportData :749-755
├── ExceptionCode.EX100008
└── ExceptionCode.Ex600148
业务唯一性校验
└── 生效条件: 导入行填写设备编号;条件表达式: 同一导入批次内 deviceCode 不可重复:handleImportData :770-775
└── ExceptionCode.EX1000013
数据存在性校验
├── 生效条件: 设备分类、设备类型、设备型号已提供;条件表达式: 设备分类+设备类型必须存在,设备分类+设备类型+设备型号必须存在,且匹配设备类型必须已配置设备规格:handleImportData :814-822
│ ├── ExceptionCode.EX1000005
│ ├── ExceptionCode.EX1000141
│ └── ExceptionCode.EX10000107
├── 生效条件: 导入行填写设备编号;条件表达式: 设备编号必须在台账中存在:handleImportData :829-833
│ └── ExceptionCode.EX1000006
├── 校验产品线名称必须提供且能匹配产品线档案:handleImportData :846-854
│ ├── ExceptionCode.EX90021
│ └── ExceptionCode.EX90022
├── 校验部门名称必须提供且能匹配部门档案:handleImportData :857-866
│ ├── ExceptionCode.EX1000020
│ └── ExceptionCode.EX300028
├── 生效条件: 导入行填写负责人;条件表达式: 负责人必须存在:handleImportData :870-878
│ └── ExceptionCode.EX1000022
├── 生效条件: 导入行填写线体;条件表达式: 线体必须存在,且线体所属产品线必须等于导入解析出的产品线:handleImportData :881-887
│ └── ExceptionCode.EX1000016
└── 生效条件: 导入行填写机型;条件表达式: 机型必须存在:handleImportData :894-898
└── ExceptionCode.EX1000017
条件业务约束
└── 生效条件: 导入行填写设备编号;条件表达式: 已存在设备的 deviceTypeNo 必须等于导入解析出的 deviceTypeNo:handleImportData :840-842
└── ExceptionCode.EX1000140涉及数据库表
| 库名.表名 | mapper.statement | 描述 |
|---|---|---|
| device_main | DeviceMainMapper.insertOrUpdateBatch | 批量新增或更新equipment数据 |