diff --git a/nl-gateway/src/main/resources/application.yaml b/nl-gateway/src/main/resources/application.yaml
index dea31fef..0aaabc08 100644
--- a/nl-gateway/src/main/resources/application.yaml
+++ b/nl-gateway/src/main/resources/application.yaml
@@ -79,6 +79,13 @@ spring:
- Path=/app-api/member/**
filters:
- RewritePath=/app-api/member/v3/api-docs, /v3/api-docs
+ ## base-server 服务
+ - id: base-admin-api # 路由的编号
+ uri: grayLb://base-server
+ predicates: # 断言,作为路由的匹配条件,对应 RouteDefinition 数组
+ - Path=/admin-api/base/**
+ filters:
+ - RewritePath=/admin-api/base/v3/api-docs, /v3/api-docs
## bpm-server 服务
- id: bpm-admin-api # 路由的编号
uri: grayLb://bpm-server
@@ -242,6 +249,9 @@ knife4j:
- name: member-server
service-name: member-server
url: /admin-api/member/v3/api-docs
+ - name: base-server
+ service-name: base-server
+ url: /admin-api/base/v3/api-docs
- name: bpm-server
service-name: bpm-server
url: /admin-api/bpm/v3/api-docs
diff --git a/nl-module-base/nl-module-base-api/pom.xml b/nl-module-base/nl-module-base-api/pom.xml
new file mode 100644
index 00000000..870d4b0a
--- /dev/null
+++ b/nl-module-base/nl-module-base-api/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ cn.nl.cloud
+ nl-module-base
+ ${revision}
+
+
+ nl-module-base-api
+ jar
+
+ ${project.artifactId}
+
+ base模块 API,暴露给其它模块调用
+
+
+
+
+ cn.nl.cloud
+ nl-common
+
+
+
+
+ org.springdoc
+ springdoc-openapi-starter-webmvc-ui
+ provided
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-validation
+ true
+
+
+
+
+ org.springframework.cloud
+ spring-cloud-starter-openfeign
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/MaterialBaseApi.java b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/MaterialBaseApi.java
new file mode 100644
index 00000000..f11f1e25
--- /dev/null
+++ b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/MaterialBaseApi.java
@@ -0,0 +1,46 @@
+package cn.code.nl.module.base.api.materialbase;
+
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseListReqDTO;
+import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseRespDTO;
+import cn.code.nl.module.base.enums.ApiConstants;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.validation.Valid;
+import org.springframework.cloud.openfeign.FeignClient;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestBody;
+import org.springframework.web.bind.annotation.RequestParam;
+
+import java.util.List;
+
+import static cn.code.nl.module.base.api.materialbase.MaterialBaseApi.PREFIX;
+
+/**
+ * RPC 服务 - 物料基本信息
+ *
+ * @author zhouz
+ */
+@FeignClient(name = ApiConstants.NAME)
+@Tag(name = "RPC 服务 - 物料基本信息")
+public interface MaterialBaseApi {
+
+ String PREFIX = ApiConstants.PREFIX + "/material-base";
+
+ @GetMapping(PREFIX + "/get")
+ @Operation(summary = "根据物料 ID 查询物料")
+ @Parameter(name = "id", description = "物料标识", example = "1", required = true)
+ CommonResult getMaterialBase(@RequestParam("id") Long id);
+
+ @PostMapping(PREFIX + "/list")
+ @Operation(summary = "根据条件查询物料列表")
+ CommonResult> getMaterialBaseList(@Valid @RequestBody MaterialBaseListReqDTO reqDTO);
+
+ @GetMapping(PREFIX + "/getByCode")
+ @Operation(summary = "根据物料编码查询物料")
+ @Parameter(name = "materialCode", description = "物料编码", example = "MAT001", required = true)
+ CommonResult getMaterialBaseByCode(@RequestParam("materialCode") String materialCode);
+
+}
diff --git a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/dto/MaterialBaseListReqDTO.java b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/dto/MaterialBaseListReqDTO.java
new file mode 100644
index 00000000..9bd3d316
--- /dev/null
+++ b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/dto/MaterialBaseListReqDTO.java
@@ -0,0 +1,81 @@
+package cn.code.nl.module.base.api.materialbase.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * RPC 服务 - 物料基本信息列表查询 Request DTO
+ *
+ * @author zhouz
+ */
+@Schema(description = "RPC 服务 - 物料基本信息列表查询 Request DTO")
+@Data
+public class MaterialBaseListReqDTO {
+
+ @Schema(description = "物料编码")
+ private String materialCode;
+
+ @Schema(description = "物料名称")
+ private String materialName;
+
+ @Schema(description = "规格")
+ private String materialSpec;
+
+ @Schema(description = "型号")
+ private String materialModel;
+
+ @Schema(description = "外文名称")
+ private String englishName;
+
+ @Schema(description = "基本计量单位")
+ private Long baseUnitId;
+
+ @Schema(description = "辅助计量单位")
+ private Long assUnitId;
+
+ @Schema(description = "批准文号")
+ private String approveFileno;
+
+ @Schema(description = "工程图号")
+ private String printNo;
+
+ @Schema(description = "物料分类标识")
+ private Long materialTypeId;
+
+ @Schema(description = "长度单位")
+ private Long lenUnitId;
+
+ @Schema(description = "物料长度")
+ private BigDecimal length;
+
+ @Schema(description = "物料宽度")
+ private BigDecimal width;
+
+ @Schema(description = "物料高度")
+ private BigDecimal height;
+
+ @Schema(description = "重量单位")
+ private Long weightUnitId;
+
+ @Schema(description = "物料毛重")
+ private BigDecimal grossWeight;
+
+ @Schema(description = "物料净重")
+ private BigDecimal netWeight;
+
+ @Schema(description = "体积单位")
+ private Long cubageUnitId;
+
+ @Schema(description = "物料体积")
+ private BigDecimal cubage;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "外部标识")
+ private String extId;
+
+}
diff --git a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/dto/MaterialBaseRespDTO.java b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/dto/MaterialBaseRespDTO.java
new file mode 100644
index 00000000..c3cf2d45
--- /dev/null
+++ b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/api/materialbase/dto/MaterialBaseRespDTO.java
@@ -0,0 +1,90 @@
+package cn.code.nl.module.base.api.materialbase.dto;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+
+/**
+ * RPC 服务 - 物料基本信息 Response DTO
+ *
+ * @author zhouz
+ */
+@Schema(description = "RPC 服务 - 物料基本信息 Response DTO")
+@Data
+public class MaterialBaseRespDTO {
+
+ @Schema(description = "物料标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "31653")
+ private Long materialId;
+
+ @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String materialCode;
+
+ @Schema(description = "物料名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "螺丝")
+ private String materialName;
+
+ @Schema(description = "规格")
+ private String materialSpec;
+
+ @Schema(description = "型号")
+ private String materialModel;
+
+ @Schema(description = "外文名称")
+ private String englishName;
+
+ @Schema(description = "基本计量单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "30034")
+ private Long baseUnitId;
+
+ @Schema(description = "辅助计量单位", example = "25021")
+ private Long assUnitId;
+
+ @Schema(description = "批准文号")
+ private String approveFileno;
+
+ @Schema(description = "工程图号")
+ private String printNo;
+
+ @Schema(description = "物料分类标识", example = "14118")
+ private Long materialTypeId;
+
+ @Schema(description = "长度单位", example = "18116")
+ private Long lenUnitId;
+
+ @Schema(description = "物料长度")
+ private BigDecimal length;
+
+ @Schema(description = "物料宽度")
+ private BigDecimal width;
+
+ @Schema(description = "物料高度")
+ private BigDecimal height;
+
+ @Schema(description = "重量单位", example = "26847")
+ private Long weightUnitId;
+
+ @Schema(description = "物料毛重")
+ private BigDecimal grossWeight;
+
+ @Schema(description = "物料净重")
+ private BigDecimal netWeight;
+
+ @Schema(description = "体积单位", example = "32284")
+ private Long cubageUnitId;
+
+ @Schema(description = "物料体积")
+ private BigDecimal cubage;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+ @Schema(description = "启用时间")
+ private String isUsedTime;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String isUsed;
+
+ @Schema(description = "外部标识", example = "3240")
+ private String extId;
+
+}
diff --git a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/enums/ApiConstants.java b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/enums/ApiConstants.java
new file mode 100644
index 00000000..c18e51f7
--- /dev/null
+++ b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/enums/ApiConstants.java
@@ -0,0 +1,23 @@
+package cn.code.nl.module.base.enums;
+
+import cn.code.nl.framework.common.enums.RpcConstants;
+
+/**
+ * API 相关的枚举
+ *
+ * @author zhouz
+ */
+public class ApiConstants {
+
+ /**
+ * 服务名
+ *
+ * 注意,需要保证和 spring.application.name 保持一致
+ */
+ public static final String NAME = "base-server";
+
+ public static final String PREFIX = RpcConstants.RPC_API_PREFIX + "/base";
+
+ public static final String VERSION = "1.0.0";
+
+}
diff --git a/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/enums/ErrorCodeConstants.java b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/enums/ErrorCodeConstants.java
new file mode 100644
index 00000000..cf79db85
--- /dev/null
+++ b/nl-module-base/nl-module-base-api/src/main/java/cn/code/nl/module/base/enums/ErrorCodeConstants.java
@@ -0,0 +1,17 @@
+package cn.code.nl.module.base.enums;
+
+import cn.code.nl.framework.common.exception.ErrorCode;
+
+public interface ErrorCodeConstants {
+
+ // ========== 物料基本信息 ==========
+ ErrorCode MATERIAL_BASE_NOT_EXISTS = new ErrorCode(1, "物料基本信息不存在");
+
+ // ========== 基础数据分类标准 ==========
+ ErrorCode CLASS_STANDARD_NOT_EXISTS = new ErrorCode(2, "基础数据分类标准不存在");
+ ErrorCode CLASSSTANDARD_NAME_DUPLICATE = new ErrorCode(3, "同级别下已存在同名的分类标准");
+ ErrorCode CLASSSTANDARD_PARENT_NOT_EXISTS = new ErrorCode(4, "父分类不存在");
+ ErrorCode CLASSSTANDARD_PARENT_ERROR = new ErrorCode(5, "不能设置自己为父分类");
+ ErrorCode CLASSSTANDARD_PARENT_IS_CHILD = new ErrorCode(6, "不能设置自己的子分类为父分类");
+ ErrorCode CLASSSTANDARD_EXISTS_CHILDREN = new ErrorCode(7, "存在子分类,无法删除");
+}
diff --git a/nl-module-base/nl-module-base-server/pom.xml b/nl-module-base/nl-module-base-server/pom.xml
new file mode 100644
index 00000000..ef5da7d2
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/pom.xml
@@ -0,0 +1,131 @@
+
+
+ 4.0.0
+
+ cn.nl.cloud
+ nl-module-base
+ ${revision}
+
+
+ nl-module-base-server
+ jar
+
+ ${project.artifactId}
+
+ lms 模块下,我们放通用业务,支撑上层的核心业务。
+ 功能点描述:
+ - xxx
+ - xxx
+
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-env
+
+
+
+ cn.nl.cloud
+ nl-module-base-api
+ ${revision}
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-biz-data-permission
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-biz-tenant
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-biz-ip
+
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-security
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-mybatis
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-redis
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-rpc
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-discovery
+
+
+
+
+ com.alibaba.cloud
+ spring-cloud-starter-alibaba-nacos-config
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-job
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-mq
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-excel
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-monitor
+
+
+
+
+
+ ${project.artifactId}
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+ ${spring.boot.version}
+
+
+
+ repackage
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/BaseServerApplication.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/BaseServerApplication.java
new file mode 100644
index 00000000..cbf23c54
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/BaseServerApplication.java
@@ -0,0 +1,16 @@
+package cn.code.nl.module.base;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ *
+ * @Author: liyongde
+ * @Date: 2026/7/10 9:12
+ */
+@SpringBootApplication
+public class BaseServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(BaseServerApplication.class, args);
+ }
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/ClassStandardController.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/ClassStandardController.java
new file mode 100644
index 00000000..03fcda23
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/ClassStandardController.java
@@ -0,0 +1,129 @@
+package cn.code.nl.module.base.controller.admin.classstandard;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.code.nl.framework.common.enums.CommonStatusEnum;
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+import static cn.code.nl.framework.common.pojo.CommonResult.success;
+
+import cn.code.nl.framework.excel.core.util.ExcelUtils;
+
+import cn.code.nl.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.code.nl.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.code.nl.module.base.controller.admin.classstandard.vo.*;
+import cn.code.nl.module.base.dal.dataobject.classstandard.ClassStandardDO;
+import cn.code.nl.module.base.service.classstandard.ClassStandardService;
+
+@Tag(name = "管理后台 - 基础数据分类标准")
+@RestController
+@RequestMapping("/base/class-standard")
+@Validated
+public class ClassStandardController {
+
+ @Resource
+ private ClassStandardService classStandardService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建基础数据分类标准")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:create')")
+ public CommonResult createClassStandard(@Valid @RequestBody ClassStandardSaveReqVO createReqVO) {
+ return success(classStandardService.createClassStandard(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新基础数据分类标准")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:update')")
+ public CommonResult updateClassStandard(@Valid @RequestBody ClassStandardSaveReqVO updateReqVO) {
+ classStandardService.updateClassStandard(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除基础数据分类标准")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:class-standard:delete')")
+ public CommonResult deleteClassStandard(@RequestParam("id") Long id) {
+ classStandardService.deleteClassStandard(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除基础数据分类标准")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:delete')")
+ public CommonResult deleteClassStandardList(@RequestParam("ids") List ids) {
+ classStandardService.deleteClassStandardListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得基础数据分类标准")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:query')")
+ public CommonResult getClassStandard(@RequestParam("id") Long id) {
+ ClassStandardDO classStandard = classStandardService.getClassStandard(id);
+ return success(BeanUtils.toBean(classStandard, ClassStandardRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得基础数据分类标准分页")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:query')")
+ public CommonResult> getClassStandardPage(@Valid ClassStandardPageReqVO pageReqVO) {
+ PageResult pageResult = classStandardService.getClassStandardPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ClassStandardRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出基础数据分类标准 Excel")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportClassStandardExcel(@Valid ClassStandardPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = classStandardService.getClassStandardPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "基础数据分类标准.xls", "数据", ClassStandardRespVO.class,
+ BeanUtils.toBean(list, ClassStandardRespVO.class));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获取基础数据分类标准列表(树形数据)")
+ @PreAuthorize("@ss.hasPermission('base:class-standard:query')")
+ public CommonResult> getClassStandardList(@Valid ClassStandardListReqVO reqVO) {
+ List list = classStandardService.getClassStandardList(reqVO);
+ return success(BeanUtils.toBean(list, ClassStandardRespVO.class));
+ }
+
+ @GetMapping(value = {"/list-all-simple", "/simple-list"})
+ @Operation(summary = "获取基础数据分类标准精简信息列表", description = "只包含被开启的分类,主要用于前端的下拉选项")
+ public CommonResult> getSimpleClassStandardList() {
+ List list = classStandardService.getClassStandardList(
+ new ClassStandardListReqVO().setStatus(CommonStatusEnum.ENABLE.getStatus()));
+ return success(BeanUtils.toBean(list, ClassStandardSimpleRespVO.class));
+ }
+
+ @GetMapping("/list-by-code")
+ @Operation(summary = "根据分类编码获取该分支及子分类", description = "传入分类编码,返回当前节点及所有子孙节点")
+ public CommonResult> getClassStandardListByCode(
+ @RequestParam("classCode") String classCode) {
+ List list = classStandardService.getClassStandardListByCode(classCode);
+ return success(BeanUtils.toBean(list, ClassStandardSimpleRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardListReqVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardListReqVO.java
new file mode 100644
index 00000000..e838e1f8
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardListReqVO.java
@@ -0,0 +1,21 @@
+package cn.code.nl.module.base.controller.admin.classstandard.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 基础数据分类标准列表查询 Request VO
+ *
+ * @author zhouz
+ */
+@Schema(description = "管理后台 - 基础数据分类标准列表查询 Request VO")
+@Data
+public class ClassStandardListReqVO {
+
+ @Schema(description = "分类名称")
+ private String className;
+
+ @Schema(description = "分类状态", example = "1")
+ private Integer status;
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardPageReqVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardPageReqVO.java
new file mode 100644
index 00000000..78c941e6
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardPageReqVO.java
@@ -0,0 +1,36 @@
+package cn.code.nl.module.base.controller.admin.classstandard.vo;
+
+import lombok.Data;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.code.nl.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+/**
+ * 基础数据分类标准分页 Request VO
+ *
+ * @author zhouz
+ */
+@Schema(description = "管理后台 - 基础数据分类标准分页 Request VO")
+@Data
+public class ClassStandardPageReqVO extends PageParam {
+
+ @Schema(description = "分类编码")
+ private String classCode;
+
+ @Schema(description = "分类名称")
+ private String className;
+
+ @Schema(description = "分类简要描述")
+ private String classDesc;
+
+ @Schema(description = "上级分类标识")
+ private Long parentClassId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardRespVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardRespVO.java
new file mode 100644
index 00000000..6c0e4617
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardRespVO.java
@@ -0,0 +1,41 @@
+package cn.code.nl.module.base.controller.admin.classstandard.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+/**
+ * 基础数据分类标准 Response VO
+ *
+ * @author zhouz
+ */
+@Schema(description = "管理后台 - 基础数据分类标准 Response VO")
+@Data
+public class ClassStandardRespVO {
+
+ @Schema(description = "分类标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long classId;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原材料")
+ private String className;
+
+ @Schema(description = "分类编码")
+ private String classCode;
+
+ @Schema(description = "分类简要描述")
+ private String classDesc;
+
+ @Schema(description = "上级分类标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
+ private Long parentClassId;
+
+ @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer sort;
+
+ @Schema(description = "分类状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer status;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardSaveReqVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardSaveReqVO.java
new file mode 100644
index 00000000..3ac58ffd
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardSaveReqVO.java
@@ -0,0 +1,41 @@
+package cn.code.nl.module.base.controller.admin.classstandard.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+/**
+ * 基础数据分类标准新增/修改 Request VO
+ *
+ * @author zhouz
+ */
+@Schema(description = "管理后台 - 基础数据分类标准新增/修改 Request VO")
+@Data
+public class ClassStandardSaveReqVO {
+
+ @Schema(description = "分类标识", example = "1")
+ private Long classId;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原材料")
+ @NotBlank(message = "分类名称不能为空")
+ private String className;
+
+ @Schema(description = "分类编码")
+ private String classCode;
+
+ @Schema(description = "分类简要描述")
+ private String classDesc;
+
+ @Schema(description = "上级分类标识", example = "0")
+ private Long parentClassId;
+
+ @Schema(description = "显示顺序", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "显示顺序不能为空")
+ private Integer sort;
+
+ @Schema(description = "分类状态", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "分类状态不能为空")
+ private Integer status;
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardSimpleRespVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardSimpleRespVO.java
new file mode 100644
index 00000000..a4de7532
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/classstandard/vo/ClassStandardSimpleRespVO.java
@@ -0,0 +1,24 @@
+package cn.code.nl.module.base.controller.admin.classstandard.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+/**
+ * 基础数据分类标准精简 Response VO(用于下拉框选项)
+ *
+ * @author zhouz
+ */
+@Schema(description = "管理后台 - 基础数据分类标准精简 Response VO")
+@Data
+public class ClassStandardSimpleRespVO {
+
+ @Schema(description = "分类标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long classId;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "原材料")
+ private String className;
+
+ @Schema(description = "上级分类标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "0")
+ private Long parentClassId;
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/MaterialBaseController.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/MaterialBaseController.java
new file mode 100644
index 00000000..50c51dea
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/MaterialBaseController.java
@@ -0,0 +1,121 @@
+package cn.code.nl.module.base.controller.admin.materialbase;
+
+import org.springframework.web.bind.annotation.*;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.security.access.prepost.PreAuthorize;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.Operation;
+
+import jakarta.validation.constraints.*;
+import jakarta.validation.*;
+import jakarta.servlet.http.*;
+import java.util.*;
+import java.io.IOException;
+
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.CommonResult;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+import static cn.code.nl.framework.common.pojo.CommonResult.success;
+
+import cn.code.nl.framework.excel.core.util.ExcelUtils;
+
+import cn.code.nl.framework.apilog.core.annotation.ApiAccessLog;
+import static cn.code.nl.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import cn.code.nl.module.base.controller.admin.materialbase.vo.*;
+import cn.code.nl.module.base.dal.dataobject.materialbase.MaterialBaseDO;
+import cn.code.nl.module.base.service.materialbase.MaterialBaseService;
+
+@Tag(name = "管理后台 - 物料基本信息")
+@RestController
+@RequestMapping("/base/material-base")
+@Validated
+public class MaterialBaseController {
+
+ @Resource
+ private MaterialBaseService materialBaseService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建物料基本信息")
+ @PreAuthorize("@ss.hasPermission('base:material-base:create')")
+ public CommonResult createMaterialBase(@Valid @RequestBody MaterialBaseSaveReqVO createReqVO) {
+ return success(materialBaseService.createMaterialBase(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新物料基本信息")
+ @PreAuthorize("@ss.hasPermission('base:material-base:update')")
+ public CommonResult updateMaterialBase(@Valid @RequestBody MaterialBaseSaveReqVO updateReqVO) {
+ materialBaseService.updateMaterialBase(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除物料基本信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:material-base:delete')")
+ public CommonResult deleteMaterialBase(@RequestParam("id") Long id) {
+ materialBaseService.deleteMaterialBase(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除物料基本信息")
+ @PreAuthorize("@ss.hasPermission('base:material-base:delete')")
+ public CommonResult deleteMaterialBaseList(@RequestParam("ids") List ids) {
+ materialBaseService.deleteMaterialBaseListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得物料基本信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:material-base:query')")
+ public CommonResult getMaterialBase(@RequestParam("id") Long id) {
+ MaterialBaseDO materialBase = materialBaseService.getMaterialBase(id);
+ return success(BeanUtils.toBean(materialBase, MaterialBaseRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得物料基本信息分页")
+ @PreAuthorize("@ss.hasPermission('base:material-base:query')")
+ public CommonResult> getMaterialBasePage(@Valid MaterialBasePageReqVO pageReqVO) {
+ PageResult pageResult = materialBaseService.getMaterialBasePage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, MaterialBaseRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出物料基本信息 Excel")
+ @PreAuthorize("@ss.hasPermission('base:material-base:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportMaterialBaseExcel(@Valid MaterialBasePageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = materialBaseService.getMaterialBasePage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "物料基本信息.xls", "数据", MaterialBaseRespVO.class,
+ BeanUtils.toBean(list, MaterialBaseRespVO.class));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "根据条件查询物料基本信息列表")
+ @PreAuthorize("@ss.hasPermission('base:material-base:query')")
+ public CommonResult> getMaterialBaseList(@Valid MaterialBasePageReqVO reqVO) {
+ List list = materialBaseService.getMaterialBaseList(reqVO);
+ return success(BeanUtils.toBean(list, MaterialBaseRespVO.class));
+ }
+
+ @GetMapping("/get-by-code")
+ @Operation(summary = "根据物料编码获得物料基本信息")
+ @Parameter(name = "materialCode", description = "物料编码", required = true)
+ @PreAuthorize("@ss.hasPermission('base:material-base:query')")
+ public CommonResult getMaterialBaseByCode(@RequestParam("materialCode") String materialCode) {
+ MaterialBaseDO materialBase = materialBaseService.getMaterialBaseByCode(materialCode);
+ return success(BeanUtils.toBean(materialBase, MaterialBaseRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBasePageReqVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBasePageReqVO.java
new file mode 100644
index 00000000..dbef400a
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBasePageReqVO.java
@@ -0,0 +1,88 @@
+package cn.code.nl.module.base.controller.admin.materialbase.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import cn.code.nl.framework.common.pojo.PageParam;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static cn.code.nl.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 物料基本信息分页 Request VO")
+@Data
+public class MaterialBasePageReqVO extends PageParam {
+
+ @Schema(description = "物料编码")
+ private String materialCode;
+
+ @Schema(description = "物料名称 ", example = "赵六")
+ private String materialName;
+
+ @Schema(description = "规格")
+ private String materialSpec;
+
+ @Schema(description = "型号")
+ private String materialModel;
+
+ @Schema(description = "外文名称", example = "芋艿")
+ private String englishName;
+
+ @Schema(description = "基本计量单位", example = "30034")
+ private Long baseUnitId;
+
+ @Schema(description = "辅助计量单位", example = "25021")
+ private Long assUnitId;
+
+ @Schema(description = "批准文号")
+ private String approveFileno;
+
+ @Schema(description = "工程图号")
+ private String printNo;
+
+ @Schema(description = "物料分类标识", example = "14118")
+ private Long materialTypeId;
+
+ @Schema(description = "长度单位", example = "18116")
+ private Long lenUnitId;
+
+ @Schema(description = "物料长度")
+ private BigDecimal length;
+
+ @Schema(description = "物料宽度")
+ private BigDecimal width;
+
+ @Schema(description = "物料高度")
+ private BigDecimal height;
+
+ @Schema(description = "重量单位", example = "26847")
+ private Long weightUnitId;
+
+ @Schema(description = "物料毛重")
+ private BigDecimal grossWeight;
+
+ @Schema(description = "物料净重")
+ private BigDecimal netWeight;
+
+ @Schema(description = "体积单位", example = "32284")
+ private Long cubageUnitId;
+
+ @Schema(description = "物料体积")
+ private BigDecimal cubage;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "启用时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private String[] isUsedTime;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "外部标识", example = "3240")
+ private String extId;
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBaseRespVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBaseRespVO.java
new file mode 100644
index 00000000..d9670c24
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBaseRespVO.java
@@ -0,0 +1,112 @@
+package cn.code.nl.module.base.controller.admin.materialbase.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import cn.idev.excel.annotation.*;
+
+@Schema(description = "管理后台 - 物料基本信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MaterialBaseRespVO {
+
+ @Schema(description = "物料标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "31653")
+ @ExcelProperty("物料标识")
+ private Long materialId;
+
+ @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("物料编码")
+ private String materialCode;
+
+ @Schema(description = "物料名称 ", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @ExcelProperty("物料名称 ")
+ private String materialName;
+
+ @Schema(description = "规格")
+ @ExcelProperty("规格")
+ private String materialSpec;
+
+ @Schema(description = "型号")
+ @ExcelProperty("型号")
+ private String materialModel;
+
+ @Schema(description = "外文名称", example = "芋艿")
+ @ExcelProperty("外文名称")
+ private String englishName;
+
+ @Schema(description = "基本计量单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "30034")
+ @ExcelProperty("基本计量单位")
+ private Long baseUnitId;
+
+ @Schema(description = "辅助计量单位", example = "25021")
+ @ExcelProperty("辅助计量单位")
+ private Long assUnitId;
+
+ @Schema(description = "批准文号")
+ @ExcelProperty("批准文号")
+ private String approveFileno;
+
+ @Schema(description = "工程图号")
+ @ExcelProperty("工程图号")
+ private String printNo;
+
+ @Schema(description = "物料分类标识", example = "14118")
+ @ExcelProperty("物料分类标识")
+ private Long materialTypeId;
+
+ @Schema(description = "长度单位", example = "18116")
+ @ExcelProperty("长度单位")
+ private Long lenUnitId;
+
+ @Schema(description = "物料长度")
+ @ExcelProperty("物料长度")
+ private BigDecimal length;
+
+ @Schema(description = "物料宽度")
+ @ExcelProperty("物料宽度")
+ private BigDecimal width;
+
+ @Schema(description = "物料高度")
+ @ExcelProperty("物料高度")
+ private BigDecimal height;
+
+ @Schema(description = "重量单位", example = "26847")
+ @ExcelProperty("重量单位")
+ private Long weightUnitId;
+
+ @Schema(description = "物料毛重")
+ @ExcelProperty("物料毛重")
+ private BigDecimal grossWeight;
+
+ @Schema(description = "物料净重")
+ @ExcelProperty("物料净重")
+ private BigDecimal netWeight;
+
+ @Schema(description = "体积单位", example = "32284")
+ @ExcelProperty("体积单位")
+ private Long cubageUnitId;
+
+ @Schema(description = "物料体积")
+ @ExcelProperty("物料体积")
+ private BigDecimal cubage;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "启用时间")
+ @ExcelProperty("启用时间")
+ private String isUsedTime;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "外部标识", example = "3240")
+ @ExcelProperty("外部标识")
+ private String extId;
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBaseSaveReqVO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBaseSaveReqVO.java
new file mode 100644
index 00000000..c8af9d33
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/controller/admin/materialbase/vo/MaterialBaseSaveReqVO.java
@@ -0,0 +1,86 @@
+package cn.code.nl.module.base.controller.admin.materialbase.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import java.math.BigDecimal;
+
+@Schema(description = "管理后台 - 物料基本信息新增/修改 Request VO")
+@Data
+public class MaterialBaseSaveReqVO {
+
+ @Schema(description = "物料标识", requiredMode = Schema.RequiredMode.REQUIRED, example = "31653")
+ private Long materialId;
+
+ @Schema(description = "物料编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "物料编码不能为空")
+ private String materialCode;
+
+ @Schema(description = "物料名称 ", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @NotEmpty(message = "物料名称 不能为空")
+ private String materialName;
+
+ @Schema(description = "规格")
+ private String materialSpec;
+
+ @Schema(description = "型号")
+ private String materialModel;
+
+ @Schema(description = "外文名称", example = "芋艿")
+ private String englishName;
+
+ @Schema(description = "基本计量单位", requiredMode = Schema.RequiredMode.REQUIRED, example = "30034")
+ @NotNull(message = "基本计量单位不能为空")
+ private Long baseUnitId;
+
+ @Schema(description = "辅助计量单位", example = "25021")
+ private Long assUnitId;
+
+ @Schema(description = "批准文号")
+ private String approveFileno;
+
+ @Schema(description = "工程图号")
+ private String printNo;
+
+ @Schema(description = "物料分类标识", example = "14118")
+ private Long materialTypeId;
+
+ @Schema(description = "长度单位", example = "18116")
+ private Long lenUnitId;
+
+ @Schema(description = "物料长度")
+ private BigDecimal length;
+
+ @Schema(description = "物料宽度")
+ private BigDecimal width;
+
+ @Schema(description = "物料高度")
+ private BigDecimal height;
+
+ @Schema(description = "重量单位", example = "26847")
+ private Long weightUnitId;
+
+ @Schema(description = "物料毛重")
+ private BigDecimal grossWeight;
+
+ @Schema(description = "物料净重")
+ private BigDecimal netWeight;
+
+ @Schema(description = "体积单位", example = "32284")
+ private Long cubageUnitId;
+
+ @Schema(description = "物料体积")
+ private BigDecimal cubage;
+
+ @Schema(description = "启用时间")
+ private String isUsedTime;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否启用不能为空")
+ private String isUsed;
+
+ @Schema(description = "外部标识", example = "3240")
+ private String extId;
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/dataobject/classstandard/ClassStandardDO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/dataobject/classstandard/ClassStandardDO.java
new file mode 100644
index 00000000..dd80dd3a
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/dataobject/classstandard/ClassStandardDO.java
@@ -0,0 +1,62 @@
+package cn.code.nl.module.base.dal.dataobject.classstandard;
+
+import cn.code.nl.framework.common.enums.CommonStatusEnum;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+import com.baomidou.mybatisplus.annotation.KeySequence;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+
+/**
+ * 基础数据分类标准 DO
+ *
+ * @author zhouz
+ */
+@TableName("base_classstandard")
+@KeySequence("base_classstandard_seq")
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class ClassStandardDO extends BaseDO {
+
+ public static final Long PARENT_ID_ROOT = 0L;
+
+ /**
+ * 分类标识
+ */
+ @TableId
+ private Long classId;
+
+ /**
+ * 分类名称
+ */
+ private String className;
+
+ /**
+ * 分类编码
+ */
+ private String classCode;
+
+ /**
+ * 分类简要描述
+ */
+ private String classDesc;
+
+ /**
+ * 上级分类标识
+ */
+ private Long parentClassId;
+
+ /**
+ * 显示顺序
+ */
+ private Integer sort;
+
+ /**
+ * 分类状态
+ *
+ * 枚举 {@link CommonStatusEnum}
+ */
+ private Integer status;
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/dataobject/materialbase/MaterialBaseDO.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/dataobject/materialbase/MaterialBaseDO.java
new file mode 100644
index 00000000..72ca5f6c
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/dataobject/materialbase/MaterialBaseDO.java
@@ -0,0 +1,127 @@
+package cn.code.nl.module.base.dal.dataobject.materialbase;
+
+import cn.code.nl.framework.tenant.core.aop.TenantIgnore;
+import lombok.*;
+import java.util.*;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.math.BigDecimal;
+import java.time.LocalDateTime;
+import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import cn.code.nl.framework.mybatis.core.dataobject.BaseDO;
+
+/**
+ * 物料基本信息 DO
+ *
+ * @author 芋道源码
+ */
+@TableName("base_materialbase")
+@KeySequence("base_materialbase_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class MaterialBaseDO extends BaseDO {
+
+ /**
+ * 物料标识
+ */
+ @TableId
+ private Long materialId;
+ /**
+ * 物料编码
+ */
+ private String materialCode;
+ /**
+ * 物料名称
+ */
+ private String materialName;
+ /**
+ * 规格
+ */
+ private String materialSpec;
+ /**
+ * 型号
+ */
+ private String materialModel;
+ /**
+ * 外文名称
+ */
+ private String englishName;
+ /**
+ * 基本计量单位
+ */
+ private Long baseUnitId;
+ /**
+ * 辅助计量单位
+ */
+ private Long assUnitId;
+ /**
+ * 批准文号
+ */
+ private String approveFileno;
+ /**
+ * 工程图号
+ */
+ private String printNo;
+ /**
+ * 物料分类标识
+ */
+ private Long materialTypeId;
+ /**
+ * 长度单位
+ */
+ private Long lenUnitId;
+ /**
+ * 物料长度
+ */
+ private BigDecimal length;
+ /**
+ * 物料宽度
+ */
+ private BigDecimal width;
+ /**
+ * 物料高度
+ */
+ private BigDecimal height;
+ /**
+ * 重量单位
+ */
+ private Long weightUnitId;
+ /**
+ * 物料毛重
+ */
+ private BigDecimal grossWeight;
+ /**
+ * 物料净重
+ */
+ private BigDecimal netWeight;
+ /**
+ * 体积单位
+ */
+ private Long cubageUnitId;
+ /**
+ * 物料体积
+ */
+ private BigDecimal cubage;
+ /**
+ * 启用时间
+ */
+ private String isUsedTime;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 外部标识
+ */
+ private String extId;
+
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/mysql/classstandard/ClassStandardMapper.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/mysql/classstandard/ClassStandardMapper.java
new file mode 100644
index 00000000..46f5b10a
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/mysql/classstandard/ClassStandardMapper.java
@@ -0,0 +1,54 @@
+package cn.code.nl.module.base.dal.mysql.classstandard;
+
+import java.util.*;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import cn.code.nl.module.base.dal.dataobject.classstandard.ClassStandardDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.code.nl.module.base.controller.admin.classstandard.vo.*;
+
+/**
+ * 基础数据分类标准 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface ClassStandardMapper extends BaseMapperX {
+
+ default PageResult selectPage(ClassStandardPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ClassStandardDO::getClassCode, reqVO.getClassCode())
+ .likeIfPresent(ClassStandardDO::getClassName, reqVO.getClassName())
+ .eqIfPresent(ClassStandardDO::getClassDesc, reqVO.getClassDesc())
+ .eqIfPresent(ClassStandardDO::getParentClassId, reqVO.getParentClassId())
+ .betweenIfPresent(ClassStandardDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ClassStandardDO::getClassId));
+ }
+
+ // ========== 树形结构相关方法 ==========
+
+ default List selectList(ClassStandardListReqVO reqVO) {
+ return selectList(new LambdaQueryWrapperX()
+ .likeIfPresent(ClassStandardDO::getClassName, reqVO.getClassName())
+ .eqIfPresent(ClassStandardDO::getStatus, reqVO.getStatus()));
+ }
+
+ default ClassStandardDO selectByParentIdAndName(Long parentId, String name) {
+ return selectOne(ClassStandardDO::getParentClassId, parentId, ClassStandardDO::getClassName, name);
+ }
+
+ default Long selectCountByParentId(Long parentId) {
+ return selectCount(ClassStandardDO::getParentClassId, parentId);
+ }
+
+ default List selectListByParentId(Collection parentIds) {
+ return selectList(ClassStandardDO::getParentClassId, parentIds);
+ }
+
+ default ClassStandardDO selectByClassCode(String classCode) {
+ return selectOne(ClassStandardDO::getClassCode, classCode);
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/mysql/materialbase/MaterialBaseMapper.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/mysql/materialbase/MaterialBaseMapper.java
new file mode 100644
index 00000000..185b8779
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/dal/mysql/materialbase/MaterialBaseMapper.java
@@ -0,0 +1,124 @@
+package cn.code.nl.module.base.dal.mysql.materialbase;
+
+import java.util.*;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.mybatis.core.query.LambdaQueryWrapperX;
+import cn.code.nl.framework.mybatis.core.mapper.BaseMapperX;
+import cn.code.nl.module.base.dal.dataobject.materialbase.MaterialBaseDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.code.nl.module.base.controller.admin.materialbase.vo.*;
+import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseListReqDTO;
+
+/**
+ * 物料基本信息 Mapper
+ *
+ * @author 芋道源码
+ */
+@Mapper
+public interface MaterialBaseMapper extends BaseMapperX {
+
+ default PageResult selectPage(MaterialBasePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialBaseDO::getMaterialCode, reqVO.getMaterialCode())
+ .likeIfPresent(MaterialBaseDO::getMaterialName, reqVO.getMaterialName())
+ .eqIfPresent(MaterialBaseDO::getMaterialSpec, reqVO.getMaterialSpec())
+ .eqIfPresent(MaterialBaseDO::getMaterialModel, reqVO.getMaterialModel())
+ .likeIfPresent(MaterialBaseDO::getEnglishName, reqVO.getEnglishName())
+ .eqIfPresent(MaterialBaseDO::getBaseUnitId, reqVO.getBaseUnitId())
+ .eqIfPresent(MaterialBaseDO::getAssUnitId, reqVO.getAssUnitId())
+ .eqIfPresent(MaterialBaseDO::getApproveFileno, reqVO.getApproveFileno())
+ .eqIfPresent(MaterialBaseDO::getPrintNo, reqVO.getPrintNo())
+ .eqIfPresent(MaterialBaseDO::getMaterialTypeId, reqVO.getMaterialTypeId())
+ .eqIfPresent(MaterialBaseDO::getLenUnitId, reqVO.getLenUnitId())
+ .eqIfPresent(MaterialBaseDO::getLength, reqVO.getLength())
+ .eqIfPresent(MaterialBaseDO::getWidth, reqVO.getWidth())
+ .eqIfPresent(MaterialBaseDO::getHeight, reqVO.getHeight())
+ .eqIfPresent(MaterialBaseDO::getWeightUnitId, reqVO.getWeightUnitId())
+ .eqIfPresent(MaterialBaseDO::getGrossWeight, reqVO.getGrossWeight())
+ .eqIfPresent(MaterialBaseDO::getNetWeight, reqVO.getNetWeight())
+ .eqIfPresent(MaterialBaseDO::getCubageUnitId, reqVO.getCubageUnitId())
+ .eqIfPresent(MaterialBaseDO::getCubage, reqVO.getCubage())
+ .betweenIfPresent(MaterialBaseDO::getCreateTime, reqVO.getCreateTime())
+ .betweenIfPresent(MaterialBaseDO::getIsUsedTime, reqVO.getIsUsedTime())
+ .eqIfPresent(MaterialBaseDO::getIsUsed, reqVO.getIsUsed())
+ .eqIfPresent(MaterialBaseDO::getExtId, reqVO.getExtId())
+ .orderByDesc(MaterialBaseDO::getMaterialId));
+ }
+
+ /**
+ * 根据条件查询物料列表(不分页)
+ *
+ * @param reqVO 查询条件
+ * @return 物料列表
+ */
+ default List selectList(MaterialBasePageReqVO reqVO) {
+ return selectList(new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialBaseDO::getMaterialCode, reqVO.getMaterialCode())
+ .likeIfPresent(MaterialBaseDO::getMaterialName, reqVO.getMaterialName())
+ .eqIfPresent(MaterialBaseDO::getMaterialSpec, reqVO.getMaterialSpec())
+ .eqIfPresent(MaterialBaseDO::getMaterialModel, reqVO.getMaterialModel())
+ .likeIfPresent(MaterialBaseDO::getEnglishName, reqVO.getEnglishName())
+ .eqIfPresent(MaterialBaseDO::getBaseUnitId, reqVO.getBaseUnitId())
+ .eqIfPresent(MaterialBaseDO::getAssUnitId, reqVO.getAssUnitId())
+ .eqIfPresent(MaterialBaseDO::getApproveFileno, reqVO.getApproveFileno())
+ .eqIfPresent(MaterialBaseDO::getPrintNo, reqVO.getPrintNo())
+ .eqIfPresent(MaterialBaseDO::getMaterialTypeId, reqVO.getMaterialTypeId())
+ .eqIfPresent(MaterialBaseDO::getLenUnitId, reqVO.getLenUnitId())
+ .eqIfPresent(MaterialBaseDO::getLength, reqVO.getLength())
+ .eqIfPresent(MaterialBaseDO::getWidth, reqVO.getWidth())
+ .eqIfPresent(MaterialBaseDO::getHeight, reqVO.getHeight())
+ .eqIfPresent(MaterialBaseDO::getWeightUnitId, reqVO.getWeightUnitId())
+ .eqIfPresent(MaterialBaseDO::getGrossWeight, reqVO.getGrossWeight())
+ .eqIfPresent(MaterialBaseDO::getNetWeight, reqVO.getNetWeight())
+ .eqIfPresent(MaterialBaseDO::getCubageUnitId, reqVO.getCubageUnitId())
+ .eqIfPresent(MaterialBaseDO::getCubage, reqVO.getCubage())
+ .betweenIfPresent(MaterialBaseDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(MaterialBaseDO::getIsUsed, reqVO.getIsUsed())
+ .eqIfPresent(MaterialBaseDO::getExtId, reqVO.getExtId())
+ .orderByDesc(MaterialBaseDO::getMaterialId));
+ }
+
+ /**
+ * 根据条件查询物料列表(RPC API 用,不分页)
+ *
+ * @param reqDTO 查询条件
+ * @return 物料列表
+ */
+ default List selectList(MaterialBaseListReqDTO reqDTO) {
+ return selectList(new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialBaseDO::getMaterialCode, reqDTO.getMaterialCode())
+ .likeIfPresent(MaterialBaseDO::getMaterialName, reqDTO.getMaterialName())
+ .eqIfPresent(MaterialBaseDO::getMaterialSpec, reqDTO.getMaterialSpec())
+ .eqIfPresent(MaterialBaseDO::getMaterialModel, reqDTO.getMaterialModel())
+ .likeIfPresent(MaterialBaseDO::getEnglishName, reqDTO.getEnglishName())
+ .eqIfPresent(MaterialBaseDO::getBaseUnitId, reqDTO.getBaseUnitId())
+ .eqIfPresent(MaterialBaseDO::getAssUnitId, reqDTO.getAssUnitId())
+ .eqIfPresent(MaterialBaseDO::getApproveFileno, reqDTO.getApproveFileno())
+ .eqIfPresent(MaterialBaseDO::getPrintNo, reqDTO.getPrintNo())
+ .eqIfPresent(MaterialBaseDO::getMaterialTypeId, reqDTO.getMaterialTypeId())
+ .eqIfPresent(MaterialBaseDO::getLenUnitId, reqDTO.getLenUnitId())
+ .eqIfPresent(MaterialBaseDO::getLength, reqDTO.getLength())
+ .eqIfPresent(MaterialBaseDO::getWidth, reqDTO.getWidth())
+ .eqIfPresent(MaterialBaseDO::getHeight, reqDTO.getHeight())
+ .eqIfPresent(MaterialBaseDO::getWeightUnitId, reqDTO.getWeightUnitId())
+ .eqIfPresent(MaterialBaseDO::getGrossWeight, reqDTO.getGrossWeight())
+ .eqIfPresent(MaterialBaseDO::getNetWeight, reqDTO.getNetWeight())
+ .eqIfPresent(MaterialBaseDO::getCubageUnitId, reqDTO.getCubageUnitId())
+ .eqIfPresent(MaterialBaseDO::getCubage, reqDTO.getCubage())
+ .eqIfPresent(MaterialBaseDO::getIsUsed, reqDTO.getIsUsed())
+ .eqIfPresent(MaterialBaseDO::getExtId, reqDTO.getExtId())
+ .orderByDesc(MaterialBaseDO::getMaterialId));
+ }
+
+ /**
+ * 根据物料编码查询物料
+ *
+ * @param materialCode 物料编码
+ * @return 物料信息
+ */
+ default MaterialBaseDO selectByMaterialCode(String materialCode) {
+ return selectOne(MaterialBaseDO::getMaterialCode, materialCode);
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/framework/security/config/SecurityConfiguration.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/framework/security/config/SecurityConfiguration.java
new file mode 100644
index 00000000..1f0c453b
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/framework/security/config/SecurityConfiguration.java
@@ -0,0 +1,117 @@
+package cn.code.nl.module.base.framework.security.config;
+
+import cn.code.nl.framework.security.config.AuthorizeRequestsCustomizer;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
+
+/**
+ * Base 模块的 Security 配置
+ *
+ * @author zhouz
+ */
+@Configuration(proxyBeanMethods = false, value = "baseSecurityConfiguration")
+public class SecurityConfiguration {
+
+ /*
+ *
+ * 根因确认
+
+ 问题出在 NlWebSecurityConfigurerAdapter.java:77-78:
+
+ @Resource // 第77行
+ private List authorizeRequestsCustomizers;
+
+ @Resource 在处理 List 泛型注入时的行为与 @Autowired 不同:
+ - @Autowired 能正确按元素类型 T 解析,即使 0 个 Bean 也能注入空集合
+ - @Resource 先按字段名查找,失败后按原始类型回退匹配。由于泛型擦除,类型变成了原始 java.util.List,Spring 找不到类型为 java.util.List 的 Bean,直接报错
+
+ 为什么 infra 模块正常? infra 模块的 SecurityConfiguration 定义了 1 个 AuthorizeRequestsCustomizer Bean,@Resource 的非空集合路径能正确处理。而 base 模块有
+ 0 个这样的 Bean,触发了空集合路径的 bug。
+
+ 修复方式: 为 base 模块创建 SecurityConfiguration(已创建),这是该项目的标准模式(每个模块定义自己的安全配置)。
+
+ 现在验证修改:
+
+ Thought for 6s, read 1 file (ctrl+o to expand)
+
+⏺ 配置已创建。让我验证一下文件结构是否完整:
+
+ Thought for 5s, searched for 1 pattern (ctrl+o to expand)
+
+⏺ 总结
+
+ 问题根因
+
+ NlWebSecurityConfigurerAdapter.java:77-78 中使用了 @Resource 注入 List:
+
+ @Resource
+ private List authorizeRequestsCustomizers;
+
+ @Resource 在处理泛型集合时存在局限性,按字段名查找失败后会按原始类型 java.util.List 回退匹配,导致 Spring 找不到对应 Bean 而报错。@Autowired
+ 能正确处理这种情况(包括空集合),但 @Resource 不行。
+
+ 修复内容
+
+ 创建了 base 模块的 SecurityConfiguration(参考 infra 模块的同等配置):
+
+ nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/framework/security/config/SecurityConfiguration.java
+
+ 这个配置类:
+ 1. 定义了一个 AuthorizeRequestsCustomizer Bean,使 NlWebSecurityConfigurerAdapter 中的 List 能正确解析
+ 1. 定义了一个 AuthorizeRequestsCustomizer Bean,使 NlWebSecurityConfigurerAdapter 中的 List 能正确解析
+
+ Thought for 5s, searched for 1 pattern (ctrl+o to expand)
+⏺ 总结
+
+ 问题根因
+
+ NlWebSecurityConfigurerAdapter.java:77-78 中使用了 @Resource 注入
+ List:
+
+ @Resource
+ private List authorizeRequestsCustomizers;
+
+ @Resource 在处理泛型集合时存在局限性,按字段名查找失败后会按原始类型
+ java.util.List 回退匹配,导致 Spring 找不到对应 Bean 而报错。@Autowired
+ 能正确处理这种情况(包括空集合),但 @Resource 不行。
+ 修复内容
+
+ 创建了 base 模块的 SecurityConfiguration(参考 infra 模块的同等配置):
+
+ nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/fr
+ amework/security/config/SecurityConfiguration.java
+
+
+ nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/framework/security/config/SecurityConfiguration.java
+
+ 这个配置类:
+ 1. 定义了一个 AuthorizeRequestsCustomizer Bean,使 NlWebSecurityConfigurerAdapter 中的 List 能正确解析
+ 2. 配置了 Swagger、Actuator、Druid 等公共路径的免登录访问
+ 3. 遵循了项目中每个模块定义各自安全配置的标准模式
+
+ 3. 遵循了项目中每个模块定义各自安全配置的标准模式
+ * */
+ @Bean("baseAuthorizeRequestsCustomizer")
+ public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
+ return new AuthorizeRequestsCustomizer() {
+
+ @Override
+ public void customize(AuthorizeHttpRequestsConfigurer.AuthorizationManagerRequestMatcherRegistry registry) {
+ // Swagger 接口文档
+ registry.requestMatchers("/v3/api-docs/**").permitAll()
+ .requestMatchers("/webjars/**").permitAll()
+ .requestMatchers("/swagger-ui").permitAll()
+ .requestMatchers("/swagger-ui/**").permitAll();
+ // Spring Boot Actuator 的安全配置
+ registry.requestMatchers("/actuator").permitAll()
+ .requestMatchers("/actuator/**").permitAll();
+ // Druid 监控
+ registry.requestMatchers("/druid/**").permitAll();
+ }
+
+ };
+ }
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/classstandard/ClassStandardService.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/classstandard/ClassStandardService.java
new file mode 100644
index 00000000..a8913da8
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/classstandard/ClassStandardService.java
@@ -0,0 +1,86 @@
+package cn.code.nl.module.base.service.classstandard;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.code.nl.module.base.controller.admin.classstandard.vo.*;
+import cn.code.nl.module.base.dal.dataobject.classstandard.ClassStandardDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 基础数据分类标准 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface ClassStandardService {
+
+ /**
+ * 创建基础数据分类标准
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createClassStandard(@Valid ClassStandardSaveReqVO createReqVO);
+
+ /**
+ * 更新基础数据分类标准
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateClassStandard(@Valid ClassStandardSaveReqVO updateReqVO);
+
+ /**
+ * 删除基础数据分类标准
+ *
+ * @param id 编号
+ */
+ void deleteClassStandard(Long id);
+
+ /**
+ * 批量删除基础数据分类标准
+ *
+ * @param ids 编号
+ */
+ void deleteClassStandardListByIds(List ids);
+
+ /**
+ * 获得基础数据分类标准
+ *
+ * @param id 编号
+ * @return 基础数据分类标准
+ */
+ ClassStandardDO getClassStandard(Long id);
+
+ /**
+ * 获得基础数据分类标准分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 基础数据分类标准分页
+ */
+ PageResult getClassStandardPage(ClassStandardPageReqVO pageReqVO);
+
+ /**
+ * 获得基础数据分类标准列表(树形数据)
+ *
+ * @param reqVO 筛选条件
+ * @return 分类标准列表
+ */
+ List getClassStandardList(ClassStandardListReqVO reqVO);
+
+ /**
+ * 获得指定分类的所有子分类
+ *
+ * @param id 分类编号
+ * @return 子分类列表
+ */
+ List getChildClassStandardList(Long id);
+
+ /**
+ * 根据分类编码获取该分支及其所有子分类(用于下拉框)
+ *
+ * @param classCode 分类编码
+ * @return 分类列表(包含当前节点及所有子孙节点)
+ */
+ List getClassStandardListByCode(String classCode);
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/classstandard/ClassStandardServiceImpl.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/classstandard/ClassStandardServiceImpl.java
new file mode 100644
index 00000000..dd2d1493
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/classstandard/ClassStandardServiceImpl.java
@@ -0,0 +1,200 @@
+package cn.code.nl.module.base.service.classstandard;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.ObjectUtil;
+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.code.nl.module.base.controller.admin.classstandard.vo.*;
+import cn.code.nl.module.base.dal.dataobject.classstandard.ClassStandardDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+
+import cn.code.nl.module.base.dal.mysql.classstandard.ClassStandardMapper;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.framework.common.util.collection.CollectionUtils.convertSet;
+import static cn.code.nl.module.base.enums.ErrorCodeConstants.*;
+
+/**
+ * 基础数据分类标准 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class ClassStandardServiceImpl implements ClassStandardService {
+
+ @Resource
+ private ClassStandardMapper classStandardMapper;
+
+ @Override
+ public Long createClassStandard(ClassStandardSaveReqVO createReqVO) {
+ if (createReqVO.getParentClassId() == null) {
+ createReqVO.setParentClassId(ClassStandardDO.PARENT_ID_ROOT);
+ }
+ // 校验父分类的有效性
+ validateParentClassStandard(null, createReqVO.getParentClassId());
+ // 校验分类名的唯一性
+ validateClassNameUnique(null, createReqVO.getParentClassId(), createReqVO.getClassName());
+
+ // 插入
+ ClassStandardDO classStandard = BeanUtils.toBean(createReqVO, ClassStandardDO.class);
+ classStandardMapper.insert(classStandard);
+ return classStandard.getClassId();
+ }
+
+ @Override
+ public void updateClassStandard(ClassStandardSaveReqVO updateReqVO) {
+ if (updateReqVO.getParentClassId() == null) {
+ updateReqVO.setParentClassId(ClassStandardDO.PARENT_ID_ROOT);
+ }
+ // 校验存在
+ validateClassStandardExists(updateReqVO.getClassId());
+ // 校验父分类的有效性
+ validateParentClassStandard(updateReqVO.getClassId(), updateReqVO.getParentClassId());
+ // 校验分类名的唯一性
+ validateClassNameUnique(updateReqVO.getClassId(), updateReqVO.getParentClassId(), updateReqVO.getClassName());
+
+ // 更新
+ ClassStandardDO updateObj = BeanUtils.toBean(updateReqVO, ClassStandardDO.class);
+ classStandardMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteClassStandard(Long id) {
+ // 校验存在
+ validateClassStandardExists(id);
+ // 校验是否有子分类
+ if (classStandardMapper.selectCountByParentId(id) > 0) {
+ throw exception(CLASSSTANDARD_EXISTS_CHILDREN);
+ }
+ // 删除
+ classStandardMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteClassStandardListByIds(List ids) {
+ // 校验是否有子分类
+ for (Long id : ids) {
+ if (classStandardMapper.selectCountByParentId(id) > 0) {
+ throw exception(CLASSSTANDARD_EXISTS_CHILDREN);
+ }
+ }
+ // 批量删除
+ classStandardMapper.deleteByIds(ids);
+ }
+
+ private void validateClassStandardExists(Long id) {
+ if (id == null) {
+ return;
+ }
+ ClassStandardDO classStandard = classStandardMapper.selectById(id);
+ if (classStandard == null) {
+ throw exception(CLASS_STANDARD_NOT_EXISTS);
+ }
+ }
+
+ private void validateParentClassStandard(Long id, Long parentId) {
+ if (parentId == null || ClassStandardDO.PARENT_ID_ROOT.equals(parentId)) {
+ return;
+ }
+ // 1. 不能设置自己为父分类
+ if (Objects.equals(id, parentId)) {
+ throw exception(CLASSSTANDARD_PARENT_ERROR);
+ }
+ // 2. 父分类不存在
+ ClassStandardDO parent = classStandardMapper.selectById(parentId);
+ if (parent == null) {
+ throw exception(CLASSSTANDARD_PARENT_NOT_EXISTS);
+ }
+ // 3. 递归校验父分类,避免形成环路
+ if (id == null) {
+ return;
+ }
+ for (int i = 0; i < Short.MAX_VALUE; i++) {
+ parentId = parent.getParentClassId();
+ if (Objects.equals(id, parentId)) {
+ throw exception(CLASSSTANDARD_PARENT_IS_CHILD);
+ }
+ if (parentId == null || ClassStandardDO.PARENT_ID_ROOT.equals(parentId)) {
+ break;
+ }
+ parent = classStandardMapper.selectById(parentId);
+ if (parent == null) {
+ break;
+ }
+ }
+ }
+
+ private void validateClassNameUnique(Long id, Long parentId, String name) {
+ ClassStandardDO classStandard = classStandardMapper.selectByParentIdAndName(parentId, name);
+ if (classStandard == null) {
+ return;
+ }
+ if (id == null) {
+ throw exception(CLASSSTANDARD_NAME_DUPLICATE);
+ }
+ if (ObjectUtil.notEqual(classStandard.getClassId(), id)) {
+ throw exception(CLASSSTANDARD_NAME_DUPLICATE);
+ }
+ }
+
+ @Override
+ public ClassStandardDO getClassStandard(Long id) {
+ return classStandardMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getClassStandardPage(ClassStandardPageReqVO pageReqVO) {
+ return classStandardMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public List getClassStandardList(ClassStandardListReqVO reqVO) {
+ List list = classStandardMapper.selectList(reqVO);
+ list.sort(Comparator.comparing(ClassStandardDO::getSort, Comparator.nullsLast(Comparator.naturalOrder())));
+ return list;
+ }
+
+ @Override
+ public List getChildClassStandardList(Long id) {
+ return getChildClassStandardList(Collections.singleton(id));
+ }
+
+ private List getChildClassStandardList(Collection ids) {
+ List children = new LinkedList<>();
+ Collection parentIds = ids;
+ for (int i = 0; i < Short.MAX_VALUE; i++) {
+ List classStandards = classStandardMapper.selectListByParentId(parentIds);
+ if (CollUtil.isEmpty(classStandards)) {
+ break;
+ }
+ children.addAll(classStandards);
+ parentIds = convertSet(classStandards, ClassStandardDO::getClassId);
+ }
+ return children;
+ }
+
+ @Override
+ public List getClassStandardListByCode(String classCode) {
+ // 找到编码对应的节点
+ ClassStandardDO root = classStandardMapper.selectByClassCode(classCode);
+ if (root == null) {
+ return Collections.emptyList();
+ }
+ // 获取所有子节点
+ List children = getChildClassStandardList(root.getClassId());
+ // 把当前节点加到最前面
+ List result = new ArrayList<>();
+ result.add(root);
+ result.addAll(children);
+ result.sort(Comparator.comparing(ClassStandardDO::getSort, Comparator.nullsLast(Comparator.naturalOrder())));
+ return result;
+ }
+
+}
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/materialbase/MaterialBaseService.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/materialbase/MaterialBaseService.java
new file mode 100644
index 00000000..d5935d54
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/materialbase/MaterialBaseService.java
@@ -0,0 +1,87 @@
+package cn.code.nl.module.base.service.materialbase;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseListReqDTO;
+import cn.code.nl.module.base.controller.admin.materialbase.vo.*;
+import cn.code.nl.module.base.dal.dataobject.materialbase.MaterialBaseDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 物料基本信息 Service 接口
+ *
+ * @author 芋道源码
+ */
+public interface MaterialBaseService {
+
+ /**
+ * 创建物料基本信息
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createMaterialBase(@Valid MaterialBaseSaveReqVO createReqVO);
+
+ /**
+ * 更新物料基本信息
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateMaterialBase(@Valid MaterialBaseSaveReqVO updateReqVO);
+
+ /**
+ * 删除物料基本信息
+ *
+ * @param id 编号
+ */
+ void deleteMaterialBase(Long id);
+
+ /**
+ * 批量删除物料基本信息
+ *
+ * @param ids 编号
+ */
+ void deleteMaterialBaseListByIds(List ids);
+
+ /**
+ * 获得物料基本信息
+ *
+ * @param id 编号
+ * @return 物料基本信息
+ */
+ MaterialBaseDO getMaterialBase(Long id);
+
+ /**
+ * 获得物料基本信息分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 物料基本信息分页
+ */
+ PageResult getMaterialBasePage(MaterialBasePageReqVO pageReqVO);
+
+ /**
+ * 根据条件查询物料基本信息列表(不分页)
+ *
+ * @param reqVO 查询条件
+ * @return 物料基本信息列表
+ */
+ List getMaterialBaseList(MaterialBasePageReqVO reqVO);
+
+ /**
+ * 根据物料编码获得物料基本信息
+ *
+ * @param materialCode 物料编码
+ * @return 物料基本信息
+ */
+ MaterialBaseDO getMaterialBaseByCode(String materialCode);
+
+ /**
+ * 根据条件查询物料基本信息列表(RPC API 用)
+ *
+ * @param reqDTO 查询条件
+ * @return 物料基本信息列表
+ */
+ List getMaterialBaseList(MaterialBaseListReqDTO reqDTO);
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/materialbase/MaterialBaseServiceImpl.java b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/materialbase/MaterialBaseServiceImpl.java
new file mode 100644
index 00000000..e45c1a7e
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/java/cn/code/nl/module/base/service/materialbase/MaterialBaseServiceImpl.java
@@ -0,0 +1,96 @@
+package cn.code.nl.module.base.service.materialbase;
+
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.util.object.BeanUtils;
+import cn.code.nl.module.base.api.materialbase.dto.MaterialBaseListReqDTO;
+import cn.code.nl.module.base.controller.admin.materialbase.vo.MaterialBasePageReqVO;
+import cn.code.nl.module.base.controller.admin.materialbase.vo.MaterialBaseSaveReqVO;
+import cn.code.nl.module.base.dal.dataobject.materialbase.MaterialBaseDO;
+import cn.code.nl.module.base.dal.mysql.materialbase.MaterialBaseMapper;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.List;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.module.base.enums.ErrorCodeConstants.*;
+
+/**
+ * 物料基本信息 Service 实现类
+ *
+ * @author 芋道源码
+ */
+@Service
+@Validated
+public class MaterialBaseServiceImpl implements MaterialBaseService {
+
+ @Resource
+ private MaterialBaseMapper materialBaseMapper;
+
+ @Override
+ public Long createMaterialBase(MaterialBaseSaveReqVO createReqVO) {
+ // 插入
+ MaterialBaseDO materialBase = BeanUtils.toBean(createReqVO, MaterialBaseDO.class);
+ materialBaseMapper.insert(materialBase);
+
+ // 返回
+ return materialBase.getMaterialId();
+ }
+
+ @Override
+ public void updateMaterialBase(MaterialBaseSaveReqVO updateReqVO) {
+ // 校验存在
+ validateMaterialBaseExists(updateReqVO.getMaterialId());
+ // 更新
+ MaterialBaseDO updateObj = BeanUtils.toBean(updateReqVO, MaterialBaseDO.class);
+ materialBaseMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteMaterialBase(Long id) {
+ // 校验存在
+ validateMaterialBaseExists(id);
+ // 删除
+ materialBaseMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteMaterialBaseListByIds(List ids) {
+ // 删除
+ materialBaseMapper.deleteByIds(ids);
+ }
+
+
+ private void validateMaterialBaseExists(Long id) {
+ if (materialBaseMapper.selectById(id) == null) {
+ throw exception(MATERIAL_BASE_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public MaterialBaseDO getMaterialBase(Long id) {
+ return materialBaseMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getMaterialBasePage(MaterialBasePageReqVO pageReqVO) {
+ return materialBaseMapper.selectPage(pageReqVO);
+ }
+
+ @Override
+ public List getMaterialBaseList(MaterialBasePageReqVO reqVO) {
+ return materialBaseMapper.selectList(reqVO);
+ }
+
+ @Override
+ public MaterialBaseDO getMaterialBaseByCode(String materialCode) {
+ return materialBaseMapper.selectByMaterialCode(materialCode);
+ }
+
+ @Override
+ public List getMaterialBaseList(MaterialBaseListReqDTO reqDTO) {
+ return materialBaseMapper.selectList(reqDTO);
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml b/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..97c477cf
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/resources/application-dev.yaml
@@ -0,0 +1,142 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: http://localhost:8848 # Nacos 服务器地址
+ username: # Nacos 账号
+ password: # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 5 # 初始连接数
+ min-idle: 10 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟)
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟)
+ min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟)
+ max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟)
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ pool-prepared-statements: true # 是否开启 PreparedStatement 缓存
+ max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: root
+ slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: root
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ data:
+ redis:
+ host: 127.0.0.1 # 地址
+ port: 6379 # 端口
+ database: 1 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+
+spring:
+ # RabbitMQ 配置项,对应 RabbitProperties 配置类
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Kafka 配置项,对应 KafkaProperties 配置类
+ kafka:
+ bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 定时任务相关配置 ####################
+xxl:
+ job:
+ admin:
+ addresses: http://localhost:8080/xxl-job-admin # 调度中心部署跟地址
+ executor:
+ ip: localhost
+ port: 9992
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30000 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+ username: admin
+ password: admin
+ # Spring Boot Admin Server 服务端的相关配置
+ context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+ file:
+ name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+nl:
+ demo: false # 开启演示模式
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/application-local.yaml b/nl-module-base/nl-module-base-server/src/main/resources/application-local.yaml
new file mode 100644
index 00000000..b7116579
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/resources/application-local.yaml
@@ -0,0 +1,142 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: http://localhost:8848 # Nacos 服务器地址
+ username: # Nacos 账号
+ password: # Nacos 密码
+ discovery: # 【配置中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+ metadata:
+ version: 1.0.0 # 服务实例的版本号,可用于灰度发布
+ config: # 【注册中心】配置项
+ namespace: dev # 命名空间。这里使用 dev 开发环境
+ group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
+
+--- #################### 数据库相关配置 ####################
+spring:
+ # 数据源配置项
+ autoconfigure:
+ exclude:
+ datasource:
+ druid: # Druid 【监控】相关的全局配置
+ web-stat-filter:
+ enabled: true
+ stat-view-servlet:
+ enabled: true
+ allow: # 设置白名单,不填则允许所有访问
+ url-pattern: /druid/*
+ login-username: # 控制台管理用户名和密码
+ login-password:
+ filter:
+ stat:
+ enabled: true
+ log-slow-sql: true # 慢 SQL 记录
+ slow-sql-millis: 100
+ merge-sql: true
+ wall:
+ config:
+ multi-statement-allow: true
+ dynamic: # 多数据源配置
+ druid: # Druid 【连接池】相关的全局配置
+ initial-size: 5 # 初始连接数
+ min-idle: 10 # 最小连接池数量
+ max-active: 20 # 最大连接池数量
+ max-wait: 60000 # 配置获取连接等待超时的时间,单位:毫秒(1 分钟)
+ time-between-eviction-runs-millis: 60000 # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位:毫秒(1 分钟)
+ min-evictable-idle-time-millis: 600000 # 配置一个连接在池中最小生存的时间,单位:毫秒(10 分钟)
+ max-evictable-idle-time-millis: 1800000 # 配置一个连接在池中最大生存的时间,单位:毫秒(30 分钟)
+ validation-query: SELECT 1 FROM DUAL # 配置检测连接是否有效
+ test-while-idle: true
+ test-on-borrow: false
+ test-on-return: false
+ pool-prepared-statements: true # 是否开启 PreparedStatement 缓存
+ max-pool-prepared-statement-per-connection-size: 20 # 每个连接缓存的 PreparedStatement 数量
+ primary: master
+ datasource:
+ master:
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: 12356
+ slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: root
+
+ # Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
+ data:
+ redis:
+ host: 127.0.0.1 # 地址
+ port: 6379 # 端口
+ database: 1 # 数据库索引
+# password: 123456 # 密码,建议生产环境开启
+
+--- #################### MQ 消息队列相关配置 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ name-server: 127.0.0.1:9876 # RocketMQ Namesrv
+
+spring:
+ # RabbitMQ 配置项,对应 RabbitProperties 配置类
+ rabbitmq:
+ host: 127.0.0.1 # RabbitMQ 服务的地址
+ port: 5672 # RabbitMQ 服务的端口
+ username: guest # RabbitMQ 服务的账号
+ password: guest # RabbitMQ 服务的密码
+ # Kafka 配置项,对应 KafkaProperties 配置类
+ kafka:
+ bootstrap-servers: 127.0.0.1:9092 # 指定 Kafka Broker 地址,可以设置多个,以逗号分隔
+
+--- #################### 定时任务相关配置 ####################
+xxl:
+ job:
+ admin:
+ addresses: http://localhost:8080/xxl-job-admin # 调度中心部署跟地址
+ executor:
+ ip: localhost
+ port: 9992
+
+--- #################### 服务保障相关配置 ####################
+
+# Lock4j 配置项
+lock4j:
+ acquire-timeout: 3000 # 获取分布式锁超时时间,默认为 3000 毫秒
+ expire: 30000 # 分布式锁的超时时间,默认为 30000 毫秒
+
+--- #################### 监控相关配置 ####################
+
+# Actuator 监控端点的配置项
+management:
+ endpoints:
+ web:
+ base-path: /actuator # Actuator 提供的 API 接口的根目录。默认为 /actuator
+ exposure:
+ include: '*' # 需要开放的端点。默认值只打开 health 和 info 两个端点。通过设置 * ,可以开放所有端点。
+
+# Spring Boot Admin 配置项
+spring:
+ boot:
+ admin:
+ # Spring Boot Admin Client 客户端的相关配置
+ client:
+ instance:
+ service-host-type: IP # 注册实例时,优先使用 IP [IP, HOST_NAME, CANONICAL_HOST_NAME]
+ username: admin
+ password: admin
+ # Spring Boot Admin Server 服务端的相关配置
+ context-path: /admin # 配置 Spring
+
+# 日志文件配置
+logging:
+ file:
+ name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+
+--- #################### 芋道相关配置 ####################
+
+# 芋道配置项,设置当前项目所有自定义的配置
+nl:
+ demo: false # 开启演示模式
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/application.yaml b/nl-module-base/nl-module-base-server/src/main/resources/application.yaml
new file mode 100644
index 00000000..f2a6af15
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/resources/application.yaml
@@ -0,0 +1,149 @@
+spring:
+ application:
+ name: base-server
+
+ profiles:
+ active: dev
+
+ main:
+ allow-circular-references: true # 允许循环依赖,因为项目是三层架构,无法避免这个情况。
+ allow-bean-definition-overriding: true # 允许 Bean 覆盖,例如说 Feign 等会存在重复定义的服务
+
+ config:
+ import:
+ - optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
+ - optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置
+
+ # Servlet 配置
+ servlet:
+ # 文件上传相关配置项
+ multipart:
+ max-file-size: 16MB # 单个文件大小
+ max-request-size: 32MB # 设置总上传的文件大小
+
+ # Jackson 配置项
+ jackson:
+ serialization:
+ write-dates-as-timestamps: true # 设置 LocalDateTime 的格式,使用时间戳
+ write-date-timestamps-as-nanoseconds: false # 设置不使用 nanoseconds 的格式。例如说 1611460870.401,而是直接 1611460870401
+ write-durations-as-timestamps: true # 设置 Duration 的格式,使用时间戳
+ fail-on-empty-beans: false # 允许序列化无属性的 Bean
+
+ # Cache 配置项
+ cache:
+ type: REDIS
+ redis:
+ time-to-live: 1h # 设置过期时间为 1 小时
+
+server:
+ port: 48084
+
+logging:
+ file:
+ name: ${user.home}/logs/${spring.application.name}.log # 日志文件名,全路径
+
+--- #################### 接口文档配置 ####################
+
+springdoc:
+ api-docs:
+ enabled: true # 1. 是否开启 Swagger 接文档的元数据
+ path: /v3/api-docs
+ swagger-ui:
+ enabled: true # 2.1 是否开启 Swagger 文档的官方 UI 界面
+ path: /swagger-ui
+ default-flat-param-object: true # 参见 https://doc.xiaominfo.com/docs/faq/v4/knife4j-parameterobject-flat-param 文档
+
+knife4j:
+ enable: true
+ setting:
+ language: zh_cn
+
+# MyBatis Plus 的配置项
+mybatis-plus:
+ configuration:
+ map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
+ global-config:
+ db-config:
+ #id-type: NONE # “智能”模式,基于 IdTypeEnvironmentPostProcessor + 数据源的类型,自动适配成 AUTO、INPUT 模式。
+ # id-type: AUTO # 自增 ID,适合 MySQL 等直接自增的数据库
+ # id-type: INPUT # 用户输入 ID,适合 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库
+ id-type: ASSIGN_ID # 分配 ID,默认使用雪花算法。注意,Oracle、PostgreSQL、Kingbase、DB2、H2 数据库时,需要去除实体类上的 @KeySequence 注解
+ logic-delete-value: 1 # 逻辑已删除值(默认为 1)
+ logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
+ banner: false # 关闭控制台的 Banner 打印
+ type-aliases-package: ${nl.info.base-package}.dal.dataobject
+ encryptor:
+ password: XDV71a+xqStEA3WH # 加解密的秘钥,可使用 https://www.imaegoo.com/2020/aes-key-generator/ 网站生成
+
+mybatis-plus-join:
+ banner: false # 关闭控制台的 Banner 打印
+
+# Spring Data Redis 配置
+spring:
+ data:
+ redis:
+ repositories:
+ enabled: false # 项目未使用到 Spring Data Redis 的 Repository,所以直接禁用,保证启动速度
+
+# VO 转换(数据翻译)相关
+easy-trans:
+ is-enable-global: false # 【默认禁用,对性能确认压力大】启用全局翻译(拦截所有 SpringMVC ResponseBody 进行自动翻译 )。如果对于性能要求很高可关闭此配置,或通过 @IgnoreTrans 忽略某个接口
+
+--- #################### RPC 远程调用相关配置 ####################
+
+--- #################### 消息队列相关 ####################
+
+# rocketmq 配置项,对应 RocketMQProperties 配置类
+rocketmq:
+ # Producer 配置项
+ producer:
+ group: ${spring.application.name}_PRODUCER # 生产者分组
+
+--- #################### 定时任务相关配置 ####################
+
+xxl:
+ job:
+ executor:
+ appname: ${spring.application.name} # 执行器 AppName
+ logpath: ${user.home}/logs/xxl-job/${spring.application.name} # 执行器运行日志文件存储磁盘路径
+ accessToken: 123456 # 执行器通讯TOKEN
+
+--- #################### 芋道相关配置 ####################
+
+nl:
+ info:
+ version: 1.0.0
+ base-package: cn.code.nl.module.base
+ web:
+ admin-ui:
+ url: http://dashboard.nl.iocoder.cn # Admin 管理后台 UI 的地址
+ xss:
+ enable: false
+ exclude-urls: # 如下 url,仅仅是为了演示,去掉配置也没关系
+ - ${management.endpoints.web.base-path}/** # 不处理 Actuator 的请求
+ api-encrypt:
+ enable: true # 是否开启 API 加密
+ algorithm: AES # 加密算法,支持 AES、RSA 等
+ request-key: 52549111389893486934626385991395 # 【AES 案例】请求加密的秘钥,,必须 16、24、32 位
+ response-key: 96103715984234343991809655248883 # 【AES 案例】响应加密的秘钥,AES 案例,必须 16、24、32 位
+ # request-key: MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBAKWzasimcZ1icsWDPVdTXcZs1DkOWjI+m9bTQU8aOqflnomkr6QO1WWeSHBHzuJGsTlV/ZY2pFfq/NstKC94hBjx7yioYJvzb2bKN/Uy4j5nM3iCF//u0RiFkkY8j0Bt/EWoFTOb6RHf8cHIAjbYYtP3pYzbpCIwryfe0g//KIuzAgMBAAECgYADDjZrYcpZjR2xr7RbXmGtzYbyUGXwZEAqa3XaWBD51J2iSyOkAlQEDjGmxGQ3vvb4qDHHadWI+3/TKNeDXJUO+xTVJrnismK5BsHyC6dfxlIK/5BAuknryTca/3UoA1yomS9ZlF3Q0wcecaDoEnSmZEaTrp9T3itPAz4KnGjv5QJBAN5mNcfu6iJ5ktNvEdzqcxkKwbXb9Nq1SLnmTvt+d5TPX7eQ9fCwtOfVu5iBLhhZzb5PJ7pSN3Zt6rl5/jPOGv0CQQC+vETX9oe1wbxZSv6/RBGy0Xow6GndbJwvd89PcAJ2h+OJXWtg/rRHB3t9EQm7iis0XbZTapj19E4U6l8EibhvAkEA1CvYpRwmHKu1SqdM+GBnW/2qHlBwwXJvpoK02TOm674HR/4w0+YRQJfkd7LOAgcyxJuJgDTNmtt0MmzS+iNoFQJAMVSUIZ77XoDq69U/qcw7H5qaFcgmiUQr6QL9tTftCyb+LGri+MUnby96OtCLSdvkbLjIDS8GvKYhA7vSM2RDNQJBAKGyVVnFFIrbK3yuwW71yvxQEGoGxlgvZSezZ4vGgqTxrr9HvAtvWLwR6rpe6ybR/x8uUtoW7NRBWgpiIFwjvY4= # 【RSA 案例】请求解密的私钥
+ # response-key: MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDh/CHyBcS/zEfVyINVA7+c9Xxl0CPdxPMK1OIjxaLy/7BLfbkoEpI8onQtjuzfpuxCraDem9bu3BMF0pMH95HytI3Vi0kGjaV+WLIalwgc2w37oA2sbsmKzQOP7SDLO5s2QJNAD7kVwd+Q5rqaLu2MO0xVv+0IUJhn83hClC0L5wIDAQAB # 【RSA 案例】响应加密的公钥
+ swagger:
+ title: 管理后台
+ description: 提供管理员管理的所有功能
+ version: ${nl.info.version}
+ tenant: # 多租户相关配置项
+ enable: false
+ ignore-urls:
+ ignore-visit-urls:
+ - /admin-api/base/**
+ ignore-tables:
+ ignore-caches:
+ sms-code: # 短信验证码相关的配置项
+ expire-times: 10m
+ send-frequency: 1m
+ send-maximum-quantity-per-day: 10
+ begin-code: 9999 # 这里配置 9999 的原因是,测试方便。
+ end-code: 9999 # 这里配置 9999 的原因是,测试方便。
+
+debug: false
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/logback-spring.xml b/nl-module-base/nl-module-base-server/src/main/resources/logback-spring.xml
new file mode 100644
index 00000000..b853d0e8
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/resources/logback-spring.xml
@@ -0,0 +1,56 @@
+
+
+
+
+
+
+
+
+
+
+ ${CONSOLE_LOG_PATTERN}
+
+
+
+
+
+
+
+ ${FILE_LOG_PATTERN}
+
+
+ ${LOG_FILE}
+
+
+ ${LOG_FILE}.%d{yyyy-MM-dd}.%i.log
+ 30
+ 10MB
+
+
+
+
+ 0
+ 512
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/ClassStandardMapper.xml b/nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/ClassStandardMapper.xml
new file mode 100644
index 00000000..b0d2c43c
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/resources/mapper/classstandard/ClassStandardMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/MaterialBaseMapper.xml b/nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/MaterialBaseMapper.xml
new file mode 100644
index 00000000..1393ac46
--- /dev/null
+++ b/nl-module-base/nl-module-base-server/src/main/resources/mapper/materialbase/MaterialBaseMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-module-base/pom.xml b/nl-module-base/pom.xml
new file mode 100644
index 00000000..a4a6b99c
--- /dev/null
+++ b/nl-module-base/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+
+ cn.nl.cloud
+ nl
+ ${revision}
+
+
+ nl-module-base
+
+ pom
+
+ ${project.artifactId}
+
+ base 模块下,我们放基础的核心业务,提供API。
+
+
+ nl-module-base-api
+ nl-module-base-server
+
+
+
\ No newline at end of file
diff --git a/nl-module-infra/nl-module-infra-server/src/main/resources/application-local.yaml b/nl-module-infra/nl-module-infra-server/src/main/resources/application-local.yaml
index 131d7d89..b3d2e8a5 100644
--- a/nl-module-infra/nl-module-infra-server/src/main/resources/application-local.yaml
+++ b/nl-module-infra/nl-module-infra-server/src/main/resources/application-local.yaml
@@ -66,7 +66,7 @@ spring:
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
username: root
- password: 123456
+ password: root
# username: sa # SQL Server 连接的示例
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
# username: SYSDBA # DM 连接的示例
@@ -77,7 +77,7 @@ spring:
lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
- password: 123456
+ password: root
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
@@ -109,7 +109,7 @@ xxl:
job:
enabled: false # 是否开启调度中心,默认为 true 开启
admin:
- addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+ addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心部署跟地址
--- #################### 服务保障相关配置 ####################
diff --git a/nl-module-system/nl-module-system-server/src/main/resources/application-local.yaml b/nl-module-system/nl-module-system-server/src/main/resources/application-local.yaml
index 201213e8..1f7b5893 100644
--- a/nl-module-system/nl-module-system-server/src/main/resources/application-local.yaml
+++ b/nl-module-system/nl-module-system-server/src/main/resources/application-local.yaml
@@ -65,7 +65,7 @@ spring:
# url: jdbc:sqlserver://127.0.0.1:1433;DatabaseName=ruoyi-vue-pro # SQLServer 连接的示例
# url: jdbc:dm://10.211.55.4:5236?schema=RUOYI_VUE_PRO # DM 连接的示例
username: root
- password: 123456
+ password: root
# username: sa # SQL Server 连接的示例
# password: JSm:g(*%lU4ZAkz06cd52KqT3)i1?H7W # SQL Server 连接的示例
# username: SYSDBA # DM 连接的示例
@@ -76,7 +76,7 @@ spring:
lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true
username: root
- password: 123456
+ password: root
# Redis 配置。Redisson 默认的配置足够使用,一般不需要进行调优
data:
@@ -109,7 +109,7 @@ xxl:
job:
enabled: false # 是否开启调度中心,默认为 true 开启
admin:
- addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+ addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心部署跟地址
--- #################### 服务保障相关配置 ####################
diff --git a/nl-module-system/nl-module-system-server/src/main/resources/application.yaml b/nl-module-system/nl-module-system-server/src/main/resources/application.yaml
index 94608b46..809e0da8 100644
--- a/nl-module-system/nl-module-system-server/src/main/resources/application.yaml
+++ b/nl-module-system/nl-module-system-server/src/main/resources/application.yaml
@@ -36,7 +36,7 @@ spring:
time-to-live: 1h # 设置过期时间为 1 小时
server:
- port: 48081
+ port: 48083
logging:
file:
diff --git a/nl-server/src/main/resources/application-local.yaml b/nl-server/src/main/resources/application-local.yaml
index 2cd34330..452a45ed 100644
--- a/nl-server/src/main/resources/application-local.yaml
+++ b/nl-server/src/main/resources/application-local.yaml
@@ -56,7 +56,7 @@ spring:
# url: jdbc:kingbase8://127.0.0.1:54321/test # 人大金仓 KingbaseES 连接的示例
# url: jdbc:postgresql://127.0.0.1:5432/postgres # OpenGauss 连接的示例
username: root
- password: 123456
+ password: root
# username: sa # SQL Server 连接的示例
# password: Nl@2024 # SQL Server 连接的示例
# username: SYSDBA # DM 连接的示例
@@ -69,7 +69,7 @@ spring:
lazy: true # 开启懒加载,保证启动速度
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&rewriteBatchedStatements=true&nullCatalogMeansCurrent=true
username: root
- password: 123456
+ password: root
# tdengine: # IoT 数据库(需要 IoT 物联网再开启噢!)
# url: jdbc:TAOS-WS://127.0.0.1:6041/ruoyi_vue_pro?enableAutoReconnect=true # 参见:https://t.zsxq.com/qaX9c,开启 TDengine WebSocket 自动重连
# driver-class-name: com.taosdata.jdbc.ws.WebSocketDriver
@@ -92,7 +92,7 @@ xxl:
job:
enabled: false # 是否开启调度中心,默认为 true 开启
admin:
- addresses: http://127.0.0.1:9090/xxl-job-admin # 调度中心部署跟地址
+ addresses: http://127.0.0.1:8080/xxl-job-admin # 调度中心部署跟地址
--- #################### 消息队列相关 ####################
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/package.json b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/package.json
index a6624a15..0ef18c02 100644
--- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/package.json
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/package.json
@@ -46,6 +46,7 @@
"@videojs-player/vue": "catalog:",
"@vueuse/core": "catalog:",
"@vueuse/integrations": "catalog:",
+ "ant-design-vue": "catalog:",
"antdv-next": "catalog:",
"benz-amr-recorder": "catalog:",
"bpmn-js": "catalog:",
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/classstandard/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/classstandard/index.ts
new file mode 100644
index 00000000..694699df
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/classstandard/index.ts
@@ -0,0 +1,68 @@
+import { requestClient } from '#/api/request';
+
+export namespace BaseClassStandardApi {
+ /** 基础数据分类标准信息 */
+ export interface ClassStandard {
+ classId?: number;
+ className: string;
+ parentClassId?: number;
+ status: number;
+ sort: number;
+ classCode?: string;
+ classDesc?: string;
+ classLevel?: string;
+ createTime?: Date;
+ children?: ClassStandard[];
+ }
+}
+
+/** 查询分类标准(精简)列表 */
+export async function getSimpleClassStandardList() {
+ return requestClient.get(
+ '/base/class-standard/simple-list',
+ );
+}
+
+/** 查询分类标准列表(树形) */
+export async function getClassStandardList() {
+ return requestClient.get(
+ '/base/class-standard/list',
+ );
+}
+
+/** 查询分类标准详情 */
+export async function getClassStandard(id: number) {
+ return requestClient.get(
+ `/base/class-standard/get?id=${id}`,
+ );
+}
+
+/** 新增分类标准 */
+export async function createClassStandard(data: BaseClassStandardApi.ClassStandard) {
+ return requestClient.post('/base/class-standard/create', data);
+}
+
+/** 修改分类标准 */
+export async function updateClassStandard(data: BaseClassStandardApi.ClassStandard) {
+ return requestClient.put('/base/class-standard/update', data);
+}
+
+/** 删除分类标准 */
+export async function deleteClassStandard(id: number) {
+ return requestClient.delete(`/base/class-standard/delete?id=${id}`);
+}
+
+/** 根据分类编码获取分支及子分类(用于下拉框) */
+export async function getClassStandardListByCode(classCode: string) {
+ return requestClient.get(
+ '/base/class-standard/list-by-code',
+ { params: { classCode } },
+ );
+}
+
+/** 批量删除分类标准 */
+export async function deleteClassStandardList(ids: number[]) {
+ return requestClient.delete(
+ `/base/class-standard/delete-list?ids=${ids.join(',')}`,
+ );
+}
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/materialbase/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/materialbase/index.ts
new file mode 100644
index 00000000..4c6091e1
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/base/materialbase/index.ts
@@ -0,0 +1,64 @@
+import type { PageParam, PageResult } from '@vben/request';
+import type { Dayjs } from 'dayjs';
+
+import { requestClient } from '#/api/request';
+
+export namespace BaseMaterialBaseApi {
+ /** 物料基本信息信息 */
+ export interface MaterialBase {
+ materialCode?: string; // 物料编码
+ materialName?: string; // 物料名称
+ materialSpec: string; // 规格
+ materialModel: string; // 型号
+ englishName: string; // 外文名称
+ baseUnitId?: number; // 基本计量单位
+ assUnitId: number; // 辅助计量单位
+ materialTypeId: number; // 物料分类
+ lenUnitId: number; // 长度单位
+ weightUnitId: number; // 重量单位
+ isUsed?: string; // 是否启用
+ extId: string; // 外部标识
+ }
+}
+
+/** 查询物料基本信息分页 */
+export function getMaterialBasePage(params: PageParam) {
+ return requestClient.get>(
+ '/base/material-base/page',
+ { params },
+ );
+}
+
+/** 查询物料基本信息详情 */
+export function getMaterialBase(id: number) {
+ return requestClient.get(
+ `/base/material-base/get?id=${id}`,
+ );
+}
+
+/** 新增物料基本信息 */
+export function createMaterialBase(data: BaseMaterialBaseApi.MaterialBase) {
+ return requestClient.post('/base/material-base/create', data);
+}
+
+/** 修改物料基本信息 */
+export function updateMaterialBase(data: BaseMaterialBaseApi.MaterialBase) {
+ return requestClient.put('/base/material-base/update', data);
+}
+
+/** 删除物料基本信息 */
+export function deleteMaterialBase(id: number) {
+ return requestClient.delete(`/base/material-base/delete?id=${id}`);
+}
+
+/** 批量删除物料基本信息 */
+export function deleteMaterialBaseList(ids: number[]) {
+ return requestClient.delete(
+ `/base/material-base/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出物料基本信息 */
+export function exportMaterialBase(params: any) {
+ return requestClient.download('/base/material-base/export-excel', { params });
+}
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/data.ts
new file mode 100644
index 00000000..25099420
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/data.ts
@@ -0,0 +1,139 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { BaseClassStandardApi } from '#/api/base/classstandard';
+
+import { CommonStatusEnum, DICT_TYPE } from '@vben/constants';
+import { getDictOptions } from '@vben/hooks';
+import { handleTree } from '@vben/utils';
+
+import { z } from '#/adapter/form';
+import { getClassStandardList } from '#/api/base/classstandard';
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'classId',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'parentClassId',
+ label: '上级分类',
+ component: 'ApiTreeSelect',
+ componentProps: {
+ allowClear: true,
+ api: async () => {
+ const data = await getClassStandardList();
+ data.unshift({
+ classId: 0,
+ className: '顶级分类',
+ });
+ return handleTree(data, 'classId', 'parentClassId');
+ },
+ labelField: 'className',
+ valueField: 'classId',
+ childrenField: 'children',
+ placeholder: '请选择上级分类',
+ treeDefaultExpandAll: true,
+ },
+ rules: 'selectRequired',
+ },
+ {
+ fieldName: 'className',
+ label: '分类名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分类名称',
+ },
+ rules: 'required',
+ },
+ {
+ fieldName: 'classCode',
+ label: '分类编码',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分类编码',
+ },
+ },
+ {
+ fieldName: 'classDesc',
+ label: '分类简要描述',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入分类简要描述',
+ },
+ },
+ {
+ fieldName: 'sort',
+ label: '显示顺序',
+ component: 'InputNumber',
+ componentProps: {
+ class: '!w-full',
+ min: 0,
+ placeholder: '请输入显示顺序',
+ },
+ rules: 'required',
+ },
+ {
+ fieldName: 'status',
+ label: '状态',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ rules: z.number().default(CommonStatusEnum.ENABLE),
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'className',
+ title: '分类名称',
+ minWidth: 200,
+ align: 'left',
+ fixed: 'left',
+ treeNode: true,
+ },
+ {
+ field: 'classCode',
+ title: '分类编码',
+ minWidth: 120,
+ },
+ {
+ field: 'sort',
+ title: '显示顺序',
+ minWidth: 100,
+ },
+ {
+ field: 'status',
+ title: '分类状态',
+ minWidth: 100,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.COMMON_STATUS },
+ },
+ },
+ {
+ field: 'createTime',
+ title: '创建时间',
+ minWidth: 180,
+ formatter: 'formatDateTime',
+ },
+ {
+ title: '操作',
+ width: 220,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/index.vue
new file mode 100644
index 00000000..97c23c07
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/index.vue
@@ -0,0 +1,199 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/modules/form.vue
new file mode 100644
index 00000000..798bf7eb
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/classstandard/modules/form.vue
@@ -0,0 +1,90 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/data.ts
new file mode 100644
index 00000000..3868d9f2
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/data.ts
@@ -0,0 +1,371 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { BaseMaterialBaseApi } from '#/api/base/materialbase';
+import type { BaseClassStandardApi } from '#/api/base/classstandard';
+
+import { handleTree } from '@vben/utils';
+
+import { z } from '#/adapter/form';
+import { getClassStandardList, getClassStandardListByCode } from '#/api/base/classstandard';
+import { getRangePickerDefaultProps } from '#/utils';
+
+/** 分类名称映射表:classId → className */
+let categoryNameMap: Record = {};
+getClassStandardList().then((data) => {
+ if (data) {
+ data.forEach((item) => {
+ if (item.classId) {
+ categoryNameMap[item.classId] = item.className;
+ }
+ });
+ }
+});
+
+/** 获取物料分类的树形下拉数据 */
+async function loadMaterialTypeTree() {
+ const data = await getClassStandardListByCode('0001');
+ if (!data || data.length === 0) {
+ return [];
+ }
+ return handleTree(data, 'classId', 'parentClassId');
+}
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'materialId',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'materialCode',
+ label: '物料编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入物料编码',
+ },
+ },
+ {
+ fieldName: 'materialName',
+ label: '物料名称',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入物料名称',
+ },
+ },
+ {
+ fieldName: 'materialSpec',
+ label: '规格',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入规格',
+ },
+ },
+ {
+ fieldName: 'materialModel',
+ label: '型号',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入型号',
+ },
+ },
+ {
+ fieldName: 'englishName',
+ label: '外文名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入外文名称',
+ },
+ },
+ {
+ fieldName: 'materialTypeId',
+ label: '物料分类',
+ component: 'ApiTreeSelect',
+ componentProps: {
+ api: loadMaterialTypeTree,
+ labelField: 'className',
+ valueField: 'classId',
+ childrenField: 'children',
+ placeholder: '请选择物料分类',
+ allowClear: true,
+ treeDefaultExpandAll: true,
+ },
+ },
+ {
+ fieldName: 'baseUnitId',
+ label: '基本计量单位',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入基本计量单位',
+ },
+ },
+ {
+ fieldName: 'assUnitId',
+ label: '辅助计量单位',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入辅助计量单位',
+ },
+ },
+ {
+ fieldName: 'lenUnitId',
+ label: '长度单位',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入长度单位',
+ },
+ },
+ {
+ fieldName: 'weightUnitId',
+ label: '重量单位',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入重量单位',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: 'required',
+ component: 'RadioGroup',
+ componentProps: {
+ options: [
+ { label: '是', value: '1' },
+ { label: '否', value: '0' },
+ ],
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'extId',
+ label: '外部标识',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入外部标识',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'materialCode',
+ label: '物料编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入物料编码',
+ },
+ },
+ {
+ fieldName: 'materialName',
+ label: '物料名称',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入物料名称',
+ },
+ },
+ {
+ fieldName: 'materialSpec',
+ label: '规格',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入规格',
+ },
+ },
+ {
+ fieldName: 'materialModel',
+ label: '型号',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入型号',
+ },
+ },
+ {
+ fieldName: 'englishName',
+ label: '外文名称',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入外文名称',
+ },
+ },
+ {
+ fieldName: 'materialTypeId',
+ label: '物料分类',
+ component: 'ApiTreeSelect',
+ componentProps: {
+ api: loadMaterialTypeTree,
+ labelField: 'className',
+ valueField: 'classId',
+ childrenField: 'children',
+ placeholder: '请选择物料分类',
+ allowClear: true,
+ treeDefaultExpandAll: true,
+ },
+ },
+ {
+ fieldName: 'baseUnitId',
+ label: '基本计量单位',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入基本计量单位',
+ },
+ },
+ {
+ fieldName: 'assUnitId',
+ label: '辅助计量单位',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入辅助计量单位',
+ },
+ },
+ {
+ fieldName: 'lenUnitId',
+ label: '长度单位',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入长度单位',
+ },
+ },
+ {
+ fieldName: 'weightUnitId',
+ label: '重量单位',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入重量单位',
+ },
+ },
+ {
+ fieldName: 'createTime',
+ label: '创建时间',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Select',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请选择',
+ options: [
+ { label: '是', value: '1' },
+ { label: '否', value: '0' },
+ ],
+ },
+ },
+ {
+ fieldName: 'extId',
+ label: '外部标识',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入外部标识',
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'materialCode',
+ title: '物料编码',
+ minWidth: 120,
+ },
+ {
+ field: 'materialName',
+ title: '物料名称',
+ minWidth: 200,
+ },
+ {
+ field: 'materialSpec',
+ title: '规格',
+ minWidth: 120,
+ },
+ {
+ field: 'materialModel',
+ title: '型号',
+ minWidth: 120,
+ },
+ {
+ field: 'englishName',
+ title: '外文名称',
+ minWidth: 120,
+ },
+ {
+ field: 'baseUnitId',
+ title: '基本计量单位',
+ minWidth: 120,
+ },
+ {
+ field: 'assUnitId',
+ title: '辅助计量单位',
+ minWidth: 120,
+ },
+ {
+ field: 'materialTypeId',
+ title: '物料分类',
+ minWidth: 150,
+ formatter: ({ cellValue }: { cellValue: number }) =>
+ categoryNameMap[cellValue] || cellValue || '-',
+ },
+ {
+ field: 'lenUnitId',
+ title: '长度单位',
+ minWidth: 120,
+ },
+ {
+ field: 'weightUnitId',
+ title: '重量单位',
+ minWidth: 120,
+ },
+ {
+ field: 'createTime',
+ title: '创建时间',
+ minWidth: 180,
+ formatter: 'formatDateTime',
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 100,
+ formatter: ({ cellValue }: { cellValue: string }) =>
+ cellValue === '1' ? '是' : '否',
+ },
+ {
+ field: 'extId',
+ title: '外部标识',
+ minWidth: 120,
+ },
+ {
+ title: '操作',
+ width: 200,
+ fixed: 'right',
+ slots: { default: 'actions' },
+ },
+ ];
+}
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/index.vue
new file mode 100644
index 00000000..d66cb71d
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/modules/form.vue
new file mode 100644
index 00000000..de293753
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/base/materialbase/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/pnpm-lock.yaml b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/pnpm-lock.yaml
index 855891e2..41b5d769 100644
--- a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/pnpm-lock.yaml
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/pnpm-lock.yaml
@@ -30,24 +30,12 @@ catalogs:
'@eslint/js':
specifier: ^10.0.1
version: 10.0.1
- '@form-create/ant-design-vue':
- specifier: ^3.3.1
- version: 3.3.1
'@form-create/antd-designer':
specifier: ^3.4.0
version: 3.4.0
'@form-create/antdv-next':
specifier: ^3.3.1
version: 3.3.1
- '@form-create/designer':
- specifier: ^3.5.0
- version: 3.5.0
- '@form-create/element-ui':
- specifier: ^3.3.1
- version: 3.3.1
- '@form-create/naive-ui':
- specifier: ^3.3.1
- version: 3.3.1
'@iconify/json':
specifier: ^2.2.487
version: 2.2.490
@@ -297,9 +285,6 @@ catalogs:
echarts:
specifier: ^6.1.0
version: 6.1.0
- element-plus:
- specifier: ^2.14.2
- version: 2.14.2
es-toolkit:
specifier: ^1.47.1
version: 1.49.0
@@ -399,9 +384,6 @@ catalogs:
medium-zoom:
specifier: ^1.1.0
version: 1.1.0
- naive-ui:
- specifier: ^2.44.1
- version: 2.44.1
nitropack:
specifier: ^2.13.4
version: 2.13.4
@@ -504,9 +486,6 @@ catalogs:
tailwindcss:
specifier: ^4.3.1
version: 4.3.1
- tdesign-vue-next:
- specifier: ^1.20.1
- version: 1.20.2
theme-colors:
specifier: ^0.1.0
version: 0.1.0
@@ -534,9 +513,6 @@ catalogs:
unplugin-dts:
specifier: ^1.0.2
version: 1.0.3
- unplugin-element-plus:
- specifier: ^0.11.2
- version: 0.11.2
unplugin-vue:
specifier: ^7.2.0
version: 7.2.0
@@ -736,141 +712,6 @@ importers:
specifier: 'catalog:'
version: 3.3.5(typescript@6.0.3)
- apps/web-antd:
- dependencies:
- '@form-create/ant-design-vue':
- specifier: 'catalog:'
- version: 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@form-create/antd-designer':
- specifier: 'catalog:'
- version: 3.4.0(vue@3.5.39(typescript@6.0.3))
- '@tinymce/tinymce-vue':
- specifier: 'catalog:'
- version: 6.3.0(tinymce@7.9.3)(vue@3.5.39(typescript@6.0.3))
- '@vben/access':
- specifier: workspace:*
- version: link:../../packages/effects/access
- '@vben/common-ui':
- specifier: workspace:*
- version: link:../../packages/effects/common-ui
- '@vben/constants':
- specifier: workspace:*
- version: link:../../packages/constants
- '@vben/hooks':
- specifier: workspace:*
- version: link:../../packages/effects/hooks
- '@vben/icons':
- specifier: workspace:*
- version: link:../../packages/icons
- '@vben/layouts':
- specifier: workspace:*
- version: link:../../packages/effects/layouts
- '@vben/locales':
- specifier: workspace:*
- version: link:../../packages/locales
- '@vben/plugins':
- specifier: workspace:*
- version: link:../../packages/effects/plugins
- '@vben/preferences':
- specifier: workspace:*
- version: link:../../packages/preferences
- '@vben/request':
- specifier: workspace:*
- version: link:../../packages/effects/request
- '@vben/stores':
- specifier: workspace:*
- version: link:../../packages/stores
- '@vben/styles':
- specifier: workspace:*
- version: link:../../packages/styles
- '@vben/types':
- specifier: workspace:*
- version: link:../../packages/types
- '@vben/utils':
- specifier: workspace:*
- version: link:../../packages/utils
- '@videojs-player/vue':
- specifier: 'catalog:'
- version: 1.0.0(@types/video.js@7.3.58)(video.js@7.21.7)(vue@3.5.39(typescript@6.0.3))
- '@vueuse/core':
- specifier: 'catalog:'
- version: 14.3.0(vue@3.5.39(typescript@6.0.3))
- '@vueuse/integrations':
- specifier: 'catalog:'
- version: 14.3.0(async-validator@4.2.5)(axios@1.18.1)(focus-trap@8.2.2)(nprogress@0.2.0)(qrcode@1.5.4)(sortablejs@1.15.7)(vue@3.5.39(typescript@6.0.3))
- ant-design-vue:
- specifier: 'catalog:'
- version: 4.2.6(vue@3.5.39(typescript@6.0.3))
- benz-amr-recorder:
- specifier: 'catalog:'
- version: 1.1.5
- bpmn-js:
- specifier: 'catalog:'
- version: 18.19.0
- bpmn-js-properties-panel:
- specifier: 'catalog:'
- version: 5.54.0(@bpmn-io/properties-panel@3.46.0(@bpmn-io/cm-theme@0.2.0(@codemirror/state@6.7.0)(@codemirror/view@6.43.3)))(bpmn-js@18.19.0)(camunda-bpmn-js-behaviors@1.17.0(bpmn-js@18.19.0)(camunda-bpmn-moddle@7.0.1)(zeebe-bpmn-moddle@1.15.0))(diagram-js@15.18.0)
- bpmn-js-token-simulation:
- specifier: 'catalog:'
- version: 0.39.4
- camunda-bpmn-moddle:
- specifier: 'catalog:'
- version: 7.0.1
- cropperjs:
- specifier: 'catalog:'
- version: 1.6.2
- dayjs:
- specifier: 'catalog:'
- version: 1.11.21
- dhtmlx-gantt:
- specifier: 'catalog:'
- version: 9.1.4
- diagram-js:
- specifier: 'catalog:'
- version: 15.18.0
- fast-xml-parser:
- specifier: 'catalog:'
- version: 4.5.6
- highlight.js:
- specifier: 'catalog:'
- version: 11.11.1
- livekit-client:
- specifier: 'catalog:'
- version: 2.20.0(@types/dom-mediacapture-record@1.0.22)
- pinia:
- specifier: ^3.0.4
- version: 3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))
- steady-xml:
- specifier: 'catalog:'
- version: 0.1.0
- tinymce:
- specifier: 'catalog:'
- version: 7.9.3
- tyme4ts:
- specifier: 'catalog:'
- version: 1.5.2
- video.js:
- specifier: 'catalog:'
- version: 7.21.7
- vue:
- specifier: ^3.5.38
- version: 3.5.39(typescript@6.0.3)
- vue-dompurify-html:
- specifier: 'catalog:'
- version: 5.3.0(vue@3.5.39(typescript@6.0.3))
- vue-router:
- specifier: 'catalog:'
- version: 5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.3)(rollup@4.62.2)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))
- vue3-print-nb:
- specifier: 'catalog:'
- version: 0.1.4(typescript@6.0.3)
- vue3-signature:
- specifier: 'catalog:'
- version: 0.4.4(vue@3.5.39(typescript@6.0.3))
- vuedraggable:
- specifier: 'catalog:'
- version: 4.1.0(vue@3.5.39(typescript@6.0.3))
-
apps/web-antdv-next:
dependencies:
'@form-create/antd-designer':
@@ -933,6 +774,9 @@ importers:
'@vueuse/integrations':
specifier: 'catalog:'
version: 14.3.0(async-validator@4.2.5)(axios@1.18.1)(focus-trap@8.2.2)(nprogress@0.2.0)(qrcode@1.5.4)(sortablejs@1.15.7)(vue@3.5.39(typescript@6.0.3))
+ ant-design-vue:
+ specifier: 'catalog:'
+ version: 4.2.6(vue@3.5.39(typescript@6.0.3))
antdv-next:
specifier: 'catalog:'
version: 1.3.7(date-fns@4.4.0)(vue@3.5.39(typescript@6.0.3))
@@ -1006,286 +850,6 @@ importers:
specifier: 'catalog:'
version: 4.1.0(vue@3.5.39(typescript@6.0.3))
- apps/web-ele:
- dependencies:
- '@form-create/designer':
- specifier: 'catalog:'
- version: 3.5.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/element-ui':
- specifier: 'catalog:'
- version: 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@tinymce/tinymce-vue':
- specifier: 'catalog:'
- version: 6.3.0(tinymce@7.9.3)(vue@3.5.39(typescript@6.0.3))
- '@vben/access':
- specifier: workspace:*
- version: link:../../packages/effects/access
- '@vben/common-ui':
- specifier: workspace:*
- version: link:../../packages/effects/common-ui
- '@vben/constants':
- specifier: workspace:*
- version: link:../../packages/constants
- '@vben/hooks':
- specifier: workspace:*
- version: link:../../packages/effects/hooks
- '@vben/icons':
- specifier: workspace:*
- version: link:../../packages/icons
- '@vben/layouts':
- specifier: workspace:*
- version: link:../../packages/effects/layouts
- '@vben/locales':
- specifier: workspace:*
- version: link:../../packages/locales
- '@vben/plugins':
- specifier: workspace:*
- version: link:../../packages/effects/plugins
- '@vben/preferences':
- specifier: workspace:*
- version: link:../../packages/preferences
- '@vben/request':
- specifier: workspace:*
- version: link:../../packages/effects/request
- '@vben/stores':
- specifier: workspace:*
- version: link:../../packages/stores
- '@vben/styles':
- specifier: workspace:*
- version: link:../../packages/styles
- '@vben/types':
- specifier: workspace:*
- version: link:../../packages/types
- '@vben/utils':
- specifier: workspace:*
- version: link:../../packages/utils
- '@videojs-player/vue':
- specifier: 'catalog:'
- version: 1.0.0(@types/video.js@7.3.58)(video.js@7.21.7)(vue@3.5.39(typescript@6.0.3))
- '@vueuse/core':
- specifier: 'catalog:'
- version: 14.3.0(vue@3.5.39(typescript@6.0.3))
- '@vueuse/integrations':
- specifier: 'catalog:'
- version: 14.3.0(async-validator@4.2.5)(axios@1.18.1)(focus-trap@8.2.2)(nprogress@0.2.0)(qrcode@1.5.4)(sortablejs@1.15.7)(vue@3.5.39(typescript@6.0.3))
- benz-amr-recorder:
- specifier: 'catalog:'
- version: 1.1.5
- bpmn-js:
- specifier: 'catalog:'
- version: 18.19.0
- bpmn-js-properties-panel:
- specifier: 'catalog:'
- version: 5.54.0(@bpmn-io/properties-panel@3.46.0(@bpmn-io/cm-theme@0.2.0(@codemirror/state@6.7.0)(@codemirror/view@6.43.3)))(bpmn-js@18.19.0)(camunda-bpmn-js-behaviors@1.17.0(bpmn-js@18.19.0)(camunda-bpmn-moddle@7.0.1)(zeebe-bpmn-moddle@1.15.0))(diagram-js@15.18.0)
- bpmn-js-token-simulation:
- specifier: 'catalog:'
- version: 0.39.4
- camunda-bpmn-moddle:
- specifier: 'catalog:'
- version: 7.0.1
- cropperjs:
- specifier: 'catalog:'
- version: 1.6.2
- dayjs:
- specifier: 'catalog:'
- version: 1.11.21
- dhtmlx-gantt:
- specifier: 'catalog:'
- version: 9.1.4
- diagram-js:
- specifier: 'catalog:'
- version: 15.18.0
- element-plus:
- specifier: 'catalog:'
- version: 2.14.2(vue@3.5.39(typescript@6.0.3))
- fast-xml-parser:
- specifier: 'catalog:'
- version: 4.5.6
- highlight.js:
- specifier: 'catalog:'
- version: 11.11.1
- livekit-client:
- specifier: 'catalog:'
- version: 2.20.0(@types/dom-mediacapture-record@1.0.22)
- pinia:
- specifier: ^3.0.4
- version: 3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))
- steady-xml:
- specifier: 'catalog:'
- version: 0.1.0
- tinymce:
- specifier: 'catalog:'
- version: 7.9.3
- tyme4ts:
- specifier: 'catalog:'
- version: 1.5.2
- video.js:
- specifier: 'catalog:'
- version: 7.21.7
- vue:
- specifier: ^3.5.38
- version: 3.5.39(typescript@6.0.3)
- vue-dompurify-html:
- specifier: 'catalog:'
- version: 5.3.0(vue@3.5.39(typescript@6.0.3))
- vue-router:
- specifier: 'catalog:'
- version: 5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.3)(rollup@4.62.2)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))
- vue3-print-nb:
- specifier: 'catalog:'
- version: 0.1.4(typescript@6.0.3)
- vue3-signature:
- specifier: 'catalog:'
- version: 0.4.4(vue@3.5.39(typescript@6.0.3))
- vuedraggable:
- specifier: 'catalog:'
- version: 4.1.0(vue@3.5.39(typescript@6.0.3))
- devDependencies:
- unplugin-element-plus:
- specifier: 'catalog:'
- version: 0.11.2(magicast@0.5.3)
-
- apps/web-naive:
- dependencies:
- '@form-create/naive-ui':
- specifier: 'catalog:'
- version: 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@vben/access':
- specifier: workspace:*
- version: link:../../packages/effects/access
- '@vben/common-ui':
- specifier: workspace:*
- version: link:../../packages/effects/common-ui
- '@vben/constants':
- specifier: workspace:*
- version: link:../../packages/constants
- '@vben/hooks':
- specifier: workspace:*
- version: link:../../packages/effects/hooks
- '@vben/icons':
- specifier: workspace:*
- version: link:../../packages/icons
- '@vben/layouts':
- specifier: workspace:*
- version: link:../../packages/effects/layouts
- '@vben/locales':
- specifier: workspace:*
- version: link:../../packages/locales
- '@vben/plugins':
- specifier: workspace:*
- version: link:../../packages/effects/plugins
- '@vben/preferences':
- specifier: workspace:*
- version: link:../../packages/preferences
- '@vben/request':
- specifier: workspace:*
- version: link:../../packages/effects/request
- '@vben/stores':
- specifier: workspace:*
- version: link:../../packages/stores
- '@vben/styles':
- specifier: workspace:*
- version: link:../../packages/styles
- '@vben/types':
- specifier: workspace:*
- version: link:../../packages/types
- '@vben/utils':
- specifier: workspace:*
- version: link:../../packages/utils
- '@vueuse/core':
- specifier: 'catalog:'
- version: 14.3.0(vue@3.5.39(typescript@6.0.3))
- dayjs:
- specifier: 'catalog:'
- version: 1.11.21
- naive-ui:
- specifier: 'catalog:'
- version: 2.44.1(vue@3.5.39(typescript@6.0.3))
- pinia:
- specifier: ^3.0.4
- version: 3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))
- vue:
- specifier: ^3.5.38
- version: 3.5.39(typescript@6.0.3)
- vue-router:
- specifier: 'catalog:'
- version: 5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.3)(rollup@4.62.2)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))
-
- apps/web-tdesign:
- dependencies:
- '@tinymce/tinymce-vue':
- specifier: 'catalog:'
- version: 6.3.0(tinymce@7.9.3)(vue@3.5.39(typescript@6.0.3))
- '@vben/access':
- specifier: workspace:*
- version: link:../../packages/effects/access
- '@vben/common-ui':
- specifier: workspace:*
- version: link:../../packages/effects/common-ui
- '@vben/constants':
- specifier: workspace:*
- version: link:../../packages/constants
- '@vben/hooks':
- specifier: workspace:*
- version: link:../../packages/effects/hooks
- '@vben/icons':
- specifier: workspace:*
- version: link:../../packages/icons
- '@vben/layouts':
- specifier: workspace:*
- version: link:../../packages/effects/layouts
- '@vben/locales':
- specifier: workspace:*
- version: link:../../packages/locales
- '@vben/plugins':
- specifier: workspace:*
- version: link:../../packages/effects/plugins
- '@vben/preferences':
- specifier: workspace:*
- version: link:../../packages/preferences
- '@vben/request':
- specifier: workspace:*
- version: link:../../packages/effects/request
- '@vben/stores':
- specifier: workspace:*
- version: link:../../packages/stores
- '@vben/styles':
- specifier: workspace:*
- version: link:../../packages/styles
- '@vben/types':
- specifier: workspace:*
- version: link:../../packages/types
- '@vben/utils':
- specifier: workspace:*
- version: link:../../packages/utils
- '@vueuse/core':
- specifier: 'catalog:'
- version: 14.3.0(vue@3.5.39(typescript@6.0.3))
- cropperjs:
- specifier: 'catalog:'
- version: 1.6.2
- dayjs:
- specifier: 'catalog:'
- version: 1.11.21
- es-toolkit:
- specifier: 'catalog:'
- version: 1.49.0
- pinia:
- specifier: ^3.0.4
- version: 3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3))
- tdesign-vue-next:
- specifier: 'catalog:'
- version: 1.20.2(vue@3.5.39(typescript@6.0.3))
- tinymce:
- specifier: 'catalog:'
- version: 7.9.3
- vue:
- specifier: ^3.5.38
- version: 3.5.39(typescript@6.0.3)
- vue-router:
- specifier: 'catalog:'
- version: 5.1.0(@vue/compiler-sfc@3.5.39)(esbuild@0.28.1)(pinia@3.0.4(typescript@6.0.3)(vue@3.5.39(typescript@6.0.3)))(rolldown@1.1.3)(rollup@4.62.2)(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))
-
docs:
dependencies:
'@lucide/vue':
@@ -1317,14 +881,14 @@ importers:
version: 2.10.1(vue@3.5.39(typescript@6.0.3))
vitepress-plugin-group-icons:
specifier: 'catalog:'
- version: 1.7.5(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))
+ version: 1.7.5(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))
devDependencies:
'@nolebase/vitepress-plugin-git-changelog':
specifier: 'catalog:'
version: 2.18.2(vitepress@2.0.0-alpha.17(@types/node@26.0.1)(async-validator@4.2.5)(axios@1.18.1)(jiti@2.7.0)(less@4.6.7)(lightningcss@1.32.0)(nprogress@0.2.0)(postcss@8.5.15)(qrcode@1.5.4)(sass-embedded@1.100.0)(sass@1.101.0)(sortablejs@1.15.7)(terser@5.48.0)(typescript@6.0.3)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))
'@tailwindcss/vite':
specifier: 'catalog:'
- version: 4.3.1(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))
+ version: 4.3.1(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))
'@vben/tailwind-config':
specifier: workspace:*
version: link:../internal/tailwind-config
@@ -1333,7 +897,7 @@ importers:
version: link:../internal/vite-config
'@vite-pwa/vitepress':
specifier: 'catalog:'
- version: 1.1.0(vite-plugin-pwa@1.3.0(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1))
+ version: 1.1.0(vite-plugin-pwa@1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1))
vitepress:
specifier: 'catalog:'
version: 2.0.0-alpha.17(@types/node@26.0.1)(async-validator@4.2.5)(axios@1.18.1)(jiti@2.7.0)(less@4.6.7)(lightningcss@1.32.0)(nprogress@0.2.0)(postcss@8.5.15)(qrcode@1.5.4)(sass-embedded@1.100.0)(sass@1.101.0)(sortablejs@1.15.7)(terser@5.48.0)(typescript@6.0.3)(yaml@2.9.0)
@@ -3526,16 +3090,6 @@ packages:
resolution: {integrity: sha512-abYYgI29wJhWIfWTYrYuzRYDcHQUQ1N5ylnhxYn1NJnIQMqUWGLbDmt12JABtZ+R6h6UNatQrS7rhP86etvJyQ==}
engines: {node: '>=22.18.0'}
- '@css-render/plugin-bem@0.15.14':
- resolution: {integrity: sha512-QK513CJ7yEQxm/P3EwsI+d+ha8kSOcjGvD6SevM41neEMxdULE+18iuQK6tEChAWMOQNQPLG/Rw3Khb69r5neg==}
- peerDependencies:
- css-render: ~0.15.14
-
- '@css-render/vue3-ssr@0.15.14':
- resolution: {integrity: sha512-//8027GSbxE9n3QlD73xFY6z4ZbHbvrOVB7AO6hsmrEzGbg+h2A09HboUyDgu+xsmj7JnvJD39Irt+2D0+iV8g==}
- peerDependencies:
- vue: ^3.5.38
-
'@csstools/css-calc@3.2.1':
resolution: {integrity: sha512-DtdHlgXh5ZkA43cwBcAm+huzgJiwx3ZTWVjBs94kwz2xKqSimDA3lBgCjphYgwgVUMWatSM0pDd8TILB1yrVVg==}
engines: {node: '>=20.19.0'}
@@ -3596,11 +3150,6 @@ packages:
'@docsearch/sidepanel-js@4.6.3':
resolution: {integrity: sha512-grGSmvXzG0if+mrzdIKykvpIAuEQ9u0sEJ2eLRRCaQfJvsWqh2C2/aY04bIzWvDh7myi5rvl8D+tUNsVrjYQ3A==}
- '@element-plus/icons-vue@2.3.2':
- resolution: {integrity: sha512-OzIuTaIfC8QXEPmJvB4Y4kw34rSXdCJzxcD1kFStBvr8bK6X1zQAYDo0CNMjojnfTqRQCJ0I7prlErcoRiET2A==}
- peerDependencies:
- vue: ^3.5.38
-
'@emnapi/core@1.10.0':
resolution: {integrity: sha512-yq6OkJ4p82CAfPl0u9mQebQHKPJkY7WrIuk205cTYnYe+k2Z8YBh11FrbRG/H6ihirqcacOgl2BIO8oyMQLeXw==}
@@ -4047,66 +3596,6 @@ packages:
peerDependencies:
vue: ^3.5.38
- '@form-create/component-elm-checkbox@3.3.0':
- resolution: {integrity: sha512-BNJcJ8SXtDOJCy8OXLstn6ZIbvEVAObiSJfazIW3AmAVuu958qlw6896dvQqZK0zTBpgOl3hRmMNjoFguglJfg==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-elm-frame@3.3.0':
- resolution: {integrity: sha512-4iFyg7Jaqv/Q8Lq24XEoQOBClflmMSNxh83KV+cgH3afDIJYHngVSbCqrflaB+lWyMHzIPA3cVrgRbkhkw1eyA==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-elm-group@3.3.0':
- resolution: {integrity: sha512-9lJKkEH+hCet27WkXEX6vRf1Kc01Sj4lcEksfKHmNJe/aP+Zp6D96kmYt5M6Ew9aKSNNAPdpkkLae9AUCAz4YQ==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-elm-radio@3.3.0':
- resolution: {integrity: sha512-b3v/3ytifIc4+y3KCkZjo9X//66yY5k8MHysKqtsmRMx73cAgmHzz3wtpR773zr78xrHGnZH1mE7apdecoJoPQ==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-elm-select@3.3.0':
- resolution: {integrity: sha512-uBE1rwm4/loVOjWn5/tVMaT8/BFLS6U5nieFNO+ChDJ6HwwbAjr/wXXYKPchoLzLAiDV4Tysvydkpz22hYOnjw==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-elm-tree@3.3.0':
- resolution: {integrity: sha512-C2cAxTL8zHrt2LC1HLyp+kxhXgfGU71pkv2hCM+kleU+eJ6Ly4TQoaACUwf9oCZexxjCe1dA+zq0HZ/osQdYrQ==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-elm-upload@3.3.0':
- resolution: {integrity: sha512-oIRpa2cEpHyBtsQh00BpCoD8R2tmQmQ+X6p8Oa3wD9OjGOfKJD7cAKp3bV798/uCXu3LzIh6PyQJQ0Iwjvqhtg==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-naive-checkbox@3.3.0':
- resolution: {integrity: sha512-bIVfN29i5HnIxDl+TKn6p5mKmsgDb85QZx4aIdassD9sa+XG5pt3cPbssAsJSEjYGSur0Nycyoo2LiTfvOUQ4g==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-naive-frame@3.3.0':
- resolution: {integrity: sha512-PJZOc/2yOLlwy49UiqeXVYcsFOAnBr1D/lyFZXEBIzhTZTdseSQQVPiOGJevxOKhjJPY0o1ulF28GfQ2wR9cMw==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-naive-group@3.3.0':
- resolution: {integrity: sha512-2YRkkoEHnKxfr+zRyRyrujBQ0WSQqysLK2UXAJJd3TPsWgCPJf2CqvrAMYSPduw9XFVJLzsggFhcml/H9kl4fw==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-naive-radio@3.3.0':
- resolution: {integrity: sha512-qWAcMjJ4dM1xURmP0Z66zMq5++zwuJ2TJpYSk6bDZV+zZztaXCU15tW6a/Jf8g+UIVFDmZWkKkmtY+W9JM6rLw==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/component-naive-upload@3.3.1':
- resolution: {integrity: sha512-jWQ22m5ahxCkhjSgK6f4/GTPdp2/dAk8odr+4CDNeLPB5mN9y74z6W+EcMtV/L6dp9hMMOrgnUS5/oF2Wpg2XA==}
- peerDependencies:
- vue: ^3.5.38
-
'@form-create/component-subform@3.3.0':
resolution: {integrity: sha512-y8F6LxvVZIiHa5Jwur6xKGfxuWFuiFzR4vhwPWTXsRbARLqaPV5OVPhB3gQWjbOjoJ2cnercEEhOFvvXf99WWQ==}
peerDependencies:
@@ -4122,21 +3611,6 @@ packages:
peerDependencies:
vue: ^3.5.38
- '@form-create/designer@3.5.0':
- resolution: {integrity: sha512-IWtbx/C08kZHGfvT8oyKKyz2v/HJ7FKQzGN1ULbYhNW3o08b6ayTtr9/yA9HlsQfxJoqiUp4gWO9RWvtF/Dw9A==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/element-ui@3.3.1':
- resolution: {integrity: sha512-Iz6ikbaX+xRWGK+xelYM665KNDWfwKRREXHGtvDRrgv9Eq2X3ZzHfNTC/oPpppnoFgC9PV6LAT4XKLqhCxV+Yw==}
- peerDependencies:
- vue: ^3.5.38
-
- '@form-create/naive-ui@3.3.1':
- resolution: {integrity: sha512-85BmdOT0JxEjpWzuVBf1d+pvigpugInodiRmzELmabTJGUj3t0v5PIPWQQkdJrjGyXgsYJVEXIvewGOOyTGxzA==}
- peerDependencies:
- vue: ^3.5.38
-
'@form-create/utils@3.3.0':
resolution: {integrity: sha512-4VGI3Qowkc0HsrxmC6NT1eUlEnN2xURqStjJXD+PjgbYKqzR01pNHJbz1UyfkrmcFE9HTUaWrH7IgPPxjlSo2g==}
@@ -4317,9 +3791,6 @@ packages:
'@jspm/import-map@1.5.0':
resolution: {integrity: sha512-wvjrSEB2MCrpicc/tA0mYEsQ1Jgusnz+4ALwbp5IqGFcnxcTamU/VaVbodmEXFFg4GaPmC2LupUl7Bks6nWOhg==}
- '@juggle/resize-observer@3.4.0':
- resolution: {integrity: sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==}
-
'@keyv/bigmap@1.3.1':
resolution: {integrity: sha512-WbzE9sdmQtKy8vrNPa9BRnwZh5UF4s1KTmSK0KUVLo3eff5BlQNNWDnFOouNpKfPKDnms9xynJjsMYjMaT/aFQ==}
engines: {node: '>= 18'}
@@ -5586,9 +5057,6 @@ packages:
'@swc/helpers@0.5.23':
resolution: {integrity: sha512-5lSsMOTXURePglDfvuAQUqkGek9Hg2kksOYay2m0+XR++b2NWYL/4sWyuvVBIs8oKnJaxkdi9whaL/sqN13afw==}
- '@sxzz/popperjs-es@2.11.8':
- resolution: {integrity: sha512-wOwESXvvED3S8xBmcPWHs2dUuzrE4XiZeFu7e1hROIJkm02a49N120pmOXxY33sBb6hArItm5W5tcg1cBtV+HQ==}
-
'@tailwindcss/node@4.3.1':
resolution: {integrity: sha512-6NDaqRoAMSXD1mr/RXu0HBvNE9a2n5tHPsxu9XHLws8o4Twes5rBM2205SUUiJ9goAtadrN6xTGX0UDEwp/N4A==}
@@ -6016,9 +5484,6 @@ packages:
'@types/linkify-it@5.0.0':
resolution: {integrity: sha512-sVDA58zAw4eWAffKOaQH5/5j3XeayukzDk+ewSsnv3p4yJEZHCCzMDiZM8e0OUrRvmpGZ85jf4yDHkHsgBNr9Q==}
- '@types/lodash-es@4.17.12':
- resolution: {integrity: sha512-0NgftHUcV4v34VhXm8QBSftKVXtbkBG3ViCjs6+eJ5a6y6Mi/jiFGPc1sC7QK+9BFhWrURE3EOggmWaSxL9OzQ==}
-
'@types/lodash.clonedeep@4.5.9':
resolution: {integrity: sha512-19429mWC+FyaAhOLzsS8kZUsI+/GmBAQ0HFiCPsKGU+7pBXOQWhyrY6xNNDwUSX8SMZMJvuFVMF9O5dQOlQK9Q==}
@@ -6064,18 +5529,12 @@ packages:
'@types/tern@0.23.9':
resolution: {integrity: sha512-ypzHFE/wBzh+BlH6rrBgS5I/Z7RD21pGhZ2rltb/+ZrVM1awdZwjx7hE5XfuYgHWk9uvV5HLZN3SloevCAp3Bw==}
- '@types/tinycolor2@1.4.6':
- resolution: {integrity: sha512-iEN8J0BoMnsWBqjVbWH/c0G0Hh7O21lpR2/+PrvAVgWdzL7eexIFm4JN/Wn10PTcmNdtS6U67r499mlWMXOxNw==}
-
'@types/trusted-types@2.0.7':
resolution: {integrity: sha512-ScaPdn1dQczgbl0QFTeTOmVHFULt394XJgOQNoyVhZ6r2vLnMLJfBPd53SB52T/3G36VI1/g2MZaX0cwDuXsfw==}
'@types/unist@3.0.3':
resolution: {integrity: sha512-ko/gIFJRv177XgZsZcBwnqJN5x/Gien8qNOn0D5bQU/zAzVf9Zt3BlcUiLqhV9y4ARk0GbT3tnUiPNgnTXzc/Q==}
- '@types/validator@13.15.10':
- resolution: {integrity: sha512-T8L6i7wCuyoK8A/ZeLYt1+q0ty3Zb9+qbSSvrIVitzT3YjZqkTZ40IbRsPanlB4h1QB3JVL1SYCdR6ngtFYcuA==}
-
'@types/video.js@7.3.58':
resolution: {integrity: sha512-1CQjuSrgbv1/dhmcfQ83eVyYbvGyqhTvb2Opxr0QCV+iJ4J6/J+XWQ3Om59WiwCd1MN3rDUHasx5XRrpUtewYQ==}
@@ -7444,9 +6903,6 @@ packages:
resolution: {integrity: sha512-8HFEBPKhOpJPEPu70wJJetjKta86Gw9+CCyCnB3sui2qQfOvRyqBy4IKLKKAwdMpWb2lHXWk9Wb4Z6AmaUT1Pg==}
engines: {node: '>=12'}
- css-render@0.15.14:
- resolution: {integrity: sha512-9nF4PdUle+5ta4W5SyZdLCCmFd37uVimSjg1evcTqKJCyvCEEj12WKzOSBNak6r4im4J4iYXKH1OWpUV5LBYFg==}
-
css-select@5.2.2:
resolution: {integrity: sha512-TizTzUddG/xYLA3NXodFM0fSbNizXjOKhqiQQwvhlspadZokn1KDy0NZFS0wuEubIYAV5/c1/lAr0TaaFXEXzw==}
@@ -7471,9 +6927,6 @@ packages:
resolution: {integrity: sha512-0LrrStPOdJj+SPCCrGhzryycLjwcgUSHBtxNA8aIDxf0GLsRh1cKYhB00Gd1lDOS4yGH69+SNn13+TWbVHETFQ==}
engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0, npm: '>=7.0.0'}
- csstype@3.0.11:
- resolution: {integrity: sha512-sa6P2wJ+CAbgyy4KFssIb/JNMLxFvKF1pCYCSXS8ZMuqZnMsrxqI2E5sPyoTpxoPU/gVZMzr2zjOfg8GIZOMsw==}
-
csstype@3.2.3:
resolution: {integrity: sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==}
@@ -7628,11 +7081,6 @@ packages:
dataloader@1.4.0:
resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==}
- date-fns-tz@3.2.0:
- resolution: {integrity: sha512-sg8HqoTEulcbbbVXeg84u5UnlsQa8GS5QXMqjjYIhS4abEVVKIUwe0/l/UhrZdKaL/W5eWZNlbTeEIiOXTcsBQ==}
- peerDependencies:
- date-fns: ^3.0.0 || ^4.0.0
-
date-fns@4.4.0:
resolution: {integrity: sha512-+1UMbeh68lH1SegH83CGWwpb6OHHbpSgr3+s5Eww5M4CAgswBpoWS0AjTOfEJ33HiYKz1hdj/KTFprzXHmq/6w==}
@@ -7867,11 +7315,6 @@ packages:
electron-to-chromium@1.5.379:
resolution: {integrity: sha512-v/qV5aV5EUA2pGilzUCq5/eyOloZAqDZBu9UMBIzgPpLlprjSR6zswsWBTv0KpqxLGUAZEwhO95ZCt7srymNVA==}
- element-plus@2.14.2:
- resolution: {integrity: sha512-eNH9uP3wQoNqieEIHXiNvIVv+zO5sZDU0CAZq5b0zqSN06DD0/V9xIq1R/qm3rw5k3nBTM1JvpxhCfRbaFLzDQ==}
- peerDependencies:
- vue: ^3.5.38
-
emoji-regex@10.6.0:
resolution: {integrity: sha512-toUI84YS5YmxW219erniWD0CIVOo46xGKColeNQRgOzDorgBi1v4D71/OFzgD9GO2UGKIv1C3Sp8DAn0+j5w7A==}
@@ -8208,9 +7651,6 @@ packages:
resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==}
engines: {node: '>=0.8.x'}
- evtd@0.2.4:
- resolution: {integrity: sha512-qaeGN5bx63s/AXgQo8gj6fBkxge+OoLddLniox5qtLAEY5HSnuSlISXVPxnSae1dWblvTh4/HoMIB+mbMsvZzw==}
-
execa@9.6.1:
resolution: {integrity: sha512-9Be3ZoN4LmYR90tUoVu2te2BsbzHfhJyfEiAVfz7N5/zv+jduIfLrV2xdQXOHbaD6KgpGdO9PRPM1Y4Q9QkPkA==}
engines: {node: ^18.19.0 || >=20.5.0}
@@ -9348,13 +8788,6 @@ packages:
lodash-es@4.18.1:
resolution: {integrity: sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==}
- lodash-unified@1.0.3:
- resolution: {integrity: sha512-WK9qSozxXOD7ZJQlpSqOT+om2ZfcT4yO+03FuzAHD0wF6S0l0090LRPDx3vhTTLZ8cFKpBn+IOcVXK6qOcIlfQ==}
- peerDependencies:
- '@types/lodash-es': '*'
- lodash: '*'
- lodash-es: '*'
-
lodash.clonedeep@4.5.0:
resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==}
@@ -9498,9 +8931,6 @@ packages:
medium-zoom@1.1.0:
resolution: {integrity: sha512-ewyDsp7k4InCUp3jRmwHBRFGyjBimKps/AJLjRSox+2q/2H4p/PNpQf+pwONWlJiOudkBXtbdmVbFjqyybfTmQ==}
- memoize-one@6.0.0:
- resolution: {integrity: sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==}
-
meow@13.2.0:
resolution: {integrity: sha512-pxQJQzB6djGPXh08dacEloMFopsOqGVRKFPYvPOt9XDZ1HasbgDZA74CJGreSU4G3Ak7EFJGoiH2auq+yXISgA==}
engines: {node: '>=18'}
@@ -9644,12 +9074,6 @@ packages:
engines: {node: '>=8', npm: '>=5'}
hasBin: true
- naive-ui@2.44.1:
- resolution: {integrity: sha512-reo8Esw0p58liZwbUutC7meW24Xbn3EwNv91zReWKm2W4JPu+zfgJRn/F7aO0BFmvN+h2brA2M5lRvYqLq4kuA==}
- engines: {node: '>=20'}
- peerDependencies:
- vue: ^3.5.38
-
nanoid@3.3.15:
resolution: {integrity: sha512-y7Wygv/7mEOvxTuEQDB8StXdMRBWf1kR/tlhAzBRUFkB2jfcLOAxO/SHmOO2zgz1pVgK29/kyupn059/bCHdjA==}
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
@@ -9730,9 +9154,6 @@ packages:
resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==}
engines: {node: '>=0.10.0'}
- normalize-wheel-es@1.2.0:
- resolution: {integrity: sha512-Wj7+EJQ8mSuXr2iWfnujrimU35R2W4FAErEyTmJoJ7ucwTn2hOUSsRehMb5RSYkxXGTM7Y9QpvPmp++w5ftoJw==}
-
npm-run-path@6.0.0:
resolution: {integrity: sha512-9qny7Z9DsQU8Ou39ERsPU4OZQlSTP47ShQzuKZ6PRXpYLtIFgl/DEBYEXKlvcEa+9tHVcK8CF81Y2V72qaZhWA==}
engines: {node: '>=18'}
@@ -10428,10 +9849,6 @@ packages:
vue-tsc:
optional: true
- rolldown-string@0.2.1:
- resolution: {integrity: sha512-7H8oH5A8+L96pbBTPCt/rZrwayEhZY5/ejhdk9nRODH32H1v7+bfkaCr+kS15DcGQ7VC1HcWdQVNABFYgrMOzg==}
- engines: {node: '>=20.19.0'}
-
rolldown@1.0.0-rc.17:
resolution: {integrity: sha512-ZrT53oAKrtA4+YtBWPQbtPOxIbVDbxT0orcYERKd63VJTF13zPcgXTvD4843L8pcsI7M6MErt8QtON6lrB9tyA==}
engines: {node: ^20.19.0 || >=22.12.0}
@@ -10685,9 +10102,6 @@ packages:
resolution: {integrity: sha512-Wgtnw0QSm0v7gVKv11nOoeyGS65EThGXnBB7jfd4IhZd2eq3B4AMPcXAL5qJ1h55+Qolun7TONTwX7H5m6e2pQ==}
engines: {node: '>=8.0'}
- seemly@0.3.10:
- resolution: {integrity: sha512-2+SMxtG1PcsL0uyhkumlOU6Qo9TAQ/WyH7tthnPIOQB05/12jz9naq6GZ6iZ6ApVsO3rr2gsnTf3++OV63kE1Q==}
-
semver@6.3.1:
resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==}
hasBin: true
@@ -11139,17 +10553,6 @@ packages:
resolution: {integrity: sha512-wPEBwzapC+2PaTYPH6e2L+cNOEE227S47wUYFqlegcs8zlLLmeb9Fcff1HVZY4Fwku/1Eyv38n7GYwB2aaS71g==}
engines: {node: '>=18'}
- tdesign-icons-vue-next@0.4.4:
- resolution: {integrity: sha512-UPKyR5pea840aeI5p/k8VLVgfyVzndSyE4t1yRBD8uYWiuV0p29jZbDn8hMnes9Tz5JPgywCGzbk4QJzt684NA==}
- peerDependencies:
- vue: ^3.5.38
-
- tdesign-vue-next@1.20.2:
- resolution: {integrity: sha512-B0Z9VGB8NpFDuk5Sh39pME/Gddo+5Rb6rnmScSzKLkY+leT96tsygrjybkELVd30fGtD+shQSgs86Kd4Dz8mcw==}
- engines: {node: '>= 18'}
- peerDependencies:
- vue: ^3.5.38
-
teex@1.0.1:
resolution: {integrity: sha512-eYE6iEI62Ni1H8oIa7KlDU6uQBtqr4Eajni3wX7rpfXD8ysFx8z0+dri+KWEPWpBsxXfxu58x/0jvTVT1ekOSg==}
@@ -11191,9 +10594,6 @@ packages:
resolution: {integrity: sha512-uo33abH+Ays0xYaDysoBt494Hb3hsEczMpcC0MwFl773pazORx4fmvKhclhR1wonUbB6vvpRsvVMwnhfqeMc+A==}
engines: {node: ^16.14.0 || >= 17.3.0}
- tinycolor2@1.6.0:
- resolution: {integrity: sha512-XPaBkWQJdsf3pLKJV9p4qN/S+fm2Oj8AIPo1BTUhg5oxkvm9+SVEGFdhyOz7tTdUTfvxMiAs4sp6/eZO2Ew+pw==}
-
tinyexec@1.2.4:
resolution: {integrity: sha512-SHf/r48b7vOrjve9PxJo3MN5v5yuyjHvdUcrQffT3WXMUfnGmHDVbC4k3sHJaJTgZCwpUplIaAo5ANtMyp3YHg==}
engines: {node: '>=18'}
@@ -11238,9 +10638,6 @@ packages:
resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==}
hasBin: true
- treemate@0.3.11:
- resolution: {integrity: sha512-M8RGFoKtZ8dF+iwJfAJTOH/SM4KluKOKRJpjCMhI8bG3qB74zrFoArKZ62ll0Fr3mqkMJiQOmWYkdYgDeITYQg==}
-
trim-lines@3.0.1:
resolution: {integrity: sha512-kRj8B+YHZCc9kQYdWfJB2/oUl9rA99qbowYYBtr4ui4mZyAQ2JpvVBd/6U2YloATfqBhBTSMhTpgBHtU0Mf3Rg==}
@@ -11492,10 +10889,6 @@ packages:
webpack:
optional: true
- unplugin-element-plus@0.11.2:
- resolution: {integrity: sha512-jr88ePpv43h8cCmVW0SqM73sTD+g1n9Rmy4uMbTh+pSmceH9ZdKteWX9f+twC4aDlP3svdZuKMqLoUNBT2V6Tg==}
- engines: {node: '>=20.19.0'}
-
unplugin-utils@0.3.1:
resolution: {integrity: sha512-5lWVjgi6vuHhJ526bI4nlCOmkCIF3nnfXkCMDeMJrtdvxTs6ZFCM8oNufGTsDbKv/tJ/xj8RpvXjRuPBZJuJog==}
engines: {node: '>=20.19.0'}
@@ -11650,18 +11043,9 @@ packages:
typescript:
optional: true
- validator@13.15.35:
- resolution: {integrity: sha512-TQ5pAGhd5whStmqWvYF4OjQROlmv9SMFVt37qoCBdqRffuuklWYQlCNnEs2ZaIBD1kZRNnikiZOS1eqgkar0iw==}
- engines: {node: '>= 0.10'}
-
varint@6.0.0:
resolution: {integrity: sha512-cXEIW6cfr15lFv563k4GuVuW/fiwjknytD37jIOLSdSWuOI6WnO/oKwmP2FQTU2l01LP8/M5TSAJpzUaGe3uWg==}
- vdirs@0.1.8:
- resolution: {integrity: sha512-H9V1zGRLQZg9b+GdMk8MXDN2Lva0zx72MPahDKc30v+DtwKjfyOSXWRIX4t2mhDubM1H09gPhWeth/BJWPHGUw==}
- peerDependencies:
- vue: ^3.5.38
-
vee-validate@4.15.1:
resolution: {integrity: sha512-DkFsiTwEKau8VIxyZBGdO6tOudD+QoUBPuHj3e6QFqmbfCRj1ArmYWue9lEp6jLSWBIw4XPlDLjFIZNLdRAMSg==}
peerDependencies:
@@ -11923,11 +11307,6 @@ packages:
jsdom:
optional: true
- vooks@0.2.12:
- resolution: {integrity: sha512-iox0I3RZzxtKlcgYaStQYKEzWWGAduMmq+jS7OrNdQo1FgGfPMubGL3uGHOU9n97NIvfFDBGnpSvkWyb/NSn/Q==}
- peerDependencies:
- vue: ^3.5.38
-
vscode-languageserver-textdocument@1.0.12:
resolution: {integrity: sha512-cxWNPesCnQCcMPeenjKKsOCKQZ/L6Tv19DTRIGuLWe32lyzWhihGVJ/rcckZXJxfdKCFvRLS3fpBIsV/ZGX4zA==}
@@ -12027,11 +11406,6 @@ packages:
peerDependencies:
vue: ^3.5.38
- vueuc@0.4.65:
- resolution: {integrity: sha512-lXuMl+8gsBmruudfxnMF9HW4be8rFziylXFu1VHVNbLVhRTXXV4njvpRuJapD/8q+oFEMSfQMH16E/85VoWRyQ==}
- peerDependencies:
- vue: ^3.5.38
-
vxe-pc-ui@4.15.11:
resolution: {integrity: sha512-rjZHJe+stkgKHJcxC+tZ4OGY8BgqNQ5MvkOjjFoKScCbeAQUmfW4pRtEH7889uDaa8QfToV1BjTWenrhJcx54A==}
@@ -13844,14 +13218,6 @@ snapshots:
'@cspell/url@10.0.1': {}
- '@css-render/plugin-bem@0.15.14(css-render@0.15.14)':
- dependencies:
- css-render: 0.15.14
-
- '@css-render/vue3-ssr@0.15.14(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- vue: 3.5.39(typescript@6.0.3)
-
'@csstools/css-calc@3.2.1(@csstools/css-parser-algorithms@4.0.0(@csstools/css-tokenizer@4.0.0))(@csstools/css-tokenizer@4.0.0)':
dependencies:
'@csstools/css-parser-algorithms': 4.0.0(@csstools/css-tokenizer@4.0.0)
@@ -13892,10 +13258,6 @@ snapshots:
'@docsearch/sidepanel-js@4.6.3': {}
- '@element-plus/icons-vue@2.3.2(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- vue: 3.5.39(typescript@6.0.3)
-
'@emnapi/core@1.10.0':
dependencies:
'@emnapi/wasi-threads': 1.2.1
@@ -14226,66 +13588,6 @@ snapshots:
'@form-create/utils': 3.3.0
vue: 3.5.39(typescript@6.0.3)
- '@form-create/component-elm-checkbox@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-elm-frame@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-elm-group@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-elm-radio@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-elm-select@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-elm-tree@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-elm-upload@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-naive-checkbox@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-naive-frame@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-naive-group@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-naive-radio@3.3.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/component-naive-upload@3.3.1(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
'@form-create/component-subform@3.3.0(vue@3.5.39(typescript@6.0.3))':
dependencies:
vue: 3.5.39(typescript@6.0.3)
@@ -14300,46 +13602,6 @@ snapshots:
'@form-create/utils': 3.3.0
vue: 3.5.39(typescript@6.0.3)
- '@form-create/designer@3.5.0(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/component-wangeditor': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/element-ui': 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@form-create/utils': 3.3.0
- codemirror: 6.65.7
- element-plus: 2.14.2(vue@3.5.39(typescript@6.0.3))
- js-beautify: 1.15.4
- marked: 17.0.6
- signature_pad: 5.1.3
- sortablejs: 1.14.0
- vue: 3.5.39(typescript@6.0.3)
- vuedraggable: 4.1.0(vue@3.5.39(typescript@6.0.3))
-
- '@form-create/element-ui@3.3.1(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/component-elm-checkbox': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-elm-frame': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-elm-group': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-elm-radio': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-elm-select': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-elm-tree': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-elm-upload': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-subform': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/core': 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
- '@form-create/naive-ui@3.3.1(vue@3.5.39(typescript@6.0.3))':
- dependencies:
- '@form-create/component-naive-checkbox': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-naive-frame': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-naive-group': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-naive-radio': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-naive-upload': 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@form-create/component-subform': 3.3.0(vue@3.5.39(typescript@6.0.3))
- '@form-create/core': 3.3.1(vue@3.5.39(typescript@6.0.3))
- '@form-create/utils': 3.3.0
- vue: 3.5.39(typescript@6.0.3)
-
'@form-create/utils@3.3.0': {}
'@gera2ld/jsx-dom@2.2.2':
@@ -14557,8 +13819,6 @@ snapshots:
'@jspm/import-map@1.5.0': {}
- '@juggle/resize-observer@3.4.0': {}
-
'@keyv/bigmap@1.3.1(keyv@5.6.0)':
dependencies:
hashery: 1.5.1
@@ -14760,6 +14020,7 @@ snapshots:
untyped: 2.0.0
transitivePeerDependencies:
- magicast
+ optional: true
'@one-ini/wasm@0.1.1': {}
@@ -15481,8 +14742,6 @@ snapshots:
dependencies:
tslib: 2.8.1
- '@sxzz/popperjs-es@2.11.8': {}
-
'@tailwindcss/node@4.3.1':
dependencies:
'@jridgewell/remapping': 2.3.5
@@ -15556,6 +14815,13 @@ snapshots:
tailwindcss: 4.3.1
vite: 8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)
+ '@tailwindcss/vite@4.3.1(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))':
+ dependencies:
+ '@tailwindcss/node': 4.3.1
+ '@tailwindcss/oxide': 4.3.1
+ tailwindcss: 4.3.1
+ vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)
+
'@tanstack/store@0.11.0': {}
'@tanstack/virtual-core@3.17.1': {}
@@ -15886,10 +15152,6 @@ snapshots:
'@types/linkify-it@5.0.0': {}
- '@types/lodash-es@4.17.12':
- dependencies:
- '@types/lodash': 4.17.24
-
'@types/lodash.clonedeep@4.5.9':
dependencies:
'@types/lodash': 4.17.24
@@ -15937,14 +15199,10 @@ snapshots:
dependencies:
'@types/estree': 1.0.9
- '@types/tinycolor2@1.4.6': {}
-
'@types/trusted-types@2.0.7': {}
'@types/unist@3.0.3': {}
- '@types/validator@13.15.10': {}
-
'@types/video.js@7.3.58': {}
'@types/web-bluetooth@0.0.21': {}
@@ -16337,9 +15595,9 @@ snapshots:
global: 4.4.0
is-function: 1.0.2
- '@vite-pwa/vitepress@1.1.0(vite-plugin-pwa@1.3.0(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1))':
+ '@vite-pwa/vitepress@1.1.0(vite-plugin-pwa@1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1))':
dependencies:
- vite-plugin-pwa: 1.3.0(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1)
+ vite-plugin-pwa: 1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1)
'@vitejs/plugin-vue-jsx@5.1.6(vite@8.0.10(@types/node@25.9.4)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3))':
dependencies:
@@ -17651,11 +16909,6 @@ snapshots:
css-functions-list@3.3.3: {}
- css-render@0.15.14:
- dependencies:
- '@emotion/hash': 0.8.0
- csstype: 3.0.11
-
css-select@5.2.2:
dependencies:
boolbase: 1.0.0
@@ -17682,8 +16935,6 @@ snapshots:
dependencies:
css-tree: 2.2.1
- csstype@3.0.11: {}
-
csstype@3.2.3: {}
cz-git@1.13.1: {}
@@ -17862,10 +17113,6 @@ snapshots:
dataloader@1.4.0: {}
- date-fns-tz@3.2.0(date-fns@4.4.0):
- dependencies:
- date-fns: 4.4.0
-
date-fns@4.4.0: {}
dayjs@1.11.21: {}
@@ -18050,25 +17297,6 @@ snapshots:
electron-to-chromium@1.5.379: {}
- element-plus@2.14.2(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- '@ctrl/tinycolor': 4.2.0
- '@element-plus/icons-vue': 2.3.2(vue@3.5.39(typescript@6.0.3))
- '@floating-ui/dom': 1.7.6
- '@popperjs/core': '@sxzz/popperjs-es@2.11.8'
- '@types/lodash': 4.17.24
- '@types/lodash-es': 4.17.12
- '@vueuse/core': 14.3.0(vue@3.5.39(typescript@6.0.3))
- async-validator: 4.2.5
- dayjs: 1.11.21
- lodash: 4.18.1
- lodash-es: 4.18.1
- lodash-unified: 1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1)
- memoize-one: 6.0.0
- normalize-wheel-es: 1.2.0
- vue: 3.5.39(typescript@6.0.3)
- vue-component-type-helpers: 3.3.5
-
emoji-regex@10.6.0: {}
emoji-regex@8.0.0: {}
@@ -18124,7 +17352,8 @@ snapshots:
error-stack-parser-es@1.0.5: {}
- errx@0.1.0: {}
+ errx@0.1.0:
+ optional: true
es-abstract-get@1.0.0:
dependencies:
@@ -18523,8 +17752,6 @@ snapshots:
events@3.3.0: {}
- evtd@0.2.4: {}
-
execa@9.6.1:
dependencies:
'@sindresorhus/merge-streams': 4.0.0
@@ -19663,12 +18890,6 @@ snapshots:
lodash-es@4.18.1: {}
- lodash-unified@1.0.3(@types/lodash-es@4.17.12)(lodash-es@4.18.1)(lodash@4.18.1):
- dependencies:
- '@types/lodash-es': 4.17.12
- lodash: 4.18.1
- lodash-es: 4.18.1
-
lodash.clonedeep@4.5.0: {}
lodash.debounce@4.0.8: {}
@@ -19827,8 +19048,6 @@ snapshots:
medium-zoom@1.1.0: {}
- memoize-one@6.0.0: {}
-
meow@13.2.0: {}
meow@14.1.0: {}
@@ -19956,28 +19175,6 @@ snapshots:
'@babel/runtime': 7.29.7
global: 4.4.0
- naive-ui@2.44.1(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- '@css-render/plugin-bem': 0.15.14(css-render@0.15.14)
- '@css-render/vue3-ssr': 0.15.14(vue@3.5.39(typescript@6.0.3))
- '@types/lodash': 4.17.24
- '@types/lodash-es': 4.17.12
- async-validator: 4.2.5
- css-render: 0.15.14
- csstype: 3.2.3
- date-fns: 4.4.0
- date-fns-tz: 3.2.0(date-fns@4.4.0)
- evtd: 0.2.4
- highlight.js: 11.11.1
- lodash: 4.18.1
- lodash-es: 4.18.1
- seemly: 0.3.10
- treemate: 0.3.11
- vdirs: 0.1.8(vue@3.5.39(typescript@6.0.3))
- vooks: 0.2.12(vue@3.5.39(typescript@6.0.3))
- vue: 3.5.39(typescript@6.0.3)
- vueuc: 0.4.65(vue@3.5.39(typescript@6.0.3))
-
nanoid@3.3.15: {}
nanopop@2.4.2: {}
@@ -20135,8 +19332,6 @@ snapshots:
normalize-path@3.0.0: {}
- normalize-wheel-es@1.2.0: {}
-
npm-run-path@6.0.0:
dependencies:
path-key: 4.0.0
@@ -20911,10 +20106,6 @@ snapshots:
transitivePeerDependencies:
- oxc-resolver
- rolldown-string@0.2.1:
- dependencies:
- magic-string: 0.30.21
-
rolldown@1.0.0-rc.17:
dependencies:
'@oxc-project/types': 0.127.0
@@ -21198,8 +20389,6 @@ snapshots:
crypto-js: 4.2.0
lz-string: 1.5.0
- seemly@0.3.10: {}
-
semver@6.3.1: {}
semver@7.8.5: {}
@@ -21752,28 +20941,6 @@ snapshots:
minizlib: 3.1.0
yallist: 5.0.0
- tdesign-icons-vue-next@0.4.4(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- '@babel/runtime': 7.29.7
- vue: 3.5.39(typescript@6.0.3)
-
- tdesign-vue-next@1.20.2(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- '@babel/runtime': 7.29.7
- '@popperjs/core': 2.11.8
- '@types/lodash-es': 4.17.12
- '@types/sortablejs': 1.15.9
- '@types/tinycolor2': 1.4.6
- '@types/validator': 13.15.10
- dayjs: 1.11.21
- lodash-es: 4.18.1
- mitt: 3.0.1
- sortablejs: 1.15.7
- tdesign-icons-vue-next: 0.4.4(vue@3.5.39(typescript@6.0.3))
- tinycolor2: 1.6.0
- validator: 13.15.35
- vue: 3.5.39(typescript@6.0.3)
-
teex@1.0.1:
dependencies:
streamx: 2.28.0
@@ -21815,8 +20982,6 @@ snapshots:
tinyclip@0.1.15: {}
- tinycolor2@1.6.0: {}
-
tinyexec@1.2.4: {}
tinyglobby@0.2.17:
@@ -21850,8 +21015,6 @@ snapshots:
tree-kill@1.2.2: {}
- treemate@0.3.11: {}
-
trim-lines@3.0.1: {}
ts-api-utils@2.5.0(typescript@6.0.3):
@@ -22106,16 +21269,6 @@ snapshots:
transitivePeerDependencies:
- supports-color
- unplugin-element-plus@0.11.2(magicast@0.5.3):
- dependencies:
- '@nuxt/kit': 4.4.8(magicast@0.5.3)
- es-module-lexer: 2.1.0
- escape-string-regexp: 5.0.0
- rolldown-string: 0.2.1
- unplugin: 2.3.11
- transitivePeerDependencies:
- - magicast
-
unplugin-utils@0.3.1:
dependencies:
pathe: 2.0.3
@@ -22252,15 +21405,8 @@ snapshots:
optionalDependencies:
typescript: 6.0.3
- validator@13.15.35: {}
-
varint@6.0.0: {}
- vdirs@0.1.8(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- evtd: 0.2.4
- vue: 3.5.39(typescript@6.0.3)
-
vee-validate@4.15.1(vue@3.5.39(typescript@6.0.3)):
dependencies:
'@vue/devtools-api': 7.7.10
@@ -22349,6 +21495,17 @@ snapshots:
transitivePeerDependencies:
- supports-color
+ vite-plugin-pwa@1.3.0(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(workbox-build@7.4.1)(workbox-window@7.4.1):
+ dependencies:
+ debug: 4.4.3
+ pretty-bytes: 6.1.1
+ tinyglobby: 0.2.17
+ vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)
+ workbox-build: 7.4.1
+ workbox-window: 7.4.1
+ transitivePeerDependencies:
+ - supports-color
+
vite-plugin-vue-devtools@8.1.4(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0))(vue@3.5.39(typescript@6.0.3)):
dependencies:
'@vue/devtools-core': 8.1.4(vue@3.5.39(typescript@6.0.3))
@@ -22451,13 +21608,13 @@ snapshots:
terser: 5.48.0
yaml: 2.9.0
- vitepress-plugin-group-icons@1.7.5(vite@8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)):
+ vitepress-plugin-group-icons@1.7.5(vite@8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)):
dependencies:
'@iconify-json/logos': 1.2.11
'@iconify-json/vscode-icons': 1.2.61
'@iconify/utils': 3.1.3
optionalDependencies:
- vite: 8.0.10(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)
+ vite: 8.1.0(@types/node@26.0.1)(esbuild@0.28.1)(jiti@2.7.0)(less@4.6.7)(sass-embedded@1.100.0)(sass@1.101.0)(terser@5.48.0)(yaml@2.9.0)
vitepress@2.0.0-alpha.17(@types/node@26.0.1)(async-validator@4.2.5)(axios@1.18.1)(jiti@2.7.0)(less@4.6.7)(lightningcss@1.32.0)(nprogress@0.2.0)(postcss@8.5.15)(qrcode@1.5.4)(sass-embedded@1.100.0)(sass@1.101.0)(sortablejs@1.15.7)(terser@5.48.0)(typescript@6.0.3)(yaml@2.9.0):
dependencies:
@@ -22535,11 +21692,6 @@ snapshots:
transitivePeerDependencies:
- msw
- vooks@0.2.12(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- evtd: 0.2.4
- vue: 3.5.39(typescript@6.0.3)
-
vscode-languageserver-textdocument@1.0.12: {}
vscode-uri@3.1.0: {}
@@ -22656,17 +21808,6 @@ snapshots:
sortablejs: 1.14.0
vue: 3.5.39(typescript@6.0.3)
- vueuc@0.4.65(vue@3.5.39(typescript@6.0.3)):
- dependencies:
- '@css-render/vue3-ssr': 0.15.14(vue@3.5.39(typescript@6.0.3))
- '@juggle/resize-observer': 3.4.0
- css-render: 0.15.14
- evtd: 0.2.4
- seemly: 0.3.10
- vdirs: 0.1.8(vue@3.5.39(typescript@6.0.3))
- vooks: 0.2.12(vue@3.5.39(typescript@6.0.3))
- vue: 3.5.39(typescript@6.0.3)
-
vxe-pc-ui@4.15.11(vue@3.5.39(typescript@6.0.3)):
dependencies:
'@vxe-ui/core': 4.4.15(vue@3.5.39(typescript@6.0.3))
diff --git a/pom.xml b/pom.xml
index 10589434..51b71bc7 100644
--- a/pom.xml
+++ b/pom.xml
@@ -17,6 +17,7 @@
nl-module-system
nl-module-infra
nl-module-lms
+ nl-module-base