diff --git a/nl-module-wms/nl-module-wms-api/pom.xml b/nl-module-wms/nl-module-wms-api/pom.xml
new file mode 100644
index 00000000..69492998
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-api/pom.xml
@@ -0,0 +1,49 @@
+
+
+ 4.0.0
+
+ cn.nl.cloud
+ nl-module-wms
+ ${revision}
+
+
+ nl-module-wms-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-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java b/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java
new file mode 100644
index 00000000..625654a9
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-api/src/main/java/cn/code/nl/module/wms/enums/ErrorCodeConstants.java
@@ -0,0 +1,7 @@
+package cn.code.nl.module.wms.enums;
+
+import cn.code.nl.framework.common.exception.ErrorCode;
+
+public interface ErrorCodeConstants {
+ ErrorCode BSREAL_STOR_ATTR_NOT_EXISTS = new ErrorCode(1, "实物库属性不存在");
+}
diff --git a/nl-module-wms/nl-module-wms-server/pom.xml b/nl-module-wms/nl-module-wms-server/pom.xml
new file mode 100644
index 00000000..7ed07635
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/pom.xml
@@ -0,0 +1,139 @@
+
+
+ 4.0.0
+
+ cn.nl.cloud
+ nl-module-wms
+ ${revision}
+
+
+ nl-module-wms-server
+ jar
+
+ ${project.artifactId}
+
+ wms 模块下,我们放通用业务,支撑上层的核心业务。
+ 功能点描述:
+ - xxx
+ - xxx
+
+
+
+
+
+ cn.nl.cloud
+ nl-spring-boot-starter-env
+
+
+
+ cn.nl.cloud
+ nl-module-wms-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-protection
+
+
+
+ com.baomidou
+ lock4j-redisson-spring-boot-starter
+
+
+
+
+ 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-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/WmsServerApplication.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/WmsServerApplication.java
new file mode 100644
index 00000000..2fc50f23
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/WmsServerApplication.java
@@ -0,0 +1,16 @@
+package cn.code.nl.module.wms;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+/**
+ *
+ * @Author: liyongde
+ * @Date: 2026/7/10 9:12
+ */
+@SpringBootApplication
+public class WmsServerApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(WmsServerApplication.class, args);
+ }
+}
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/BsrealStorAttrController.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/BsrealStorAttrController.java
new file mode 100644
index 00000000..13058b05
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/BsrealStorAttrController.java
@@ -0,0 +1,104 @@
+package cn.code.nl.module.wms.controller.admin.bsrealstorattr;
+
+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.wms.controller.admin.bsrealstorattr.vo.*;
+import cn.code.nl.module.wms.dal.dataobject.bsrealstorattr.BsrealStorAttrDO;
+import cn.code.nl.module.wms.service.bsrealstorattr.BsrealStorAttrService;
+
+@Tag(name = "管理后台 - 实物库属性")
+@RestController
+@RequestMapping("/wms/bsreal-stor-attr")
+@Validated
+public class BsrealStorAttrController {
+
+ @Resource
+ private BsrealStorAttrService bsrealStorAttrService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建实物库属性")
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:create')")
+ public CommonResult createBsrealStorAttr(@Valid @RequestBody BsrealStorAttrSaveReqVO createReqVO) {
+ return success(bsrealStorAttrService.createBsrealStorAttr(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新实物库属性")
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:update')")
+ public CommonResult updateBsrealStorAttr(@Valid @RequestBody BsrealStorAttrSaveReqVO updateReqVO) {
+ bsrealStorAttrService.updateBsrealStorAttr(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除实物库属性")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:delete')")
+ public CommonResult deleteBsrealStorAttr(@RequestParam("id") String id) {
+ bsrealStorAttrService.deleteBsrealStorAttr(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除实物库属性")
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:delete')")
+ public CommonResult deleteBsrealStorAttrList(@RequestParam("ids") List ids) {
+ bsrealStorAttrService.deleteBsrealStorAttrListByIds(ids);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得实物库属性")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:query')")
+ public CommonResult getBsrealStorAttr(@RequestParam("id") String id) {
+ BsrealStorAttrDO bsrealStorAttr = bsrealStorAttrService.getBsrealStorAttr(id);
+ return success(BeanUtils.toBean(bsrealStorAttr, BsrealStorAttrRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得实物库属性分页")
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:query')")
+ public CommonResult> getBsrealStorAttrPage(@Valid BsrealStorAttrPageReqVO pageReqVO) {
+ PageResult pageResult = bsrealStorAttrService.getBsrealStorAttrPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, BsrealStorAttrRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出实物库属性 Excel")
+ @PreAuthorize("@ss.hasPermission('wms:bsreal-stor-attr:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportBsrealStorAttrExcel(@Valid BsrealStorAttrPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = bsrealStorAttrService.getBsrealStorAttrPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "实物库属性.xls", "数据", BsrealStorAttrRespVO.class,
+ BeanUtils.toBean(list, BsrealStorAttrRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrPageReqVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrPageReqVO.java
new file mode 100644
index 00000000..f73f9d9a
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrPageReqVO.java
@@ -0,0 +1,39 @@
+package cn.code.nl.module.wms.controller.admin.bsrealstorattr.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 BsrealStorAttrPageReqVO extends PageParam {
+
+ @Schema(description = "仓库编码")
+ private String storCode;
+
+ @Schema(description = "仓库名称")
+ private String storName;
+
+ @Schema(description = "仓库简称")
+ private String simpleName;
+
+ @Schema(description = "仓库性质")
+ private String storTypeScode;
+
+ @Schema(description = "地区")
+ private String area;
+
+ @Schema(description = "是否启用")
+ private String isUsed;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrRespVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrRespVO.java
new file mode 100644
index 00000000..f0f086ce
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrRespVO.java
@@ -0,0 +1,148 @@
+package cn.code.nl.module.wms.controller.admin.bsrealstorattr.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 BsrealStorAttrRespVO {
+
+ @Schema(description = "仓库标识", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("仓库标识")
+ private String storId;
+
+ @Schema(description = "仓库编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("仓库编码")
+ private String storCode;
+
+ @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("仓库名称")
+ private String storName;
+
+ @Schema(description = "仓库简称")
+ @ExcelProperty("仓库简称")
+ private String simpleName;
+
+ @Schema(description = "仓库容量")
+ @ExcelProperty("仓库容量")
+ private Integer storCapacity;
+
+ @Schema(description = "总面积")
+ @ExcelProperty("总面积")
+ private BigDecimal totalArea;
+
+ @Schema(description = "仓库性质", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("仓库性质")
+ private String storTypeScode;
+
+ @Schema(description = "是否虚拟库", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否虚拟库")
+ private String isVirtualstore;
+
+ @Schema(description = "是否半成品库", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否半成品库")
+ private String isSemiFinished;
+
+ @Schema(description = "是否原料库", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否原料库")
+ private String isMaterialstore;
+
+ @Schema(description = "是否成品库", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否成品库")
+ private String isProductstore;
+
+ @Schema(description = "是否备件库", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否备件库")
+ private String isAttachment;
+
+ @Schema(description = "是否允许红冲", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否允许红冲")
+ private String isReversed;
+
+ @Schema(description = "是否移出业务自动确认", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否移出业务自动确认")
+ private String isMvoutAutoCfm;
+
+ @Schema(description = "是否移入业务自动确认", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否移入业务自动确认")
+ private String isMvinAutoCfm;
+
+ @Schema(description = "地区")
+ @ExcelProperty("地区")
+ private String area;
+
+ @Schema(description = "仓库地址")
+ @ExcelProperty("仓库地址")
+ private String storeaDdress;
+
+ @Schema(description = "负责人")
+ @ExcelProperty("负责人")
+ private String principal;
+
+ @Schema(description = "办公电话")
+ @ExcelProperty("办公电话")
+ private String officePhone;
+
+ @Schema(description = "负责人手机")
+ @ExcelProperty("负责人手机")
+ private String mobileNo;
+
+ @Schema(description = "备注", example = "你猜")
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "显示顺序")
+ @ExcelProperty("显示顺序")
+ private Integer orderIndex;
+
+ @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("状态")
+ private String whstateScode;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否启用")
+ private String isUsed;
+
+ @Schema(description = "物料基本分类", example = "6627")
+ @ExcelProperty("物料基本分类")
+ private String baseClassId;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "拥有者ID", example = "20565")
+ @ExcelProperty("拥有者ID")
+ private String sysownerid;
+
+ @Schema(description = "部门ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "26732")
+ @ExcelProperty("部门ID")
+ private String sysdeptid;
+
+ @Schema(description = "公司ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "21831")
+ @ExcelProperty("公司ID")
+ private String syscompanyid;
+
+ @Schema(description = "是否删除", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("是否删除")
+ private String isDelete;
+
+ @Schema(description = "外部标识", example = "18176")
+ @ExcelProperty("外部标识")
+ private String extId;
+
+ @Schema(description = "部门名称", example = "李四")
+ @ExcelProperty("部门名称")
+ private String departName;
+
+ @Schema(description = "公司名称", example = "芋艿")
+ @ExcelProperty("公司名称")
+ private String companyName;
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrSaveReqVO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrSaveReqVO.java
new file mode 100644
index 00000000..7f9c387d
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/controller/admin/bsrealstorattr/vo/BsrealStorAttrSaveReqVO.java
@@ -0,0 +1,111 @@
+package cn.code.nl.module.wms.controller.admin.bsrealstorattr.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 BsrealStorAttrSaveReqVO {
+
+ @Schema(description = "仓库标识", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String storId;
+
+ @Schema(description = "仓库编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "仓库编码不能为空")
+ private String storCode;
+
+ @Schema(description = "仓库名称", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "仓库名称不能为空")
+ private String storName;
+
+ @Schema(description = "仓库简称")
+ private String simpleName;
+
+ @Schema(description = "仓库容量")
+ private Integer storCapacity;
+
+ @Schema(description = "总面积")
+ private BigDecimal totalArea;
+
+ @Schema(description = "仓库性质", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "仓库性质不能为空")
+ private String storTypeScode;
+
+ @Schema(description = "是否虚拟库")
+ private String isVirtualstore;
+
+ @Schema(description = "是否半成品库")
+ private String isSemiFinished;
+
+ @Schema(description = "是否原料库")
+ private String isMaterialstore;
+
+ @Schema(description = "是否成品库")
+ private String isProductstore;
+
+ @Schema(description = "是否备件库")
+ private String isAttachment;
+
+ @Schema(description = "是否允许红冲")
+ private String isReversed;
+
+ @Schema(description = "是否移出业务自动确认")
+ private String isMvoutAutoCfm;
+
+ @Schema(description = "是否移入业务自动确认")
+ private String isMvinAutoCfm;
+
+ @Schema(description = "地区")
+ private String area;
+
+ @Schema(description = "仓库地址")
+ private String storeaDdress;
+
+ @Schema(description = "负责人")
+ private String principal;
+
+ @Schema(description = "办公电话")
+ private String officePhone;
+
+ @Schema(description = "负责人手机")
+ private String mobileNo;
+
+ @Schema(description = "备注", example = "你猜")
+ private String remark;
+
+ @Schema(description = "显示顺序")
+ private Integer orderIndex;
+
+ @Schema(description = "状态", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "状态不能为空")
+ private String whstateScode;
+
+ @Schema(description = "是否启用", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "是否启用不能为空")
+ private String isUsed;
+
+ @Schema(description = "物料基本分类", example = "6627")
+ private String baseClassId;
+
+ @Schema(description = "拥有者ID", example = "20565")
+ private String sysownerid;
+
+ @Schema(description = "部门ID", example = "26732")
+ private String sysdeptid;
+
+ @Schema(description = "公司ID", example = "21831")
+ private String syscompanyid;
+
+ @Schema(description = "外部标识", example = "18176")
+ private String extId;
+
+ @Schema(description = "部门名称", example = "李四")
+ private String departName;
+
+ @Schema(description = "公司名称", example = "芋艿")
+ private String companyName;
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/bsrealstorattr/BsrealStorAttrDO.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/bsrealstorattr/BsrealStorAttrDO.java
new file mode 100644
index 00000000..1d69f6f5
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/dataobject/bsrealstorattr/BsrealStorAttrDO.java
@@ -0,0 +1,153 @@
+package cn.code.nl.module.wms.dal.dataobject.bsrealstorattr;
+
+import lombok.*;
+import java.util.*;
+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("wms_bsrealstorattr")
+@KeySequence("wms_bsrealstorattr_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class BsrealStorAttrDO extends BaseDO {
+
+ /**
+ * 仓库标识
+ */
+ @TableId
+ private String storId;
+ /**
+ * 仓库编码
+ */
+ private String storCode;
+ /**
+ * 仓库名称
+ */
+ private String storName;
+ /**
+ * 仓库简称
+ */
+ private String simpleName;
+ /**
+ * 仓库容量
+ */
+ private Integer storCapacity;
+ /**
+ * 总面积
+ */
+ private BigDecimal totalArea;
+ /**
+ * 仓库性质
+ */
+ private String storTypeScode;
+ /**
+ * 是否虚拟库
+ */
+ private String isVirtualstore;
+ /**
+ * 是否半成品库
+ */
+ private String isSemiFinished;
+ /**
+ * 是否原料库
+ */
+ private String isMaterialstore;
+ /**
+ * 是否成品库
+ */
+ private String isProductstore;
+ /**
+ * 是否备件库
+ */
+ private String isAttachment;
+ /**
+ * 是否允许红冲
+ */
+ private String isReversed;
+ /**
+ * 是否移出业务自动确认
+ */
+ private String isMvoutAutoCfm;
+ /**
+ * 是否移入业务自动确认
+ */
+ private String isMvinAutoCfm;
+ /**
+ * 地区
+ */
+ private String area;
+ /**
+ * 仓库地址
+ */
+ private String storeaDdress;
+ /**
+ * 负责人
+ */
+ private String principal;
+ /**
+ * 办公电话
+ */
+ private String officePhone;
+ /**
+ * 负责人手机
+ */
+ private String mobileNo;
+ /**
+ * 备注
+ */
+ private String remark;
+ /**
+ * 显示顺序
+ */
+ private Integer orderIndex;
+ /**
+ * 状态
+ */
+ private String whstateScode;
+ /**
+ * 是否启用
+ */
+ private String isUsed;
+ /**
+ * 物料基本分类
+ */
+ private String baseClassId;
+ /**
+ * 拥有者ID
+ */
+ private String sysownerid;
+ /**
+ * 部门ID
+ */
+ private String sysdeptid;
+ /**
+ * 公司ID
+ */
+ private String syscompanyid;
+ /**
+ * 外部标识
+ */
+ private String extId;
+ /**
+ * 部门名称
+ */
+ private String departName;
+ /**
+ * 公司名称
+ */
+ private String companyName;
+
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/bsrealstorattr/BsrealStorAttrMapper.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/bsrealstorattr/BsrealStorAttrMapper.java
new file mode 100644
index 00000000..bb106290
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/dal/mysql/bsrealstorattr/BsrealStorAttrMapper.java
@@ -0,0 +1,32 @@
+package cn.code.nl.module.wms.dal.mysql.bsrealstorattr;
+
+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.wms.dal.dataobject.bsrealstorattr.BsrealStorAttrDO;
+import org.apache.ibatis.annotations.Mapper;
+import cn.code.nl.module.wms.controller.admin.bsrealstorattr.vo.*;
+
+/**
+ * 实物库属性 Mapper
+ *
+ * @author 诺力管理员
+ */
+@Mapper
+public interface BsrealStorAttrMapper extends BaseMapperX {
+
+ default PageResult selectPage(BsrealStorAttrPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(BsrealStorAttrDO::getStorCode, reqVO.getStorCode())
+ .likeIfPresent(BsrealStorAttrDO::getStorName, reqVO.getStorName())
+ .likeIfPresent(BsrealStorAttrDO::getSimpleName, reqVO.getSimpleName())
+ .eqIfPresent(BsrealStorAttrDO::getStorTypeScode, reqVO.getStorTypeScode())
+ .eqIfPresent(BsrealStorAttrDO::getArea, reqVO.getArea())
+ .eqIfPresent(BsrealStorAttrDO::getIsUsed, reqVO.getIsUsed())
+ .betweenIfPresent(BsrealStorAttrDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(BsrealStorAttrDO::getStorId));
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/framework/security/config/SecurityConfiguration.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/framework/security/config/SecurityConfiguration.java
new file mode 100644
index 00000000..20c30302
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/framework/security/config/SecurityConfiguration.java
@@ -0,0 +1,117 @@
+package cn.code.nl.module.wms.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-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/bsrealstorattr/BsrealStorAttrService.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/bsrealstorattr/BsrealStorAttrService.java
new file mode 100644
index 00000000..43023e4d
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/bsrealstorattr/BsrealStorAttrService.java
@@ -0,0 +1,62 @@
+package cn.code.nl.module.wms.service.bsrealstorattr;
+
+import java.util.*;
+import jakarta.validation.*;
+import cn.code.nl.module.wms.controller.admin.bsrealstorattr.vo.*;
+import cn.code.nl.module.wms.dal.dataobject.bsrealstorattr.BsrealStorAttrDO;
+import cn.code.nl.framework.common.pojo.PageResult;
+import cn.code.nl.framework.common.pojo.PageParam;
+
+/**
+ * 实物库属性 Service 接口
+ *
+ * @author 诺力管理员
+ */
+public interface BsrealStorAttrService {
+
+ /**
+ * 创建实物库属性
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ String createBsrealStorAttr(@Valid BsrealStorAttrSaveReqVO createReqVO);
+
+ /**
+ * 更新实物库属性
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateBsrealStorAttr(@Valid BsrealStorAttrSaveReqVO updateReqVO);
+
+ /**
+ * 删除实物库属性
+ *
+ * @param id 编号
+ */
+ void deleteBsrealStorAttr(String id);
+
+ /**
+ * 批量删除实物库属性
+ *
+ * @param ids 编号
+ */
+ void deleteBsrealStorAttrListByIds(List ids);
+
+ /**
+ * 获得实物库属性
+ *
+ * @param id 编号
+ * @return 实物库属性
+ */
+ BsrealStorAttrDO getBsrealStorAttr(String id);
+
+ /**
+ * 获得实物库属性分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 实物库属性分页
+ */
+ PageResult getBsrealStorAttrPage(BsrealStorAttrPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/bsrealstorattr/BsrealStorAttrServiceImpl.java b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/bsrealstorattr/BsrealStorAttrServiceImpl.java
new file mode 100644
index 00000000..13b92577
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/java/cn/code/nl/module/wms/service/bsrealstorattr/BsrealStorAttrServiceImpl.java
@@ -0,0 +1,85 @@
+package cn.code.nl.module.wms.service.bsrealstorattr;
+
+import cn.hutool.core.collection.CollUtil;
+import org.springframework.stereotype.Service;
+import jakarta.annotation.Resource;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.*;
+import cn.code.nl.module.wms.controller.admin.bsrealstorattr.vo.*;
+import cn.code.nl.module.wms.dal.dataobject.bsrealstorattr.BsrealStorAttrDO;
+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.wms.dal.mysql.bsrealstorattr.BsrealStorAttrMapper;
+
+import static cn.code.nl.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static cn.code.nl.framework.common.util.collection.CollectionUtils.convertList;
+import static cn.code.nl.framework.common.util.collection.CollectionUtils.diffList;
+import static cn.code.nl.module.wms.enums.ErrorCodeConstants.*;
+
+/**
+ * 实物库属性 Service 实现类
+ *
+ * @author 诺力管理员
+ */
+@Service
+@Validated
+public class BsrealStorAttrServiceImpl implements BsrealStorAttrService {
+
+ @Resource
+ private BsrealStorAttrMapper bsrealStorAttrMapper;
+
+ @Override
+ public String createBsrealStorAttr(BsrealStorAttrSaveReqVO createReqVO) {
+ // 插入
+ BsrealStorAttrDO bsrealStorAttr = BeanUtils.toBean(createReqVO, BsrealStorAttrDO.class);
+ bsrealStorAttrMapper.insert(bsrealStorAttr);
+
+ // 返回
+ return bsrealStorAttr.getStorId();
+ }
+
+ @Override
+ public void updateBsrealStorAttr(BsrealStorAttrSaveReqVO updateReqVO) {
+ // 校验存在
+ validateBsrealStorAttrExists(updateReqVO.getStorId());
+ // 更新
+ BsrealStorAttrDO updateObj = BeanUtils.toBean(updateReqVO, BsrealStorAttrDO.class);
+ bsrealStorAttrMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteBsrealStorAttr(String id) {
+ // 校验存在
+ validateBsrealStorAttrExists(id);
+ // 删除
+ bsrealStorAttrMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteBsrealStorAttrListByIds(List ids) {
+ // 删除
+ bsrealStorAttrMapper.deleteByIds(ids);
+ }
+
+
+ private void validateBsrealStorAttrExists(String id) {
+ if (bsrealStorAttrMapper.selectById(id) == null) {
+ throw exception(BSREAL_STOR_ATTR_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public BsrealStorAttrDO getBsrealStorAttr(String id) {
+ return bsrealStorAttrMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getBsrealStorAttrPage(BsrealStorAttrPageReqVO pageReqVO) {
+ return bsrealStorAttrMapper.selectPage(pageReqVO);
+ }
+
+}
\ No newline at end of file
diff --git a/nl-module-wms/nl-module-wms-server/src/main/resources/application-dev.yaml b/nl-module-wms/nl-module-wms-server/src/main/resources/application-dev.yaml
new file mode 100644
index 00000000..03cd549a
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/resources/application-dev.yaml
@@ -0,0 +1,142 @@
+--- #################### 注册中心 + 配置中心相关配置 ####################
+
+spring:
+ cloud:
+ nacos:
+ server-addr: http://192.168.81.193: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://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: root123
+ slave: # 模拟从库,可根据自己需要修改 # 模拟从库,可根据自己需要修改
+ lazy: true # 开启懒加载,保证启动速度
+ url: jdbc:mysql://192.168.81.193:3306/huachuang_lms_dev?useSSL=false&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true&nullCatalogMeansCurrent=true&rewriteBatchedStatements=true # MySQL Connector/J 8.X 连接的示例
+ username: root
+ password: root123
+
+ # 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-wms/nl-module-wms-server/src/main/resources/application-local.yaml b/nl-module-wms/nl-module-wms-server/src/main/resources/application-local.yaml
new file mode 100644
index 00000000..b7116579
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-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-wms/nl-module-wms-server/src/main/resources/application.yaml b/nl-module-wms/nl-module-wms-server/src/main/resources/application.yaml
new file mode 100644
index 00000000..ba49db52
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/resources/application.yaml
@@ -0,0 +1,149 @@
+spring:
+ application:
+ name: wms-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: 48085
+
+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.wms
+ 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/wms/**
+ 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-wms/nl-module-wms-server/src/main/resources/logback-spring.xml b/nl-module-wms/nl-module-wms-server/src/main/resources/logback-spring.xml
new file mode 100644
index 00000000..b853d0e8
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-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-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BsrealStorAttrMapper.xml b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BsrealStorAttrMapper.xml
new file mode 100644
index 00000000..098b34e6
--- /dev/null
+++ b/nl-module-wms/nl-module-wms-server/src/main/resources/mapper/bsrealstorattr/BsrealStorAttrMapper.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-module-wms/pom.xml b/nl-module-wms/pom.xml
new file mode 100644
index 00000000..e9b6802a
--- /dev/null
+++ b/nl-module-wms/pom.xml
@@ -0,0 +1,25 @@
+
+
+ 4.0.0
+
+ cn.nl.cloud
+ nl
+ ${revision}
+
+
+ nl-module-wms
+ pom
+
+ ${project.artifactId}
+
+ wms 模块下,我们放仓储的核心业务,提供API。
+
+
+
+ nl-module-wms-api
+ nl-module-wms-server
+
+
+
\ No newline at end of file
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/bsrealstorattr/index.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/bsrealstorattr/index.ts
new file mode 100644
index 00000000..c20a7a08
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/api/wms/bsrealstorattr/index.ts
@@ -0,0 +1,82 @@
+import type { PageParam, PageResult } from '@vben/request';
+
+import { requestClient } from '#/api/request';
+
+export namespace WmsBsrealStorAttrApi {
+ /** 实物库属性信息 */
+ export interface BsrealStorAttr {
+ storId: string; // 仓库标识
+ storCode?: string; // 仓库编码
+ storName?: string; // 仓库名称
+ simpleName: string; // 仓库简称
+ storCapacity: number; // 仓库容量
+ totalArea: number; // 总面积
+ storTypeScode?: string; // 仓库性质
+ isVirtualstore?: string; // 是否虚拟库
+ isSemiFinished?: string; // 是否半成品库
+ isMaterialstore?: string; // 是否原料库
+ isProductstore?: string; // 是否成品库
+ isAttachment?: string; // 是否备件库
+ isReversed?: string; // 是否允许红冲
+ isMvoutAutoCfm?: string; // 是否移出业务自动确认
+ isMvinAutoCfm?: string; // 是否移入业务自动确认
+ area: string; // 地区
+ storeaDdress: string; // 仓库地址
+ principal: string; // 负责人
+ officePhone: string; // 办公电话
+ mobileNo: string; // 负责人手机
+ remark: string; // 备注
+ orderIndex: number; // 显示顺序
+ whstateScode?: string; // 状态
+ isUsed?: string; // 是否启用
+ baseClassId: string; // 物料基本分类
+ sysownerid: string; // 拥有者ID
+ sysdeptid?: string; // 部门ID
+ syscompanyid?: string; // 公司ID
+ extId: string; // 外部标识
+ departName: string; // 部门名称
+ companyName: string; // 公司名称
+ }
+}
+
+/** 查询实物库属性分页 */
+export function getBsrealStorAttrPage(params: PageParam) {
+ return requestClient.get>(
+ '/wms/bsreal-stor-attr/page',
+ { params },
+ );
+}
+
+/** 查询实物库属性详情 */
+export function getBsrealStorAttr(id: number) {
+ return requestClient.get(
+ `/wms/bsreal-stor-attr/get?id=${id}`,
+ );
+}
+
+/** 新增实物库属性 */
+export function createBsrealStorAttr(data: WmsBsrealStorAttrApi.BsrealStorAttr) {
+ return requestClient.post('/wms/bsreal-stor-attr/create', data);
+}
+
+/** 修改实物库属性 */
+export function updateBsrealStorAttr(data: WmsBsrealStorAttrApi.BsrealStorAttr) {
+ return requestClient.put('/wms/bsreal-stor-attr/update', data);
+}
+
+/** 删除实物库属性 */
+export function deleteBsrealStorAttr(id: number) {
+ return requestClient.delete(`/wms/bsreal-stor-attr/delete?id=${id}`);
+}
+
+/** 批量删除实物库属性 */
+export function deleteBsrealStorAttrList(ids: number[]) {
+ return requestClient.delete(
+ `/wms/bsreal-stor-attr/delete-list?ids=${ids.join(',')}`,
+ );
+}
+
+/** 导出实物库属性 */
+export function exportBsrealStorAttr(params: any) {
+ return requestClient.download('/wms/bsreal-stor-attr/export-excel', { params });
+}
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/data.ts b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/data.ts
new file mode 100644
index 00000000..f2d320f5
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/data.ts
@@ -0,0 +1,566 @@
+import type { VbenFormSchema } from '#/adapter/form';
+import type { VxeTableGridOptions } from '#/adapter/vxe-table';
+import type { WmsBsrealStorAttrApi } from '#/api/wms/bsrealstorattr';
+
+import { DICT_TYPE } from '@vben/constants';
+import { getDictOptions } from '@vben/hooks';
+
+import { getRangePickerDefaultProps } from '#/utils';
+
+/** 新增/修改的表单 */
+export function useFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'id',
+ component: 'Input',
+ dependencies: {
+ triggerFields: [''],
+ show: () => false,
+ },
+ },
+ {
+ fieldName: 'storCode',
+ label: '仓库编码',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入仓库编码',
+ },
+ },
+ {
+ fieldName: 'storName',
+ label: '仓库名称',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入仓库名称',
+ },
+ },
+ {
+ fieldName: 'simpleName',
+ label: '仓库简称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入仓库简称',
+ },
+ },
+ {
+ fieldName: 'storCapacity',
+ label: '仓库容量',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入仓库容量',
+ },
+ },
+ {
+ fieldName: 'totalArea',
+ label: '总面积',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入总面积',
+ },
+ },
+ {
+ fieldName: 'storTypeScode',
+ label: '仓库性质',
+ rules: 'required',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入仓库性质',
+ },
+ },
+ {
+ fieldName: 'isVirtualstore',
+ label: '是否虚拟库',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isSemiFinished',
+ label: '是否半成品库',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isMaterialstore',
+ label: '是否原料库',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isProductstore',
+ label: '是否成品库',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isAttachment',
+ label: '是否备件库',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isReversed',
+ label: '是否允许红冲',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isMvoutAutoCfm',
+ label: '是否移出业务自动确认',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'isMvinAutoCfm',
+ label: '是否移入业务自动确认',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'area',
+ label: '地区',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入地区',
+ },
+ },
+ {
+ fieldName: 'storeaDdress',
+ label: '仓库地址',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入仓库地址',
+ },
+ },
+ {
+ fieldName: 'principal',
+ label: '负责人',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入负责人',
+ },
+ },
+ {
+ fieldName: 'officePhone',
+ label: '办公电话',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入办公电话',
+ },
+ },
+ {
+ fieldName: 'mobileNo',
+ label: '负责人手机',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入负责人手机',
+ },
+ },
+ {
+ fieldName: 'remark',
+ label: '备注',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入备注',
+ },
+ },
+ {
+ fieldName: 'orderIndex',
+ label: '显示顺序',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入显示顺序',
+ },
+ },
+ {
+ fieldName: 'whstateScode',
+ label: '状态',
+ rules: 'required',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.COMMON_STATUS, 'number'),
+ placeholder: '请选择状态',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ rules: 'required',
+ component: 'RadioGroup',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ buttonStyle: 'solid',
+ optionType: 'button',
+ },
+ },
+ {
+ fieldName: 'baseClassId',
+ label: '物料基本分类',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入物料基本分类',
+ },
+ },
+ {
+ fieldName: 'sysownerid',
+ label: '拥有者ID',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入拥有者ID',
+ },
+ },
+ {
+ fieldName: 'sysdeptid',
+ label: '部门ID',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入部门ID',
+ },
+ },
+ {
+ fieldName: 'syscompanyid',
+ label: '公司ID',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入公司ID',
+ },
+ },
+ {
+ fieldName: 'extId',
+ label: '外部标识',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入外部标识',
+ },
+ },
+ {
+ fieldName: 'departName',
+ label: '部门名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入部门名称',
+ },
+ },
+ {
+ fieldName: 'companyName',
+ label: '公司名称',
+ component: 'Input',
+ componentProps: {
+ placeholder: '请输入公司名称',
+ },
+ },
+ ];
+}
+
+/** 列表的搜索表单 */
+export function useGridFormSchema(): VbenFormSchema[] {
+ return [
+ {
+ fieldName: 'storCode',
+ label: '仓库编码',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入仓库编码',
+ },
+ },
+ {
+ fieldName: 'storName',
+ label: '仓库名称',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入仓库名称',
+ },
+ },
+ {
+ fieldName: 'simpleName',
+ label: '仓库简称',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入仓库简称',
+ },
+ },
+ {
+ fieldName: 'storTypeScode',
+ label: '仓库性质',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入仓库性质',
+ },
+ },
+ {
+ fieldName: 'area',
+ label: '地区',
+ component: 'Input',
+ componentProps: {
+ allowClear: true,
+ placeholder: '请输入地区',
+ },
+ },
+ {
+ fieldName: 'isUsed',
+ label: '是否启用',
+ component: 'Select',
+ componentProps: {
+ options: getDictOptions(DICT_TYPE.INFRA_BOOLEAN_STRING, 'boolean'),
+ placeholder: '请选择是否启用',
+ allowClear: true,
+ },
+ },
+ {
+ fieldName: 'createTime',
+ label: '创建时间',
+ component: 'RangePicker',
+ componentProps: {
+ ...getRangePickerDefaultProps(),
+ allowClear: true,
+ },
+ },
+ ];
+}
+
+/** 列表的字段 */
+export function useGridColumns(): VxeTableGridOptions['columns'] {
+ return [
+ { type: 'checkbox', width: 40 },
+ {
+ field: 'storCode',
+ title: '仓库编码',
+ minWidth: 120,
+ },
+ {
+ field: 'storName',
+ title: '仓库名称',
+ minWidth: 120,
+ },
+ {
+ field: 'simpleName',
+ title: '仓库简称',
+ minWidth: 120,
+ },
+ {
+ field: 'storCapacity',
+ title: '仓库容量',
+ minWidth: 120,
+ },
+ {
+ field: 'totalArea',
+ title: '总面积',
+ minWidth: 120,
+ },
+ {
+ field: 'storTypeScode',
+ title: '仓库性质',
+ minWidth: 120,
+ },
+ {
+ field: 'isVirtualstore',
+ title: '是否虚拟库',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isSemiFinished',
+ title: '是否半成品库',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isMaterialstore',
+ title: '是否原料库',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isProductstore',
+ title: '是否成品库',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isAttachment',
+ title: '是否备件库',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isReversed',
+ title: '是否允许红冲',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isMvoutAutoCfm',
+ title: '是否移出业务自动确认',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'isMvinAutoCfm',
+ title: '是否移入业务自动确认',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'area',
+ title: '地区',
+ minWidth: 120,
+ },
+ {
+ field: 'storeaDdress',
+ title: '仓库地址',
+ minWidth: 120,
+ },
+ {
+ field: 'principal',
+ title: '负责人',
+ minWidth: 120,
+ },
+ {
+ field: 'officePhone',
+ title: '办公电话',
+ minWidth: 120,
+ },
+ {
+ field: 'mobileNo',
+ title: '负责人手机',
+ minWidth: 120,
+ },
+ {
+ field: 'remark',
+ title: '备注',
+ minWidth: 120,
+ },
+ {
+ field: 'orderIndex',
+ title: '显示顺序',
+ minWidth: 120,
+ },
+ {
+ field: 'whstateScode',
+ title: '状态',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.COMMON_STATUS },
+ },
+ },
+ {
+ field: 'isUsed',
+ title: '是否启用',
+ minWidth: 120,
+ cellRender: {
+ name: 'CellDict',
+ props: { type: DICT_TYPE.INFRA_BOOLEAN_STRING },
+ },
+ },
+ {
+ field: 'baseClassId',
+ title: '物料基本分类',
+ minWidth: 120,
+ },
+ {
+ field: 'createTime',
+ title: '创建时间',
+ minWidth: 120,
+ formatter: 'formatDateTime',
+ },
+ {
+ field: 'sysownerid',
+ title: '拥有者ID',
+ minWidth: 120,
+ },
+ {
+ field: 'sysdeptid',
+ title: '部门ID',
+ minWidth: 120,
+ },
+ {
+ field: 'syscompanyid',
+ title: '公司ID',
+ minWidth: 120,
+ },
+ {
+ field: 'extId',
+ title: '外部标识',
+ minWidth: 120,
+ },
+ {
+ field: 'departName',
+ title: '部门名称',
+ minWidth: 120,
+ },
+ {
+ field: 'companyName',
+ 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/wms/bsrealstorattr/index.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/index.vue
new file mode 100644
index 00000000..c5fc4f8f
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/index.vue
@@ -0,0 +1,186 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/modules/form.vue b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/modules/form.vue
new file mode 100644
index 00000000..8dc13cd4
--- /dev/null
+++ b/nl-ui/nl-ui-admin-vben/yudao-ui-admin-vben/apps/web-antdv-next/src/views/wms/bsrealstorattr/modules/form.vue
@@ -0,0 +1,82 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/pom.xml b/pom.xml
index 51b71bc7..ef3d646b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -18,6 +18,7 @@
nl-module-infra
nl-module-lms
nl-module-base
+ nl-module-wms