From 311b9c0ca93eedb518cf219833506a66933155ea Mon Sep 17 00:00:00 2001 From: lihongjie0209 Date: Thu, 23 May 2024 20:42:04 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/cn/lihongjie/coal/Codegen.java | 11 ++- .../cn/lihongjie/coal/common/DictCode.java | 3 + .../device/controller/DeviceController.java | 6 ++ .../coal/device/service/DeviceService.java | 98 ++++++++++++++++++- .../dto/CreateDeviceCategoryDto.java | 7 ++ .../deviceCategory/dto/DeviceCategoryDto.java | 15 +++ .../dto/DeviceCategoryTreeDto.java | 15 +++ .../dto/UpdateDeviceCategoryDto.java | 8 ++ .../entity/DeviceCategoryEntity.java | 9 ++ .../coal/sequence/SequenceService.java | 32 +++++- src/main/resources/config/dictionary.json | 23 +++++ 11 files changed, 217 insertions(+), 10 deletions(-) diff --git a/src/main/java/cn/lihongjie/coal/Codegen.java b/src/main/java/cn/lihongjie/coal/Codegen.java index 1e7dc230..0b0ea728 100644 --- a/src/main/java/cn/lihongjie/coal/Codegen.java +++ b/src/main/java/cn/lihongjie/coal/Codegen.java @@ -13,7 +13,6 @@ import cn.lihongjie.coal.base.mapper.BaseMapper; import cn.lihongjie.coal.base.mapper.CommonEntityMapper; import cn.lihongjie.coal.base.mapper.CommonMapper; import cn.lihongjie.coal.base.service.BaseService; -import cn.lihongjie.coal.common.DictCode; import cn.lihongjie.coal.common.TreeUtils; import cn.lihongjie.coal.dbFunctions.DbFunctionService; import cn.lihongjie.coal.exception.BizException; @@ -208,9 +207,13 @@ public class Codegen { "archiveStatusName", Modifier.PRIVATE) .addAnnotation( - AnnotationSpec.builder( -DictTranslate.class) - .addMember("dictKey", "$T.$N", ClassName.get(DictCode.class), "ARCHIVESTATUS" ) + AnnotationSpec.builder(DictTranslate.class) + .addMember( + "dictKey", + "$T.$N", + ClassName.get( + "cn.lihongjie.coal.common", "DictCode"), + "ARCHIVESTATUS") .build()) .build()) .build(); diff --git a/src/main/java/cn/lihongjie/coal/common/DictCode.java b/src/main/java/cn/lihongjie/coal/common/DictCode.java index 7065f189..d9f60c79 100644 --- a/src/main/java/cn/lihongjie/coal/common/DictCode.java +++ b/src/main/java/cn/lihongjie/coal/common/DictCode.java @@ -52,6 +52,9 @@ public class DictCode { public static final String EXCEL_TEMPLATE_TYPE = "excel.template.type"; + public static final String DEVICE_CATEGORY_DEVICECODEGENRULE = + "device.category.deviceCodeGenRule"; + public static final String EXCEL_GENERATOR_DATASOURCE_TYPE = "excel.generator.datasource.type"; public static final String DEVICE_WORKORDER_STATUS = "device.workOrder.status"; diff --git a/src/main/java/cn/lihongjie/coal/device/controller/DeviceController.java b/src/main/java/cn/lihongjie/coal/device/controller/DeviceController.java index b4049b9b..53deb28d 100644 --- a/src/main/java/cn/lihongjie/coal/device/controller/DeviceController.java +++ b/src/main/java/cn/lihongjie/coal/device/controller/DeviceController.java @@ -4,6 +4,7 @@ import cn.lihongjie.coal.annotation.OrgScope; import cn.lihongjie.coal.annotation.SysLog; import cn.lihongjie.coal.base.dto.CommonQuery; import cn.lihongjie.coal.base.dto.IdRequest; +import cn.lihongjie.coal.base.dto.R; import cn.lihongjie.coal.device.dto.CreateDeviceDto; import cn.lihongjie.coal.device.dto.DeviceDto; import cn.lihongjie.coal.device.dto.UpdateDeviceDto; @@ -31,6 +32,11 @@ public class DeviceController { return this.service.create(request); } + @PostMapping("/genCode") + public R genCode(@RequestBody CreateDeviceDto request) { + return R.success(this.service.genCode(request)); + } + @PostMapping("/update") public DeviceDto update(@RequestBody UpdateDeviceDto request) { return this.service.update(request); diff --git a/src/main/java/cn/lihongjie/coal/device/service/DeviceService.java b/src/main/java/cn/lihongjie/coal/device/service/DeviceService.java index 449cd741..44d67343 100644 --- a/src/main/java/cn/lihongjie/coal/device/service/DeviceService.java +++ b/src/main/java/cn/lihongjie/coal/device/service/DeviceService.java @@ -10,7 +10,10 @@ import cn.lihongjie.coal.device.dto.UpdateDeviceDto; import cn.lihongjie.coal.device.entity.DeviceEntity; import cn.lihongjie.coal.device.mapper.DeviceMapper; import cn.lihongjie.coal.device.repository.DeviceRepository; +import cn.lihongjie.coal.deviceCategory.entity.DeviceCategoryEntity; +import cn.lihongjie.coal.deviceCategory.service.DeviceCategoryService; import cn.lihongjie.coal.exception.BizException; +import cn.lihongjie.coal.sequence.SequenceService; import jakarta.persistence.EntityManager; import jakarta.persistence.PersistenceContext; @@ -20,6 +23,7 @@ import jakarta.persistence.criteria.JoinType; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.BooleanUtils; +import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.convert.ConversionService; import org.springframework.data.domain.Page; @@ -46,15 +50,106 @@ public class DeviceService extends BaseService { return getById(entity.getId()); } + @Autowired DeviceCategoryService deviceCategoryService; + + @Autowired SequenceService sequenceService; + + public String genCode(CreateDeviceDto request) { + + String categoryId = request.getCategory(); + + DeviceCategoryEntity category = null; + try { + + category = deviceCategoryService.get(categoryId); + } catch (Exception e) { + + throw new BizException("设备类目不存在"); + } + String genRule = StringUtils.defaultIfBlank(category.getDeviceCodeGenRule(), "3"); + + if (!StringUtils.equals(genRule, "3") + && category.getCodeLength() == null) { + throw new BizException("设备类目编码长度不能为空"); + } + StringBuilder sb = new StringBuilder(); + + switch (genRule) { + case "0": + String key = "device.global." + Ctx.currentUser().getOrganizationId(); + + sequenceService.createSequence(key, 0); + Long next = sequenceService.nextVal(key); + + return String.format( + "%s%0" + category.getCodeLength() + "d", + StringUtils.defaultIfBlank(category.getCodePrefix(), ""), + next); + case "1": + var curr = category; + + while (curr != null) { + + if (StringUtils.isBlank(curr.getCode())) { + throw new BizException("设备类目编码不能为空: " + curr.getName()); + } + + sb.insert(0, curr.getCode()); + + curr = curr.getParent(); + } + + key = "device.category." + category.getId(); + + sequenceService.createSequence(key, 0); + next = sequenceService.nextVal(key); + + sb.append( + String.format( + "%0" + category.getCodeLength() + "d", + + next)); + + return StringUtils.defaultIfBlank(category.getCodePrefix(), "") + sb; + case "2": + key = "device.category." + category.getId(); + + sequenceService.createSequence(key, 0); + next = sequenceService.nextVal(key); + + if (StringUtils.isBlank(category.getCode())) { + throw new BizException("设备类目编码不能为空: " + category.getName()); + } + + sb.append(category.getCode()); + + sb.append( + String.format( + "%0" + category.getCodeLength() + "d", + + next)); + + return StringUtils.defaultIfBlank(category.getCodePrefix(), "") + sb; + + case "3": + return ""; + } + + return null; + } + @PersistenceContext EntityManager em; public DeviceDto update(UpdateDeviceDto request) { + DeviceEntity entity = this.repository.get(request.getId()); + String orgCode = entity.getCode(); if (this.repository.containArchived(request.getId())) { throw new BizException("部分数据已归档,无法编辑或删除"); } this.mapper.updateEntity(entity, request); + entity.setCode(orgCode); this.repository.save(entity); return getById(entity.getId()); @@ -123,7 +218,8 @@ public class DeviceService extends BaseService { public Object workOrderCount(String id) { return em.createQuery( - "select type as type, count(1) as cnt from DeviceWorkOrderEntity where device.id = :id group by type", DeviceWorkOrderSummary.class) + "select type as type, count(1) as cnt from DeviceWorkOrderEntity where device.id = :id group by type", + DeviceWorkOrderSummary.class) .setParameter("id", id) .getResultList(); } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java index 4df0995e..06dff08b 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/CreateDeviceCategoryDto.java @@ -4,10 +4,17 @@ import cn.lihongjie.coal.base.dto.OrgCommonDto; import lombok.Data; +import org.hibernate.annotations.Comment; + import java.util.List; @Data public class CreateDeviceCategoryDto extends OrgCommonDto { private String parent; private List users; + @Comment("设备编码生成规则") + private String deviceCodeGenRule; + + private Integer codeLength; + private String codePrefix; } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryDto.java b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryDto.java index 2671e57c..18010ff0 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryDto.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryDto.java @@ -2,9 +2,13 @@ package cn.lihongjie.coal.deviceCategory.dto; import cn.lihongjie.coal.base.dto.OrgCommonDto; import cn.lihongjie.coal.base.dto.SimpleDto; +import cn.lihongjie.coal.common.DictCode; +import cn.lihongjie.coal.pojoProcessor.DictTranslate; import lombok.Data; +import org.hibernate.annotations.Comment; + import java.util.List; @Data @@ -16,4 +20,15 @@ public class DeviceCategoryDto extends OrgCommonDto { private List childrenDeviceIds; private List selfDeviceIds; + + @Comment("设备编码生成规则") + private String deviceCodeGenRule; + + + private Integer codeLength; + + private String codePrefix; + + @DictTranslate(dictKey = DictCode.DEVICE_CATEGORY_DEVICECODEGENRULE) + private String deviceCodeGenRuleName; } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java index aca7639b..2def86a3 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/DeviceCategoryTreeDto.java @@ -2,9 +2,13 @@ package cn.lihongjie.coal.deviceCategory.dto; import cn.lihongjie.coal.base.dto.OrgCommonDto; import cn.lihongjie.coal.base.dto.SimpleDto; +import cn.lihongjie.coal.common.DictCode; +import cn.lihongjie.coal.pojoProcessor.DictTranslate; import lombok.Data; +import org.hibernate.annotations.Comment; + import java.util.List; @Data @@ -19,4 +23,15 @@ public class DeviceCategoryTreeDto extends OrgCommonDto { private List children; private String parent; + + @Comment("设备编码生成规则") + private String deviceCodeGenRule; + + + private Integer codeLength; + + private String codePrefix; + @DictTranslate(dictKey = DictCode.DEVICE_CATEGORY_DEVICECODEGENRULE) + private String deviceCodeGenRuleName; + } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/UpdateDeviceCategoryDto.java b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/UpdateDeviceCategoryDto.java index d91ba07b..cb89d53f 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/dto/UpdateDeviceCategoryDto.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/dto/UpdateDeviceCategoryDto.java @@ -4,10 +4,18 @@ import cn.lihongjie.coal.base.dto.OrgCommonDto; import lombok.Data; +import org.hibernate.annotations.Comment; + import java.util.List; @Data public class UpdateDeviceCategoryDto extends OrgCommonDto { private String parent; private List users; + @Comment("设备编码生成规则") + private String deviceCodeGenRule; + + private Integer codeLength; + + private String codePrefix; } diff --git a/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java b/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java index 4155821b..066ca18e 100644 --- a/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java +++ b/src/main/java/cn/lihongjie/coal/deviceCategory/entity/DeviceCategoryEntity.java @@ -7,6 +7,8 @@ import jakarta.persistence.*; import lombok.Data; +import org.hibernate.annotations.Comment; + import java.util.List; @Data @@ -18,6 +20,13 @@ public class DeviceCategoryEntity extends OrgCommonEntity { private List users; + @Comment("设备编码生成规则") + private String deviceCodeGenRule; + + private Integer codeLength; + + private String codePrefix; + @ManyToOne private DeviceCategoryEntity parent; @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL) diff --git a/src/main/java/cn/lihongjie/coal/sequence/SequenceService.java b/src/main/java/cn/lihongjie/coal/sequence/SequenceService.java index dbcb9b4c..f38774a6 100644 --- a/src/main/java/cn/lihongjie/coal/sequence/SequenceService.java +++ b/src/main/java/cn/lihongjie/coal/sequence/SequenceService.java @@ -15,13 +15,23 @@ public class SequenceService { @PersistenceContext EntityManager em; + public void createSequence(String name, Integer start) { + createSequence(name, start, 1); + } + public void createSequence(String name, Integer start, Integer step) { + if (start <= 1){ + start = 1; + } + + name = processName(name); + int count = em.createNativeQuery( - "CREATE SEQUENCE IF NOT EXISTS " + "CREATE SEQUENCE IF NOT EXISTS \"" + name - + " START WITH " + + "\" START WITH " + start + " INCREMENT BY " + step) @@ -30,18 +40,30 @@ public class SequenceService { log.info("create sequence {} update count {}", name, count); } + private String processName(String name) { + + return name.replace(".", "_") + .replace("-", "_") + .replace(" ", "_") + .replace("/", "_") + .replace("\\", "_"); + } + public Long nextVal(String name) { - return ((Number) em.createNativeQuery("select nextval(\"" + name + "\")").getSingleResult()) + name = processName(name); + return ((Number) em.createNativeQuery("select nextval('" + name + "')").getSingleResult()) .longValue(); } public Long currVal(String name) { - return ((Number) em.createNativeQuery("select currval(\"" + name + "\")").getSingleResult()) + name = processName(name); + return ((Number) em.createNativeQuery("select currval('" + name + "')").getSingleResult()) .longValue(); } public void dropSequence(String name) { - int count = em.createNativeQuery("DROP SEQUENCE IF EXISTS " + name).executeUpdate(); + name = processName(name); + int count = em.createNativeQuery("DROP SEQUENCE IF EXISTS '" + name + "'").executeUpdate(); log.info("drop sequence {} update count {}", name, count); } diff --git a/src/main/resources/config/dictionary.json b/src/main/resources/config/dictionary.json index e1be55bb..88b6e65b 100644 --- a/src/main/resources/config/dictionary.json +++ b/src/main/resources/config/dictionary.json @@ -2068,6 +2068,29 @@ } ] }, + + { + "code": "device.category.deviceCodeGenRule", + "name": "设备编码生成规则", + "item": [ + { + "code": "0", + "name": "全局递增" + }, + { + "code": "1", + "name": "父级类目编码+本级类目编码+递增" + }, + { + "code": "2", + "name": "本级类目编码+递增" + }, + { + "code": "3", + "name": "手动输入" + } + ] + }, { "code": "excel.generator.datasource.type", "name": "excel生成器数据源类型",