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