diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java index 953cd1e..4d66b42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; +import lombok.Data; import java.util.Date; @@ -12,6 +13,7 @@ * @param 基础属性字段封装 * @author lwh */ +@Data public abstract class BaseModel extends Model { /** * 创建时间 @@ -24,5 +26,5 @@ * 更新时间 */ @TableField(value = "update_time") - private Date updateTime; + private Date updateTime; } diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java index 953cd1e..4d66b42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; +import lombok.Data; import java.util.Date; @@ -12,6 +13,7 @@ * @param 基础属性字段封装 * @author lwh */ +@Data public abstract class BaseModel extends Model { /** * 创建时间 @@ -24,5 +26,5 @@ * 更新时间 */ @TableField(value = "update_time") - private Date updateTime; + private Date updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java index 8f2de34..8f857ad 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java @@ -6,8 +6,14 @@ import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.casic.missiles.core.base.json.DateDeserializer; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,9 +21,16 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; +import static com.casic.missiles.modular.util.DictConvertUtils.convertDictValue; + /** *

* 设备表 @@ -35,7 +48,7 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ID_WORKER) private Long id; /** @@ -112,6 +125,11 @@ @TableField("install_date") private Date installDate; /** + * 安装时间字符串 + */ + @TableField(exist = false) + private String installDateFmt; + /** * 记录更新时间 */ @JSONField(serializeUsing = DateDeserializer.class) @@ -127,6 +145,65 @@ return this.id; } + public static final Map importMppers = new HashMap<>(12); + + static { + importMppers.put("设备编号", "deviceNo"); + importMppers.put("设备名称", "deviceName"); + //需要转换 + importMppers.put("设备类型", "type"); + + importMppers.put("省编号", "provinceCode"); + importMppers.put("城市编号", "cityCode"); + importMppers.put("区编码", "areaCode"); + importMppers.put("详细地址", "position"); + importMppers.put("经度", "lng"); + importMppers.put("纬度", "lat"); + importMppers.put("备注", "notes"); + //需要转换 + importMppers.put("所属管理组织", "deptId"); + importMppers.put("安装时间", "installDateFmt"); + } + + /** + * 导入数据校验及部分数据 转换 + * + * @param envDeviceTypes 字典列表 + * @param deptFunction 组织检索 + */ + public void changeImportData(List envDeviceTypes, Function deptFunction) { + // 所属组织名称 + if (ToolUtil.isOneEmpty(deptId, type)) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("所属组织及设备类型为必填项"); + throw msg; + } + DecimalFormat format = new DecimalFormat("0.000000"); + if (ToolUtil.isNotEmpty(lng)) { + lng = format.format(new BigDecimal(lng)); + } + if (ToolUtil.isNotEmpty(lat)) { + lat = format.format(new BigDecimal(lat)); + } + if(ToolUtil.isNotEmpty(installDateFmt)){ + installDate = DateUtil.parseDate(installDateFmt); + } + //导入数据转换操作 设备类型转换为 + if (ToolUtil.isNotEmpty(type)) { + type = convertDictValue(type, envDeviceTypes, true); + } + + Dept dept = deptFunction.apply(deptId); + if (ToolUtil.isOneEmpty(dept, dept.getId())) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("\"" + deptId + "\"不存在"); + throw msg; + } + + deptId = String.valueOf(dept.getId()); + + } + /** * 传输数据转换 * diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java index 953cd1e..4d66b42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; +import lombok.Data; import java.util.Date; @@ -12,6 +13,7 @@ * @param 基础属性字段封装 * @author lwh */ +@Data public abstract class BaseModel extends Model { /** * 创建时间 @@ -24,5 +26,5 @@ * 更新时间 */ @TableField(value = "update_time") - private Date updateTime; + private Date updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java index 8f2de34..8f857ad 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java @@ -6,8 +6,14 @@ import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.casic.missiles.core.base.json.DateDeserializer; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,9 +21,16 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; +import static com.casic.missiles.modular.util.DictConvertUtils.convertDictValue; + /** *

* 设备表 @@ -35,7 +48,7 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ID_WORKER) private Long id; /** @@ -112,6 +125,11 @@ @TableField("install_date") private Date installDate; /** + * 安装时间字符串 + */ + @TableField(exist = false) + private String installDateFmt; + /** * 记录更新时间 */ @JSONField(serializeUsing = DateDeserializer.class) @@ -127,6 +145,65 @@ return this.id; } + public static final Map importMppers = new HashMap<>(12); + + static { + importMppers.put("设备编号", "deviceNo"); + importMppers.put("设备名称", "deviceName"); + //需要转换 + importMppers.put("设备类型", "type"); + + importMppers.put("省编号", "provinceCode"); + importMppers.put("城市编号", "cityCode"); + importMppers.put("区编码", "areaCode"); + importMppers.put("详细地址", "position"); + importMppers.put("经度", "lng"); + importMppers.put("纬度", "lat"); + importMppers.put("备注", "notes"); + //需要转换 + importMppers.put("所属管理组织", "deptId"); + importMppers.put("安装时间", "installDateFmt"); + } + + /** + * 导入数据校验及部分数据 转换 + * + * @param envDeviceTypes 字典列表 + * @param deptFunction 组织检索 + */ + public void changeImportData(List envDeviceTypes, Function deptFunction) { + // 所属组织名称 + if (ToolUtil.isOneEmpty(deptId, type)) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("所属组织及设备类型为必填项"); + throw msg; + } + DecimalFormat format = new DecimalFormat("0.000000"); + if (ToolUtil.isNotEmpty(lng)) { + lng = format.format(new BigDecimal(lng)); + } + if (ToolUtil.isNotEmpty(lat)) { + lat = format.format(new BigDecimal(lat)); + } + if(ToolUtil.isNotEmpty(installDateFmt)){ + installDate = DateUtil.parseDate(installDateFmt); + } + //导入数据转换操作 设备类型转换为 + if (ToolUtil.isNotEmpty(type)) { + type = convertDictValue(type, envDeviceTypes, true); + } + + Dept dept = deptFunction.apply(deptId); + if (ToolUtil.isOneEmpty(dept, dept.getId())) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("\"" + deptId + "\"不存在"); + throw msg; + } + + deptId = String.valueOf(dept.getId()); + + } + /** * 传输数据转换 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java index 6fac74a..332c1d7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java @@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.Device; import com.baomidou.mybatisplus.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.io.Serializable; import java.util.List; @@ -48,4 +50,11 @@ * @param ids 设备主键集合 */ void deleteBatchByDeviceIds(List ids); + + /** + * 批量导入设备 + * @param file 上传设备附件 + * @return 导入结果 + */ + ResponseData importDevices(MultipartFile file); } diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java index 953cd1e..4d66b42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; +import lombok.Data; import java.util.Date; @@ -12,6 +13,7 @@ * @param 基础属性字段封装 * @author lwh */ +@Data public abstract class BaseModel extends Model { /** * 创建时间 @@ -24,5 +26,5 @@ * 更新时间 */ @TableField(value = "update_time") - private Date updateTime; + private Date updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java index 8f2de34..8f857ad 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java @@ -6,8 +6,14 @@ import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.casic.missiles.core.base.json.DateDeserializer; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,9 +21,16 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; +import static com.casic.missiles.modular.util.DictConvertUtils.convertDictValue; + /** *

* 设备表 @@ -35,7 +48,7 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ID_WORKER) private Long id; /** @@ -112,6 +125,11 @@ @TableField("install_date") private Date installDate; /** + * 安装时间字符串 + */ + @TableField(exist = false) + private String installDateFmt; + /** * 记录更新时间 */ @JSONField(serializeUsing = DateDeserializer.class) @@ -127,6 +145,65 @@ return this.id; } + public static final Map importMppers = new HashMap<>(12); + + static { + importMppers.put("设备编号", "deviceNo"); + importMppers.put("设备名称", "deviceName"); + //需要转换 + importMppers.put("设备类型", "type"); + + importMppers.put("省编号", "provinceCode"); + importMppers.put("城市编号", "cityCode"); + importMppers.put("区编码", "areaCode"); + importMppers.put("详细地址", "position"); + importMppers.put("经度", "lng"); + importMppers.put("纬度", "lat"); + importMppers.put("备注", "notes"); + //需要转换 + importMppers.put("所属管理组织", "deptId"); + importMppers.put("安装时间", "installDateFmt"); + } + + /** + * 导入数据校验及部分数据 转换 + * + * @param envDeviceTypes 字典列表 + * @param deptFunction 组织检索 + */ + public void changeImportData(List envDeviceTypes, Function deptFunction) { + // 所属组织名称 + if (ToolUtil.isOneEmpty(deptId, type)) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("所属组织及设备类型为必填项"); + throw msg; + } + DecimalFormat format = new DecimalFormat("0.000000"); + if (ToolUtil.isNotEmpty(lng)) { + lng = format.format(new BigDecimal(lng)); + } + if (ToolUtil.isNotEmpty(lat)) { + lat = format.format(new BigDecimal(lat)); + } + if(ToolUtil.isNotEmpty(installDateFmt)){ + installDate = DateUtil.parseDate(installDateFmt); + } + //导入数据转换操作 设备类型转换为 + if (ToolUtil.isNotEmpty(type)) { + type = convertDictValue(type, envDeviceTypes, true); + } + + Dept dept = deptFunction.apply(deptId); + if (ToolUtil.isOneEmpty(dept, dept.getId())) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("\"" + deptId + "\"不存在"); + throw msg; + } + + deptId = String.valueOf(dept.getId()); + + } + /** * 传输数据转换 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java index 6fac74a..332c1d7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java @@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.Device; import com.baomidou.mybatisplus.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.io.Serializable; import java.util.List; @@ -48,4 +50,11 @@ * @param ids 设备主键集合 */ void deleteBatchByDeviceIds(List ids); + + /** + * 批量导入设备 + * @param file 上传设备附件 + * @return 导入结果 + */ + ResponseData importDevices(MultipartFile file); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java index 48e1a38..44b8596 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java @@ -3,17 +3,29 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.IExpandComponentService; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.dao.DeviceMapper; import com.casic.missiles.modular.device.model.Device; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.service.IDeviceService; import com.casic.missiles.modular.system.model.Area; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hswebframework.expands.office.excel.ExcelIO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -26,11 +38,13 @@ * @author lwh * @since 2021-07-26 */ +@Slf4j @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { private final ICommonPermissionService permissionService; private final IExpandComponentService expandComponentService; + private final ICommonDeptService deptService; /** * 设备服务构造 @@ -38,9 +52,10 @@ * @param permissionService 权限服务 * @param expandComponentService 拓展服务 */ - public DeviceServiceImpl(ICommonPermissionService permissionService, IExpandComponentService expandComponentService) { + public DeviceServiceImpl(ICommonPermissionService permissionService, IExpandComponentService expandComponentService, ICommonDeptService deptService) { this.permissionService = permissionService; this.expandComponentService = expandComponentService; + this.deptService = deptService; } /** @@ -95,6 +110,40 @@ this.updateBatchById(deviceList); } + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData importDevices(MultipartFile file) { + //获取字典数据 + List envDeviceTypes = permissionService.findInDictByCode("envDeviceType"); + List results = new ArrayList<>(); + try (InputStream in = file.getInputStream()) { + ExcelIO.read(in, Device.importMppers, Device.class, (row) -> { + //仅读取第一个sheet + if (row.getSheet() == 0) { + if (row.getResult() != null) { + Device device = row.getResult(); + if (ToolUtil.isEmpty(device.getDeviceNo())) { + return; + } + device.changeImportData(envDeviceTypes, (deptName) -> { + Page page = new PageFactory().defaultPage(); + page.setSize(Integer.MAX_VALUE); + List list = deptService.getSubDeptObjPage(null, null, deptName, null, page, null); + return list == null ? null : list.get(0); + }); + results.add(device); + } + } else { + log.info("当前sheet" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + } + this.insertBatch(results); + return ResponseData.success(); + } + /** * 服务数据转换 * diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java index 953cd1e..4d66b42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; +import lombok.Data; import java.util.Date; @@ -12,6 +13,7 @@ * @param 基础属性字段封装 * @author lwh */ +@Data public abstract class BaseModel extends Model { /** * 创建时间 @@ -24,5 +26,5 @@ * 更新时间 */ @TableField(value = "update_time") - private Date updateTime; + private Date updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java index 8f2de34..8f857ad 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java @@ -6,8 +6,14 @@ import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.casic.missiles.core.base.json.DateDeserializer; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,9 +21,16 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; +import static com.casic.missiles.modular.util.DictConvertUtils.convertDictValue; + /** *

* 设备表 @@ -35,7 +48,7 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ID_WORKER) private Long id; /** @@ -112,6 +125,11 @@ @TableField("install_date") private Date installDate; /** + * 安装时间字符串 + */ + @TableField(exist = false) + private String installDateFmt; + /** * 记录更新时间 */ @JSONField(serializeUsing = DateDeserializer.class) @@ -127,6 +145,65 @@ return this.id; } + public static final Map importMppers = new HashMap<>(12); + + static { + importMppers.put("设备编号", "deviceNo"); + importMppers.put("设备名称", "deviceName"); + //需要转换 + importMppers.put("设备类型", "type"); + + importMppers.put("省编号", "provinceCode"); + importMppers.put("城市编号", "cityCode"); + importMppers.put("区编码", "areaCode"); + importMppers.put("详细地址", "position"); + importMppers.put("经度", "lng"); + importMppers.put("纬度", "lat"); + importMppers.put("备注", "notes"); + //需要转换 + importMppers.put("所属管理组织", "deptId"); + importMppers.put("安装时间", "installDateFmt"); + } + + /** + * 导入数据校验及部分数据 转换 + * + * @param envDeviceTypes 字典列表 + * @param deptFunction 组织检索 + */ + public void changeImportData(List envDeviceTypes, Function deptFunction) { + // 所属组织名称 + if (ToolUtil.isOneEmpty(deptId, type)) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("所属组织及设备类型为必填项"); + throw msg; + } + DecimalFormat format = new DecimalFormat("0.000000"); + if (ToolUtil.isNotEmpty(lng)) { + lng = format.format(new BigDecimal(lng)); + } + if (ToolUtil.isNotEmpty(lat)) { + lat = format.format(new BigDecimal(lat)); + } + if(ToolUtil.isNotEmpty(installDateFmt)){ + installDate = DateUtil.parseDate(installDateFmt); + } + //导入数据转换操作 设备类型转换为 + if (ToolUtil.isNotEmpty(type)) { + type = convertDictValue(type, envDeviceTypes, true); + } + + Dept dept = deptFunction.apply(deptId); + if (ToolUtil.isOneEmpty(dept, dept.getId())) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("\"" + deptId + "\"不存在"); + throw msg; + } + + deptId = String.valueOf(dept.getId()); + + } + /** * 传输数据转换 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java index 6fac74a..332c1d7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java @@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.Device; import com.baomidou.mybatisplus.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.io.Serializable; import java.util.List; @@ -48,4 +50,11 @@ * @param ids 设备主键集合 */ void deleteBatchByDeviceIds(List ids); + + /** + * 批量导入设备 + * @param file 上传设备附件 + * @return 导入结果 + */ + ResponseData importDevices(MultipartFile file); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java index 48e1a38..44b8596 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java @@ -3,17 +3,29 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.IExpandComponentService; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.dao.DeviceMapper; import com.casic.missiles.modular.device.model.Device; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.service.IDeviceService; import com.casic.missiles.modular.system.model.Area; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hswebframework.expands.office.excel.ExcelIO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -26,11 +38,13 @@ * @author lwh * @since 2021-07-26 */ +@Slf4j @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { private final ICommonPermissionService permissionService; private final IExpandComponentService expandComponentService; + private final ICommonDeptService deptService; /** * 设备服务构造 @@ -38,9 +52,10 @@ * @param permissionService 权限服务 * @param expandComponentService 拓展服务 */ - public DeviceServiceImpl(ICommonPermissionService permissionService, IExpandComponentService expandComponentService) { + public DeviceServiceImpl(ICommonPermissionService permissionService, IExpandComponentService expandComponentService, ICommonDeptService deptService) { this.permissionService = permissionService; this.expandComponentService = expandComponentService; + this.deptService = deptService; } /** @@ -95,6 +110,40 @@ this.updateBatchById(deviceList); } + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData importDevices(MultipartFile file) { + //获取字典数据 + List envDeviceTypes = permissionService.findInDictByCode("envDeviceType"); + List results = new ArrayList<>(); + try (InputStream in = file.getInputStream()) { + ExcelIO.read(in, Device.importMppers, Device.class, (row) -> { + //仅读取第一个sheet + if (row.getSheet() == 0) { + if (row.getResult() != null) { + Device device = row.getResult(); + if (ToolUtil.isEmpty(device.getDeviceNo())) { + return; + } + device.changeImportData(envDeviceTypes, (deptName) -> { + Page page = new PageFactory().defaultPage(); + page.setSize(Integer.MAX_VALUE); + List list = deptService.getSubDeptObjPage(null, null, deptName, null, page, null); + return list == null ? null : list.get(0); + }); + results.add(device); + } + } else { + log.info("当前sheet" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + } + this.insertBatch(results); + return ResponseData.success(); + } + /** * 服务数据转换 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DictConvertUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DictConvertUtils.java new file mode 100644 index 0000000..a245dbf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DictConvertUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.util; + +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.commons.lang.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 字典提取转换工具 + * @author lenovo + */ +public class DictConvertUtils { + /** + * 处理导入字典信息 + * + * @param names 字典名(逗号拼接) + * @param dicts 字典集合 + * @return 字典值集合(逗号拼接) + */ + public static String convertDictValue(String names, List dicts, boolean isSingle) { + String values = ""; + if (ToolUtil.isNotEmpty(names)) { + try { + List valuList = new ArrayList<>(); + List nameList = Arrays.asList(StringUtils.split(names, ",")); + nameList.stream().forEach(str -> { + valuList.add(dicts.stream().filter(dict -> str.trim().equals(dict.getName())).findFirst().get().getCode()); + }); + + // 判断是否提取单个字典值 + if (ToolUtil.isNotEmpty(valuList)) { + return isSingle ? valuList.get(0) : String.join(",", valuList); + } + } catch (Exception e) { + e.printStackTrace(); + GunsException ex = new GunsException(BizExceptionEnum.DICT_EXISTED); + ex.setMessage(names + "不存在"); + throw ex; + } + } + return values; + } +} diff --git a/casic-server/pom.xml b/casic-server/pom.xml index 38f1582..4654cef 100644 --- a/casic-server/pom.xml +++ b/casic-server/pom.xml @@ -27,6 +27,11 @@ casic-admin-support ${admin.version} + + com.casic + casic-export-support + ${admin.version} + diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java index f13505e..2189b4b 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/controller/DeviceController.java @@ -1,7 +1,7 @@ package com.casic.missiles.modular.device.controller; import com.baomidou.mybatisplus.plugins.Page; -import com.casic.missiles.core.base.controller.BaseController; +import com.casic.missiles.core.base.controller.ExportController; import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.core.base.response.SuccessResponseData; import com.casic.missiles.core.common.constant.factory.PageFactory; @@ -12,9 +12,14 @@ import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; import com.casic.missiles.modular.device.service.IDeviceService; +import com.casic.missiles.modular.util.DuplicateKeyUtils; +import lombok.extern.slf4j.Slf4j; +import org.springframework.dao.DuplicateKeyException; import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; -import java.io.Serializable; +import java.sql.BatchUpdateException; +import java.util.Date; import java.util.List; /** @@ -23,9 +28,10 @@ * @author dev * @Date 2021-07-26 14:38:07 */ +@Slf4j @RestController @RequestMapping("/device") -public class DeviceController extends BaseController { +public class DeviceController extends ExportController { private final IDeviceService deviceService; @@ -51,6 +57,27 @@ } /** + * 设备导入接口 + * + * @param file 文件流程 + * @return + */ + @PostMapping(value = "/import") + public Object importDevices(@RequestParam("file") MultipartFile file) { + try { + return deviceService.importDevices(file); + } catch (Exception ex) { + if (ex instanceof GunsException) { + return ResponseData.error(((GunsException) ex).getMessage()); + } else if (ex instanceof DuplicateKeyException || ex instanceof BatchUpdateException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } + } + + /** * 设备分页列表查询 * * @param vo 查询参数 @@ -75,7 +102,17 @@ */ @PostMapping(value = "/add") public Object add(Device device) { - deviceService.insert(device); + device.setCreateTime(new Date()); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.insert(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备添加异常", ex); + return ResponseData.error("设备添加异常"); + } return ResponseData.success(); } @@ -107,13 +144,23 @@ if (ToolUtil.isEmpty(device.getId())) { throw new GunsException(GunsExceptionEnum.REQUEST_NULL); } - deviceService.updateById(device); + device.setUpdateTime(device.getCreateTime()); + try { + deviceService.updateById(device); + } catch (Exception ex) { + if (ex instanceof DuplicateKeyException) { + return ResponseData.error(DuplicateKeyUtils.message((DuplicateKeyException) ex, "设备编号%s已存在", "device_no_index")); + } + log.error("设备修改异常", ex); + return ResponseData.error("设备修改异常"); + } return ResponseData.success(); } /** * 查询详情 + * * @param id 设备主键 * @return 查询结果 */ diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java index 953cd1e..4d66b42 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/BaseModel.java @@ -3,6 +3,7 @@ import com.alibaba.fastjson.annotation.JSONField; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotations.TableField; +import lombok.Data; import java.util.Date; @@ -12,6 +13,7 @@ * @param 基础属性字段封装 * @author lwh */ +@Data public abstract class BaseModel extends Model { /** * 创建时间 @@ -24,5 +26,5 @@ * 更新时间 */ @TableField(value = "update_time") - private Date updateTime; + private Date updateTime; } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java index 8f2de34..8f857ad 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/model/Device.java @@ -6,8 +6,14 @@ import com.baomidou.mybatisplus.annotations.TableName; import com.baomidou.mybatisplus.enums.IdType; import com.casic.missiles.core.base.json.DateDeserializer; +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.DateUtil; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.vo.DeviceVO; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; import lombok.EqualsAndHashCode; @@ -15,9 +21,16 @@ import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; +import java.math.BigDecimal; +import java.text.DecimalFormat; import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; import java.util.function.Function; +import static com.casic.missiles.modular.util.DictConvertUtils.convertDictValue; + /** *

* 设备表 @@ -35,7 +48,7 @@ /** * 主键 */ - @TableId(value = "id", type = IdType.AUTO) + @TableId(value = "id", type = IdType.ID_WORKER) private Long id; /** @@ -112,6 +125,11 @@ @TableField("install_date") private Date installDate; /** + * 安装时间字符串 + */ + @TableField(exist = false) + private String installDateFmt; + /** * 记录更新时间 */ @JSONField(serializeUsing = DateDeserializer.class) @@ -127,6 +145,65 @@ return this.id; } + public static final Map importMppers = new HashMap<>(12); + + static { + importMppers.put("设备编号", "deviceNo"); + importMppers.put("设备名称", "deviceName"); + //需要转换 + importMppers.put("设备类型", "type"); + + importMppers.put("省编号", "provinceCode"); + importMppers.put("城市编号", "cityCode"); + importMppers.put("区编码", "areaCode"); + importMppers.put("详细地址", "position"); + importMppers.put("经度", "lng"); + importMppers.put("纬度", "lat"); + importMppers.put("备注", "notes"); + //需要转换 + importMppers.put("所属管理组织", "deptId"); + importMppers.put("安装时间", "installDateFmt"); + } + + /** + * 导入数据校验及部分数据 转换 + * + * @param envDeviceTypes 字典列表 + * @param deptFunction 组织检索 + */ + public void changeImportData(List envDeviceTypes, Function deptFunction) { + // 所属组织名称 + if (ToolUtil.isOneEmpty(deptId, type)) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("所属组织及设备类型为必填项"); + throw msg; + } + DecimalFormat format = new DecimalFormat("0.000000"); + if (ToolUtil.isNotEmpty(lng)) { + lng = format.format(new BigDecimal(lng)); + } + if (ToolUtil.isNotEmpty(lat)) { + lat = format.format(new BigDecimal(lat)); + } + if(ToolUtil.isNotEmpty(installDateFmt)){ + installDate = DateUtil.parseDate(installDateFmt); + } + //导入数据转换操作 设备类型转换为 + if (ToolUtil.isNotEmpty(type)) { + type = convertDictValue(type, envDeviceTypes, true); + } + + Dept dept = deptFunction.apply(deptId); + if (ToolUtil.isOneEmpty(dept, dept.getId())) { + GunsException msg = new GunsException(BizExceptionEnum.SERVER_ERROR); + msg.setMessage("\"" + deptId + "\"不存在"); + throw msg; + } + + deptId = String.valueOf(dept.getId()); + + } + /** * 传输数据转换 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java index 6fac74a..332c1d7 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/IDeviceService.java @@ -2,9 +2,11 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; +import com.casic.missiles.core.base.response.ResponseData; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.model.Device; import com.baomidou.mybatisplus.service.IService; +import org.springframework.web.multipart.MultipartFile; import java.io.Serializable; import java.util.List; @@ -48,4 +50,11 @@ * @param ids 设备主键集合 */ void deleteBatchByDeviceIds(List ids); + + /** + * 批量导入设备 + * @param file 上传设备附件 + * @return 导入结果 + */ + ResponseData importDevices(MultipartFile file); } diff --git a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java index 48e1a38..44b8596 100644 --- a/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java +++ b/casic-server/src/main/java/com/casic/missiles/modular/device/service/impl/DeviceServiceImpl.java @@ -3,17 +3,29 @@ import com.baomidou.mybatisplus.mapper.EntityWrapper; import com.baomidou.mybatisplus.plugins.Page; import com.baomidou.mybatisplus.service.impl.ServiceImpl; +import com.casic.missiles.core.base.response.ResponseData; +import com.casic.missiles.core.common.constant.factory.PageFactory; +import com.casic.missiles.core.common.service.ICommonDeptService; import com.casic.missiles.core.common.service.ICommonPermissionService; import com.casic.missiles.core.common.service.IExpandComponentService; +import com.casic.missiles.core.util.ToolUtil; import com.casic.missiles.modular.device.dao.DeviceMapper; import com.casic.missiles.modular.device.model.Device; import com.casic.missiles.modular.device.model.dto.DeviceDTO; import com.casic.missiles.modular.device.service.IDeviceService; import com.casic.missiles.modular.system.model.Area; +import com.casic.missiles.modular.system.model.Dept; +import com.casic.missiles.modular.system.model.Dict; +import lombok.SneakyThrows; +import lombok.extern.slf4j.Slf4j; +import org.hswebframework.expands.office.excel.ExcelIO; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.multipart.MultipartFile; +import java.io.InputStream; import java.io.Serializable; +import java.util.ArrayList; import java.util.List; import java.util.function.Function; import java.util.stream.Collectors; @@ -26,11 +38,13 @@ * @author lwh * @since 2021-07-26 */ +@Slf4j @Service public class DeviceServiceImpl extends ServiceImpl implements IDeviceService { private final ICommonPermissionService permissionService; private final IExpandComponentService expandComponentService; + private final ICommonDeptService deptService; /** * 设备服务构造 @@ -38,9 +52,10 @@ * @param permissionService 权限服务 * @param expandComponentService 拓展服务 */ - public DeviceServiceImpl(ICommonPermissionService permissionService, IExpandComponentService expandComponentService) { + public DeviceServiceImpl(ICommonPermissionService permissionService, IExpandComponentService expandComponentService, ICommonDeptService deptService) { this.permissionService = permissionService; this.expandComponentService = expandComponentService; + this.deptService = deptService; } /** @@ -95,6 +110,40 @@ this.updateBatchById(deviceList); } + @SneakyThrows + @Transactional(rollbackFor = Exception.class) + @Override + public ResponseData importDevices(MultipartFile file) { + //获取字典数据 + List envDeviceTypes = permissionService.findInDictByCode("envDeviceType"); + List results = new ArrayList<>(); + try (InputStream in = file.getInputStream()) { + ExcelIO.read(in, Device.importMppers, Device.class, (row) -> { + //仅读取第一个sheet + if (row.getSheet() == 0) { + if (row.getResult() != null) { + Device device = row.getResult(); + if (ToolUtil.isEmpty(device.getDeviceNo())) { + return; + } + device.changeImportData(envDeviceTypes, (deptName) -> { + Page page = new PageFactory().defaultPage(); + page.setSize(Integer.MAX_VALUE); + List list = deptService.getSubDeptObjPage(null, null, deptName, null, page, null); + return list == null ? null : list.get(0); + }); + results.add(device); + } + } else { + log.info("当前sheet" + row.getSheet() + ",停止读取"); + row.shutdown(); + } + }); + } + this.insertBatch(results); + return ResponseData.success(); + } + /** * 服务数据转换 * diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DictConvertUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DictConvertUtils.java new file mode 100644 index 0000000..a245dbf --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DictConvertUtils.java @@ -0,0 +1,48 @@ +package com.casic.missiles.modular.util; + +import com.casic.missiles.core.common.exception.BizExceptionEnum; +import com.casic.missiles.core.exception.GunsException; +import com.casic.missiles.core.util.ToolUtil; +import com.casic.missiles.modular.system.model.Dict; +import org.apache.commons.lang.StringUtils; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * 字典提取转换工具 + * @author lenovo + */ +public class DictConvertUtils { + /** + * 处理导入字典信息 + * + * @param names 字典名(逗号拼接) + * @param dicts 字典集合 + * @return 字典值集合(逗号拼接) + */ + public static String convertDictValue(String names, List dicts, boolean isSingle) { + String values = ""; + if (ToolUtil.isNotEmpty(names)) { + try { + List valuList = new ArrayList<>(); + List nameList = Arrays.asList(StringUtils.split(names, ",")); + nameList.stream().forEach(str -> { + valuList.add(dicts.stream().filter(dict -> str.trim().equals(dict.getName())).findFirst().get().getCode()); + }); + + // 判断是否提取单个字典值 + if (ToolUtil.isNotEmpty(valuList)) { + return isSingle ? valuList.get(0) : String.join(",", valuList); + } + } catch (Exception e) { + e.printStackTrace(); + GunsException ex = new GunsException(BizExceptionEnum.DICT_EXISTED); + ex.setMessage(names + "不存在"); + throw ex; + } + } + return values; + } +} diff --git a/casic-server/src/main/java/com/casic/missiles/modular/util/DuplicateKeyUtils.java b/casic-server/src/main/java/com/casic/missiles/modular/util/DuplicateKeyUtils.java new file mode 100644 index 0000000..0d4885a --- /dev/null +++ b/casic-server/src/main/java/com/casic/missiles/modular/util/DuplicateKeyUtils.java @@ -0,0 +1,34 @@ +package com.casic.missiles.modular.util; + +import org.springframework.dao.DuplicateKeyException; + +/** + * 主键冲突提取工具 + * + * @author lwh + */ +public class DuplicateKeyUtils { + private static final String DUPLICATEKEY_START = "Duplicate entry '"; + private static final String DUPLICATEKEY_END = "' for key '%s'"; + + /** + * 主键冲突提示 + * + * @param ex 异常 + * @param msgFormat 提示信息模板 + * @param indexName 唯一索引名称 + * @return + */ + public static String message(DuplicateKeyException ex, String msgFormat, String indexName) { + String value = ex.getCause().getMessage().replaceAll(DUPLICATEKEY_START, "").replaceAll("' for key '" + indexName + "'", ""); + if (value.endsWith("-0")) { + value = value.substring(0, value.length() - 2); + } + return String.format(msgFormat, value); + } + + public static void main(String[] args) { + System.out.println(String.format(DUPLICATEKEY_END, "toilet_code_index")); + + } +}