codes = codegenService.generationCodes(tableId, isBusiness, isStandardized, isFileUpload);
// 构建 zip 包
String[] paths = codes.keySet().toArray(new String[0]);
ByteArrayInputStream[] ins = codes.values().stream().map(IoUtil::toUtf8Stream).toArray(ByteArrayInputStream[]::new);
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java
index d4d4223e..3c7e4fff 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/file/vo/file/FileRespVO.java
@@ -76,7 +76,7 @@ public class FileRespVO {
if (presignedUrl == null || presignedUrl.isEmpty()) {
return null;
}
- String base64PresignedUrl = Base64.getUrlEncoder().encodeToString(presignedUrl.getBytes(StandardCharsets.UTF_8));
+ String base64PresignedUrl = Base64.getEncoder().encodeToString(presignedUrl.getBytes(StandardCharsets.UTF_8));
String timestamp = String.valueOf(System.currentTimeMillis());
String watermark = SpringUtils.getProperty("aj.captcha.water-mark", "中国铜业");
return onlinePreview + base64PresignedUrl + "&t=" + timestamp + "&watermarkTxt=" + watermark;
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/StdNmsController.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java
similarity index 90%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/StdNmsController.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java
index 6f2e174d..fb11064a 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/StdNmsController.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/StdNmsController.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.system.controller.admin.stdnms;
+package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms;
import cn.iocoder.yudao.framework.apilog.core.annotation.ApiAccessLog;
import cn.iocoder.yudao.framework.common.pojo.CommonResult;
@@ -7,11 +7,11 @@ import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
import cn.iocoder.yudao.framework.excel.core.util.ExcelUtils;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import cn.iocoder.yudao.module.system.controller.admin.stdnms.vo.StdNmsPageReqVO;
-import cn.iocoder.yudao.module.system.controller.admin.stdnms.vo.StdNmsRespVO;
-import cn.iocoder.yudao.module.system.controller.admin.stdnms.vo.StdNmsSaveReqVO;
-import cn.iocoder.yudao.module.system.dal.dataobject.stdnms.StdNmsDO;
-import cn.iocoder.yudao.module.system.service.stdnms.StdNmsService;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsRespVO;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO;
+import cn.iocoder.yudao.module.infra.stdnms.StdNmsService;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -32,7 +32,7 @@ import static cn.iocoder.yudao.framework.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 数据命名与简写标准")
@RestController
-@RequestMapping("/system/std-nms")
+@RequestMapping("/infra/std-nms")
@Validated
public class StdNmsController {
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsPageReqVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsPageReqVO.java
similarity index 88%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsPageReqVO.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsPageReqVO.java
index e84c6235..ab50d46e 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsPageReqVO.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsPageReqVO.java
@@ -1,10 +1,10 @@
-package cn.iocoder.yudao.module.system.controller.admin.stdnms.vo;
+package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo;
-import lombok.*;
-import java.util.*;
-import io.swagger.v3.oas.annotations.media.Schema;
import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
+
import java.time.LocalDateTime;
import static cn.iocoder.yudao.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsRespVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsRespVO.java
similarity index 82%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsRespVO.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsRespVO.java
index 85f3bd7a..47be53e7 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsRespVO.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsRespVO.java
@@ -1,11 +1,11 @@
-package cn.iocoder.yudao.module.system.controller.admin.stdnms.vo;
+package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import org.springframework.format.annotation.DateTimeFormat;
+import lombok.Data;
+
import java.time.LocalDateTime;
-import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 数据命名与简写标准 Response VO")
@Data
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsSaveReqVO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsSaveReqVO.java
similarity index 84%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsSaveReqVO.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsSaveReqVO.java
index a03f1803..be96fa8f 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/controller/admin/stdnms/vo/StdNmsSaveReqVO.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/controller/admin/stdnms/stdnms/vo/StdNmsSaveReqVO.java
@@ -1,9 +1,8 @@
-package cn.iocoder.yudao.module.system.controller.admin.stdnms.vo;
+package cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo;
import io.swagger.v3.oas.annotations.media.Schema;
-import lombok.*;
-import java.util.*;
-import jakarta.validation.constraints.*;
+import jakarta.validation.constraints.NotEmpty;
+import lombok.Data;
@Schema(description = "管理后台 - 数据命名与简写标准新增/修改 Request VO")
@Data
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/businessfile/BusinessFileDO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/businessfile/BusinessFileDO.java
new file mode 100644
index 00000000..39de74b9
--- /dev/null
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/businessfile/BusinessFileDO.java
@@ -0,0 +1,53 @@
+package cn.iocoder.yudao.module.infra.dal.dataobject.businessfile;
+
+import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.*;
+/**
+* 业务附件关联 DO
+*
+* @author 后台管理
+*/
+@TableName("infra_bsn_file")
+@KeySequence("infra_bsn_file_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BusinessFileDO extends BaseDO {
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 业务Id
+ */
+ @TableField("BSN_ID")
+ private Long businessId;
+ /**
+ * 业务编码
+ */
+ @TableField("BSN_CD")
+ private String businessCode;
+ /**
+ * 附件fileId
+ */
+ @TableField("FILE_ID")
+ private Long fileId;
+ /**
+ * 附件名称
+ */
+ @TableField("FILE_NAME")
+ private String fileName;
+ /**
+ * 附件来源
+ */
+ @TableField("SRC")
+ private String source;
+
+
+ }
\ No newline at end of file
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java
index f65e9b1f..44fc65c2 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/file/FileDO.java
@@ -2,11 +2,9 @@ package cn.iocoder.yudao.module.infra.dal.dataobject.file;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
-import com.baomidou.mybatisplus.annotation.IdType;
-import com.baomidou.mybatisplus.annotation.KeySequence;
-import com.baomidou.mybatisplus.annotation.TableId;
-import com.baomidou.mybatisplus.annotation.TableName;
+import com.baomidou.mybatisplus.annotation.*;
import lombok.*;
+import org.apache.commons.lang3.StringUtils;
/**
* 文件表
@@ -67,4 +65,16 @@ public class FileDO extends BaseDO {
*/
private String aesIv;
+ /**
+ * 是否加密
+ *
+ * 例如,使用 AES 加密时,isEncrypted = true;未加密时,isEncrypted = false。
+ */
+ @TableField(exist = false) // 不在数据库中
+ private Boolean isEncrypted;
+
+
+ public Boolean getIsEncrypted() {
+ return !StringUtils.isBlank(aesIv);
+ }
}
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/stdnms/StdNmsDO.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java
similarity index 79%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/stdnms/StdNmsDO.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java
index 71832e93..0b8299e9 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/dataobject/stdnms/StdNmsDO.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/dataobject/stdnms/stdnms/StdNmsDO.java
@@ -1,4 +1,4 @@
-package cn.iocoder.yudao.module.system.dal.dataobject.stdnms;
+package cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms;
import cn.iocoder.yudao.framework.mybatis.core.dataobject.BaseDO;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -11,8 +11,8 @@ import lombok.*;
*
* @author 后台管理
*/
-@TableName("system_std_nms")
-@KeySequence("system_std_nms_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@TableName("infra_std_nms")
+@KeySequence("infra_std_nms_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/businessfile/BusinessFileMapper.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/businessfile/BusinessFileMapper.java
new file mode 100644
index 00000000..24eac268
--- /dev/null
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/businessfile/BusinessFileMapper.java
@@ -0,0 +1,31 @@
+package cn.iocoder.yudao.module.infra.dal.mysql.businessfile;
+
+import java.util.*;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
+import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.*;
+
+/**
+ * 业务附件关联 Mapper
+ *
+ * @author 后台管理
+ */
+@Mapper
+public interface BusinessFileMapper extends BaseMapperX {
+
+ default PageResult selectPage(BusinessFilePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BusinessFileDO::getBusinessId, reqVO.getBusinessId())
+ .eqIfPresent(BusinessFileDO::getBusinessCode, reqVO.getBusinessCode())
+ .eqIfPresent(BusinessFileDO::getFileId, reqVO.getFileId())
+ .likeIfPresent(BusinessFileDO::getFileName, reqVO.getFileName())
+ .eqIfPresent(BusinessFileDO::getSource, reqVO.getSource())
+ .betweenIfPresent(BusinessFileDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(BusinessFileDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/stdnms/StdNmsMapper.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java
similarity index 77%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/stdnms/StdNmsMapper.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java
index e21cb124..bc2d5e3c 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/dal/mysql/stdnms/StdNmsMapper.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/dal/mysql/stdnms/StdNmsMapper.java
@@ -1,9 +1,9 @@
-package cn.iocoder.yudao.module.system.dal.mysql.stdnms;
+package cn.iocoder.yudao.module.infra.dal.mysql.stdnms;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
-import cn.iocoder.yudao.module.system.controller.admin.stdnms.vo.StdNmsPageReqVO;
-import cn.iocoder.yudao.module.system.dal.dataobject.stdnms.StdNmsDO;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/businessfile/BusinessFileService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/businessfile/BusinessFileService.java
new file mode 100644
index 00000000..272eb800
--- /dev/null
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/businessfile/BusinessFileService.java
@@ -0,0 +1,64 @@
+package cn.iocoder.yudao.module.infra.service.businessfile;
+
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
+import jakarta.validation.Valid;
+
+import java.util.List;
+
+/**
+ * 业务附件关联 Service 接口
+ *
+ * @author 后台管理
+ */
+public interface BusinessFileService {
+
+ /**
+ * 创建业务附件关联
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createBusinessFile(@Valid BusinessFileSaveReqVO createReqVO);
+
+ /**
+ * 更新业务附件关联
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateBusinessFile(@Valid BusinessFileSaveReqVO updateReqVO);
+
+ /**
+ * 删除业务附件关联
+ *
+ * @param id 编号
+ */
+ void deleteBusinessFile(Long id);
+
+ /**
+ * 批量删除业务附件关联
+ *
+ * @param ids 编号
+ */
+ void deleteBusinessFileListByIds(List ids);
+
+ /**
+ * 获得业务附件关联
+ *
+ * @param id 编号
+ * @return 业务附件关联
+ */
+ BusinessFileDO getBusinessFile(Long id);
+
+ /**
+ * 获得业务附件关联分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 业务附件关联分页
+ */
+ PageResult getBusinessFilePage(BusinessFilePageReqVO pageReqVO);
+
+ List batchCreateBusinessFile(List createReqVOList);
+}
\ No newline at end of file
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/businessfile/BusinessFileServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/businessfile/BusinessFileServiceImpl.java
new file mode 100644
index 00000000..ccedb864
--- /dev/null
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/businessfile/BusinessFileServiceImpl.java
@@ -0,0 +1,99 @@
+package cn.iocoder.yudao.module.infra.service.businessfile;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.iocoder.yudao.framework.common.pojo.PageResult;
+import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFilePageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.businessfile.vo.BusinessFileSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.businessfile.BusinessFileDO;
+import cn.iocoder.yudao.module.infra.dal.mysql.businessfile.BusinessFileMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.BUSINESS_FILE_NOT_EXISTS;
+
+/**
+ * 业务附件关联 Service 实现类
+ *
+ * @author 后台管理
+ */
+@Service
+@Validated
+public class BusinessFileServiceImpl implements BusinessFileService {
+
+ @Resource
+ private BusinessFileMapper businessFileMapper;
+
+ @Override
+ public Long createBusinessFile(BusinessFileSaveReqVO createReqVO) {
+ // 插入
+ BusinessFileDO businessFile = BeanUtils.toBean(createReqVO, BusinessFileDO.class);
+ businessFileMapper.insert(businessFile);
+ // 返回
+ return businessFile.getId();
+ }
+
+ @Override
+ public void updateBusinessFile(BusinessFileSaveReqVO updateReqVO) {
+ // 校验存在
+ validateBusinessFileExists(updateReqVO.getId());
+ // 更新
+ BusinessFileDO updateObj = BeanUtils.toBean(updateReqVO, BusinessFileDO.class);
+ businessFileMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteBusinessFile(Long id) {
+ // 校验存在
+ validateBusinessFileExists(id);
+ // 删除
+ businessFileMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteBusinessFileListByIds(List ids) {
+ // 校验存在
+ validateBusinessFileExists(ids);
+ // 删除
+ businessFileMapper.deleteByIds(ids);
+ }
+
+ private void validateBusinessFileExists(List ids) {
+ List list = businessFileMapper.selectByIds(ids);
+ if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
+ throw exception(BUSINESS_FILE_NOT_EXISTS);
+ }
+ }
+
+ private void validateBusinessFileExists(Long id) {
+ if (businessFileMapper.selectById(id) == null) {
+ throw exception(BUSINESS_FILE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public BusinessFileDO getBusinessFile(Long id) {
+ return businessFileMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getBusinessFilePage(BusinessFilePageReqVO pageReqVO) {
+ return businessFileMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public List batchCreateBusinessFile(List createReqVOList) {
+ List businessFileList = BeanUtils.toBean(createReqVOList, BusinessFileDO.class);
+ List ids = new ArrayList<>();
+ for (BusinessFileDO businessFile : businessFileList) {
+ businessFileMapper.insert(businessFile);
+ ids.add(businessFile.getId());
+ }
+ return ids;
+ }
+}
\ No newline at end of file
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java
index 64835408..61e3879f 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenService.java
@@ -81,18 +81,14 @@ public interface CodegenService {
List getCodegenColumnListByTableId(Long tableId);
/**
- * 执行指定表的代码生成
- *
- * @param tableId 表编号
- * @return 生成结果。key 为文件路径,value 为对应的代码内容
- */
- /**
- * 执行指定表的代码生成,支持业务基类继承
+ * 执行指定表的代码生成,支持业务基类继承、标准化和附件上传能力
* @param tableId 表编号
* @param isBusiness 是否业务基类
- * @return 生成结果
+ * @param isStandardized 是否标准化
+ * @param isFileUpload 是否包含附件上传能力
+ * @return 生成结果。key 为文件路径,value 为对应的代码内容
*/
- Map generationCodes(Long tableId, Boolean isBusiness);
+ Map generationCodes(Long tableId, Boolean isBusiness, Boolean isStandardized, Boolean isFileUpload);
/**
* 兼容原有接口,默认 isBusiness=false
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
index c50ebcc2..a1ae6f91 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/CodegenServiceImpl.java
@@ -246,7 +246,7 @@ public class CodegenServiceImpl implements CodegenService {
/**
* 执行指定表的代码生成,支持业务基类继承
*/
- public Map generationCodes(Long tableId, Boolean isBusiness) {
+ public Map generationCodes(Long tableId, Boolean isBusiness, Boolean isStandardized, Boolean isFileUpload) {
// 校验是否已经存在
CodegenTableDO table = codegenTableMapper.selectById(tableId);
if (table == null) {
@@ -278,8 +278,13 @@ public class CodegenServiceImpl implements CodegenService {
}
}
- // 执行生成,传递 isBusiness
- return codegenEngine.execute(table, columns, subTables, subColumnsList, isBusiness != null && isBusiness);
+ // 执行生成,传递 extraParam
+ Map extraParam = new HashMap<>();
+ extraParam.put("isBusiness", isBusiness != null && isBusiness);
+ extraParam.put("isStandardized", isStandardized != null && isStandardized);
+ extraParam.put("isFileUpload", isFileUpload != null && isFileUpload);
+
+ return codegenEngine.execute(table, columns, subTables, subColumnsList, extraParam);
}
/**
@@ -287,7 +292,7 @@ public class CodegenServiceImpl implements CodegenService {
*/
@Override
public Map generationCodes(Long tableId) {
- return generationCodes(tableId, false);
+ return generationCodes(tableId, false, false, false);
}
@Override
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
index 5880d47d..39459d47 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/codegen/inner/CodegenEngine.java
@@ -29,11 +29,13 @@ import cn.iocoder.yudao.framework.mybatis.core.mapper.BaseMapperX;
import cn.iocoder.yudao.framework.mybatis.core.query.LambdaQueryWrapperX;
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenColumnDO;
import cn.iocoder.yudao.module.infra.dal.dataobject.codegen.CodegenTableDO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO;
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenFrontTypeEnum;
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenSceneEnum;
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenTemplateTypeEnum;
import cn.iocoder.yudao.module.infra.enums.codegen.CodegenVOTypeEnum;
import cn.iocoder.yudao.module.infra.framework.codegen.config.CodegenProperties;
+import cn.iocoder.yudao.module.infra.stdnms.StdNmsService;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.google.common.annotations.VisibleForTesting;
import com.google.common.collect.ImmutableTable;
@@ -46,9 +48,14 @@ import org.springframework.stereotype.Component;
import org.springframework.util.ClassUtils;
import java.util.*;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.stream.Collectors;
+import java.util.stream.IntStream;
import static cn.hutool.core.map.MapUtil.getStr;
import static cn.hutool.core.text.CharSequenceUtil.*;
+import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STD_ABBR_NOT_EXISTS;
/**
* 代码生成的引擎,用于具体生成代码
@@ -59,6 +66,8 @@ import static cn.hutool.core.text.CharSequenceUtil.*;
*/
@Component
public class CodegenEngine {
+ @Resource
+ private StdNmsService stdNmsService;
/**
* 后端的模板配置
@@ -273,12 +282,22 @@ public class CodegenEngine {
* 代码生成,支持业务基类继承
* @param isBusiness 是否业务基类
*/
+ /**
+ * 代码生成,支持传递额外参数
+ * @param extraParam 额外参数,如 isBusiness
+ */
public Map execute(CodegenTableDO table, List columns,
- List subTables, List> subColumnsList, boolean isBusiness) {
+ List subTables, List> subColumnsList, Map extraParam) {
// 1.1 初始化 bindMap 上下文
Map bindingMap = initBindingMap(table, columns, subTables, subColumnsList);
- // 传递 isBusiness 到模板
- bindingMap.put("isBusiness", isBusiness);
+
+ // 标准化命名校验逻辑
+ standardizedJavaField(columns, subColumnsList, extraParam);
+
+ // 传递 extraParam 到模板
+ if (extraParam != null) {
+ bindingMap.putAll(extraParam);
+ }
// 1.2 获得模版
Map templates = getTemplates(table.getFrontType());
@@ -308,12 +327,76 @@ public class CodegenEngine {
return result;
}
+ /**
+ * 如果是标准化的字段名需要针对标准命名表映射 javaField 全名
+ * @param columns 主表的字段集合
+ * @param subColumnsList 子表的字段集合
+ * @param extraParam 额外参数,包含 isStandardized 标志
+ */
+ private void standardizedJavaField(List columns, List> subColumnsList, Map extraParam) {
+ if (extraParam != null && Boolean.TRUE.equals(extraParam.get("isStandardized"))) {
+ List allColumns = new ArrayList<>();
+ allColumns.addAll(columns);
+ allColumns.addAll(Optional.ofNullable(subColumnsList).orElse(new ArrayList<>()).stream().flatMap(Collection::stream).toList());
+ // BusinessBaseDO 字段集合
+ Set businessBaseFields = CodegenBuilder.BUSINESS_BASE_DO_FIELDS;
+ Map abbrToFullName = new HashMap<>();
+ Set columnNameSet = allColumns.stream()
+ // 跳过 BusinessBaseDO 字段
+ .filter(x -> !businessBaseFields.contains(x.getJavaField()))
+ .map(CodegenColumnDO::getColumnName).collect(Collectors.toSet());
+ // 分词(如驼峰转词组)
+ Set phrases = columnNameSet.stream().map(String::toLowerCase)
+ // 分割,最终使用大写
+ .flatMap(y -> Arrays.stream(y.split("_"))).map(String::toUpperCase)
+ .collect(Collectors.toSet());
+ List checkedData = stdNmsService.getStdNmsListByAbbrs(phrases);
+ Set stdAbbrSet = checkedData.stream().map(StdNmsDO::getAbbr).collect(Collectors.toSet());
+ phrases.removeAll(stdAbbrSet);
+ if (CollUtil.isNotEmpty(phrases)) {
+ throw exception(STD_ABBR_NOT_EXISTS, String.join(",", phrases));
+ }
+ Map stdNmsAbbrMap = new ConcurrentHashMap<>();
+ checkedData.forEach(x-> {
+ stdNmsAbbrMap.put(x.getAbbr(), x.getWord());
+ });
+
+ // 构造列名和全名的映射(需要根据短语映射的关系进行拼接)
+ abbrToFullName = allColumns.stream()
+ // 跳过 BusinessBaseDO 字段
+ .filter(x -> !businessBaseFields.contains(x.getJavaField()))
+ .collect(Collectors.toMap(
+ CodegenColumnDO::getJavaField,
+ column -> {
+ // 1.1.1 获取短语
+ String columnName = column.getColumnName().toUpperCase();
+ List words = new LinkedList<>(Arrays.asList(columnName.split("_")));
+ List fullWords = words.stream().map(stdNmsAbbrMap::get).map(String::toLowerCase).toList();
+ // 拼接 fullName 除第一个单词外,首字母需要大写
+ return IntStream.range(0, fullWords.size())
+ .mapToObj(i -> i == 0 ? fullWords.get(i) : Character.toUpperCase(fullWords.get(i).charAt(0)) + fullWords.get(i).substring(1))
+ .collect(Collectors.joining());
+ },
+ (v1, v2) -> v1,
+ HashMap::new
+ ));
+ // 替换 所有列的 javaField
+ Map finalAbbrToFullName = abbrToFullName;
+ columns.stream().filter(x -> !businessBaseFields.contains(x.getJavaField())).forEach(column -> {
+ String fullName = finalAbbrToFullName.get(column.getJavaField());
+ column.setJavaField(fullName);
+ });
+ }
+ }
+
/**
* 兼容原有接口,默认 isBusiness=false
*/
public Map execute(CodegenTableDO table, List columns,
List subTables, List> subColumnsList) {
- return execute(table, columns, subTables, subColumnsList, false);
+ Map extraParam = new HashMap<>();
+ extraParam.put("isBusiness", false);
+ return execute(table, columns, subTables, subColumnsList, extraParam);
}
private void generateCode(Map result, String vmPath,
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java
index 0b94078f..70069904 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/service/file/FileServiceImpl.java
@@ -124,15 +124,7 @@ public class FileServiceImpl implements FileService {
@Override
public FileRespVO createFileWhitReturn(byte[] content, String name, String directory, String type, Boolean encrypt) {
FileDO entity = uploadFile(content, name, directory, type, encrypt);
- return new FileRespVO()
- .setId(entity.getId())
- .setName(entity.getName())
- .setPath(entity.getPath())
- .setUrl(entity.getUrl())
- .setType(entity.getType())
- .setSize(entity.getSize())
- .setConfigId(entity.getConfigId())
- .setIsEncrypted(entity.getAesIv() != null && !entity.getAesIv().isEmpty());
+ return BeanUtils.toBean(entity, FileRespVO.class);
}
private FileDO uploadFile(byte[] content, String name, String directory, String type, Boolean encrypt) throws Exception {
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/stdnms/StdNmsService.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java
similarity index 59%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/stdnms/StdNmsService.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java
index 3699cd00..df15aaca 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/stdnms/StdNmsService.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsService.java
@@ -1,11 +1,13 @@
-package cn.iocoder.yudao.module.system.service.stdnms;
+package cn.iocoder.yudao.module.infra.stdnms;
-import java.util.*;
-import jakarta.validation.*;
-import cn.iocoder.yudao.module.system.controller.admin.stdnms.vo.*;
-import cn.iocoder.yudao.module.system.dal.dataobject.stdnms.StdNmsDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO;
+import jakarta.validation.Valid;
+
+import java.util.Collection;
+import java.util.List;
/**
* 数据命名与简写标准 Service 接口
@@ -58,5 +60,17 @@ public interface StdNmsService {
* @return 数据命名与简写标准分页
*/
PageResult getStdNmsPage(StdNmsPageReqVO pageReqVO);
+ /**
+ * 根据缩写查询数据命名与简写标准
+ * @param abbr 缩写
+ * @return 数据命名与简写标准
+ */
+ StdNmsDO getStdNmsByAbbr(String abbr);
+ /**
+ * 根据缩写列表查询数据命名与简写标准
+ * @param abbrs 缩写列表
+ * @return 数据命名与简写标准列表
+ */
+ List getStdNmsListByAbbrs(Collection abbrs);
}
\ No newline at end of file
diff --git a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/stdnms/StdNmsServiceImpl.java b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java
similarity index 65%
rename from yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/stdnms/StdNmsServiceImpl.java
rename to yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java
index 3bd104cb..68a165b2 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/java/cn/iocoder/yudao/module/system/service/stdnms/StdNmsServiceImpl.java
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/java/cn/iocoder/yudao/module/infra/stdnms/StdNmsServiceImpl.java
@@ -1,24 +1,23 @@
-package cn.iocoder.yudao.module.system.service.stdnms;
+package cn.iocoder.yudao.module.infra.stdnms;
import cn.hutool.core.collection.CollUtil;
-import org.springframework.stereotype.Service;
-import jakarta.annotation.Resource;
-import org.springframework.validation.annotation.Validated;
-import org.springframework.transaction.annotation.Transactional;
-
-import java.util.*;
-import cn.iocoder.yudao.module.system.controller.admin.stdnms.vo.*;
-import cn.iocoder.yudao.module.system.dal.dataobject.stdnms.StdNmsDO;
import cn.iocoder.yudao.framework.common.pojo.PageResult;
-import cn.iocoder.yudao.framework.common.pojo.PageParam;
import cn.iocoder.yudao.framework.common.util.object.BeanUtils;
+import cn.iocoder.yudao.framework.tenant.core.aop.TenantIgnore;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsPageReqVO;
+import cn.iocoder.yudao.module.infra.controller.admin.stdnms.stdnms.vo.StdNmsSaveReqVO;
+import cn.iocoder.yudao.module.infra.dal.dataobject.stdnms.stdnms.StdNmsDO;
+import cn.iocoder.yudao.module.infra.dal.mysql.stdnms.StdNmsMapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
-import cn.iocoder.yudao.module.system.dal.mysql.stdnms.StdNmsMapper;
+import java.util.Collection;
+import java.util.List;
import static cn.iocoder.yudao.framework.common.exception.util.ServiceExceptionUtil.exception;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.convertList;
-import static cn.iocoder.yudao.framework.common.util.collection.CollectionUtils.diffList;
-import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
+import static cn.iocoder.yudao.module.infra.enums.ErrorCodeConstants.STD_NMS_NOT_EXISTS;
/**
* 数据命名与简写标准 Service 实现类
@@ -27,14 +26,28 @@ import static cn.iocoder.yudao.module.system.enums.ErrorCodeConstants.*;
*/
@Service
@Validated
+@TenantIgnore
public class StdNmsServiceImpl implements StdNmsService {
@Resource
private StdNmsMapper stdNmsMapper;
+ @Override
+ public StdNmsDO getStdNmsByAbbr(String abbr) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.eq("abbr", abbr);
+ return stdNmsMapper.selectOne(queryWrapper);
+ }
+
+ @Override
+ public List getStdNmsListByAbbrs(Collection abbrs) {
+ QueryWrapper queryWrapper = new QueryWrapper<>();
+ queryWrapper.in("abbr", abbrs);
+ return stdNmsMapper.selectList(queryWrapper);
+ }
+
@Override
public Long createStdNms(StdNmsSaveReqVO createReqVO) {
- // 插入
StdNmsDO stdNms = BeanUtils.toBean(createReqVO, StdNmsDO.class);
stdNmsMapper.insert(stdNms);
// 返回
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml
index 8abab8d4..d336b3bf 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/application.yaml
@@ -173,5 +173,6 @@ yudao:
enable: true
ignore-urls:
ignore-tables:
+ - infra_std_nms
debug: false
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/controller/controller.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/controller/controller.vm
index ec9f3282..226b2329 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/controller/controller.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/controller/controller.vm
@@ -3,10 +3,16 @@ package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePac
import org.springframework.web.bind.annotation.*;
import ${jakartaPackage}.annotation.Resource;
import org.springframework.validation.annotation.Validated;
-#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end
+#if ($sceneEnum.scene == 1)
+import org.springframework.security.access.prepost.PreAuthorize;
+#end
#if($isBusiness && $isBusiness == true)
import ${basePackage}.framework.business.interceptor.BusinessControllerMarker;
#end
+#if($isFileUpload && $isFileUpload == true)
+import ${basePackage}.framework.business.annotation.FileUploadController;
+import ${basePackage}.framework.business.controller.AbstractFileUploadController;
+#end
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
@@ -42,11 +48,27 @@ import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.$
##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写
@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}")
@Validated
+#if($isFileUpload && $isFileUpload == true)
+@FileUploadController(source = "${table.moduleName}.${table.businessName}")
+#end
## 支持业务基类标记:isBusiness=true 时继承 BusinessControllerMarker
-#if($isBusiness && $isBusiness == true)
+#if($isBusiness && $isBusiness == true && (!$isFileUpload || !$isFileUpload == true))
public class ${sceneEnum.prefixClass}${table.className}Controller implements BusinessControllerMarker {
-#else
+#elseif((!$isBusiness || !$isBusiness == true) && (!$isFileUpload || !$isFileUpload == true))
public class ${sceneEnum.prefixClass}${table.className}Controller {
+#elseif($isBusiness && $isBusiness == true && $isFileUpload && $isFileUpload == true)
+public class ${sceneEnum.prefixClass}${table.className}Controller extends AbstractFileUploadController implements BusinessControllerMarker{
+#elseif((!$isBusiness || !$isBusiness == true) && $isFileUpload && $isFileUpload == true)
+public class ${sceneEnum.prefixClass}${table.className}Controller extends AbstractFileUploadController {
+#end
+
+#if($isFileUpload && $isFileUpload == true)
+ static {
+ FileUploadController annotation = DemoContractController.class.getAnnotation(FileUploadController.class);
+ if (annotation != null) {
+ setFileUploadInfo(annotation);
+ }
+ }
#end
@Resource
@@ -57,7 +79,7 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
#end
- public CommonResult<${primaryColumn.javaType}> create${simpleClassName}(@Valid @RequestBody ${saveReqVOClass} ${saveReqVOVar}) {
+ public CommonResult<${respVOClass}> create${simpleClassName}(@Valid @RequestBody ${saveReqVOClass} ${saveReqVOVar}) {
return success(${classNameVar}Service.create${simpleClassName}(${saveReqVOVar}));
}
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm
index 9c718296..ace9f98a 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/dal/do.vm
@@ -3,12 +3,12 @@ package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.busines
import lombok.*;
import java.util.*;
#foreach ($column in $columns)
-#if (${column.javaType} == "BigDecimal")
-import java.math.BigDecimal;
-#end
-#if (${column.javaType} == "LocalDateTime")
-import java.time.LocalDateTime;
-#end
+ #if (${column.javaType} == "BigDecimal")
+ import java.math.BigDecimal;
+ #end
+ #if (${column.javaType} == "LocalDateTime")
+ import java.time.LocalDateTime;
+ #end
#end
import com.baomidou.mybatisplus.annotation.*;
## 导入基类
@@ -21,19 +21,19 @@ import ${BaseDOClassName};
#if ($voType == 20)
import io.swagger.v3.oas.annotations.media.Schema;
import com.alibaba.excel.annotation.*;
-#foreach ($column in $columns)
- #if ("$!column.dictType" != "")## 有设置数据字典
+ #foreach ($column in $columns)
+ #if ("$!column.dictType" != "")## 有设置数据字典
import ${DictFormatClassName};
import ${DictConvertClassName};
- #break
+ #break
+ #end
#end
#end
-#end
/**
- * ${table.classComment} DO
- *
- * @author ${table.author}
- */
+* ${table.classComment} DO
+*
+* @author ${table.author}
+*/
@TableName("${table.tableName.toLowerCase()}")
@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@@ -48,8 +48,8 @@ import com.alibaba.excel.annotation.*;
@ExcelIgnoreUnannotated
#end
/**
- * 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
- */
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
#if($isBusiness && $isBusiness == true)
public class ${table.className}DO extends BusinessBaseDO {
#else
@@ -58,67 +58,53 @@ public class ${table.className}DO extends BaseDO {
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
- public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT = 0L;
+public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT = 0L;
#end
+## 字段定义宏,统一渲染字段
+#macro(renderField $column $isStandardized)
+ /**
+ * ${column.columnComment}
+ #if ("$!column.dictType" != "")
+ *
+ * 枚举 {@link TODO ${column.dictType} 对应的类}
+ #end
+ */
+ #if (${column.primaryKey})
+ @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#else(type = IdType.ASSIGN_ID)#end
+ #end
+ #if ($voType == 20)
+ @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if (
+ "$!column.example" != ""), example = "${column.example}"#end)
+ #if ("$!column.dictType" != "")
+ @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class)
+ @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
+ #else
+ @ExcelProperty("${column.columnComment}")
+ #end
+ #end
+ #if($isStandardized == true)
+ #if(!${column.primaryKey})
+ @TableField("${column.columnName}")
+ #end
+ #end
+ private ${column.javaType} ${column.javaField};
+#end
+
## 字段定义,分支避免嵌套,保证 Velocity 兼容性
#if($isBusiness == true)
-#foreach ($column in $columns)
- #if (!${businessBaseDOFields.contains(${column.javaField})})
- /**
- * ${column.columnComment}
- #if ("$!column.dictType" != "")##处理枚举值
- *
- * 枚举 {@link TODO ${column.dictType} 对应的类}
+ #foreach ($column in $columns)
+ #if (!${businessBaseDOFields.contains(${column.javaField})})
+ #renderField($column $isStandardized)
+ #end
#end
- */
- #if (${column.primaryKey})##处理主键
- @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#else(type = IdType.ASSIGN_ID)#end
- #end
-#if ($voType == 20)
-## 1. 处理 Swagger 注解
- @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end)
-## 2. 处理 Excel 导出
-#if ("$!column.dictType" != "")##处理枚举值
- @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class)
- @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
#else
- @ExcelProperty("${column.columnComment}")
-#end
-#end
-## 3. 处理字段定义
- private ${column.javaType} ${column.javaField};
- #end
-#end
-#else
-#foreach ($column in $columns)
- #if (!${baseDOFields.contains(${column.javaField})})
- /**
- * ${column.columnComment}
- #if ("$!column.dictType" != "")##处理枚举值
- *
- * 枚举 {@link TODO ${column.dictType} 对应的类}
+ #foreach ($column in $columns)
+ #if (!${baseDOFields.contains(${column.javaField})})
+ #renderField($column $isStandardized)
+ #end
#end
- */
- #if (${column.primaryKey})##处理主键
- @TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#else(type = IdType.ASSIGN_ID)#end
- #end
-#if ($voType == 20)
-## 1. 处理 Swagger 注解
- @Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end)
-## 2. 处理 Excel 导出
-#if ("$!column.dictType" != "")##处理枚举值
- @ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class)
- @DictFormat("${column.dictType}") // TODO 代码优化:建议设置到对应的 DictTypeConstants 枚举类中
-#else
- @ExcelProperty("${column.columnComment}")
-#end
-#end
-## 3. 处理字段定义
- private ${column.javaType} ${column.javaField};
- #end
-#end
#end
## 特殊:主子表专属逻辑(非 ERP 模式)
@@ -126,21 +112,21 @@ public class ${table.className}DO extends BaseDO {
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#if ( $subTable.subJoinMany)
- /**
- * ${subTable.classComment}列表
- */
- @Schema(description = "${subTable.classComment}列表")
- @TableField(exist = false)
- private List<${subTable.className}DO> ${subClassNameVars.get($index)}s;
+ /**
+ * ${subTable.classComment}列表
+ */
+ @Schema(description = "${subTable.classComment}列表")
+ @TableField(exist = false)
+ private List
+ <${subTable.className}DO> ${subClassNameVars.get($index)}s;
#else
- /**
- * ${subTable.classComment}
- */
- @Schema(description = "${subTable.classComment}")
- @TableField(exist = false)
- private ${subTable.className}DO ${subClassNameVars.get($index)};
+ /**
+ * ${subTable.classComment}
+ */
+ @Schema(description = "${subTable.classComment}")
+ @TableField(exist = false)
+ private ${subTable.className}DO ${subClassNameVars.get($index)};
#end
#end
#end
-
}
\ No newline at end of file
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/service.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/service.vm
index 1cc68bf3..5927ba9d 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/service.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/service.vm
@@ -24,7 +24,7 @@ public interface ${table.className}Service {
* @param ${saveReqVOVar} 创建信息
* @return 编号
*/
- ${primaryColumn.javaType} create${simpleClassName}(@Valid ${saveReqVOClass} ${saveReqVOVar});
+ ${respVOClass} create${simpleClassName}(@Valid ${saveReqVOClass} ${saveReqVOVar});
/**
* 更新${table.classComment}
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm
index edea2e7a..93608a7b 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/java/service/serviceImpl.vm
@@ -52,7 +52,7 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
@Transactional(rollbackFor = Exception.class)
#end
- public ${primaryColumn.javaType} create${simpleClassName}(${saveReqVOClass} ${saveReqVOVar}) {
+ public ${respVOClass} create${simpleClassName}(${saveReqVOClass} ${saveReqVOVar}) {
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
@@ -86,7 +86,7 @@ public class ${table.className}ServiceImpl implements ${table.className}Service
#end
#end
// 返回
- return ${classNameVar}.getId();
+ return BeanUtils.toBean(${classNameVar}, ${respVOClass}.class);
}
@Override
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm
index a252884c..bf7a7960 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/api/api.ts.vm
@@ -64,6 +64,11 @@ export const ${simpleClassName}Api = {
export${simpleClassName}: async (params) => {
return await request.download({ url: `${baseURL}/export-excel`, params })
},
+
+ // 查询接口相关的文件上传元数据信息
+ getFileUploadInfo: async () => {
+ return await request.get({url: `${baseURL}/upload-info`})
+ }
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm
index e37474b8..c494c96c 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/form.vue.vm
@@ -115,6 +115,11 @@
#end
#end
#end
+ #if($isFileUpload && $isFileUpload == true)
+
+
+
+ #end
## 特殊:主子表专属逻辑
#if ( $table.templateType == 10 || $table.templateType == 12 )
@@ -171,6 +176,9 @@ const formData = ref({
#end
#end
#end
+#if($isFileUpload && $isFileUpload == true)
+ files: undefined
+#end
})
const formRules = reactive({
#foreach ($column in $columns)
@@ -281,6 +289,9 @@ const resetForm = () => {
$column.javaField: undefined,
#end
#end
+#end
+#if($isFileUpload && $isFileUpload == true)
+ files: undefined
#end
}
formRef.value?.resetFields()
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm
index 399b58e3..985c37cb 100644
--- a/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/codegen/vue3/views/index.vue.vm
@@ -181,7 +181,7 @@
#end
#end
#end
-
+
删除
+#if($isFileUpload && $isFileUpload == true)
+ 附件
+#end
@@ -248,6 +251,16 @@ import ${simpleClassName}Form from './${simpleClassName}Form.vue'
import ${subSimpleClassName}List from './components/${subSimpleClassName}List.vue'
#end
#end
+#if($isFileUpload && $isFileUpload == true)
+import {useDialogStore} from '@/store/modules/dialog'
+import {FileUploadInfoVO} from '@/api/infra/file'
+const dialogStore = useDialogStore()
+const openBusinessFile = async (id: string) => {
+ let fileUploadInfoVO : FileUploadInfoVO = await ${simpleClassName}Api.getFileUploadInfo();
+ fileUploadInfoVO.businessId = id
+ dialogStore.openBusinessFileDialog(fileUploadInfoVO)
+}
+#end
/** ${table.classComment} 列表 */
defineOptions({ name: '${table.className}' })
diff --git a/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/businessfile/BusinessFileMapper.xml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/businessfile/BusinessFileMapper.xml
new file mode 100644
index 00000000..2921a661
--- /dev/null
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/businessfile/BusinessFileMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/yudao-module-system/yudao-module-system-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml
similarity index 83%
rename from yudao-module-system/yudao-module-system-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml
rename to yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml
index cd8d25ab..9e42dcb1 100644
--- a/yudao-module-system/yudao-module-system-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml
+++ b/yudao-module-infra/yudao-module-infra-server/src/main/resources/mapper/stdnms/StdNmsMapper.xml
@@ -1,9 +1,9 @@
-
+
-