diff --git a/.gitignore b/.gitignore
index e55eb64b..c652c405 100644
--- a/.gitignore
+++ b/.gitignore
@@ -73,3 +73,5 @@ functions/mock
screenshot
.firebase
sessionStore
+/CLAUDE.md
+/nul
diff --git a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java
index c36bd6e0..a15b0ee8 100644
--- a/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java
+++ b/zt-module-base/zt-module-base-api/src/main/java/com/zt/plat/module/base/enums/ErrorCodeConstants.java
@@ -29,4 +29,32 @@ public interface ErrorCodeConstants {
ErrorCode BUSINESS_DICTIONARY_TYPE_NOT_EXISTS = new ErrorCode(1_027_200_003, "业务字典类型不存在");
ErrorCode BUSINESS_DEPARTMENT_INDICATOR_NOT_EXISTS = new ErrorCode(1_027_200_004, "部门持有指标不存在");
+ // ========== 模板文档管理系统 1-006-xxx-xxx ==========
+ // 模板分类 1-006-001-xxx
+ ErrorCode TEMPLATE_CATEGORY_NOT_EXISTS = new ErrorCode(1_006_001_001, "模板分类不存在");
+
+ // 标签库 1-006-002-xxx
+ ErrorCode TEMPLATE_TAG_NOT_EXISTS = new ErrorCode(1_006_002_001, "标签不存在");
+ ErrorCode TEMPLATE_TAG_CODE_DUPLICATE = new ErrorCode(1_006_002_002, "标签编码已存在");
+
+ // 模板 1-006-003-xxx
+ ErrorCode TEMPLATE_NOT_EXISTS = new ErrorCode(1_006_003_001, "模板不存在");
+ ErrorCode TEMPLATE_CODE_DUPLICATE = new ErrorCode(1_006_003_002, "模板编码已存在");
+
+ // 模板实例 1-006-004-xxx
+ ErrorCode TEMPLATE_INSTANCE_NOT_EXISTS = new ErrorCode(1_006_004_001, "模板实例不存在");
+ ErrorCode TEMPLATE_INSTANCE_CODE_DUPLICATE = new ErrorCode(1_006_004_002, "实例编码已存在");
+
+ // ========== 物料属性 ==========
+ ErrorCode MATERIAL_PROPERTIES_NOT_EXISTS = new ErrorCode(1_027_101_001, "物料属性不存在");
+ ErrorCode MATERIAL_HAS_PROPERTIES_NOT_EXISTS = new ErrorCode(1_027_101_002, "物料持有属性不存在");
+ ErrorCode MATERIAL_CLASSES_NOT_EXISTS = new ErrorCode(1_027_101_003, "物料分类不存在");
+ ErrorCode DEPARTMENT_MATERIAL_NOT_EXISTS = new ErrorCode(1_027_101_004, "组织物料不存在");
+ ErrorCode MATERIAL_HAS_CLASSES_NOT_EXISTS = new ErrorCode(1_027_101_004, "物料持有属性不存在");
+
+ // ========== 工艺信息属性 ==========
+ ErrorCode PROCESSING_INFOMATION_NOT_EXISTS = new ErrorCode(1_027_101_005, "工艺信息不存在");
+ ErrorCode PROCESSING_INFOMATION_OPERATION_NOT_EXISTS = new ErrorCode(1_027_101_006, "工艺工序不存在");
+ ErrorCode PROCESSING_OPERATION_NOT_EXISTS = new ErrorCode(1_027_101_007, "工序不存在");
+ ErrorCode PROCESSING_OPERATION_MATERIAL_NOT_EXISTS = new ErrorCode(1_027_101_008, "工艺工序物料不存在");
}
diff --git a/zt-module-base/zt-module-base-server/pom.xml b/zt-module-base/zt-module-base-server/pom.xml
index acd97ea1..431837b0 100644
--- a/zt-module-base/zt-module-base-server/pom.xml
+++ b/zt-module-base/zt-module-base-server/pom.xml
@@ -122,6 +122,13 @@
zt-spring-boot-starter-excel
+
+
+ org.apache.velocity
+ velocity-engine-core
+ 2.3
+
+
com.zt.plat
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationPageReqVO.java
index 5e1fe2b0..d81d1cab 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationPageReqVO.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationPageReqVO.java
@@ -19,6 +19,9 @@ public class MaterialInfomationPageReqVO extends PageParam {
@Schema(description = "物料名称", example = "张三")
private String name;
+ @Schema(description = "分类ID", example = "1024")
+ private Long classesId;
+
@Schema(description = "备注")
private String remark;
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationRespVO.java
index 47237be6..7fc8b56c 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationRespVO.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationRespVO.java
@@ -24,6 +24,10 @@ public class MaterialInfomationRespVO {
@ExcelProperty("物料名称")
private String name;
+ @Schema(description = "分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ @ExcelProperty("分类ID")
+ private Long classesId;
+
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("备注")
private String remark;
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationSaveReqVO.java
index 80d5cbec..687c5875 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationSaveReqVO.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/base/vo/MaterialInfomationSaveReqVO.java
@@ -2,6 +2,7 @@ package com.zt.plat.module.base.controller.admin.base.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.NotEmpty;
+import jakarta.validation.constraints.NotNull;
import lombok.Data;
@Schema(description = "管理后台 - 物料信息新增/修改 Request VO")
@@ -19,6 +20,10 @@ public class MaterialInfomationSaveReqVO {
@NotEmpty(message = "物料名称不能为空")
private String name;
+ @Schema(description = "分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ @NotNull(message = "所属分类不能为空")
+ private Long classesId;
+
@Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
@NotEmpty(message = "备注不能为空")
private String remark;
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/DepartmentMaterialController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/DepartmentMaterialController.java
new file mode 100644
index 00000000..bbde8459
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/DepartmentMaterialController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.departmentmaterial;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.departmentmaterial.vo.*;
+import com.zt.plat.module.base.dal.dataobject.departmentmaterial.DepartmentMaterialDO;
+import com.zt.plat.module.base.service.departmentmaterial.DepartmentMaterialService;
+
+@Tag(name = "管理后台 - 组织架构物料")
+@RestController
+@RequestMapping("/base/department-material")
+@Validated
+public class DepartmentMaterialController {
+
+
+ @Resource
+ private DepartmentMaterialService departmentMaterialService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建组织架构物料")
+ @PreAuthorize("@ss.hasPermission('base:department-material:create')")
+ public CommonResult createDepartmentMaterial(@Valid @RequestBody DepartmentMaterialSaveReqVO createReqVO) {
+ return success(departmentMaterialService.createDepartmentMaterial(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新组织架构物料")
+ @PreAuthorize("@ss.hasPermission('base:department-material:update')")
+ public CommonResult updateDepartmentMaterial(@Valid @RequestBody DepartmentMaterialSaveReqVO updateReqVO) {
+ departmentMaterialService.updateDepartmentMaterial(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除组织架构物料")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:department-material:delete')")
+ public CommonResult deleteDepartmentMaterial(@RequestParam("id") Long id) {
+ departmentMaterialService.deleteDepartmentMaterial(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除组织架构物料")
+ @PreAuthorize("@ss.hasPermission('base:department-material:delete')")
+ public CommonResult deleteDepartmentMaterialList(@RequestBody BatchDeleteReqVO req) {
+ departmentMaterialService.deleteDepartmentMaterialListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得组织架构物料")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:department-material:query')")
+ public CommonResult getDepartmentMaterial(@RequestParam("id") Long id) {
+ DepartmentMaterialDO departmentMaterial = departmentMaterialService.getDepartmentMaterial(id);
+ return success(BeanUtils.toBean(departmentMaterial, DepartmentMaterialRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得组织架构物料分页")
+ @PreAuthorize("@ss.hasPermission('base:department-material:query')")
+ public CommonResult> getDepartmentMaterialPage(@Valid DepartmentMaterialPageReqVO pageReqVO) {
+ PageResult pageResult = departmentMaterialService.getDepartmentMaterialPage(pageReqVO);
+ return success(pageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出组织架构物料 Excel")
+ @PreAuthorize("@ss.hasPermission('base:department-material:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportDepartmentMaterialExcel(@Valid DepartmentMaterialPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = departmentMaterialService.getDepartmentMaterialPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "组织架构物料.xls", "数据", DepartmentMaterialRespVO.class,
+ list);
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java
new file mode 100644
index 00000000..0ae288f5
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialPageReqVO.java
@@ -0,0 +1,47 @@
+package com.zt.plat.module.base.controller.admin.departmentmaterial.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 组织架构物料分页 Request VO")
+@Data
+public class DepartmentMaterialPageReqVO extends PageParam {
+
+ @Schema(description = "物料信息ID", example = "3923")
+ private Long infomationId;
+
+ @Schema(description = "物料信息ID集合(内部使用)")
+ private List infomationIds;
+
+ @Schema(description = "物料分类ID", example = "30114")
+ private Long classesId;
+
+ @Schema(description = "部门ID", example = "1001")
+ private Long deptId;
+
+ @Schema(description = "字典数据值-物料类型")
+ private String dictionaryDataValue;
+
+ @Schema(description = "状态编码", example = "1")
+ private String isEnable;
+
+ @Schema(description = "物料编码")
+ private String materialNumber;
+
+ @Schema(description = "物料名称")
+ private String materialName;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java
new file mode 100644
index 00000000..4d694bda
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialRespVO.java
@@ -0,0 +1,83 @@
+package com.zt.plat.module.base.controller.admin.departmentmaterial.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 组织架构物料 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class DepartmentMaterialRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5674")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "物料信息ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3923")
+ @ExcelProperty("物料信息ID")
+ private Long infomationId;
+
+ @Schema(description = "物料分类ID", example = "30114")
+ @ExcelProperty("物料分类ID")
+ private Long classesId;
+
+ @Schema(description = "字典数据值-物料类型", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("字典数据值-物料类型")
+ private String dictionaryDataValue;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "部门ID")
+ @ExcelIgnore
+ private Long deptId;
+
+ @Schema(description = "部门名称")
+ @ExcelProperty("部门名称")
+ private String deptName;
+
+ @Schema(description = "物料编码")
+ @ExcelProperty("物料编码")
+ private String materialNumber;
+
+ @Schema(description = "物料名称")
+ @ExcelProperty("物料名称")
+ private String materialName;
+
+ @Schema(description = "物料大类名称")
+ @ExcelProperty("物料大类")
+ private String categoryLargeName;
+
+ @Schema(description = "物料中类名称")
+ @ExcelProperty("物料中类")
+ private String categoryMediumName;
+
+ @Schema(description = "物料小类名称")
+ @ExcelProperty("物料小类")
+ private String categorySmallName;
+
+ @Schema(description = "物料分类路径")
+ @ExcelProperty("物料分类路径")
+ private String categoryPath;
+
+ @Schema(description = "组织物料类型名称")
+ @ExcelProperty("组织物料类型")
+ private String dictionaryDataLabel;
+
+ @Schema(description = "状态编码")
+ @ExcelProperty("状态编码")
+ private String isEnable;
+
+ @Schema(description = "状态名称")
+ @ExcelProperty("状态")
+ private String statusLabel;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialSaveReqVO.java
new file mode 100644
index 00000000..375428ab
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/departmentmaterial/vo/DepartmentMaterialSaveReqVO.java
@@ -0,0 +1,30 @@
+package com.zt.plat.module.base.controller.admin.departmentmaterial.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 组织架构物料新增/修改 Request VO")
+@Data
+public class DepartmentMaterialSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5674")
+ private Long id;
+
+ @Schema(description = "物料信息ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "3923")
+ @NotNull(message = "物料信息ID不能为空")
+ private Long infomationId;
+
+ @Schema(description = "物料分类ID", example = "30114")
+ private Long classesId;
+
+ @Schema(description = "字典数据值-物料类型", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "字典数据值-物料类型不能为空")
+ private String dictionaryDataValue;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "备注不能为空")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateCategoryController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateCategoryController.java
new file mode 100644
index 00000000..d673d013
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateCategoryController.java
@@ -0,0 +1,89 @@
+package com.zt.plat.module.base.controller.admin.doctemplate;
+
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryPageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategorySaveReqVO;
+import com.zt.plat.module.base.service.doctemplate.DocTemplateCategoryService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import java.util.List;
+
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+/**
+ * 模板分类 Controller
+ *
+ * @author 系统生成
+ */
+@Tag(name = "管理后台 - 模板分类")
+@RestController
+@RequestMapping("/base/doc-template-category")
+@Validated
+public class DocTemplateCategoryController {
+
+ @Resource
+ private DocTemplateCategoryService templateCategoryService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建模板分类")
+ @PreAuthorize("@ss.hasPermission('base:template-category:create')")
+ public CommonResult createTemplateCategory(@Valid @RequestBody DocTemplateCategorySaveReqVO createReqVO) {
+ return success(templateCategoryService.createTemplateCategory(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新模板分类")
+ @PreAuthorize("@ss.hasPermission('base:template-category:update')")
+ public CommonResult updateTemplateCategory(@Valid @RequestBody DocTemplateCategorySaveReqVO updateReqVO) {
+ templateCategoryService.updateTemplateCategory(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除模板分类")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:template-category:delete')")
+ public CommonResult deleteTemplateCategory(@RequestParam("id") Long id) {
+ templateCategoryService.deleteTemplateCategory(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得模板分类")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:template-category:query')")
+ public CommonResult getTemplateCategory(@RequestParam("id") Long id) {
+ return success(templateCategoryService.getTemplateCategory(id));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得模板分类分页")
+ @PreAuthorize("@ss.hasPermission('base:template-category:query')")
+ public CommonResult> getTemplateCategoryPage(@Valid DocTemplateCategoryPageReqVO pageReqVO) {
+ return success(templateCategoryService.getTemplateCategoryPage(pageReqVO));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得模板分类列表")
+ @PreAuthorize("@ss.hasPermission('base:template-category:query')")
+ public CommonResult> getTemplateCategoryList() {
+ return success(templateCategoryService.getTemplateCategoryList());
+ }
+
+ @GetMapping("/tree")
+ @Operation(summary = "获得模板分类树形结构")
+ @PreAuthorize("@ss.hasPermission('base:template-category:query')")
+ public CommonResult> getTemplateCategoryTree() {
+ return success(templateCategoryService.buildTree());
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateController.java
new file mode 100644
index 00000000..0b23670e
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateController.java
@@ -0,0 +1,82 @@
+package com.zt.plat.module.base.controller.admin.doctemplate;
+
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplatePageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateSaveReqVO;
+import com.zt.plat.module.base.service.doctemplate.DocTemplateService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import java.util.List;
+
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+/**
+ * 模板 Controller
+ *
+ * @author 系统生成
+ */
+@Tag(name = "管理后台 - 模板")
+@RestController
+@RequestMapping("/base/doc-template")
+@Validated
+public class DocTemplateController {
+
+ @Resource
+ private DocTemplateService templateService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建模板")
+ @PreAuthorize("@ss.hasPermission('base:template:create')")
+ public CommonResult createTemplate(@Valid @RequestBody DocTemplateSaveReqVO createReqVO) {
+ return success(templateService.createTemplate(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新模板")
+ @PreAuthorize("@ss.hasPermission('base:template:update')")
+ public CommonResult updateTemplate(@Valid @RequestBody DocTemplateSaveReqVO updateReqVO) {
+ templateService.updateTemplate(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除模板")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:template:delete')")
+ public CommonResult deleteTemplate(@RequestParam("id") Long id) {
+ templateService.deleteTemplate(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得模板")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:template:query')")
+ public CommonResult getTemplate(@RequestParam("id") Long id) {
+ return success(templateService.getTemplate(id));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得模板分页")
+ @PreAuthorize("@ss.hasPermission('base:template:query')")
+ public CommonResult> getTemplatePage(@Valid DocTemplatePageReqVO pageReqVO) {
+ return success(templateService.getTemplatePage(pageReqVO));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得模板列表")
+ @PreAuthorize("@ss.hasPermission('base:template:query')")
+ public CommonResult> getTemplateList() {
+ return success(templateService.getTemplateList());
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateInstanceController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateInstanceController.java
new file mode 100644
index 00000000..4b3b5132
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateInstanceController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.doctemplate;
+
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstancePageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceSaveReqVO;
+import com.zt.plat.module.base.service.doctemplate.DocTemplateInstanceService;
+import com.zt.plat.module.base.service.doctemplate.DocTemplateRenderService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import java.util.List;
+import java.util.Map;
+
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+/**
+ * 模板实例 Controller
+ *
+ * @author 系统生成
+ */
+@Tag(name = "管理后台 - 模板实例")
+@RestController
+@RequestMapping("/base/doc-template-instance")
+@Validated
+public class DocTemplateInstanceController {
+
+ @Resource
+ private DocTemplateInstanceService templateInstanceService;
+
+ @Resource
+ private DocTemplateRenderService renderService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建模板实例")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:create')")
+ public CommonResult createTemplateInstance(@Valid @RequestBody DocTemplateInstanceSaveReqVO createReqVO) {
+ return success(templateInstanceService.createTemplateInstance(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新模板实例")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:update')")
+ public CommonResult updateTemplateInstance(@Valid @RequestBody DocTemplateInstanceSaveReqVO updateReqVO) {
+ templateInstanceService.updateTemplateInstance(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除模板实例")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:template-instance:delete')")
+ public CommonResult deleteTemplateInstance(@RequestParam("id") Long id) {
+ templateInstanceService.deleteTemplateInstance(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得模板实例")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:query')")
+ public CommonResult getTemplateInstance(@RequestParam("id") Long id) {
+ return success(templateInstanceService.getTemplateInstance(id));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得模板实例分页")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:query')")
+ public CommonResult> getTemplateInstancePage(@Valid DocTemplateInstancePageReqVO pageReqVO) {
+ return success(templateInstanceService.getTemplateInstancePage(pageReqVO));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得模板实例列表")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:query')")
+ public CommonResult> getTemplateInstanceList() {
+ return success(templateInstanceService.getTemplateInstanceList());
+ }
+
+ @PostMapping("/render")
+ @Operation(summary = "渲染模板实例")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:query')")
+ public CommonResult renderTemplateInstance(
+ @Parameter(name = "instanceId", description = "实例ID", required = true) @RequestParam("instanceId") Long instanceId,
+ @Parameter(name = "dataMap", description = "数据Map") @RequestBody(required = false) Map dataMap) {
+ String renderedContent = renderService.render(null, instanceId, null, dataMap);
+ return success(renderedContent);
+ }
+
+ @PostMapping("/render-and-save")
+ @Operation(summary = "渲染并保存模板实例")
+ @PreAuthorize("@ss.hasPermission('base:template-instance:update')")
+ public CommonResult renderAndSaveTemplateInstance(
+ @Parameter(name = "instanceId", description = "实例ID", required = true) @RequestParam("instanceId") Long instanceId,
+ @Parameter(name = "dataMap", description = "数据Map", required = true) @RequestBody Map dataMap) {
+ renderService.renderAndSave(instanceId, dataMap);
+ return success(true);
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateTagController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateTagController.java
new file mode 100644
index 00000000..25e2ecfd
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/DocTemplateTagController.java
@@ -0,0 +1,82 @@
+package com.zt.plat.module.base.controller.admin.doctemplate;
+
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagPageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagSaveReqVO;
+import com.zt.plat.module.base.service.doctemplate.DocTemplateTagService;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import jakarta.annotation.Resource;
+import jakarta.validation.Valid;
+import java.util.List;
+
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+/**
+ * 标签库 Controller
+ *
+ * @author 系统生成
+ */
+@Tag(name = "管理后台 - 标签库")
+@RestController
+@RequestMapping("/base/doc-template-tag")
+@Validated
+public class DocTemplateTagController {
+
+ @Resource
+ private DocTemplateTagService templateTagService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建标签")
+ @PreAuthorize("@ss.hasPermission('base:template-tag:create')")
+ public CommonResult createTemplateTag(@Valid @RequestBody DocTemplateTagSaveReqVO createReqVO) {
+ return success(templateTagService.createTemplateTag(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新标签")
+ @PreAuthorize("@ss.hasPermission('base:template-tag:update')")
+ public CommonResult updateTemplateTag(@Valid @RequestBody DocTemplateTagSaveReqVO updateReqVO) {
+ templateTagService.updateTemplateTag(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除标签")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:template-tag:delete')")
+ public CommonResult deleteTemplateTag(@RequestParam("id") Long id) {
+ templateTagService.deleteTemplateTag(id);
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得标签")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:template-tag:query')")
+ public CommonResult getTemplateTag(@RequestParam("id") Long id) {
+ return success(templateTagService.getTemplateTag(id));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得标签分页")
+ @PreAuthorize("@ss.hasPermission('base:template-tag:query')")
+ public CommonResult> getTemplateTagPage(@Valid DocTemplateTagPageReqVO pageReqVO) {
+ return success(templateTagService.getTemplateTagPage(pageReqVO));
+ }
+
+ @GetMapping("/list")
+ @Operation(summary = "获得标签列表")
+ @PreAuthorize("@ss.hasPermission('base:template-tag:query')")
+ public CommonResult> getTemplateTagList() {
+ return success(templateTagService.getTemplateTagList());
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategoryPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategoryPageReqVO.java
new file mode 100644
index 00000000..da89763e
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategoryPageReqVO.java
@@ -0,0 +1,27 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import com.zt.plat.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 模板分类分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DocTemplateCategoryPageReqVO extends PageParam {
+
+ @Schema(description = "分类名称", example = "采购类")
+ private String categoryName;
+
+ @Schema(description = "分类编码", example = "PURCHASE")
+ private String categoryCode;
+
+ @Schema(description = "父分类ID", example = "1")
+ private Long parentId;
+
+ @Schema(description = "层级(1=大类,2=小类)", example = "1")
+ private Integer level;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategoryRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategoryRespVO.java
new file mode 100644
index 00000000..fe742441
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategoryRespVO.java
@@ -0,0 +1,43 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Schema(description = "管理后台 - 模板分类 Response VO")
+@Data
+public class DocTemplateCategoryRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "采购类")
+ private String categoryName;
+
+ @Schema(description = "分类编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PURCHASE")
+ private String categoryCode;
+
+ @Schema(description = "父分类ID", example = "1")
+ private Long parentId;
+
+ @Schema(description = "层级(1=大类,2=小类)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Integer level;
+
+ @Schema(description = "排序号", example = "1")
+ private Integer sort;
+
+ @Schema(description = "备注", example = "采购业务相关文档分类")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+ @Schema(description = "创建人", example = "admin")
+ private String creator;
+
+ @Schema(description = "子分类列表")
+ private List children;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategorySaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategorySaveReqVO.java
new file mode 100644
index 00000000..21217ac2
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateCategorySaveReqVO.java
@@ -0,0 +1,37 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 模板分类新增/修改 Request VO")
+@Data
+public class DocTemplateCategorySaveReqVO {
+
+ @Schema(description = "主键", example = "1024")
+ private Long id;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "采购类")
+ @NotBlank(message = "分类名称不能为空")
+ private String categoryName;
+
+ @Schema(description = "分类编码", requiredMode = Schema.RequiredMode.REQUIRED, example = "PURCHASE")
+ @NotBlank(message = "分类编码不能为空")
+ private String categoryCode;
+
+ @Schema(description = "父分类ID", example = "1")
+ private Long parentId;
+
+ @Schema(description = "层级(1=大类,2=小类)", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "层级不能为空")
+ private Integer level;
+
+ @Schema(description = "排序号", example = "1")
+ private Integer sort;
+
+ @Schema(description = "备注", example = "采购业务相关文档分类")
+ private String remark;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstancePageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstancePageReqVO.java
new file mode 100644
index 00000000..ab6f3cb4
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstancePageReqVO.java
@@ -0,0 +1,36 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import com.zt.plat.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 模板实例分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DocTemplateInstancePageReqVO extends PageParam {
+
+ @Schema(description = "实例名称", example = "采购合同")
+ private String instanceName;
+
+ @Schema(description = "模板ID", example = "1")
+ private Long templateId;
+
+ @Schema(description = "业务关联类型", example = "contract")
+ private String businessType;
+
+ @Schema(description = "状态", example = "draft")
+ private String status;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstanceRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstanceRespVO.java
new file mode 100644
index 00000000..b27bab09
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstanceRespVO.java
@@ -0,0 +1,51 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 模板实例 Response VO")
+@Data
+public class DocTemplateInstanceRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "2025年上海XX供应商采购合同")
+ private String instanceName;
+
+ @Schema(description = "实例编码", example = "DOC-20250127-001")
+ private String instanceCode;
+
+ @Schema(description = "引用的模板ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long templateId;
+
+ @Schema(description = "业务关联类型", example = "contract")
+ private String businessType;
+
+ @Schema(description = "业务关联ID", example = "100")
+ private Long businessId;
+
+ @Schema(description = "业务关联标签", example = "PC-2025-001")
+ private String businessLabel;
+
+ @Schema(description = "用户编辑后的内容")
+ private String editedContent;
+
+ @Schema(description = "渲染后的最终内容")
+ private String renderedContent;
+
+ @Schema(description = "备注", example = "采购合同文档")
+ private String remark;
+
+ @Schema(description = "状态", example = "draft")
+ private String status;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+ @Schema(description = "创建人", example = "admin")
+ private String creator;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstanceSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstanceSaveReqVO.java
new file mode 100644
index 00000000..49e0a137
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateInstanceSaveReqVO.java
@@ -0,0 +1,49 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 模板实例新增/修改 Request VO")
+@Data
+public class DocTemplateInstanceSaveReqVO {
+
+ @Schema(description = "主键", example = "1024")
+ private Long id;
+
+ @Schema(description = "实例名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "2025年上海XX供应商采购合同")
+ @NotBlank(message = "实例名称不能为空")
+ private String instanceName;
+
+ @Schema(description = "实例编码", example = "DOC-20250127-001")
+ private String instanceCode;
+
+ @Schema(description = "引用的模板ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "模板ID不能为空")
+ private Long templateId;
+
+ @Schema(description = "业务关联类型", example = "contract")
+ private String businessType;
+
+ @Schema(description = "业务关联ID", example = "100")
+ private Long businessId;
+
+ @Schema(description = "业务关联标签", example = "PC-2025-001")
+ private String businessLabel;
+
+ @Schema(description = "用户编辑后的内容", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "内容不能为空")
+ private String editedContent;
+
+ @Schema(description = "渲染后的最终内容")
+ private String renderedContent;
+
+ @Schema(description = "备注", example = "采购合同文档")
+ private String remark;
+
+ @Schema(description = "状态", example = "draft")
+ private String status;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplatePageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplatePageReqVO.java
new file mode 100644
index 00000000..ee8f37c8
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplatePageReqVO.java
@@ -0,0 +1,39 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import com.zt.plat.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 模板分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DocTemplatePageReqVO extends PageParam {
+
+ @Schema(description = "模板名称", example = "采购合同模板")
+ private String tmplName;
+
+ @Schema(description = "模板编码", example = "PO_CONTRACT_001")
+ private String tmplCode;
+
+ @Schema(description = "所属大类", example = "1")
+ private Long bigCategoryId;
+
+ @Schema(description = "所属小类", example = "11")
+ private Long smallCategoryId;
+
+ @Schema(description = "状态(1=启用,0=停用,2=草稿)", example = "1")
+ private String enabled;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateRespVO.java
new file mode 100644
index 00000000..3a86c8e8
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateRespVO.java
@@ -0,0 +1,57 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 模板 Response VO")
+@Data
+public class DocTemplateRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "采购合同模板")
+ private String tmplName;
+
+ @Schema(description = "模板编码(唯一)", requiredMode = Schema.RequiredMode.REQUIRED, example = "PO_CONTRACT_001")
+ private String tmplCode;
+
+ @Schema(description = "模板图标", example = "📄")
+ private String icon;
+
+ @Schema(description = "所属大类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ private Long bigCategoryId;
+
+ @Schema(description = "所属小类", example = "11")
+ private Long smallCategoryId;
+
+ @Schema(description = "版本号", example = "v1.2")
+ private String version;
+
+ @Schema(description = "模板描述", example = "标准采购合同范本")
+ private String description;
+
+ @Schema(description = "模板内容(HTML,含占位符)", requiredMode = Schema.RequiredMode.REQUIRED)
+ private String content;
+
+ @Schema(description = "SQL配置(JSON格式,可选)")
+ private String sqlConfig;
+
+ @Schema(description = "数据源标识", example = "default")
+ private String dataSource;
+
+ @Schema(description = "使用次数", example = "10")
+ private Integer useCount;
+
+ @Schema(description = "状态(1=启用,0=停用,2=草稿)", example = "1")
+ private String enabled;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+ @Schema(description = "创建人", example = "admin")
+ private String creator;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateSaveReqVO.java
new file mode 100644
index 00000000..19003af9
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateSaveReqVO.java
@@ -0,0 +1,53 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+import jakarta.validation.constraints.NotNull;
+
+@Schema(description = "管理后台 - 模板新增/修改 Request VO")
+@Data
+public class DocTemplateSaveReqVO {
+
+ @Schema(description = "主键", example = "1024")
+ private Long id;
+
+ @Schema(description = "模板名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "采购合同模板")
+ @NotBlank(message = "模板名称不能为空")
+ private String tmplName;
+
+ @Schema(description = "模板编码(唯一)", requiredMode = Schema.RequiredMode.REQUIRED, example = "PO_CONTRACT_001")
+ @NotBlank(message = "模板编码不能为空")
+ private String tmplCode;
+
+ @Schema(description = "模板图标", example = "📄")
+ private String icon;
+
+ @Schema(description = "所属大类", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotNull(message = "所属大类不能为空")
+ private Long bigCategoryId;
+
+ @Schema(description = "所属小类", example = "11")
+ private Long smallCategoryId;
+
+ @Schema(description = "版本号", example = "v1.2")
+ private String version;
+
+ @Schema(description = "模板描述", example = "标准采购合同范本")
+ private String description;
+
+ @Schema(description = "模板内容(HTML,含占位符)", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotBlank(message = "模板内容不能为空")
+ private String content;
+
+ @Schema(description = "SQL配置(JSON格式,可选)")
+ private String sqlConfig;
+
+ @Schema(description = "数据源标识", example = "default")
+ private String dataSource;
+
+ @Schema(description = "状态(1=启用,0=停用,2=草稿)", example = "2")
+ private String enabled;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagPageReqVO.java
new file mode 100644
index 00000000..8d7f9220
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagPageReqVO.java
@@ -0,0 +1,27 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import com.zt.plat.framework.common.pojo.PageParam;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.ToString;
+
+@Schema(description = "管理后台 - 标签库分页 Request VO")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+public class DocTemplateTagPageReqVO extends PageParam {
+
+ @Schema(description = "标签名称", example = "合同编号")
+ private String tagName;
+
+ @Schema(description = "标签编码", example = "contractNo")
+ private String tagCode;
+
+ @Schema(description = "所属分类ID", example = "1")
+ private Long categoryId;
+
+ @Schema(description = "是否启用(1=启用,0=停用)", example = "1")
+ private String enabled;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagRespVO.java
new file mode 100644
index 00000000..9c031389
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagRespVO.java
@@ -0,0 +1,63 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 标签库 Response VO")
+@Data
+public class DocTemplateTagRespVO {
+
+ @Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "1024")
+ private Long id;
+
+ @Schema(description = "标签名称(中文)", requiredMode = Schema.RequiredMode.REQUIRED, example = "合同编号")
+ private String tagName;
+
+ @Schema(description = "标签编码(Velocity变量名)", requiredMode = Schema.RequiredMode.REQUIRED, example = "contractNo")
+ private String tagCode;
+
+ @Schema(description = "所属分类ID", example = "1")
+ private Long categoryId;
+
+ @Schema(description = "所属分类名称", example = "合同管理")
+ private String categoryName;
+
+ @Schema(description = "数据类型", example = "String")
+ private String dataType;
+
+ @Schema(description = "默认值", example = "")
+ private String defaultValue;
+
+ @Schema(description = "SQL脚本(可选,仅保存参考)", example = "SELECT contract_no FROM contract_main WHERE id = #{businessId}")
+ private String sqlScript;
+
+ @Schema(description = "描述", example = "合同主表的合同编号字段")
+ private String description;
+
+ @Schema(description = "排序号", example = "1")
+ private Integer sort;
+
+ @Schema(description = "是否启用(1=启用,0=停用)", example = "1")
+ private String enabled;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ private LocalDateTime createTime;
+
+ @Schema(description = "创建人ID", example = "1")
+ private String creator;
+
+ @Schema(description = "创建人名称", example = "管理员")
+ private String creatorName;
+
+ @Schema(description = "更新时间")
+ private LocalDateTime updateTime;
+
+ @Schema(description = "更新人ID", example = "1")
+ private String updater;
+
+ @Schema(description = "更新人名称", example = "管理员")
+ private String updaterName;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagSaveReqVO.java
new file mode 100644
index 00000000..4e066018
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/doctemplate/vo/DocTemplateTagSaveReqVO.java
@@ -0,0 +1,44 @@
+package com.zt.plat.module.base.controller.admin.doctemplate.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import jakarta.validation.constraints.NotBlank;
+
+@Schema(description = "管理后台 - 标签库新增/修改 Request VO")
+@Data
+public class DocTemplateTagSaveReqVO {
+
+ @Schema(description = "主键", example = "1024")
+ private Long id;
+
+ @Schema(description = "标签名称(中文)", requiredMode = Schema.RequiredMode.REQUIRED, example = "合同编号")
+ @NotBlank(message = "标签名称不能为空")
+ private String tagName;
+
+ @Schema(description = "标签编码(Velocity变量名)", requiredMode = Schema.RequiredMode.REQUIRED, example = "contractNo")
+ @NotBlank(message = "标签编码不能为空")
+ private String tagCode;
+
+ @Schema(description = "所属分类ID", example = "1")
+ private Long categoryId;
+
+ @Schema(description = "数据类型", example = "String")
+ private String dataType;
+
+ @Schema(description = "默认值", example = "")
+ private String defaultValue;
+
+ @Schema(description = "SQL脚本(可选,仅保存参考)", example = "SELECT contract_no FROM contract_main WHERE id = #{businessId}")
+ private String sqlScript;
+
+ @Schema(description = "描述", example = "合同主表的合同编号字段")
+ private String description;
+
+ @Schema(description = "排序号", example = "1")
+ private Integer sort;
+
+ @Schema(description = "是否启用(1=启用,0=停用)", example = "1")
+ private String enabled;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/MaterialClassesController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/MaterialClassesController.java
new file mode 100644
index 00000000..acb855ed
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/MaterialClassesController.java
@@ -0,0 +1,138 @@
+package com.zt.plat.module.base.controller.admin.materialclasses;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.materialclasses.vo.*;
+import com.zt.plat.module.base.dal.dataobject.materialclasses.MaterialClassesDO;
+import com.zt.plat.module.base.service.materialclasses.MaterialClassesService;
+
+@Tag(name = "管理后台 - 物料分类")
+@RestController
+@RequestMapping("/base/material-classes")
+@Validated
+public class MaterialClassesController {
+
+
+ @Resource
+ private MaterialClassesService materialClassesService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建物料分类")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:create')")
+ public CommonResult createMaterialClasses(@Valid @RequestBody MaterialClassesSaveReqVO createReqVO) {
+ return success(materialClassesService.createMaterialClasses(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新物料分类")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:update')")
+ public CommonResult updateMaterialClasses(@Valid @RequestBody MaterialClassesSaveReqVO updateReqVO) {
+ materialClassesService.updateMaterialClasses(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除物料分类")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:material-classes:delete')")
+ public CommonResult deleteMaterialClasses(@RequestParam("id") Long id) {
+ materialClassesService.deleteMaterialClasses(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除物料分类")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:delete')")
+ public CommonResult deleteMaterialClassesList(@RequestBody BatchDeleteReqVO req) {
+ materialClassesService.deleteMaterialClassesListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得物料分类")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:query')")
+ public CommonResult getMaterialClasses(@RequestParam("id") Long id) {
+ MaterialClassesDO materialClasses = materialClassesService.getMaterialClasses(id);
+ return success(BeanUtils.toBean(materialClasses, MaterialClassesRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得物料分类分页")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:query')")
+ public CommonResult> getMaterialClassesPage(@Valid MaterialClassesPageReqVO pageReqVO) {
+ PageResult pageResult = materialClassesService.getMaterialClassesPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, MaterialClassesRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出物料分类 Excel")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportMaterialClassesExcel(@Valid MaterialClassesPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = materialClassesService.getMaterialClassesPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "物料分类.xls", "数据", MaterialClassesRespVO.class,
+ BeanUtils.toBean(list, MaterialClassesRespVO.class));
+ }
+
+ @GetMapping("/tree")
+ @Operation(summary = "获得物料分类树")
+ @PreAuthorize("@ss.hasPermission('base:material-classes:query')")
+ public CommonResult> getMaterialClassesTree() {
+ List list = materialClassesService.getMaterialClassesList();
+ return success(buildTree(list));
+ }
+
+ private List buildTree(List list) {
+ if (list == null || list.isEmpty()) {
+ return Collections.emptyList();
+ }
+ Map nodeMap = new LinkedHashMap<>();
+ list.stream()
+ .sorted(Comparator.comparing(MaterialClassesDO::getId))
+ .forEach(item -> {
+ MaterialClassesTreeRespVO node = BeanUtils.toBean(item, MaterialClassesTreeRespVO.class);
+ nodeMap.put(node.getId(), node);
+ });
+ List roots = new ArrayList<>();
+ nodeMap.values().forEach(node -> {
+ Long parentId = node.getParentId();
+ if (parentId == null || parentId == 0 || !nodeMap.containsKey(parentId)) {
+ roots.add(node);
+ } else {
+ nodeMap.get(parentId).getChildren().add(node);
+ }
+ });
+ return roots;
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesPageReqVO.java
new file mode 100644
index 00000000..60683023
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesPageReqVO.java
@@ -0,0 +1,35 @@
+package com.zt.plat.module.base.controller.admin.materialclasses.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 物料分类分页 Request VO")
+@Data
+public class MaterialClassesPageReqVO extends PageParam {
+
+ @Schema(description = "父级ID", example = "20706")
+ private Long parentId;
+
+ @Schema(description = "分类编码")
+ private String code;
+
+ @Schema(description = "分类名称", example = "赵六")
+ private String name;
+
+ @Schema(description = "分类级别-用于类别层级(大/中/小类)")
+ private Long level;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesRespVO.java
new file mode 100644
index 00000000..a4825a72
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesRespVO.java
@@ -0,0 +1,43 @@
+package com.zt.plat.module.base.controller.admin.materialclasses.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 物料分类 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MaterialClassesRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4051")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "父级ID", example = "20706")
+ @ExcelProperty("父级ID")
+ private Long parentId;
+
+ @Schema(description = "分类编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("分类编码")
+ private String code;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @ExcelProperty("分类名称")
+ private String name;
+
+ @Schema(description = "分类级别-用于类别层级(大/中/小类)")
+ @ExcelProperty("分类级别-用于类别层级(大/中/小类)")
+ private Long level;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesSaveReqVO.java
new file mode 100644
index 00000000..92ffea06
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesSaveReqVO.java
@@ -0,0 +1,33 @@
+package com.zt.plat.module.base.controller.admin.materialclasses.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 物料分类新增/修改 Request VO")
+@Data
+public class MaterialClassesSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "4051")
+ private Long id;
+
+ @Schema(description = "父级ID", example = "20706")
+ private Long parentId;
+
+ @Schema(description = "分类编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "分类编码不能为空")
+ private String code;
+
+ @Schema(description = "分类名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @NotEmpty(message = "分类名称不能为空")
+ private String name;
+
+ @Schema(description = "分类级别-用于类别层级(大/中/小类)")
+ private Long level;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "备注不能为空")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesTreeRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesTreeRespVO.java
new file mode 100644
index 00000000..f47d2151
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialclasses/vo/MaterialClassesTreeRespVO.java
@@ -0,0 +1,33 @@
+package com.zt.plat.module.base.controller.admin.materialclasses.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Schema(description = "管理后台 - 物料分类树节点 Response VO")
+@Data
+public class MaterialClassesTreeRespVO {
+
+ @Schema(description = "主键ID", example = "1001")
+ private Long id;
+
+ @Schema(description = "父级ID", example = "0")
+ private Long parentId;
+
+ @Schema(description = "分类编码", example = "CL-001")
+ private String code;
+
+ @Schema(description = "分类名称", example = "原材料")
+ private String name;
+
+ @Schema(description = "分类级别")
+ private Long level;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "子节点")
+ private List children = new ArrayList<>();
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/MaterialHasClassesController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/MaterialHasClassesController.java
new file mode 100644
index 00000000..2dcc8418
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/MaterialHasClassesController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.materialhasclasses;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.materialhasclasses.vo.*;
+import com.zt.plat.module.base.dal.dataobject.materialhasclasses.MaterialHasClassesDO;
+import com.zt.plat.module.base.service.materialhasclasses.MaterialHasClassesService;
+
+@Tag(name = "管理后台 - 物料持有分类")
+@RestController
+@RequestMapping("/base/material-has-classes")
+@Validated
+public class MaterialHasClassesController {
+
+
+ @Resource
+ private MaterialHasClassesService materialHasClassesService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建物料持有分类")
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:create')")
+ public CommonResult createMaterialHasClasses(@Valid @RequestBody MaterialHasClassesSaveReqVO createReqVO) {
+ return success(materialHasClassesService.createMaterialHasClasses(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新物料持有分类")
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:update')")
+ public CommonResult updateMaterialHasClasses(@Valid @RequestBody MaterialHasClassesSaveReqVO updateReqVO) {
+ materialHasClassesService.updateMaterialHasClasses(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除物料持有分类")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:delete')")
+ public CommonResult deleteMaterialHasClasses(@RequestParam("id") Long id) {
+ materialHasClassesService.deleteMaterialHasClasses(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除物料持有分类")
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:delete')")
+ public CommonResult deleteMaterialHasClassesList(@RequestBody BatchDeleteReqVO req) {
+ materialHasClassesService.deleteMaterialHasClassesListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得物料持有分类")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:query')")
+ public CommonResult getMaterialHasClasses(@RequestParam("id") Long id) {
+ MaterialHasClassesDO materialHasClasses = materialHasClassesService.getMaterialHasClasses(id);
+ return success(BeanUtils.toBean(materialHasClasses, MaterialHasClassesRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得物料持有分类分页")
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:query')")
+ public CommonResult> getMaterialHasClassesPage(@Valid MaterialHasClassesPageReqVO pageReqVO) {
+ PageResult pageResult = materialHasClassesService.getMaterialHasClassesPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, MaterialHasClassesRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出物料持有分类 Excel")
+ @PreAuthorize("@ss.hasPermission('base:material-has-classes:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportMaterialHasClassesExcel(@Valid MaterialHasClassesPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = materialHasClassesService.getMaterialHasClassesPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "物料持有分类.xls", "数据", MaterialHasClassesRespVO.class,
+ BeanUtils.toBean(list, MaterialHasClassesRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesPageReqVO.java
new file mode 100644
index 00000000..3f5efd1e
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesPageReqVO.java
@@ -0,0 +1,26 @@
+package com.zt.plat.module.base.controller.admin.materialhasclasses.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 物料持有分类分页 Request VO")
+@Data
+public class MaterialHasClassesPageReqVO extends PageParam {
+
+ @Schema(description = "物料信息ID", example = "31031")
+ private Long infomationId;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "分类ID", example = "5914")
+ private Long classesId;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesRespVO.java
new file mode 100644
index 00000000..b5d6bdcc
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesRespVO.java
@@ -0,0 +1,31 @@
+package com.zt.plat.module.base.controller.admin.materialhasclasses.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 物料持有分类 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MaterialHasClassesRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16228")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "物料信息ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31031")
+ @ExcelProperty("物料信息ID")
+ private Long infomationId;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5914")
+ @ExcelProperty("分类ID")
+ private Long classesId;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesSaveReqVO.java
new file mode 100644
index 00000000..1c0dbbc6
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasclasses/vo/MaterialHasClassesSaveReqVO.java
@@ -0,0 +1,23 @@
+package com.zt.plat.module.base.controller.admin.materialhasclasses.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 物料持有分类新增/修改 Request VO")
+@Data
+public class MaterialHasClassesSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16228")
+ private Long id;
+
+ @Schema(description = "物料信息ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "31031")
+ @NotNull(message = "物料信息ID不能为空")
+ private Long infomationId;
+
+ @Schema(description = "分类ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "5914")
+ @NotNull(message = "分类ID不能为空")
+ private Long classesId;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/MaterialHasPropertiesController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/MaterialHasPropertiesController.java
new file mode 100644
index 00000000..74cd3366
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/MaterialHasPropertiesController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.materialhasproperties;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.materialhasproperties.vo.*;
+import com.zt.plat.module.base.dal.dataobject.materialhasproperties.MaterialHasPropertiesDO;
+import com.zt.plat.module.base.service.materialhasproperties.MaterialHasPropertiesService;
+
+@Tag(name = "管理后台 - 物料持有属性")
+@RestController
+@RequestMapping("/base/material-has-properties")
+@Validated
+public class MaterialHasPropertiesController {
+
+
+ @Resource
+ private MaterialHasPropertiesService materialHasPropertiesService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建物料持有属性")
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:create')")
+ public CommonResult createMaterialHasProperties(@Valid @RequestBody MaterialHasPropertiesSaveReqVO createReqVO) {
+ return success(materialHasPropertiesService.createMaterialHasProperties(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新物料持有属性")
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:update')")
+ public CommonResult updateMaterialHasProperties(@Valid @RequestBody MaterialHasPropertiesSaveReqVO updateReqVO) {
+ materialHasPropertiesService.updateMaterialHasProperties(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除物料持有属性")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:delete')")
+ public CommonResult deleteMaterialHasProperties(@RequestParam("id") Long id) {
+ materialHasPropertiesService.deleteMaterialHasProperties(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除物料持有属性")
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:delete')")
+ public CommonResult deleteMaterialHasPropertiesList(@RequestBody BatchDeleteReqVO req) {
+ materialHasPropertiesService.deleteMaterialHasPropertiesListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得物料持有属性")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:query')")
+ public CommonResult getMaterialHasProperties(@RequestParam("id") Long id) {
+ MaterialHasPropertiesDO materialHasProperties = materialHasPropertiesService.getMaterialHasProperties(id);
+ return success(BeanUtils.toBean(materialHasProperties, MaterialHasPropertiesRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得物料持有属性分页")
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:query')")
+ public CommonResult> getMaterialHasPropertiesPage(@Valid MaterialHasPropertiesPageReqVO pageReqVO) {
+ PageResult pageResult = materialHasPropertiesService.getMaterialHasPropertiesPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, MaterialHasPropertiesRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出物料持有属性 Excel")
+ @PreAuthorize("@ss.hasPermission('base:material-has-properties:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportMaterialHasPropertiesExcel(@Valid MaterialHasPropertiesPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = materialHasPropertiesService.getMaterialHasPropertiesPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "物料持有属性.xls", "数据", MaterialHasPropertiesRespVO.class,
+ BeanUtils.toBean(list, MaterialHasPropertiesRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesPageReqVO.java
new file mode 100644
index 00000000..f1a33498
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesPageReqVO.java
@@ -0,0 +1,41 @@
+package com.zt.plat.module.base.controller.admin.materialhasproperties.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 物料持有属性分页 Request VO")
+@Data
+public class MaterialHasPropertiesPageReqVO extends PageParam {
+
+ @Schema(description = "物料信息ID", example = "2614")
+ private Long infomationId;
+
+ @Schema(description = "属性ID", example = "8607")
+ private Long propertiesId;
+
+ @Schema(description = "计量单位ID-默认计量单位", example = "23731")
+ private Long unitId;
+
+ @Schema(description = "属性值")
+ private String value;
+
+ @Schema(description = "是否关键属性-关键属性表示物料唯一性")
+ private Integer isKey;
+
+ @Schema(description = "是否计量定价")
+ private Integer isMetering;
+
+ @Schema(description = "排序号")
+ private Long sort;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesRespVO.java
new file mode 100644
index 00000000..79cdc7a6
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesRespVO.java
@@ -0,0 +1,51 @@
+package com.zt.plat.module.base.controller.admin.materialhasproperties.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 物料持有属性 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MaterialHasPropertiesRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6800")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "物料信息ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2614")
+ @ExcelProperty("物料信息ID")
+ private Long infomationId;
+
+ @Schema(description = "属性ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8607")
+ @ExcelProperty("属性ID")
+ private Long propertiesId;
+
+ @Schema(description = "计量单位ID-默认计量单位", example = "23731")
+ @ExcelProperty("计量单位ID-默认计量单位")
+ private Long unitId;
+
+ @Schema(description = "属性值", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("属性值")
+ private String value;
+
+ @Schema(description = "是否关键属性-关键属性表示物料唯一性")
+ @ExcelProperty("是否关键属性-关键属性表示物料唯一性")
+ private Integer isKey;
+
+ @Schema(description = "是否计量定价")
+ @ExcelProperty("是否计量定价")
+ private Integer isMetering;
+
+ @Schema(description = "排序号")
+ @ExcelProperty("排序号")
+ private Long sort;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesSaveReqVO.java
new file mode 100644
index 00000000..e3092ab7
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialhasproperties/vo/MaterialHasPropertiesSaveReqVO.java
@@ -0,0 +1,39 @@
+package com.zt.plat.module.base.controller.admin.materialhasproperties.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 物料持有属性新增/修改 Request VO")
+@Data
+public class MaterialHasPropertiesSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "6800")
+ private Long id;
+
+ @Schema(description = "物料信息ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "2614")
+ @NotNull(message = "物料信息ID不能为空")
+ private Long infomationId;
+
+ @Schema(description = "属性ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "8607")
+ @NotNull(message = "属性ID不能为空")
+ private Long propertiesId;
+
+ @Schema(description = "计量单位ID-默认计量单位", example = "23731")
+ private Long unitId;
+
+ @Schema(description = "属性值", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "属性值不能为空")
+ private String value;
+
+ @Schema(description = "是否关键属性-关键属性表示物料唯一性")
+ private Integer isKey;
+
+ @Schema(description = "是否计量定价")
+ private Integer isMetering;
+
+ @Schema(description = "排序号")
+ private Long sort;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/MaterialPropertiesController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/MaterialPropertiesController.java
new file mode 100644
index 00000000..09290736
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/MaterialPropertiesController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.materialproperties;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.materialproperties.vo.*;
+import com.zt.plat.module.base.dal.dataobject.materialproperties.MaterialPropertiesDO;
+import com.zt.plat.module.base.service.materialproperties.MaterialPropertiesService;
+
+@Tag(name = "管理后台 - 物料属性")
+@RestController
+@RequestMapping("/base/material-properties")
+@Validated
+public class MaterialPropertiesController {
+
+
+ @Resource
+ private MaterialPropertiesService materialPropertiesService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建物料属性")
+ @PreAuthorize("@ss.hasPermission('base:material-properties:create')")
+ public CommonResult createMaterialProperties(@Valid @RequestBody MaterialPropertiesSaveReqVO createReqVO) {
+ return success(materialPropertiesService.createMaterialProperties(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新物料属性")
+ @PreAuthorize("@ss.hasPermission('base:material-properties:update')")
+ public CommonResult updateMaterialProperties(@Valid @RequestBody MaterialPropertiesSaveReqVO updateReqVO) {
+ materialPropertiesService.updateMaterialProperties(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除物料属性")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:material-properties:delete')")
+ public CommonResult deleteMaterialProperties(@RequestParam("id") Long id) {
+ materialPropertiesService.deleteMaterialProperties(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除物料属性")
+ @PreAuthorize("@ss.hasPermission('base:material-properties:delete')")
+ public CommonResult deleteMaterialPropertiesList(@RequestBody BatchDeleteReqVO req) {
+ materialPropertiesService.deleteMaterialPropertiesListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得物料属性")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:material-properties:query')")
+ public CommonResult getMaterialProperties(@RequestParam("id") Long id) {
+ MaterialPropertiesDO materialProperties = materialPropertiesService.getMaterialProperties(id);
+ return success(BeanUtils.toBean(materialProperties, MaterialPropertiesRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得物料属性分页")
+ @PreAuthorize("@ss.hasPermission('base:material-properties:query')")
+ public CommonResult> getMaterialPropertiesPage(@Valid MaterialPropertiesPageReqVO pageReqVO) {
+ PageResult pageResult = materialPropertiesService.getMaterialPropertiesPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, MaterialPropertiesRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出物料属性 Excel")
+ @PreAuthorize("@ss.hasPermission('base:material-properties:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportMaterialPropertiesExcel(@Valid MaterialPropertiesPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = materialPropertiesService.getMaterialPropertiesPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "物料属性.xls", "数据", MaterialPropertiesRespVO.class,
+ BeanUtils.toBean(list, MaterialPropertiesRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesPageReqVO.java
new file mode 100644
index 00000000..6621b95c
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesPageReqVO.java
@@ -0,0 +1,38 @@
+package com.zt.plat.module.base.controller.admin.materialproperties.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 物料属性分页 Request VO")
+@Data
+public class MaterialPropertiesPageReqVO extends PageParam {
+
+ @Schema(description = "属性编码")
+ private String code;
+
+ @Schema(description = "属性名称", example = "芋艿")
+ private String name;
+
+ @Schema(description = "计量单位量ID", example = "30468")
+ private Long unitQuantityId;
+
+ @Schema(description = "业务字典数据值")
+ private String dictionaryDataValue;
+
+ @Schema(description = "数据类型", example = "1")
+ private String dataType;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesRespVO.java
new file mode 100644
index 00000000..c2ac468a
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesRespVO.java
@@ -0,0 +1,47 @@
+package com.zt.plat.module.base.controller.admin.materialproperties.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 物料属性 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class MaterialPropertiesRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10591")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "属性编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("属性编码")
+ private String code;
+
+ @Schema(description = "属性名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+ @ExcelProperty("属性名称")
+ private String name;
+
+ @Schema(description = "计量单位量ID", example = "30468")
+ @ExcelProperty("计量单位量ID")
+ private Long unitQuantityId;
+
+ @Schema(description = "业务字典数据值", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("业务字典数据值")
+ private String dictionaryDataValue;
+
+ @Schema(description = "数据类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @ExcelProperty("数据类型")
+ private String dataType;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesSaveReqVO.java
new file mode 100644
index 00000000..e296bbe6
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/materialproperties/vo/MaterialPropertiesSaveReqVO.java
@@ -0,0 +1,38 @@
+package com.zt.plat.module.base.controller.admin.materialproperties.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 物料属性新增/修改 Request VO")
+@Data
+public class MaterialPropertiesSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "10591")
+ private Long id;
+
+ @Schema(description = "属性编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "属性编码不能为空")
+ private String code;
+
+ @Schema(description = "属性名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "芋艿")
+ @NotEmpty(message = "属性名称不能为空")
+ private String name;
+
+ @Schema(description = "计量单位量ID", example = "30468")
+ private Long unitQuantityId;
+
+ @Schema(description = "业务字典数据值", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "业务字典数据值不能为空")
+ private String dictionaryDataValue;
+
+ @Schema(description = "数据类型", requiredMode = Schema.RequiredMode.REQUIRED, example = "1")
+ @NotEmpty(message = "数据类型不能为空")
+ private String dataType;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "备注不能为空")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/ProcessingInfomationController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/ProcessingInfomationController.java
new file mode 100644
index 00000000..2cb57b52
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/ProcessingInfomationController.java
@@ -0,0 +1,138 @@
+package com.zt.plat.module.base.controller.admin.processinginfomation;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.processinginfomation.vo.*;
+import com.zt.plat.module.base.dal.dataobject.processinginfomation.ProcessingInfomationDO;
+import com.zt.plat.module.base.service.processinginfomation.ProcessingInfomationService;
+
+@Tag(name = "管理后台 - 工艺信息")
+@RestController
+@RequestMapping("/base/processing-infomation")
+@Validated
+public class ProcessingInfomationController {
+
+
+ @Resource
+ private ProcessingInfomationService processingInfomationService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建工艺信息")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:create')")
+ public CommonResult createProcessingInfomation(@Valid @RequestBody ProcessingInfomationSaveReqVO createReqVO) {
+ return success(processingInfomationService.createProcessingInfomation(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新工艺信息")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:update')")
+ public CommonResult updateProcessingInfomation(@Valid @RequestBody ProcessingInfomationSaveReqVO updateReqVO) {
+ processingInfomationService.updateProcessingInfomation(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除工艺信息")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:delete')")
+ public CommonResult deleteProcessingInfomation(@RequestParam("id") Long id) {
+ processingInfomationService.deleteProcessingInfomation(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除工艺信息")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:delete')")
+ public CommonResult deleteProcessingInfomationList(@RequestBody BatchDeleteReqVO req) {
+ processingInfomationService.deleteProcessingInfomationListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得工艺信息")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:query')")
+ public CommonResult getProcessingInfomation(@RequestParam("id") Long id) {
+ ProcessingInfomationDO processingInfomation = processingInfomationService.getProcessingInfomation(id);
+ return success(BeanUtils.toBean(processingInfomation, ProcessingInfomationRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得工艺信息分页")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:query')")
+ public CommonResult> getProcessingInfomationPage(@Valid ProcessingInfomationPageReqVO pageReqVO) {
+ PageResult pageResult = processingInfomationService.getProcessingInfomationPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ProcessingInfomationRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出工艺信息 Excel")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProcessingInfomationExcel(@Valid ProcessingInfomationPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = processingInfomationService.getProcessingInfomationPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "工艺信息.xls", "数据", ProcessingInfomationRespVO.class,
+ BeanUtils.toBean(list, ProcessingInfomationRespVO.class));
+ }
+
+ @GetMapping("/tree")
+ @Operation(summary = "获得工艺信息树")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation:query')")
+ public CommonResult> getProcessingInfomationTree() {
+ List list = processingInfomationService.getProcessingInfomationList();
+ return success(buildTree(list));
+ }
+
+ private List buildTree(List list) {
+ if (list == null || list.isEmpty()) {
+ return Collections.emptyList();
+ }
+ Map nodeMap = new LinkedHashMap<>();
+ list.stream()
+ .sorted(Comparator.comparing(ProcessingInfomationDO::getId))
+ .forEach(item -> {
+ ProcessingInfomationTreeRespVO node = BeanUtils.toBean(item, ProcessingInfomationTreeRespVO.class);
+ nodeMap.put(node.getId(), node);
+ });
+ List roots = new ArrayList<>();
+ nodeMap.values().forEach(node -> {
+ Long parentId = node.getParentId();
+ if (parentId == null || parentId == 0 || !nodeMap.containsKey(parentId)) {
+ roots.add(node);
+ } else {
+ nodeMap.get(parentId).getChildren().add(node);
+ }
+ });
+ return roots;
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationPageReqVO.java
new file mode 100644
index 00000000..35efbf83
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationPageReqVO.java
@@ -0,0 +1,42 @@
+package com.zt.plat.module.base.controller.admin.processinginfomation.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 工艺信息分页 Request VO")
+@Data
+public class ProcessingInfomationPageReqVO extends PageParam {
+
+ @Schema(description = "父级ID", example = "16823")
+ private Long parentId;
+
+ @Schema(description = "工艺编码-唯一业务键")
+ private String code;
+
+ @Schema(description = "工艺名称", example = "赵六")
+ private String name;
+
+ @Schema(description = "工艺类型值")
+ private Long typeValue;
+
+ @Schema(description = "状态值-工艺状态")
+ private String statusValue;
+
+ @Schema(description = "工艺描述")
+ private String description;
+
+ @Schema(description = "生效日期")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] effectiveDate;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationRespVO.java
new file mode 100644
index 00000000..c22e4e9e
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationRespVO.java
@@ -0,0 +1,51 @@
+package com.zt.plat.module.base.controller.admin.processinginfomation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 工艺信息 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProcessingInfomationRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16240")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "父级ID", example = "16823")
+ @ExcelProperty("父级ID")
+ private Long parentId;
+
+ @Schema(description = "工艺编码-唯一业务键", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("工艺编码-唯一业务键")
+ private String code;
+
+ @Schema(description = "工艺名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @ExcelProperty("工艺名称")
+ private String name;
+
+ @Schema(description = "工艺类型值")
+ @ExcelProperty("工艺类型值")
+ private Long typeValue;
+
+ @Schema(description = "状态值-工艺状态", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("状态值-工艺状态")
+ private String statusValue;
+
+ @Schema(description = "工艺描述", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("工艺描述")
+ private String description;
+
+ @Schema(description = "生效日期")
+ @ExcelProperty("生效日期")
+ private LocalDateTime effectiveDate;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationSaveReqVO.java
new file mode 100644
index 00000000..bcf17ca3
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationSaveReqVO.java
@@ -0,0 +1,42 @@
+package com.zt.plat.module.base.controller.admin.processinginfomation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+@Schema(description = "管理后台 - 工艺信息新增/修改 Request VO")
+@Data
+public class ProcessingInfomationSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "16240")
+ private Long id;
+
+ @Schema(description = "父级ID", example = "16823")
+ private Long parentId;
+
+ @Schema(description = "工艺编码-唯一业务键", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "工艺编码-唯一业务键不能为空")
+ private String code;
+
+ @Schema(description = "工艺名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "赵六")
+ @NotEmpty(message = "工艺名称不能为空")
+ private String name;
+
+ @Schema(description = "工艺类型值")
+ private Long typeValue;
+
+ @Schema(description = "状态值-工艺状态", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "状态值-工艺状态不能为空")
+ private String statusValue;
+
+ @Schema(description = "工艺描述", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "工艺描述不能为空")
+ private String description;
+
+ @Schema(description = "生效日期")
+ private LocalDateTime effectiveDate;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationTreeRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationTreeRespVO.java
new file mode 100644
index 00000000..87b276ab
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomation/vo/ProcessingInfomationTreeRespVO.java
@@ -0,0 +1,34 @@
+package com.zt.plat.module.base.controller.admin.processinginfomation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Schema(description = "管理后台 - 工艺信息树节点 Response VO")
+@Data
+public class ProcessingInfomationTreeRespVO {
+
+ @Schema(description = "主键ID", example = "1001")
+ private Long id;
+
+ @Schema(description = "父级ID", example = "0")
+ private Long parentId;
+
+ @Schema(description = "工艺编码", example = "PRC-001")
+ private String code;
+
+ @Schema(description = "工艺名称", example = "熔铸")
+ private String name;
+
+ @Schema(description = "工艺类型值")
+ private Long typeValue;
+
+ @Schema(description = "状态值-工艺状态")
+ private String statusValue;
+
+ @Schema(description = "子节点")
+ private List children = new ArrayList<>();
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/ProcessingInfomationOperationController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/ProcessingInfomationOperationController.java
new file mode 100644
index 00000000..16b25097
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/ProcessingInfomationOperationController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.processinginfomationoperation;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.processinginfomationoperation.vo.*;
+import com.zt.plat.module.base.dal.dataobject.processinginfomationoperation.ProcessingInfomationOperationDO;
+import com.zt.plat.module.base.service.processinginfomationoperation.ProcessingInfomationOperationService;
+
+@Tag(name = "管理后台 - 工艺工序")
+@RestController
+@RequestMapping("/base/processing-infomation-operation")
+@Validated
+public class ProcessingInfomationOperationController {
+
+
+ @Resource
+ private ProcessingInfomationOperationService processingInfomationOperationService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建工艺工序")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:create')")
+ public CommonResult createProcessingInfomationOperation(@Valid @RequestBody ProcessingInfomationOperationSaveReqVO createReqVO) {
+ return success(processingInfomationOperationService.createProcessingInfomationOperation(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新工艺工序")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:update')")
+ public CommonResult updateProcessingInfomationOperation(@Valid @RequestBody ProcessingInfomationOperationSaveReqVO updateReqVO) {
+ processingInfomationOperationService.updateProcessingInfomationOperation(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除工艺工序")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:delete')")
+ public CommonResult deleteProcessingInfomationOperation(@RequestParam("id") Long id) {
+ processingInfomationOperationService.deleteProcessingInfomationOperation(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除工艺工序")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:delete')")
+ public CommonResult deleteProcessingInfomationOperationList(@RequestBody BatchDeleteReqVO req) {
+ processingInfomationOperationService.deleteProcessingInfomationOperationListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得工艺工序")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:query')")
+ public CommonResult getProcessingInfomationOperation(@RequestParam("id") Long id) {
+ ProcessingInfomationOperationDO processingInfomationOperation = processingInfomationOperationService.getProcessingInfomationOperation(id);
+ return success(BeanUtils.toBean(processingInfomationOperation, ProcessingInfomationOperationRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得工艺工序分页")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:query')")
+ public CommonResult> getProcessingInfomationOperationPage(@Valid ProcessingInfomationOperationPageReqVO pageReqVO) {
+ PageResult pageResult = processingInfomationOperationService.getProcessingInfomationOperationDetailPage(pageReqVO);
+ return success(pageResult);
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出工艺工序 Excel")
+ @PreAuthorize("@ss.hasPermission('base:processing-infomation-operation:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProcessingInfomationOperationExcel(@Valid ProcessingInfomationOperationPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = processingInfomationOperationService.getProcessingInfomationOperationDetailList(pageReqVO);
+ // 导出 Excel
+ ExcelUtils.write(response, "工艺工序.xls", "数据", ProcessingInfomationOperationRespVO.class,
+ list);
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationPageReqVO.java
new file mode 100644
index 00000000..96590e15
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationPageReqVO.java
@@ -0,0 +1,41 @@
+package com.zt.plat.module.base.controller.admin.processinginfomationoperation.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 工艺工序分页 Request VO")
+@Data
+public class ProcessingInfomationOperationPageReqVO extends PageParam {
+
+ @Schema(description = "前序工序ID", example = "14658")
+ private Long previousOperationId;
+
+ @Schema(description = "后续工序ID", example = "22110")
+ private Long nextOperationId;
+
+ @Schema(description = "工艺ID", example = "5773")
+ private Long processingId;
+
+ @Schema(description = "是否关键工序")
+ private Integer isKey;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "后续工序编码")
+ private String nextOperationCode;
+
+ @Schema(description = "后续工序名称")
+ private String nextOperationName;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationRespVO.java
new file mode 100644
index 00000000..78b09db8
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationRespVO.java
@@ -0,0 +1,59 @@
+package com.zt.plat.module.base.controller.admin.processinginfomationoperation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 工艺工序 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProcessingInfomationOperationRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29694")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "前序工序ID", example = "14658")
+ @ExcelProperty("前序工序ID")
+ private Long previousOperationId;
+
+ @Schema(description = "前序工序编码")
+ @ExcelProperty("前序工序编码")
+ private String previousOperationCode;
+
+ @Schema(description = "前序工序名称")
+ @ExcelProperty("前序工序名称")
+ private String previousOperationName;
+
+ @Schema(description = "后续工序ID", example = "22110")
+ @ExcelProperty("后续工序ID")
+ private Long nextOperationId;
+
+ @Schema(description = "后续工序编码")
+ @ExcelProperty("后续工序编码")
+ private String nextOperationCode;
+
+ @Schema(description = "后续工序名称")
+ @ExcelProperty("后续工序名称")
+ private String nextOperationName;
+
+ @Schema(description = "工艺ID", example = "5773")
+ @ExcelProperty("工艺ID")
+ private Long processingId;
+
+ @Schema(description = "是否关键工序")
+ @ExcelProperty("是否关键工序")
+ private Integer isKey;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationSaveReqVO.java
new file mode 100644
index 00000000..eb396caf
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processinginfomationoperation/vo/ProcessingInfomationOperationSaveReqVO.java
@@ -0,0 +1,31 @@
+package com.zt.plat.module.base.controller.admin.processinginfomationoperation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 工艺工序新增/修改 Request VO")
+@Data
+public class ProcessingInfomationOperationSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "29694")
+ private Long id;
+
+ @Schema(description = "前序工序ID", example = "14658")
+ private Long previousOperationId;
+
+ @Schema(description = "后续工序ID", example = "22110")
+ private Long nextOperationId;
+
+ @Schema(description = "工艺ID", example = "5773")
+ private Long processingId;
+
+ @Schema(description = "是否关键工序")
+ private Integer isKey;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "备注不能为空")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/ProcessingOperationController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/ProcessingOperationController.java
new file mode 100644
index 00000000..4dd13395
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/ProcessingOperationController.java
@@ -0,0 +1,115 @@
+package com.zt.plat.module.base.controller.admin.processingoperation;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.processingoperation.vo.*;
+import com.zt.plat.module.base.dal.dataobject.processingoperation.ProcessingOperationDO;
+import com.zt.plat.module.base.service.processingoperation.ProcessingOperationService;
+
+@Tag(name = "管理后台 - 工序")
+@RestController
+@RequestMapping("/base/processing-operation")
+@Validated
+public class ProcessingOperationController {
+
+
+ @Resource
+ private ProcessingOperationService processingOperationService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建工序")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:create')")
+ public CommonResult createProcessingOperation(@Valid @RequestBody ProcessingOperationSaveReqVO createReqVO) {
+ return success(processingOperationService.createProcessingOperation(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新工序")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:update')")
+ public CommonResult updateProcessingOperation(@Valid @RequestBody ProcessingOperationSaveReqVO updateReqVO) {
+ processingOperationService.updateProcessingOperation(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除工序")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:delete')")
+ public CommonResult deleteProcessingOperation(@RequestParam("id") Long id) {
+ processingOperationService.deleteProcessingOperation(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除工序")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:delete')")
+ public CommonResult deleteProcessingOperationList(@RequestBody BatchDeleteReqVO req) {
+ processingOperationService.deleteProcessingOperationListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得工序")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:query')")
+ public CommonResult getProcessingOperation(@RequestParam("id") Long id) {
+ ProcessingOperationDO processingOperation = processingOperationService.getProcessingOperation(id);
+ return success(BeanUtils.toBean(processingOperation, ProcessingOperationRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得工序分页")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:query')")
+ public CommonResult> getProcessingOperationPage(@Valid ProcessingOperationPageReqVO pageReqVO) {
+ PageResult pageResult = processingOperationService.getProcessingOperationPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ProcessingOperationRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出工序 Excel")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProcessingOperationExcel(@Valid ProcessingOperationPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = processingOperationService.getProcessingOperationPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "工序.xls", "数据", ProcessingOperationRespVO.class,
+ BeanUtils.toBean(list, ProcessingOperationRespVO.class));
+ }
+
+ @GetMapping("/simple-list")
+ @Operation(summary = "获得工序简单列表")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation:query')")
+ public CommonResult> getProcessingOperationSimpleList() {
+ List list = processingOperationService.getProcessingOperationList();
+ return success(BeanUtils.toBean(list, ProcessingOperationSimpleRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationPageReqVO.java
new file mode 100644
index 00000000..30eb3b91
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationPageReqVO.java
@@ -0,0 +1,35 @@
+package com.zt.plat.module.base.controller.admin.processingoperation.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 工序分页 Request VO")
+@Data
+public class ProcessingOperationPageReqVO extends PageParam {
+
+ @Schema(description = "工序编码")
+ private String code;
+
+ @Schema(description = "工序名称", example = "王五")
+ private String name;
+
+ @Schema(description = "排序号")
+ private Long sort;
+
+ @Schema(description = "类型值-工序类型")
+ private String typeValue;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationRespVO.java
new file mode 100644
index 00000000..a011073f
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationRespVO.java
@@ -0,0 +1,43 @@
+package com.zt.plat.module.base.controller.admin.processingoperation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 工序 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProcessingOperationRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14097")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "工序编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("工序编码")
+ private String code;
+
+ @Schema(description = "工序名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+ @ExcelProperty("工序名称")
+ private String name;
+
+ @Schema(description = "排序号")
+ @ExcelProperty("排序号")
+ private Long sort;
+
+ @Schema(description = "类型值-工序类型", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("类型值-工序类型")
+ private String typeValue;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationSaveReqVO.java
new file mode 100644
index 00000000..33ef1168
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationSaveReqVO.java
@@ -0,0 +1,34 @@
+package com.zt.plat.module.base.controller.admin.processingoperation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 工序新增/修改 Request VO")
+@Data
+public class ProcessingOperationSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "14097")
+ private Long id;
+
+ @Schema(description = "工序编码", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "工序编码不能为空")
+ private String code;
+
+ @Schema(description = "工序名称", requiredMode = Schema.RequiredMode.REQUIRED, example = "王五")
+ @NotEmpty(message = "工序名称不能为空")
+ private String name;
+
+ @Schema(description = "排序号")
+ private Long sort;
+
+ @Schema(description = "类型值-工序类型", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "类型值-工序类型不能为空")
+ private String typeValue;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "备注不能为空")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationSimpleRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationSimpleRespVO.java
new file mode 100644
index 00000000..75808482
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperation/vo/ProcessingOperationSimpleRespVO.java
@@ -0,0 +1,19 @@
+package com.zt.plat.module.base.controller.admin.processingoperation.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+
+@Schema(description = "管理后台 - 工序简单信息 Response VO")
+@Data
+public class ProcessingOperationSimpleRespVO {
+
+ @Schema(description = "工序ID", example = "1001")
+ private Long id;
+
+ @Schema(description = "工序编码", example = "OP-001")
+ private String code;
+
+ @Schema(description = "工序名称", example = "熔铸")
+ private String name;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/ProcessingOperationMaterialController.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/ProcessingOperationMaterialController.java
new file mode 100644
index 00000000..dfa6bcba
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/ProcessingOperationMaterialController.java
@@ -0,0 +1,107 @@
+package com.zt.plat.module.base.controller.admin.processingoperationmaterial;
+
+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 com.zt.plat.framework.common.pojo.vo.BatchDeleteReqVO;
+import com.zt.plat.framework.common.pojo.PageParam;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.CommonResult;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import static com.zt.plat.framework.common.pojo.CommonResult.success;
+
+import com.zt.plat.framework.excel.core.util.ExcelUtils;
+
+import com.zt.plat.framework.apilog.core.annotation.ApiAccessLog;
+import static com.zt.plat.framework.apilog.core.enums.OperateTypeEnum.*;
+
+import com.zt.plat.module.base.controller.admin.processingoperationmaterial.vo.*;
+import com.zt.plat.module.base.dal.dataobject.processingoperationmaterial.ProcessingOperationMaterialDO;
+import com.zt.plat.module.base.service.processingoperationmaterial.ProcessingOperationMaterialService;
+
+@Tag(name = "管理后台 - 工艺工序物料")
+@RestController
+@RequestMapping("/base/processing-operation-material")
+@Validated
+public class ProcessingOperationMaterialController {
+
+
+ @Resource
+ private ProcessingOperationMaterialService processingOperationMaterialService;
+
+ @PostMapping("/create")
+ @Operation(summary = "创建工艺工序物料")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:create')")
+ public CommonResult createProcessingOperationMaterial(@Valid @RequestBody ProcessingOperationMaterialSaveReqVO createReqVO) {
+ return success(processingOperationMaterialService.createProcessingOperationMaterial(createReqVO));
+ }
+
+ @PutMapping("/update")
+ @Operation(summary = "更新工艺工序物料")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:update')")
+ public CommonResult updateProcessingOperationMaterial(@Valid @RequestBody ProcessingOperationMaterialSaveReqVO updateReqVO) {
+ processingOperationMaterialService.updateProcessingOperationMaterial(updateReqVO);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete")
+ @Operation(summary = "删除工艺工序物料")
+ @Parameter(name = "id", description = "编号", required = true)
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:delete')")
+ public CommonResult deleteProcessingOperationMaterial(@RequestParam("id") Long id) {
+ processingOperationMaterialService.deleteProcessingOperationMaterial(id);
+ return success(true);
+ }
+
+ @DeleteMapping("/delete-list")
+ @Parameter(name = "ids", description = "编号", required = true)
+ @Operation(summary = "批量删除工艺工序物料")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:delete')")
+ public CommonResult deleteProcessingOperationMaterialList(@RequestBody BatchDeleteReqVO req) {
+ processingOperationMaterialService.deleteProcessingOperationMaterialListByIds(req.getIds());
+ return success(true);
+ }
+
+ @GetMapping("/get")
+ @Operation(summary = "获得工艺工序物料")
+ @Parameter(name = "id", description = "编号", required = true, example = "1024")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:query')")
+ public CommonResult getProcessingOperationMaterial(@RequestParam("id") Long id) {
+ ProcessingOperationMaterialDO processingOperationMaterial = processingOperationMaterialService.getProcessingOperationMaterial(id);
+ return success(BeanUtils.toBean(processingOperationMaterial, ProcessingOperationMaterialRespVO.class));
+ }
+
+ @GetMapping("/page")
+ @Operation(summary = "获得工艺工序物料分页")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:query')")
+ public CommonResult> getProcessingOperationMaterialPage(@Valid ProcessingOperationMaterialPageReqVO pageReqVO) {
+ PageResult pageResult = processingOperationMaterialService.getProcessingOperationMaterialPage(pageReqVO);
+ return success(BeanUtils.toBean(pageResult, ProcessingOperationMaterialRespVO.class));
+ }
+
+ @GetMapping("/export-excel")
+ @Operation(summary = "导出工艺工序物料 Excel")
+ @PreAuthorize("@ss.hasPermission('base:processing-operation-material:export')")
+ @ApiAccessLog(operateType = EXPORT)
+ public void exportProcessingOperationMaterialExcel(@Valid ProcessingOperationMaterialPageReqVO pageReqVO,
+ HttpServletResponse response) throws IOException {
+ pageReqVO.setPageSize(PageParam.PAGE_SIZE_NONE);
+ List list = processingOperationMaterialService.getProcessingOperationMaterialPage(pageReqVO).getList();
+ // 导出 Excel
+ ExcelUtils.write(response, "工艺工序物料.xls", "数据", ProcessingOperationMaterialRespVO.class,
+ BeanUtils.toBean(list, ProcessingOperationMaterialRespVO.class));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialPageReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialPageReqVO.java
new file mode 100644
index 00000000..8e8853c4
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialPageReqVO.java
@@ -0,0 +1,29 @@
+package com.zt.plat.module.base.controller.admin.processingoperationmaterial.vo;
+
+import lombok.*;
+import java.util.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import com.zt.plat.framework.common.pojo.PageParam;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+
+import static com.zt.plat.framework.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
+
+@Schema(description = "管理后台 - 工艺工序物料分页 Request VO")
+@Data
+public class ProcessingOperationMaterialPageReqVO extends PageParam {
+
+ @Schema(description = "类型值-物料类型(产出/投入)")
+ private String typeValue;
+
+ @Schema(description = "备注")
+ private String remark;
+
+ @Schema(description = "创建时间")
+ @DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
+ private LocalDateTime[] createTime;
+
+ @Schema(description = "组织机构")
+ private String departmentIds;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialRespVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialRespVO.java
new file mode 100644
index 00000000..a0e3b0a5
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialRespVO.java
@@ -0,0 +1,43 @@
+package com.zt.plat.module.base.controller.admin.processingoperationmaterial.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import org.springframework.format.annotation.DateTimeFormat;
+import java.time.LocalDateTime;
+import com.alibaba.excel.annotation.*;
+
+@Schema(description = "管理后台 - 工艺工序物料 Response VO")
+@Data
+@ExcelIgnoreUnannotated
+public class ProcessingOperationMaterialRespVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27200")
+ @ExcelProperty("主键ID")
+ private Long id;
+
+ @Schema(description = "工艺工序ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18575")
+ @ExcelProperty("工艺工序ID")
+ private Long processingOperationId;
+
+ @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15117")
+ @ExcelProperty("物料ID")
+ private Long materialId;
+
+ @Schema(description = "类型值-物料类型(产出/投入)", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("类型值-物料类型(产出/投入)")
+ private String typeValue;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("备注")
+ private String remark;
+
+ @Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
+ @ExcelProperty("创建时间")
+ private LocalDateTime createTime;
+
+ @Schema(description = "组织机构")
+ @ExcelProperty("组织机构")
+ private String departmentIds;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialSaveReqVO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialSaveReqVO.java
new file mode 100644
index 00000000..18bd082b
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/controller/admin/processingoperationmaterial/vo/ProcessingOperationMaterialSaveReqVO.java
@@ -0,0 +1,32 @@
+package com.zt.plat.module.base.controller.admin.processingoperationmaterial.vo;
+
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.*;
+import java.util.*;
+import jakarta.validation.constraints.*;
+
+@Schema(description = "管理后台 - 工艺工序物料新增/修改 Request VO")
+@Data
+public class ProcessingOperationMaterialSaveReqVO {
+
+ @Schema(description = "主键ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "27200")
+ private Long id;
+
+ @Schema(description = "工艺工序ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "18575")
+ private Long processingOperationId;
+
+ @Schema(description = "物料ID", requiredMode = Schema.RequiredMode.REQUIRED, example = "15117")
+ private Long materialId;
+
+ @Schema(description = "类型值-物料类型(产出/投入)", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "类型值-物料类型(产出/投入)不能为空")
+ private String typeValue;
+
+ @Schema(description = "备注", requiredMode = Schema.RequiredMode.REQUIRED)
+ @NotEmpty(message = "备注不能为空")
+ private String remark;
+
+ @Schema(description = "组织机构")
+ private String departmentIds;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateCategoryConvert.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateCategoryConvert.java
new file mode 100644
index 00000000..2ec24029
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateCategoryConvert.java
@@ -0,0 +1,30 @@
+package com.zt.plat.module.base.convert.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategorySaveReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateCategoryDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 模板分类 Convert
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateCategoryConvert {
+
+ DocTemplateCategoryConvert INSTANCE = Mappers.getMapper(DocTemplateCategoryConvert.class);
+
+ DocTemplateCategoryDO convert(DocTemplateCategorySaveReqVO bean);
+
+ DocTemplateCategoryRespVO convert(DocTemplateCategoryDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateConvert.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateConvert.java
new file mode 100644
index 00000000..95590538
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateConvert.java
@@ -0,0 +1,30 @@
+package com.zt.plat.module.base.convert.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateSaveReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 模板 Convert
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateConvert {
+
+ DocTemplateConvert INSTANCE = Mappers.getMapper(DocTemplateConvert.class);
+
+ DocTemplateDO convert(DocTemplateSaveReqVO bean);
+
+ DocTemplateRespVO convert(DocTemplateDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateInstanceConvert.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateInstanceConvert.java
new file mode 100644
index 00000000..716cedce
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateInstanceConvert.java
@@ -0,0 +1,30 @@
+package com.zt.plat.module.base.convert.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceSaveReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateInstanceDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 模板实例 Convert
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateInstanceConvert {
+
+ DocTemplateInstanceConvert INSTANCE = Mappers.getMapper(DocTemplateInstanceConvert.class);
+
+ DocTemplateInstanceDO convert(DocTemplateInstanceSaveReqVO bean);
+
+ DocTemplateInstanceRespVO convert(DocTemplateInstanceDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateTagConvert.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateTagConvert.java
new file mode 100644
index 00000000..1ef73be5
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/convert/doctemplate/DocTemplateTagConvert.java
@@ -0,0 +1,30 @@
+package com.zt.plat.module.base.convert.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagSaveReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateTagDO;
+import org.mapstruct.Mapper;
+import org.mapstruct.factory.Mappers;
+
+import java.util.List;
+
+/**
+ * 标签库 Convert
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateTagConvert {
+
+ DocTemplateTagConvert INSTANCE = Mappers.getMapper(DocTemplateTagConvert.class);
+
+ DocTemplateTagDO convert(DocTemplateTagSaveReqVO bean);
+
+ DocTemplateTagRespVO convert(DocTemplateTagDO bean);
+
+ List convertList(List list);
+
+ PageResult convertPage(PageResult page);
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java
new file mode 100644
index 00000000..d7dbd2d1
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/departmentmaterial/DepartmentMaterialMapper.java
@@ -0,0 +1,32 @@
+package com.zt.plat.module.base.dal.dao.departmentmaterial;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.departmentmaterial.DepartmentMaterialDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.departmentmaterial.vo.*;
+
+/**
+ * 组织架构物料 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface DepartmentMaterialMapper extends BaseMapperX {
+
+ default PageResult selectPage(DepartmentMaterialPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(DepartmentMaterialDO::getInfomationId, reqVO.getInfomationId())
+ .inIfPresent(DepartmentMaterialDO::getInfomationId, reqVO.getInfomationIds())
+ .eqIfPresent(DepartmentMaterialDO::getClassesId, reqVO.getClassesId())
+ .eqIfPresent(DepartmentMaterialDO::getDeptId, reqVO.getDeptId())
+ .eqIfPresent(DepartmentMaterialDO::getDictionaryDataValue, reqVO.getDictionaryDataValue())
+ .eqIfPresent(DepartmentMaterialDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(DepartmentMaterialDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(DepartmentMaterialDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateCategoryMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateCategoryMapper.java
new file mode 100644
index 00000000..b6310e0d
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateCategoryMapper.java
@@ -0,0 +1,28 @@
+package com.zt.plat.module.base.dal.dao.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryPageReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateCategoryDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 模板分类 Mapper
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateCategoryMapper extends BaseMapperX {
+
+ default PageResult selectPage(DocTemplateCategoryPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(DocTemplateCategoryDO::getCategoryName, reqVO.getCategoryName())
+ .eqIfPresent(DocTemplateCategoryDO::getCategoryCode, reqVO.getCategoryCode())
+ .eqIfPresent(DocTemplateCategoryDO::getParentId, reqVO.getParentId())
+ .eqIfPresent(DocTemplateCategoryDO::getLevel, reqVO.getLevel())
+ .orderByAsc(DocTemplateCategoryDO::getSort)
+ .orderByDesc(DocTemplateCategoryDO::getId));
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateInstanceMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateInstanceMapper.java
new file mode 100644
index 00000000..80630834
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateInstanceMapper.java
@@ -0,0 +1,28 @@
+package com.zt.plat.module.base.dal.dao.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstancePageReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateInstanceDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 模板实例 Mapper
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateInstanceMapper extends BaseMapperX {
+
+ default PageResult selectPage(DocTemplateInstancePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(DocTemplateInstanceDO::getInstanceName, reqVO.getInstanceName())
+ .eqIfPresent(DocTemplateInstanceDO::getTemplateId, reqVO.getTemplateId())
+ .eqIfPresent(DocTemplateInstanceDO::getBusinessType, reqVO.getBusinessType())
+ .eqIfPresent(DocTemplateInstanceDO::getStatus, reqVO.getStatus())
+ .betweenIfPresent(DocTemplateInstanceDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(DocTemplateInstanceDO::getId));
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateMapper.java
new file mode 100644
index 00000000..8de6f6b9
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateMapper.java
@@ -0,0 +1,29 @@
+package com.zt.plat.module.base.dal.dao.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplatePageReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 模板 Mapper
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateMapper extends BaseMapperX {
+
+ default PageResult selectPage(DocTemplatePageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(DocTemplateDO::getTmplName, reqVO.getTmplName())
+ .likeIfPresent(DocTemplateDO::getTmplCode, reqVO.getTmplCode())
+ .eqIfPresent(DocTemplateDO::getBigCategoryId, reqVO.getBigCategoryId())
+ .eqIfPresent(DocTemplateDO::getSmallCategoryId, reqVO.getSmallCategoryId())
+ .eqIfPresent(DocTemplateDO::getEnabled, reqVO.getEnabled())
+ .betweenIfPresent(DocTemplateDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(DocTemplateDO::getId));
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateTagMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateTagMapper.java
new file mode 100644
index 00000000..d791d60e
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/doctemplate/DocTemplateTagMapper.java
@@ -0,0 +1,28 @@
+package com.zt.plat.module.base.dal.dao.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagPageReqVO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateTagDO;
+import org.apache.ibatis.annotations.Mapper;
+
+/**
+ * 标签库 Mapper
+ *
+ * @author 系统生成
+ */
+@Mapper
+public interface DocTemplateTagMapper extends BaseMapperX {
+
+ default PageResult selectPage(DocTemplateTagPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .likeIfPresent(DocTemplateTagDO::getTagName, reqVO.getTagName())
+ .likeIfPresent(DocTemplateTagDO::getTagCode, reqVO.getTagCode())
+ .eqIfPresent(DocTemplateTagDO::getCategoryId, reqVO.getCategoryId())
+ .eqIfPresent(DocTemplateTagDO::getEnabled, reqVO.getEnabled())
+ .orderByAsc(DocTemplateTagDO::getSort)
+ .orderByDesc(DocTemplateTagDO::getId));
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialclasses/MaterialClassesMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialclasses/MaterialClassesMapper.java
new file mode 100644
index 00000000..c4861958
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialclasses/MaterialClassesMapper.java
@@ -0,0 +1,31 @@
+package com.zt.plat.module.base.dal.dao.materialclasses;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.materialclasses.MaterialClassesDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.materialclasses.vo.*;
+
+/**
+ * 物料分类 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface MaterialClassesMapper extends BaseMapperX {
+
+ default PageResult selectPage(MaterialClassesPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialClassesDO::getParentId, reqVO.getParentId())
+ .eqIfPresent(MaterialClassesDO::getCode, reqVO.getCode())
+ .likeIfPresent(MaterialClassesDO::getName, reqVO.getName())
+ .eqIfPresent(MaterialClassesDO::getLevel, reqVO.getLevel())
+ .eqIfPresent(MaterialClassesDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(MaterialClassesDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(MaterialClassesDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialhasclasses/MaterialHasClassesMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialhasclasses/MaterialHasClassesMapper.java
new file mode 100644
index 00000000..8bbde0f2
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialhasclasses/MaterialHasClassesMapper.java
@@ -0,0 +1,28 @@
+package com.zt.plat.module.base.dal.dao.materialhasclasses;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.materialhasclasses.MaterialHasClassesDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.materialhasclasses.vo.*;
+
+/**
+ * 物料持有分类 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface MaterialHasClassesMapper extends BaseMapperX {
+
+ default PageResult selectPage(MaterialHasClassesPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialHasClassesDO::getInfomationId, reqVO.getInfomationId())
+ .betweenIfPresent(MaterialHasClassesDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(MaterialHasClassesDO::getClassesId, reqVO.getClassesId())
+ .orderByDesc(MaterialHasClassesDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialhasproperties/MaterialHasPropertiesMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialhasproperties/MaterialHasPropertiesMapper.java
new file mode 100644
index 00000000..824da813
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialhasproperties/MaterialHasPropertiesMapper.java
@@ -0,0 +1,33 @@
+package com.zt.plat.module.base.dal.dao.materialhasproperties;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.materialhasproperties.MaterialHasPropertiesDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.materialhasproperties.vo.*;
+
+/**
+ * 物料持有属性 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface MaterialHasPropertiesMapper extends BaseMapperX {
+
+ default PageResult selectPage(MaterialHasPropertiesPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialHasPropertiesDO::getInfomationId, reqVO.getInfomationId())
+ .eqIfPresent(MaterialHasPropertiesDO::getPropertiesId, reqVO.getPropertiesId())
+ .eqIfPresent(MaterialHasPropertiesDO::getUnitId, reqVO.getUnitId())
+ .eqIfPresent(MaterialHasPropertiesDO::getValue, reqVO.getValue())
+ .eqIfPresent(MaterialHasPropertiesDO::getIsKey, reqVO.getIsKey())
+ .eqIfPresent(MaterialHasPropertiesDO::getIsMetering, reqVO.getIsMetering())
+ .eqIfPresent(MaterialHasPropertiesDO::getSort, reqVO.getSort())
+ .betweenIfPresent(MaterialHasPropertiesDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(MaterialHasPropertiesDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialproperties/MaterialPropertiesMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialproperties/MaterialPropertiesMapper.java
new file mode 100644
index 00000000..9bb43345
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/materialproperties/MaterialPropertiesMapper.java
@@ -0,0 +1,32 @@
+package com.zt.plat.module.base.dal.dao.materialproperties;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.materialproperties.MaterialPropertiesDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.materialproperties.vo.*;
+
+/**
+ * 物料属性 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface MaterialPropertiesMapper extends BaseMapperX {
+
+ default PageResult selectPage(MaterialPropertiesPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(MaterialPropertiesDO::getCode, reqVO.getCode())
+ .likeIfPresent(MaterialPropertiesDO::getName, reqVO.getName())
+ .eqIfPresent(MaterialPropertiesDO::getUnitQuantityId, reqVO.getUnitQuantityId())
+ .eqIfPresent(MaterialPropertiesDO::getDictionaryDataValue, reqVO.getDictionaryDataValue())
+ .eqIfPresent(MaterialPropertiesDO::getDataType, reqVO.getDataType())
+ .eqIfPresent(MaterialPropertiesDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(MaterialPropertiesDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(MaterialPropertiesDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processinginfomation/ProcessingInfomationMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processinginfomation/ProcessingInfomationMapper.java
new file mode 100644
index 00000000..4468ec89
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processinginfomation/ProcessingInfomationMapper.java
@@ -0,0 +1,33 @@
+package com.zt.plat.module.base.dal.dao.processinginfomation;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.processinginfomation.ProcessingInfomationDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.processinginfomation.vo.*;
+
+/**
+ * 工艺信息 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface ProcessingInfomationMapper extends BaseMapperX {
+
+ default PageResult selectPage(ProcessingInfomationPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ProcessingInfomationDO::getParentId, reqVO.getParentId())
+ .eqIfPresent(ProcessingInfomationDO::getCode, reqVO.getCode())
+ .likeIfPresent(ProcessingInfomationDO::getName, reqVO.getName())
+ .eqIfPresent(ProcessingInfomationDO::getTypeValue, reqVO.getTypeValue())
+ .eqIfPresent(ProcessingInfomationDO::getStatusValue, reqVO.getStatusValue())
+ .eqIfPresent(ProcessingInfomationDO::getDescription, reqVO.getDescription())
+ .betweenIfPresent(ProcessingInfomationDO::getEffectiveDate, reqVO.getEffectiveDate())
+ .betweenIfPresent(ProcessingInfomationDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ProcessingInfomationDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processinginfomationoperation/ProcessingInfomationOperationMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processinginfomationoperation/ProcessingInfomationOperationMapper.java
new file mode 100644
index 00000000..e8748cc2
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processinginfomationoperation/ProcessingInfomationOperationMapper.java
@@ -0,0 +1,42 @@
+package com.zt.plat.module.base.dal.dao.processinginfomationoperation;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.processinginfomationoperation.ProcessingInfomationOperationDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.processinginfomationoperation.vo.*;
+
+/**
+ * 工艺工序 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface ProcessingInfomationOperationMapper extends BaseMapperX {
+
+ default PageResult selectPage(ProcessingInfomationOperationPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ProcessingInfomationOperationDO::getPreviousOperationId, reqVO.getPreviousOperationId())
+ .eqIfPresent(ProcessingInfomationOperationDO::getNextOperationId, reqVO.getNextOperationId())
+ .eqIfPresent(ProcessingInfomationOperationDO::getProcessingId, reqVO.getProcessingId())
+ .eqIfPresent(ProcessingInfomationOperationDO::getIsKey, reqVO.getIsKey())
+ .eqIfPresent(ProcessingInfomationOperationDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ProcessingInfomationOperationDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ProcessingInfomationOperationDO::getId));
+ }
+
+ default List selectList(ProcessingInfomationOperationPageReqVO reqVO) {
+ return selectList(new LambdaQueryWrapperX()
+ .eqIfPresent(ProcessingInfomationOperationDO::getPreviousOperationId, reqVO.getPreviousOperationId())
+ .eqIfPresent(ProcessingInfomationOperationDO::getNextOperationId, reqVO.getNextOperationId())
+ .eqIfPresent(ProcessingInfomationOperationDO::getProcessingId, reqVO.getProcessingId())
+ .eqIfPresent(ProcessingInfomationOperationDO::getIsKey, reqVO.getIsKey())
+ .eqIfPresent(ProcessingInfomationOperationDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ProcessingInfomationOperationDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ProcessingInfomationOperationDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processingoperation/ProcessingOperationMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processingoperation/ProcessingOperationMapper.java
new file mode 100644
index 00000000..b611f7a0
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processingoperation/ProcessingOperationMapper.java
@@ -0,0 +1,31 @@
+package com.zt.plat.module.base.dal.dao.processingoperation;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.processingoperation.ProcessingOperationDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.processingoperation.vo.*;
+
+/**
+ * 工序 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface ProcessingOperationMapper extends BaseMapperX {
+
+ default PageResult selectPage(ProcessingOperationPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ProcessingOperationDO::getCode, reqVO.getCode())
+ .likeIfPresent(ProcessingOperationDO::getName, reqVO.getName())
+ .eqIfPresent(ProcessingOperationDO::getSort, reqVO.getSort())
+ .eqIfPresent(ProcessingOperationDO::getTypeValue, reqVO.getTypeValue())
+ .eqIfPresent(ProcessingOperationDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ProcessingOperationDO::getCreateTime, reqVO.getCreateTime())
+ .orderByDesc(ProcessingOperationDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processingoperationmaterial/ProcessingOperationMaterialMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processingoperationmaterial/ProcessingOperationMaterialMapper.java
new file mode 100644
index 00000000..81a4b50f
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dao/processingoperationmaterial/ProcessingOperationMaterialMapper.java
@@ -0,0 +1,29 @@
+package com.zt.plat.module.base.dal.dao.processingoperationmaterial;
+
+import java.util.*;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.framework.mybatis.core.mapper.BaseMapperX;
+import com.zt.plat.module.base.dal.dataobject.processingoperationmaterial.ProcessingOperationMaterialDO;
+import org.apache.ibatis.annotations.Mapper;
+import com.zt.plat.module.base.controller.admin.processingoperationmaterial.vo.*;
+
+/**
+ * 工艺工序物料 Mapper
+ *
+ * @author 后台管理-1
+ */
+@Mapper
+public interface ProcessingOperationMaterialMapper extends BaseMapperX {
+
+ default PageResult selectPage(ProcessingOperationMaterialPageReqVO reqVO) {
+ return selectPage(reqVO, new LambdaQueryWrapperX()
+ .eqIfPresent(ProcessingOperationMaterialDO::getTypeValue, reqVO.getTypeValue())
+ .eqIfPresent(ProcessingOperationMaterialDO::getRemark, reqVO.getRemark())
+ .betweenIfPresent(ProcessingOperationMaterialDO::getCreateTime, reqVO.getCreateTime())
+ .eqIfPresent(ProcessingOperationMaterialDO::getDepartmentIds, reqVO.getDepartmentIds())
+ .orderByDesc(ProcessingOperationMaterialDO::getId));
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/base/MaterialInfomationDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/base/MaterialInfomationDO.java
index 1515714e..8b5f73ec 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/base/MaterialInfomationDO.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/base/MaterialInfomationDO.java
@@ -39,6 +39,11 @@ public class MaterialInfomationDO extends BaseDO {
@TableField("NAME")
private String name;
/**
+ * 分类ID(中间表关联)
+ */
+ @TableField(exist = false)
+ private Long classesId;
+ /**
* 备注
*/
@TableField("RMK")
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/departmentmaterial/DepartmentMaterialDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/departmentmaterial/DepartmentMaterialDO.java
new file mode 100644
index 00000000..a759e7bb
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/departmentmaterial/DepartmentMaterialDO.java
@@ -0,0 +1,60 @@
+package com.zt.plat.module.base.dal.dataobject.departmentmaterial;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 组织架构物料 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_dept_mtrl")
+@KeySequence("bse_dept_mtrl_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class DepartmentMaterialDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 部门ID
+ */
+ @TableField("DEPT_ID")
+ private Long deptId;
+ /**
+ * 物料信息ID
+ */
+ @TableField("INF_ID")
+ private Long infomationId;
+ /**
+ * 物料分类ID
+ */
+ @TableField("CLS_ID")
+ private Long classesId;
+ /**
+ * 字典数据值-物料类型
+ */
+ @TableField("DIC_DAT_VAL")
+ private String dictionaryDataValue;
+ /**
+ * 备注
+ */
+ @TableField("RMK")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateCategoryDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateCategoryDO.java
new file mode 100644
index 00000000..390706f2
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateCategoryDO.java
@@ -0,0 +1,63 @@
+package com.zt.plat.module.base.dal.dataobject.doctemplate;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
+import lombok.*;
+
+/**
+ * 模板分类 DO
+ *
+ * @author 系统生成
+ */
+@TableName(value = "bse_doc_category")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DocTemplateCategoryDO extends BusinessBaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 分类名称
+ */
+ @TableField("category_name")
+ private String categoryName;
+
+ /**
+ * 分类编码
+ */
+ @TableField("category_code")
+ private String categoryCode;
+
+ /**
+ * 父分类ID(NULL=大类)
+ */
+ @TableField("parent_id")
+ private Long parentId;
+
+ /**
+ * 层级(1=大类,2=小类)
+ */
+ @TableField("level")
+ private Integer level;
+
+ /**
+ * 排序号
+ */
+ @TableField("sort")
+ private Integer sort;
+
+ /**
+ * 备注
+ */
+ @TableField("remark")
+ private String remark;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateDO.java
new file mode 100644
index 00000000..344835a9
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateDO.java
@@ -0,0 +1,99 @@
+package com.zt.plat.module.base.dal.dataobject.doctemplate;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
+import lombok.*;
+
+/**
+ * 模板 DO
+ *
+ * @author 系统生成
+ */
+@TableName(value = "bse_doc_tmpl")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DocTemplateDO extends BusinessBaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 模板名称
+ */
+ @TableField("tmpl_name")
+ private String tmplName;
+
+ /**
+ * 模板编码(唯一)
+ */
+ @TableField("tmpl_code")
+ private String tmplCode;
+
+ /**
+ * 模板图标
+ */
+ @TableField("icon")
+ private String icon;
+
+ /**
+ * 所属大类
+ */
+ @TableField("big_category_id")
+ private Long bigCategoryId;
+
+ /**
+ * 所属小类
+ */
+ @TableField("small_category_id")
+ private Long smallCategoryId;
+
+ /**
+ * 版本号
+ */
+ @TableField("version")
+ private String version;
+
+ /**
+ * 模板描述
+ */
+ @TableField("description")
+ private String description;
+
+ /**
+ * 模板内容(HTML,含占位符)
+ */
+ @TableField("content")
+ private String content;
+
+ /**
+ * SQL配置(JSON格式,可选)
+ */
+ @TableField("sql_config")
+ private String sqlConfig;
+
+ /**
+ * 数据源标识
+ */
+ @TableField("data_source")
+ private String dataSource;
+
+ /**
+ * 使用次数(引用创建实例的次数)
+ */
+ @TableField("use_count")
+ private Integer useCount;
+
+ /**
+ * 状态(1=启用,0=停用,2=草稿)
+ */
+ @TableField("enabled")
+ private String enabled;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateInstanceDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateInstanceDO.java
new file mode 100644
index 00000000..88621fd1
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateInstanceDO.java
@@ -0,0 +1,87 @@
+package com.zt.plat.module.base.dal.dataobject.doctemplate;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
+import lombok.*;
+
+/**
+ * 模板实例 DO
+ *
+ * @author 系统生成
+ */
+@TableName(value = "bse_doc_instance")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DocTemplateInstanceDO extends BusinessBaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 实例名称
+ */
+ @TableField("instance_name")
+ private String instanceName;
+
+ /**
+ * 实例编码(唯一)
+ */
+ @TableField("instance_code")
+ private String instanceCode;
+
+ /**
+ * 引用的模板ID
+ */
+ @TableField("template_id")
+ private Long templateId;
+
+ /**
+ * 业务关联类型
+ */
+ @TableField("business_type")
+ private String businessType;
+
+ /**
+ * 业务关联ID
+ */
+ @TableField("business_id")
+ private Long businessId;
+
+ /**
+ * 业务关联标签(如 PC-2025-001)
+ */
+ @TableField("business_label")
+ private String businessLabel;
+
+ /**
+ * 用户编辑后的内容(含占位符)
+ */
+ @TableField("edited_content")
+ private String editedContent;
+
+ /**
+ * 渲染后的最终内容(占位符已替换)
+ */
+ @TableField("rendered_content")
+ private String renderedContent;
+
+ /**
+ * 备注
+ */
+ @TableField("remark")
+ private String remark;
+
+ /**
+ * 状态(draft=草稿,published=已发布)
+ */
+ @TableField("status")
+ private String status;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateTagDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateTagDO.java
new file mode 100644
index 00000000..564561ff
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/doctemplate/DocTemplateTagDO.java
@@ -0,0 +1,81 @@
+package com.zt.plat.module.base.dal.dataobject.doctemplate;
+
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BusinessBaseDO;
+import lombok.*;
+
+/**
+ * 标签库 DO
+ *
+ * @author 系统生成
+ */
+@TableName(value = "bse_doc_tag")
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+public class DocTemplateTagDO extends BusinessBaseDO {
+
+ /**
+ * 主键
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+
+ /**
+ * 标签名称(中文)
+ */
+ @TableField("tag_name")
+ private String tagName;
+
+ /**
+ * 标签编码(Velocity变量名)
+ */
+ @TableField("tag_code")
+ private String tagCode;
+
+ /**
+ * 所属分类ID
+ */
+ @TableField("category_id")
+ private Long categoryId;
+
+ /**
+ * 数据类型(String/Number/Date/Boolean)
+ */
+ @TableField("data_type")
+ private String dataType;
+
+ /**
+ * 默认值
+ */
+ @TableField("default_value")
+ private String defaultValue;
+
+ /**
+ * SQL脚本(可选,仅保存参考)
+ */
+ @TableField("sql_script")
+ private String sqlScript;
+
+ /**
+ * 描述
+ */
+ @TableField("description")
+ private String description;
+
+ /**
+ * 排序号
+ */
+ @TableField("sort")
+ private Integer sort;
+
+ /**
+ * 是否启用(1=启用,0=停用)
+ */
+ @TableField("enabled")
+ private String enabled;
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialclasses/MaterialClassesDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialclasses/MaterialClassesDO.java
new file mode 100644
index 00000000..fbf13b75
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialclasses/MaterialClassesDO.java
@@ -0,0 +1,60 @@
+package com.zt.plat.module.base.dal.dataobject.materialclasses;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 物料分类 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_mtrl_cls")
+@KeySequence("bse_mtrl_cls_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class MaterialClassesDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 父级ID
+ */
+ @TableField("PRN_ID")
+ private Long parentId;
+ /**
+ * 分类编码
+ */
+ @TableField("CD")
+ private String code;
+ /**
+ * 分类名称
+ */
+ @TableField("NAME")
+ private String name;
+ /**
+ * 分类级别-用于类别层级(大/中/小类)
+ */
+ @TableField("LVL")
+ private Long level;
+ /**
+ * 备注
+ */
+ @TableField("RMK")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialhasclasses/MaterialHasClassesDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialhasclasses/MaterialHasClassesDO.java
new file mode 100644
index 00000000..8bd7ceed
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialhasclasses/MaterialHasClassesDO.java
@@ -0,0 +1,45 @@
+package com.zt.plat.module.base.dal.dataobject.materialhasclasses;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 物料持有分类 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_mtrl_hs_cls")
+@KeySequence("bse_mtrl_hs_cls_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class MaterialHasClassesDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 物料信息ID
+ */
+ @TableField("INF_ID")
+ private Long infomationId;
+ /**
+ * 分类ID
+ */
+ @TableField("CLS_ID")
+ private Long classesId;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialhasproperties/MaterialHasPropertiesDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialhasproperties/MaterialHasPropertiesDO.java
new file mode 100644
index 00000000..8eccb9a1
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialhasproperties/MaterialHasPropertiesDO.java
@@ -0,0 +1,70 @@
+package com.zt.plat.module.base.dal.dataobject.materialhasproperties;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 物料持有属性 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_mtrl_hs_prps")
+@KeySequence("bse_mtrl_hs_prps_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class MaterialHasPropertiesDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 物料信息ID
+ */
+ @TableField("INF_ID")
+ private Long infomationId;
+ /**
+ * 属性ID
+ */
+ @TableField("PRPS_ID")
+ private Long propertiesId;
+ /**
+ * 计量单位ID-默认计量单位
+ */
+ @TableField("UNT_ID")
+ private Long unitId;
+ /**
+ * 属性值
+ */
+ @TableField("VAL")
+ private String value;
+ /**
+ * 是否关键属性-关键属性表示物料唯一性
+ */
+ @TableField("IS_KY")
+ private Integer isKey;
+ /**
+ * 是否计量定价
+ */
+ @TableField("IS_MTNG")
+ private Integer isMetering;
+ /**
+ * 排序号
+ */
+ @TableField("SRT")
+ private Long sort;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialproperties/MaterialPropertiesDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialproperties/MaterialPropertiesDO.java
new file mode 100644
index 00000000..a075eeb1
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/materialproperties/MaterialPropertiesDO.java
@@ -0,0 +1,65 @@
+package com.zt.plat.module.base.dal.dataobject.materialproperties;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 物料属性 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_mtrl_prps")
+@KeySequence("bse_mtrl_prps_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class MaterialPropertiesDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 属性编码
+ */
+ @TableField("CD")
+ private String code;
+ /**
+ * 属性名称
+ */
+ @TableField("NAME")
+ private String name;
+ /**
+ * 计量单位量ID
+ */
+ @TableField("UNT_QTY_ID")
+ private Long unitQuantityId;
+ /**
+ * 业务字典数据值
+ */
+ @TableField("DIC_DAT_VAL")
+ private String dictionaryDataValue;
+ /**
+ * 数据类型
+ */
+ @TableField("DAT_TP")
+ private String dataType;
+ /**
+ * 备注
+ */
+ @TableField("RMK")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processinginfomation/ProcessingInfomationDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processinginfomation/ProcessingInfomationDO.java
new file mode 100644
index 00000000..45c196a8
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processinginfomation/ProcessingInfomationDO.java
@@ -0,0 +1,76 @@
+package com.zt.plat.module.base.dal.dataobject.processinginfomation;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 工艺信息 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_proc_inf")
+@KeySequence("bse_proc_inf_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class ProcessingInfomationDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 父级ID
+ */
+ @TableField("PRN_ID")
+ private Long parentId;
+ /**
+ * 工艺编码-唯一业务键
+ */
+ @TableField("CD")
+ private String code;
+ /**
+ * 工艺名称
+ */
+ @TableField("NAME")
+ private String name;
+ /**
+ * 工艺类型值
+ */
+ @TableField("TP_VAL")
+ private Long typeValue;
+ /**
+ * 状态值-工艺状态
+ */
+ @TableField("STS_VAL")
+ private String statusValue;
+ /**
+ * 工艺描述
+ */
+ @TableField("DSP")
+ private String description;
+ /**
+ * 部门ID
+ */
+ @TableField("DEPT_ID")
+ private Long deptId;
+ /**
+ * 生效日期
+ */
+ @TableField("EFCT_DT")
+ private LocalDateTime effectiveDate;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processinginfomationoperation/ProcessingInfomationOperationDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processinginfomationoperation/ProcessingInfomationOperationDO.java
new file mode 100644
index 00000000..1710df1a
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processinginfomationoperation/ProcessingInfomationOperationDO.java
@@ -0,0 +1,60 @@
+package com.zt.plat.module.base.dal.dataobject.processinginfomationoperation;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 工艺工序 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_proc_inf_optn")
+@KeySequence("bse_proc_inf_optn_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class ProcessingInfomationOperationDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 前序工序ID
+ */
+ @TableField("PRE_OPTN_ID")
+ private Long previousOperationId;
+ /**
+ * 后续工序ID
+ */
+ @TableField("NXT_OPTN_ID")
+ private Long nextOperationId;
+ /**
+ * 工艺ID
+ */
+ @TableField("PROC_ID")
+ private Long processingId;
+ /**
+ * 是否关键工序
+ */
+ @TableField("IS_KY")
+ private Integer isKey;
+ /**
+ * 备注
+ */
+ @TableField("RMK")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processingoperation/ProcessingOperationDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processingoperation/ProcessingOperationDO.java
new file mode 100644
index 00000000..be78b179
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processingoperation/ProcessingOperationDO.java
@@ -0,0 +1,60 @@
+package com.zt.plat.module.base.dal.dataobject.processingoperation;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 工序 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_proc_optn")
+@KeySequence("bse_proc_optn_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class ProcessingOperationDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 工序编码
+ */
+ @TableField("CD")
+ private String code;
+ /**
+ * 工序名称
+ */
+ @TableField("NAME")
+ private String name;
+ /**
+ * 排序号
+ */
+ @TableField("SRT")
+ private Long sort;
+ /**
+ * 类型值-工序类型
+ */
+ @TableField("TP_VAL")
+ private String typeValue;
+ /**
+ * 备注
+ */
+ @TableField("RMK")
+ private String remark;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processingoperationmaterial/ProcessingOperationMaterialDO.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processingoperationmaterial/ProcessingOperationMaterialDO.java
new file mode 100644
index 00000000..e1447cda
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/dataobject/processingoperationmaterial/ProcessingOperationMaterialDO.java
@@ -0,0 +1,58 @@
+package com.zt.plat.module.base.dal.dataobject.processingoperationmaterial;
+
+import lombok.*;
+import java.util.*;
+ import java.time.LocalDateTime;
+ import java.time.LocalDateTime;
+import com.baomidou.mybatisplus.annotation.*;
+import com.zt.plat.framework.mybatis.core.dataobject.BaseDO;
+/**
+* 工艺工序物料 DO
+*
+* @author 后台管理-1
+*/
+@TableName("bse_proc_optn_mtrl")
+@KeySequence("bse_proc_optn_mtrl_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
+@Data
+@EqualsAndHashCode(callSuper = true)
+@ToString(callSuper = true)
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+/**
+* 支持业务基类继承:isBusiness=true 时继承 BusinessBaseDO,否则继承 BaseDO
+*/
+public class ProcessingOperationMaterialDO extends BaseDO {
+
+
+
+ /**
+ * 主键ID
+ */
+ @TableId(type = IdType.ASSIGN_ID)
+ private Long id;
+ /**
+ * 工艺工序ID
+ */
+ private Long processingOperationId;
+ /**
+ * 物料ID
+ */
+ private Long materialId;
+ /**
+ * 类型值-物料类型(产出/投入)
+ */
+ @TableField("TP_VAL")
+ private String typeValue;
+ /**
+ * 备注
+ */
+ @TableField("RMK")
+ private String remark;
+ /**
+ * 组织机构
+ */
+ @TableField("DEPT_IDS")
+ private String departmentIds;
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/base/MaterialInfomationMapper.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/base/MaterialInfomationMapper.java
index 2e353cb0..e0c41fd1 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/base/MaterialInfomationMapper.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/dal/mysql/base/MaterialInfomationMapper.java
@@ -7,6 +7,8 @@ import com.zt.plat.module.base.controller.admin.base.vo.MaterialInfomationPageRe
import com.zt.plat.module.base.dal.dataobject.base.MaterialInfomationDO;
import org.apache.ibatis.annotations.Mapper;
+import java.util.Collection;
+
/**
* 物料信息 Mapper
*
@@ -16,11 +18,16 @@ import org.apache.ibatis.annotations.Mapper;
public interface MaterialInfomationMapper extends BaseMapperX {
default PageResult selectPage(MaterialInfomationPageReqVO reqVO) {
- return selectPage(reqVO, new LambdaQueryWrapperX()
+ return selectPage(reqVO, (Collection) null);
+ }
+
+ default PageResult selectPage(MaterialInfomationPageReqVO reqVO, Collection infomationIds) {
+ return BaseMapperX.super.selectPage(reqVO, new LambdaQueryWrapperX()
.eqIfPresent(MaterialInfomationDO::getCode, reqVO.getCode())
.likeIfPresent(MaterialInfomationDO::getName, reqVO.getName())
.eqIfPresent(MaterialInfomationDO::getRemark, reqVO.getRemark())
.betweenIfPresent(MaterialInfomationDO::getCreateTime, reqVO.getCreateTime())
+ .inIfPresent(MaterialInfomationDO::getId, infomationIds)
.orderByDesc(MaterialInfomationDO::getId));
}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/base/MaterialInfomationServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/base/MaterialInfomationServiceImpl.java
index eec1accc..2333fc24 100644
--- a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/base/MaterialInfomationServiceImpl.java
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/base/MaterialInfomationServiceImpl.java
@@ -1,21 +1,29 @@
package com.zt.plat.module.base.service.base;
import cn.hutool.core.collection.CollUtil;
+import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.zt.plat.framework.common.pojo.CommonResult;
import com.zt.plat.framework.common.pojo.PageResult;
import com.zt.plat.framework.common.util.object.BeanUtils;
import com.zt.plat.module.base.controller.admin.base.vo.MaterialInfomationPageReqVO;
import com.zt.plat.module.base.controller.admin.base.vo.MaterialInfomationRespVO;
import com.zt.plat.module.base.controller.admin.base.vo.MaterialInfomationSaveReqVO;
+import com.zt.plat.module.base.dal.dao.materialhasclasses.MaterialHasClassesMapper;
import com.zt.plat.module.base.dal.dataobject.base.MaterialInfomationDO;
+import com.zt.plat.module.base.dal.dataobject.materialhasclasses.MaterialHasClassesDO;
import com.zt.plat.module.base.dal.mysql.base.MaterialInfomationMapper;
import com.zt.plat.module.erp.api.ErpExternalApi;
import com.zt.plat.module.erp.api.dto.ErpProductiveVersionReqDTO;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
import org.springframework.validation.annotation.Validated;
+import java.util.Collections;
import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.stream.Collectors;
import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
import static com.zt.plat.module.base.enums.ErrorCodeConstants.MATERIAL_INFOMATION_NOT_EXISTS;
@@ -35,23 +43,46 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService
@Resource
private ErpExternalApi erpExternalApi;
+ @Resource
+ private MaterialHasClassesMapper materialHasClassesMapper;
@Override
+ @Transactional(rollbackFor = Exception.class)
public MaterialInfomationRespVO createMaterialInfomation(MaterialInfomationSaveReqVO createReqVO) {
// 插入
MaterialInfomationDO materialInfomation = BeanUtils.toBean(createReqVO, MaterialInfomationDO.class);
materialInfomationMapper.insert(materialInfomation);
+ // 维护分类关联
+ if (createReqVO.getClassesId() != null) {
+ MaterialHasClassesDO relation = MaterialHasClassesDO.builder()
+ .classesId(createReqVO.getClassesId())
+ .infomationId(materialInfomation.getId())
+ .build();
+ materialHasClassesMapper.insert(relation);
+ materialInfomation.setClassesId(createReqVO.getClassesId());
+ }
// 返回
return BeanUtils.toBean(materialInfomation, MaterialInfomationRespVO.class);
}
@Override
+ @Transactional(rollbackFor = Exception.class)
public void updateMaterialInfomation(MaterialInfomationSaveReqVO updateReqVO) {
// 校验存在
validateMaterialInfomationExists(updateReqVO.getId());
// 更新
MaterialInfomationDO updateObj = BeanUtils.toBean(updateReqVO, MaterialInfomationDO.class);
materialInfomationMapper.updateById(updateObj);
+ // 更新分类关联
+ materialHasClassesMapper.delete(new LambdaUpdateWrapper()
+ .eq(MaterialHasClassesDO::getInfomationId, updateReqVO.getId()));
+ if (updateReqVO.getClassesId() != null) {
+ MaterialHasClassesDO relation = MaterialHasClassesDO.builder()
+ .classesId(updateReqVO.getClassesId())
+ .infomationId(updateReqVO.getId())
+ .build();
+ materialHasClassesMapper.insert(relation);
+ }
}
@Override
@@ -60,6 +91,8 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService
validateMaterialInfomationExists(id);
// 删除
materialInfomationMapper.deleteById(id);
+ materialHasClassesMapper.delete(new LambdaUpdateWrapper()
+ .eq(MaterialHasClassesDO::getInfomationId, id));
}
@Override
@@ -85,12 +118,52 @@ public class MaterialInfomationServiceImpl implements MaterialInfomationService
@Override
public MaterialInfomationDO getMaterialInfomation(Long id) {
- return materialInfomationMapper.selectById(id);
+ MaterialInfomationDO info = materialInfomationMapper.selectById(id);
+ if (info == null) {
+ return null;
+ }
+ MaterialHasClassesDO relation = materialHasClassesMapper.selectFirstOne(MaterialHasClassesDO::getInfomationId, id);
+ if (relation != null) {
+ info.setClassesId(relation.getClassesId());
+ }
+ return info;
}
@Override
public PageResult getMaterialInfomationPage(MaterialInfomationPageReqVO pageReqVO) {
- return materialInfomationMapper.selectPage(pageReqVO);
+ List infomationIds = null;
+ List relationList = Collections.emptyList();
+ if (pageReqVO.getClassesId() != null) {
+ relationList = materialHasClassesMapper.selectList(MaterialHasClassesDO::getClassesId, pageReqVO.getClassesId());
+ if (CollUtil.isEmpty(relationList)) {
+ return PageResult.empty();
+ }
+ infomationIds = relationList.stream()
+ .map(MaterialHasClassesDO::getInfomationId)
+ .filter(Objects::nonNull)
+ .distinct()
+ .collect(Collectors.toList());
+ }
+
+ PageResult pageResult = materialInfomationMapper.selectPage(pageReqVO, infomationIds);
+ if (CollUtil.isEmpty(pageResult.getList())) {
+ return pageResult;
+ }
+
+ List currentInfoIds = pageResult.getList().stream()
+ .map(MaterialInfomationDO::getId)
+ .collect(Collectors.toList());
+
+ if (pageReqVO.getClassesId() == null) {
+ relationList = materialHasClassesMapper.selectList(MaterialHasClassesDO::getInfomationId, currentInfoIds);
+ }
+
+ Map infoClassMap = relationList.stream()
+ .filter(item -> item.getInfomationId() != null)
+ .collect(Collectors.toMap(MaterialHasClassesDO::getInfomationId, MaterialHasClassesDO::getClassesId, (existing, replacement) -> existing));
+
+ pageResult.getList().forEach(item -> item.setClassesId(infoClassMap.get(item.getId())));
+ return pageResult;
}
@Override
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/departmentmaterial/DepartmentMaterialService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/departmentmaterial/DepartmentMaterialService.java
new file mode 100644
index 00000000..06419589
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/departmentmaterial/DepartmentMaterialService.java
@@ -0,0 +1,62 @@
+package com.zt.plat.module.base.service.departmentmaterial;
+
+import java.util.*;
+import jakarta.validation.*;
+import com.zt.plat.module.base.controller.admin.departmentmaterial.vo.*;
+import com.zt.plat.module.base.dal.dataobject.departmentmaterial.DepartmentMaterialDO;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.pojo.PageParam;
+
+/**
+ * 组织架构物料 Service 接口
+ *
+ * @author 后台管理-1
+ */
+public interface DepartmentMaterialService {
+
+ /**
+ * 创建组织架构物料
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ DepartmentMaterialRespVO createDepartmentMaterial(@Valid DepartmentMaterialSaveReqVO createReqVO);
+
+ /**
+ * 更新组织架构物料
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateDepartmentMaterial(@Valid DepartmentMaterialSaveReqVO updateReqVO);
+
+ /**
+ * 删除组织架构物料
+ *
+ * @param id 编号
+ */
+ void deleteDepartmentMaterial(Long id);
+
+ /**
+ * 批量删除组织架构物料
+ *
+ * @param ids 编号
+ */
+ void deleteDepartmentMaterialListByIds(List ids);
+
+ /**
+ * 获得组织架构物料
+ *
+ * @param id 编号
+ * @return 组织架构物料
+ */
+ DepartmentMaterialDO getDepartmentMaterial(Long id);
+
+ /**
+ * 获得组织架构物料分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 组织架构物料分页
+ */
+ PageResult getDepartmentMaterialPage(DepartmentMaterialPageReqVO pageReqVO);
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/departmentmaterial/DepartmentMaterialServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/departmentmaterial/DepartmentMaterialServiceImpl.java
new file mode 100644
index 00000000..72c3f05f
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/departmentmaterial/DepartmentMaterialServiceImpl.java
@@ -0,0 +1,246 @@
+package com.zt.plat.module.base.service.departmentmaterial;
+
+import cn.hutool.core.collection.CollUtil;
+import cn.hutool.core.util.StrUtil;
+import jakarta.annotation.Resource;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import java.util.*;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.framework.common.util.collection.CollectionUtils;
+import com.zt.plat.framework.common.util.object.BeanUtils;
+import com.zt.plat.framework.mybatis.core.query.LambdaQueryWrapperX;
+import com.zt.plat.module.base.controller.admin.departmentmaterial.vo.*;
+import com.zt.plat.module.base.dal.dao.departmentmaterial.DepartmentMaterialMapper;
+import com.zt.plat.module.base.dal.dao.materialclasses.MaterialClassesMapper;
+import com.zt.plat.module.base.dal.dataobject.base.MaterialInfomationDO;
+import com.zt.plat.module.base.dal.dataobject.departmentmaterial.DepartmentMaterialDO;
+import com.zt.plat.module.base.dal.dataobject.materialclasses.MaterialClassesDO;
+import com.zt.plat.module.base.dal.mysql.base.MaterialInfomationMapper;
+import com.zt.plat.module.system.api.dept.DeptApi;
+import com.zt.plat.module.system.api.dept.dto.DeptRespDTO;
+
+import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zt.plat.module.base.enums.ErrorCodeConstants.*;
+
+/**
+ * 组织架构物料 Service 实现类
+ *
+ * @author 后台管理-1
+ */
+@Service
+@Validated
+public class DepartmentMaterialServiceImpl implements DepartmentMaterialService {
+
+ @Resource
+ private DepartmentMaterialMapper departmentMaterialMapper;
+
+ @Resource
+ private MaterialInfomationMapper materialInfomationMapper;
+
+ @Resource
+ private MaterialClassesMapper materialClassesMapper;
+
+ @Resource
+ private DeptApi deptApi;
+
+ @Override
+ public DepartmentMaterialRespVO createDepartmentMaterial(DepartmentMaterialSaveReqVO createReqVO) {
+ // 插入
+ DepartmentMaterialDO departmentMaterial = BeanUtils.toBean(createReqVO, DepartmentMaterialDO.class);
+ departmentMaterialMapper.insert(departmentMaterial);
+ // 返回
+ return BeanUtils.toBean(departmentMaterial, DepartmentMaterialRespVO.class);
+ }
+
+ @Override
+ public void updateDepartmentMaterial(DepartmentMaterialSaveReqVO updateReqVO) {
+ // 校验存在
+ validateDepartmentMaterialExists(updateReqVO.getId());
+ // 更新
+ DepartmentMaterialDO updateObj = BeanUtils.toBean(updateReqVO, DepartmentMaterialDO.class);
+ departmentMaterialMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteDepartmentMaterial(Long id) {
+ // 校验存在
+ validateDepartmentMaterialExists(id);
+ // 删除
+ departmentMaterialMapper.deleteById(id);
+ }
+
+ @Override
+ public void deleteDepartmentMaterialListByIds(List ids) {
+ // 校验存在
+ validateDepartmentMaterialExists(ids);
+ // 删除
+ departmentMaterialMapper.deleteByIds(ids);
+ }
+
+ private void validateDepartmentMaterialExists(List ids) {
+ List list = departmentMaterialMapper.selectByIds(ids);
+ if (CollUtil.isEmpty(list) || list.size() != ids.size()) {
+ throw exception(DEPARTMENT_MATERIAL_NOT_EXISTS);
+ }
+ }
+
+ private void validateDepartmentMaterialExists(Long id) {
+ if (departmentMaterialMapper.selectById(id) == null) {
+ throw exception(DEPARTMENT_MATERIAL_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public DepartmentMaterialDO getDepartmentMaterial(Long id) {
+ return departmentMaterialMapper.selectById(id);
+ }
+
+ @Override
+ public PageResult getDepartmentMaterialPage(DepartmentMaterialPageReqVO pageReqVO) {
+ // 预处理物料名称/编码查询条件
+ List matchedInfoIds = null;
+ if (StrUtil.isNotBlank(pageReqVO.getMaterialName()) || StrUtil.isNotBlank(pageReqVO.getMaterialNumber())) {
+ LambdaQueryWrapperX infoWrapper = new LambdaQueryWrapperX<>();
+ infoWrapper.likeIfPresent(MaterialInfomationDO::getName, pageReqVO.getMaterialName())
+ .likeIfPresent(MaterialInfomationDO::getCode, pageReqVO.getMaterialNumber());
+ List infoCandidates = materialInfomationMapper.selectList(infoWrapper);
+ if (CollUtil.isEmpty(infoCandidates)) {
+ return PageResult.empty();
+ }
+ matchedInfoIds = infoCandidates.stream().map(MaterialInfomationDO::getId).toList();
+ pageReqVO.setInfomationIds(matchedInfoIds);
+ }
+
+ PageResult pageResult = departmentMaterialMapper.selectPage(pageReqVO);
+ // 重置,避免后续使用该入参出现意外的 in 条件
+ pageReqVO.setInfomationIds(null);
+
+ if (CollUtil.isEmpty(pageResult.getList())) {
+ return PageResult.empty(pageResult.getTotal());
+ }
+
+ // 关联数据准备
+ Set infoIds = pageResult.getList().stream()
+ .map(DepartmentMaterialDO::getInfomationId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+ Map infoMap = infoIds.isEmpty()
+ ? Collections.emptyMap()
+ : materialInfomationMapper.selectBatchIds(infoIds).stream()
+ .filter(Objects::nonNull)
+ .collect(Collectors.toMap(MaterialInfomationDO::getId, Function.identity()));
+
+ Set classIds = new HashSet<>();
+ pageResult.getList().forEach(item -> {
+ if (item.getClassesId() != null) {
+ classIds.add(item.getClassesId());
+ }
+ MaterialInfomationDO info = infoMap.get(item.getInfomationId());
+ if (info != null && info.getClassesId() != null) {
+ classIds.add(info.getClassesId());
+ }
+ });
+
+ Map classCache = loadClassHierarchy(classIds);
+
+ Set deptIds = pageResult.getList().stream()
+ .map(DepartmentMaterialDO::getDeptId)
+ .filter(Objects::nonNull)
+ .collect(Collectors.toSet());
+
+ Map deptMap = Collections.emptyMap();
+ if (!deptIds.isEmpty()) {
+ try {
+ deptMap = CollectionUtils.convertMap(deptApi.getDeptList(deptIds).getCheckedData(), DeptRespDTO::getId);
+ } catch (Exception ignore) {
+ deptMap = Collections.emptyMap();
+ }
+ }
+
+ List respList = new ArrayList<>(pageResult.getList().size());
+ for (DepartmentMaterialDO item : pageResult.getList()) {
+ DepartmentMaterialRespVO respVO = BeanUtils.toBean(item, DepartmentMaterialRespVO.class);
+
+ MaterialInfomationDO info = infoMap.get(item.getInfomationId());
+ if (info != null) {
+ respVO.setMaterialNumber(info.getCode());
+ respVO.setMaterialName(info.getName());
+ }
+
+ Long targetClassId = item.getClassesId();
+ if (targetClassId == null && info != null) {
+ targetClassId = info.getClassesId();
+ }
+ if (targetClassId != null) {
+ List classPath = buildClassPath(targetClassId, classCache);
+ if (!classPath.isEmpty()) {
+ respVO.setCategoryLargeName(classPath.get(0));
+ if (classPath.size() > 1) {
+ respVO.setCategoryMediumName(classPath.get(1));
+ }
+ if (classPath.size() > 2) {
+ respVO.setCategorySmallName(classPath.get(classPath.size() - 1));
+ }
+ respVO.setCategoryPath(String.join("/", classPath));
+ }
+ }
+
+ DeptRespDTO deptRespDTO = deptMap.get(item.getDeptId());
+ if (deptRespDTO != null) {
+ respVO.setDeptName(deptRespDTO.getName());
+ }
+
+ respVO.setStatusLabel(StrUtil.isNotBlank(respVO.getStatusLabel()) ? respVO.getStatusLabel() : "未配置");
+
+ respVO.setDictionaryDataLabel(respVO.getDictionaryDataValue());
+ respList.add(respVO);
+ }
+
+ return new PageResult<>(respList, pageResult.getTotal());
+ }
+
+ private Map loadClassHierarchy(Set initialIds) {
+ if (CollUtil.isEmpty(initialIds)) {
+ return Collections.emptyMap();
+ }
+ Map cache = new HashMap<>();
+ Set pending = new HashSet<>(initialIds);
+ while (!pending.isEmpty()) {
+ List fetched = materialClassesMapper.selectBatchIds(pending);
+ pending = new HashSet<>();
+ for (MaterialClassesDO cls : fetched) {
+ if (cls == null || cache.containsKey(cls.getId())) {
+ continue;
+ }
+ cache.put(cls.getId(), cls);
+ Long parentId = cls.getParentId();
+ if (parentId != null && parentId > 0 && !cache.containsKey(parentId)) {
+ pending.add(parentId);
+ }
+ }
+ }
+ return cache;
+ }
+
+ private List buildClassPath(Long classId, Map cache) {
+ List path = new ArrayList<>();
+ MaterialClassesDO current = cache.get(classId);
+ int guard = 0;
+ while (current != null && guard++ < 10) {
+ path.add(current.getName());
+ Long parentId = current.getParentId();
+ if (parentId == null || parentId == 0) {
+ break;
+ }
+ current = cache.get(parentId);
+ }
+ Collections.reverse(path);
+ return path;
+ }
+
+}
\ No newline at end of file
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateCategoryService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateCategoryService.java
new file mode 100644
index 00000000..6b1d7eb0
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateCategoryService.java
@@ -0,0 +1,78 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryPageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategorySaveReqVO;
+
+import jakarta.validation.Valid;
+import java.util.List;
+
+/**
+ * 模板分类 Service 接口
+ *
+ * @author 系统生成
+ */
+public interface DocTemplateCategoryService {
+
+ /**
+ * 创建模板分类
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createTemplateCategory(@Valid DocTemplateCategorySaveReqVO createReqVO);
+
+ /**
+ * 更新模板分类
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateTemplateCategory(@Valid DocTemplateCategorySaveReqVO updateReqVO);
+
+ /**
+ * 删除模板分类
+ *
+ * @param id 编号
+ */
+ void deleteTemplateCategory(Long id);
+
+ /**
+ * 获得模板分类
+ *
+ * @param id 编号
+ * @return 模板分类
+ */
+ DocTemplateCategoryRespVO getTemplateCategory(Long id);
+
+ /**
+ * 获得模板分类分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 模板分类分页
+ */
+ PageResult getTemplateCategoryPage(DocTemplateCategoryPageReqVO pageReqVO);
+
+ /**
+ * 获得模板分类列表
+ *
+ * @return 模板分类列表
+ */
+ List getTemplateCategoryList();
+
+ /**
+ * 获得模板分类树形结构
+ *
+ * @return 模板分类树
+ */
+ List buildTree();
+
+ /**
+ * 获得分类完整路径(包含所有父级)
+ *
+ * @param categoryId 分类ID
+ * @return 分类路径,用"/"分隔,如"合同管理/销售合同"
+ */
+ String getCategoryFullPath(Long categoryId);
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateCategoryServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateCategoryServiceImpl.java
new file mode 100644
index 00000000..326d8a24
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateCategoryServiceImpl.java
@@ -0,0 +1,158 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryPageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategoryRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateCategorySaveReqVO;
+import com.zt.plat.module.base.convert.doctemplate.DocTemplateCategoryConvert;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateCategoryDO;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateCategoryMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import jakarta.annotation.Resource;
+import java.util.ArrayList;
+import java.util.Comparator;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zt.plat.module.base.enums.ErrorCodeConstants.TEMPLATE_CATEGORY_NOT_EXISTS;
+
+/**
+ * 模板分类 Service 实现类
+ *
+ * @author 系统生成
+ */
+@Service
+@Validated
+public class DocTemplateCategoryServiceImpl implements DocTemplateCategoryService {
+
+ @Resource
+ private DocTemplateCategoryMapper templateCategoryMapper;
+
+ @Override
+ public Long createTemplateCategory(DocTemplateCategorySaveReqVO createReqVO) {
+ // 插入
+ DocTemplateCategoryDO templateCategory = DocTemplateCategoryConvert.INSTANCE.convert(createReqVO);
+ // 设置默认值
+ if (templateCategory.getSort() == null) {
+ templateCategory.setSort(0);
+ }
+ templateCategoryMapper.insert(templateCategory);
+ // 返回
+ return templateCategory.getId();
+ }
+
+ @Override
+ public void updateTemplateCategory(DocTemplateCategorySaveReqVO updateReqVO) {
+ // 校验存在
+ validateTemplateCategoryExists(updateReqVO.getId());
+ // 更新
+ DocTemplateCategoryDO updateObj = DocTemplateCategoryConvert.INSTANCE.convert(updateReqVO);
+ templateCategoryMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteTemplateCategory(Long id) {
+ // 校验存在
+ validateTemplateCategoryExists(id);
+ // 删除
+ templateCategoryMapper.deleteById(id);
+ }
+
+ private void validateTemplateCategoryExists(Long id) {
+ if (templateCategoryMapper.selectById(id) == null) {
+ throw exception(TEMPLATE_CATEGORY_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public DocTemplateCategoryRespVO getTemplateCategory(Long id) {
+ DocTemplateCategoryDO templateCategory = templateCategoryMapper.selectById(id);
+ return DocTemplateCategoryConvert.INSTANCE.convert(templateCategory);
+ }
+
+ @Override
+ public PageResult getTemplateCategoryPage(DocTemplateCategoryPageReqVO pageReqVO) {
+ PageResult pageResult = templateCategoryMapper.selectPage(pageReqVO);
+ return DocTemplateCategoryConvert.INSTANCE.convertPage(pageResult);
+ }
+
+ @Override
+ public List getTemplateCategoryList() {
+ List list = templateCategoryMapper.selectList();
+ return DocTemplateCategoryConvert.INSTANCE.convertList(list);
+ }
+
+ @Override
+ public List buildTree() {
+ // 1. 查询所有分类数据
+ List allCategories = templateCategoryMapper.selectList();
+
+ // 2. 转换为 VO
+ List categoryVOs = DocTemplateCategoryConvert.INSTANCE.convertList(allCategories);
+
+ // 3. 构建树形结构
+ return buildTreeStructure(categoryVOs);
+ }
+
+ /**
+ * 构建树形结构
+ */
+ private List buildTreeStructure(List categories) {
+ // 1. 按 parentId 分组
+ Map> groupByParentId = categories.stream()
+ .collect(Collectors.groupingBy(node ->
+ node.getParentId() != null ? node.getParentId().toString() : "null"));
+
+ // 2. 设置子节点并排序
+ categories.forEach(node -> {
+ List children = groupByParentId.get(node.getId().toString());
+ if (children != null && !children.isEmpty()) {
+ // 按排序号升序排列
+ children.sort(Comparator.comparing(DocTemplateCategoryRespVO::getSort,
+ Comparator.nullsLast(Comparator.naturalOrder())));
+ node.setChildren(children);
+ }
+ });
+
+ // 3. 返回根节点(parentId 为 null 的节点)
+ List rootNodes = groupByParentId.get("null");
+ if (rootNodes != null) {
+ // 根节点也要排序
+ rootNodes.sort(Comparator.comparing(DocTemplateCategoryRespVO::getSort,
+ Comparator.nullsLast(Comparator.naturalOrder())));
+ return rootNodes;
+ }
+ return List.of();
+ }
+
+ @Override
+ public String getCategoryFullPath(Long categoryId) {
+ if (categoryId == null) {
+ return "";
+ }
+
+ // 构建分类路径
+ List pathNames = new ArrayList<>();
+ Long currentId = categoryId;
+
+ // 递归查找父级分类
+ while (currentId != null) {
+ DocTemplateCategoryDO category = templateCategoryMapper.selectById(currentId);
+ if (category == null) {
+ break;
+ }
+ // 将当前分类名称添加到列表开头
+ pathNames.add(0, category.getCategoryName());
+ // 继续查找父级
+ currentId = category.getParentId();
+ }
+
+ // 用"/"拼接分类路径
+ return String.join("/", pathNames);
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateInstanceService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateInstanceService.java
new file mode 100644
index 00000000..4c9acf2d
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateInstanceService.java
@@ -0,0 +1,63 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstancePageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceSaveReqVO;
+
+import jakarta.validation.Valid;
+import java.util.List;
+
+/**
+ * 模板实例 Service 接口
+ *
+ * @author 系统生成
+ */
+public interface DocTemplateInstanceService {
+
+ /**
+ * 创建模板实例
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createTemplateInstance(@Valid DocTemplateInstanceSaveReqVO createReqVO);
+
+ /**
+ * 更新模板实例
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateTemplateInstance(@Valid DocTemplateInstanceSaveReqVO updateReqVO);
+
+ /**
+ * 删除模板实例
+ *
+ * @param id 编号
+ */
+ void deleteTemplateInstance(Long id);
+
+ /**
+ * 获得模板实例
+ *
+ * @param id 编号
+ * @return 模板实例
+ */
+ DocTemplateInstanceRespVO getTemplateInstance(Long id);
+
+ /**
+ * 获得模板实例分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 模板实例分页
+ */
+ PageResult getTemplateInstancePage(DocTemplateInstancePageReqVO pageReqVO);
+
+ /**
+ * 获得模板实例列表
+ *
+ * @return 模板实例列表
+ */
+ List getTemplateInstanceList();
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateInstanceServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateInstanceServiceImpl.java
new file mode 100644
index 00000000..17100c48
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateInstanceServiceImpl.java
@@ -0,0 +1,136 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstancePageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateInstanceSaveReqVO;
+import com.zt.plat.module.base.convert.doctemplate.DocTemplateInstanceConvert;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateInstanceDO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateInstanceMapper;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.transaction.annotation.Transactional;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zt.plat.module.base.enums.ErrorCodeConstants.*;
+
+/**
+ * 模板实例 Service 实现类
+ *
+ * @author 系统生成
+ */
+@Service
+@Validated
+public class DocTemplateInstanceServiceImpl implements DocTemplateInstanceService {
+
+ @Resource
+ private DocTemplateInstanceMapper docTemplateInstanceMapper;
+
+ @Resource
+ private DocTemplateMapper docTemplateMapper;
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public Long createTemplateInstance(DocTemplateInstanceSaveReqVO createReqVO) {
+ // 校验模板存在
+ DocTemplateDO template = docTemplateMapper.selectById(createReqVO.getTemplateId());
+ if (template == null) {
+ throw exception(TEMPLATE_NOT_EXISTS);
+ }
+ // 校验实例编码唯一性
+ validateInstanceCodeUnique(null, createReqVO.getInstanceCode());
+
+ // 插入实例
+ DocTemplateInstanceDO templateInstance = DocTemplateInstanceConvert.INSTANCE.convert(createReqVO);
+ docTemplateInstanceMapper.insert(templateInstance);
+
+ // 更新模板使用次数
+ incrementTemplateUseCount(createReqVO.getTemplateId());
+
+ // 返回
+ return templateInstance.getId();
+ }
+
+ @Override
+ public void updateTemplateInstance(DocTemplateInstanceSaveReqVO updateReqVO) {
+ // 校验存在
+ validateTemplateInstanceExists(updateReqVO.getId());
+ // 校验实例编码唯一性
+ validateInstanceCodeUnique(updateReqVO.getId(), updateReqVO.getInstanceCode());
+ // 更新
+ DocTemplateInstanceDO updateObj = DocTemplateInstanceConvert.INSTANCE.convert(updateReqVO);
+ docTemplateInstanceMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteTemplateInstance(Long id) {
+ // 校验存在
+ validateTemplateInstanceExists(id);
+ // 删除
+ docTemplateInstanceMapper.deleteById(id);
+ }
+
+ private void validateTemplateInstanceExists(Long id) {
+ if (docTemplateInstanceMapper.selectById(id) == null) {
+ throw exception(TEMPLATE_INSTANCE_NOT_EXISTS);
+ }
+ }
+
+ /**
+ * 校验实例编码唯一性
+ */
+ private void validateInstanceCodeUnique(Long id, String instanceCode) {
+ if (StrUtil.isBlank(instanceCode)) {
+ return;
+ }
+ DocTemplateInstanceDO instance = docTemplateInstanceMapper.selectOne(new LambdaQueryWrapper()
+ .eq(DocTemplateInstanceDO::getInstanceCode, instanceCode));
+ if (instance == null) {
+ return;
+ }
+ // 如果是更新操作,排除自己
+ if (id != null && id.equals(instance.getId())) {
+ return;
+ }
+ throw exception(TEMPLATE_INSTANCE_CODE_DUPLICATE);
+ }
+
+ /**
+ * 增加模板使用次数
+ */
+ private void incrementTemplateUseCount(Long templateId) {
+ DocTemplateDO template = docTemplateMapper.selectById(templateId);
+ if (template != null) {
+ DocTemplateDO updateObj = new DocTemplateDO();
+ updateObj.setId(templateId);
+ updateObj.setUseCount(template.getUseCount() == null ? 1 : template.getUseCount() + 1);
+ docTemplateMapper.updateById(updateObj);
+ }
+ }
+
+ @Override
+ public DocTemplateInstanceRespVO getTemplateInstance(Long id) {
+ DocTemplateInstanceDO templateInstance = docTemplateInstanceMapper.selectById(id);
+ return DocTemplateInstanceConvert.INSTANCE.convert(templateInstance);
+ }
+
+ @Override
+ public PageResult getTemplateInstancePage(DocTemplateInstancePageReqVO pageReqVO) {
+ PageResult pageResult = docTemplateInstanceMapper.selectPage(pageReqVO);
+ return DocTemplateInstanceConvert.INSTANCE.convertPage(pageResult);
+ }
+
+ @Override
+ public List getTemplateInstanceList() {
+ List list = docTemplateInstanceMapper.selectList();
+ return DocTemplateInstanceConvert.INSTANCE.convertList(list);
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateRenderService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateRenderService.java
new file mode 100644
index 00000000..277d3e00
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateRenderService.java
@@ -0,0 +1,31 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import java.util.Map;
+
+/**
+ * 文档模板渲染 Service 接口
+ *
+ * @author 系统生成
+ */
+public interface DocTemplateRenderService {
+
+ /**
+ * 渲染模板内容
+ *
+ * @param templateId 模板ID(可选,与instanceId二选一)
+ * @param instanceId 实例ID(可选,与templateId二选一)
+ * @param content 直接传入内容(可选,优先级最高)
+ * @param dataMap 数据Map(必填)
+ * @return 渲染后的内容
+ */
+ String render(Long templateId, Long instanceId, String content, Map dataMap);
+
+ /**
+ * 渲染模板并保存到实例
+ *
+ * @param instanceId 实例ID
+ * @param dataMap 数据Map
+ */
+ void renderAndSave(Long instanceId, Map dataMap);
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateRenderServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateRenderServiceImpl.java
new file mode 100644
index 00000000..18374ae6
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateRenderServiceImpl.java
@@ -0,0 +1,144 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import cn.hutool.core.util.StrUtil;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateInstanceDO;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateMapper;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateInstanceMapper;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.velocity.VelocityContext;
+import org.apache.velocity.app.Velocity;
+import org.springframework.stereotype.Service;
+
+import jakarta.annotation.PostConstruct;
+import jakarta.annotation.Resource;
+import java.io.StringWriter;
+import java.util.Map;
+import java.util.Properties;
+
+import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zt.plat.module.base.enums.ErrorCodeConstants.*;
+
+/**
+ * 文档模板渲染 Service 实现类
+ * 使用 Apache Velocity 模板引擎进行渲染
+ *
+ * @author 系统生成
+ */
+@Service
+@Slf4j
+public class DocTemplateRenderServiceImpl implements DocTemplateRenderService {
+
+ @Resource
+ private DocTemplateMapper templateMapper;
+
+ @Resource
+ private DocTemplateInstanceMapper instanceMapper;
+
+ /**
+ * 初始化 Velocity 引擎
+ */
+ @PostConstruct
+ public void initVelocity() {
+ try {
+ Properties props = new Properties();
+ // 设置编码
+ props.setProperty("input.encoding", "UTF-8");
+ props.setProperty("output.encoding", "UTF-8");
+ // 设置资源加载器为字符串
+ props.setProperty("resource.loader", "string");
+ props.setProperty("string.resource.loader.class",
+ "org.apache.velocity.runtime.resource.loader.StringResourceLoader");
+ // 关闭日志(可选)
+ props.setProperty("runtime.log.logsystem.class",
+ "org.apache.velocity.runtime.log.NullLogChute");
+
+ Velocity.init(props);
+ log.info("Velocity 模板引擎初始化成功");
+ } catch (Exception e) {
+ log.error("Velocity 模板引擎初始化失败", e);
+ throw new RuntimeException("Velocity 模板引擎初始化失败", e);
+ }
+ }
+
+ @Override
+ public String render(Long templateId, Long instanceId, String content, Map dataMap) {
+ // 1. 获取模板内容
+ String templateContent = getTemplateContent(templateId, instanceId, content);
+
+ if (StrUtil.isBlank(templateContent)) {
+ throw exception(TEMPLATE_NOT_EXISTS);
+ }
+
+ // 2. 创建 Velocity 上下文
+ VelocityContext context = new VelocityContext();
+ if (dataMap != null && !dataMap.isEmpty()) {
+ dataMap.forEach(context::put);
+ }
+
+ // 3. 渲染模板
+ try {
+ StringWriter writer = new StringWriter();
+ Velocity.evaluate(context, writer, "DocTemplateRender", templateContent);
+ String result = writer.toString();
+
+ log.debug("模板渲染成功,数据量: {}, 内容长度: {}",
+ dataMap != null ? dataMap.size() : 0, result.length());
+
+ return result;
+ } catch (Exception e) {
+ log.error("模板渲染失败,templateId: {}, instanceId: {}", templateId, instanceId, e);
+ throw new RuntimeException("模板渲染失败: " + e.getMessage(), e);
+ }
+ }
+
+ @Override
+ public void renderAndSave(Long instanceId, Map dataMap) {
+ // 1. 校验实例存在
+ DocTemplateInstanceDO instance = instanceMapper.selectById(instanceId);
+ if (instance == null) {
+ throw exception(TEMPLATE_INSTANCE_NOT_EXISTS);
+ }
+
+ // 2. 渲染内容
+ String renderedContent = render(null, instanceId, null, dataMap);
+
+ // 3. 更新实例的渲染内容
+ DocTemplateInstanceDO updateObj = new DocTemplateInstanceDO();
+ updateObj.setId(instanceId);
+ updateObj.setRenderedContent(renderedContent);
+ instanceMapper.updateById(updateObj);
+
+ log.info("模板实例渲染并保存成功,instanceId: {}", instanceId);
+ }
+
+ /**
+ * 获取模板内容
+ * 优先级:content > instanceId > templateId
+ */
+ private String getTemplateContent(Long templateId, Long instanceId, String content) {
+ // 优先使用直接传入的内容
+ if (StrUtil.isNotBlank(content)) {
+ return content;
+ }
+
+ // 其次使用实例的编辑内容
+ if (instanceId != null) {
+ DocTemplateInstanceDO instance = instanceMapper.selectById(instanceId);
+ if (instance != null && StrUtil.isNotBlank(instance.getEditedContent())) {
+ return instance.getEditedContent();
+ }
+ }
+
+ // 最后使用模板内容
+ if (templateId != null) {
+ DocTemplateDO template = templateMapper.selectById(templateId);
+ if (template != null && StrUtil.isNotBlank(template.getContent())) {
+ return template.getContent();
+ }
+ }
+
+ return null;
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateService.java
new file mode 100644
index 00000000..4bc15f77
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateService.java
@@ -0,0 +1,63 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplatePageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateSaveReqVO;
+
+import jakarta.validation.Valid;
+import java.util.List;
+
+/**
+ * 模板 Service 接口
+ *
+ * @author 系统生成
+ */
+public interface DocTemplateService {
+
+ /**
+ * 创建模板
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createTemplate(@Valid DocTemplateSaveReqVO createReqVO);
+
+ /**
+ * 更新模板
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateTemplate(@Valid DocTemplateSaveReqVO updateReqVO);
+
+ /**
+ * 删除模板
+ *
+ * @param id 编号
+ */
+ void deleteTemplate(Long id);
+
+ /**
+ * 获得模板
+ *
+ * @param id 编号
+ * @return 模板
+ */
+ DocTemplateRespVO getTemplate(Long id);
+
+ /**
+ * 获得模板分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 模板分页
+ */
+ PageResult getTemplatePage(DocTemplatePageReqVO pageReqVO);
+
+ /**
+ * 获得模板列表
+ *
+ * @return 模板列表
+ */
+ List getTemplateList();
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateServiceImpl.java
new file mode 100644
index 00000000..b5e353b2
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateServiceImpl.java
@@ -0,0 +1,115 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplatePageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateSaveReqVO;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.zt.plat.module.base.convert.doctemplate.DocTemplateConvert;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateDO;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zt.plat.module.base.enums.ErrorCodeConstants.*;
+
+/**
+ * 模板 Service 实现类
+ *
+ * @author 系统生成
+ */
+@Service
+@Validated
+public class DocTemplateServiceImpl implements DocTemplateService {
+
+ @Resource
+ private DocTemplateMapper templateMapper;
+
+ @Override
+ public Long createTemplate(DocTemplateSaveReqVO createReqVO) {
+ // 校验模板编码唯一性
+ validateTemplateCodeUnique(null, createReqVO.getTmplCode());
+
+ // 插入
+ DocTemplateDO template = DocTemplateConvert.INSTANCE.convert(createReqVO);
+ // 设置默认值
+ if (template.getUseCount() == null) {
+ template.setUseCount(0);
+ }
+ if (template.getEnabled() == null) {
+ template.setEnabled("2"); // 默认为草稿状态
+ }
+ templateMapper.insert(template);
+ // 返回
+ return template.getId();
+ }
+
+ @Override
+ public void updateTemplate(DocTemplateSaveReqVO updateReqVO) {
+ // 校验存在
+ validateTemplateExists(updateReqVO.getId());
+ // 校验模板编码唯一性
+ validateTemplateCodeUnique(updateReqVO.getId(), updateReqVO.getTmplCode());
+
+ // 更新
+ DocTemplateDO updateObj = DocTemplateConvert.INSTANCE.convert(updateReqVO);
+ templateMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteTemplate(Long id) {
+ // 校验存在
+ validateTemplateExists(id);
+ // 删除
+ templateMapper.deleteById(id);
+ }
+
+ private void validateTemplateExists(Long id) {
+ if (templateMapper.selectById(id) == null) {
+ throw exception(TEMPLATE_NOT_EXISTS);
+ }
+ }
+
+ /**
+ * 校验模板编码唯一性
+ */
+ private void validateTemplateCodeUnique(Long id, String tmplCode) {
+ if (StrUtil.isBlank(tmplCode)) {
+ return;
+ }
+ DocTemplateDO template = templateMapper.selectOne(new LambdaQueryWrapper()
+ .eq(DocTemplateDO::getTmplCode, tmplCode));
+ if (template == null) {
+ return;
+ }
+ // 如果是更新操作,排除自己
+ if (id != null && id.equals(template.getId())) {
+ return;
+ }
+ throw exception(TEMPLATE_CODE_DUPLICATE);
+ }
+
+ @Override
+ public DocTemplateRespVO getTemplate(Long id) {
+ DocTemplateDO template = templateMapper.selectById(id);
+ return DocTemplateConvert.INSTANCE.convert(template);
+ }
+
+ @Override
+ public PageResult getTemplatePage(DocTemplatePageReqVO pageReqVO) {
+ PageResult pageResult = templateMapper.selectPage(pageReqVO);
+ return DocTemplateConvert.INSTANCE.convertPage(pageResult);
+ }
+
+ @Override
+ public List getTemplateList() {
+ List list = templateMapper.selectList();
+ return DocTemplateConvert.INSTANCE.convertList(list);
+ }
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateTagService.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateTagService.java
new file mode 100644
index 00000000..15954ed0
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateTagService.java
@@ -0,0 +1,63 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagPageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagSaveReqVO;
+
+import jakarta.validation.Valid;
+import java.util.List;
+
+/**
+ * 标签库 Service 接口
+ *
+ * @author 系统生成
+ */
+public interface DocTemplateTagService {
+
+ /**
+ * 创建标签
+ *
+ * @param createReqVO 创建信息
+ * @return 编号
+ */
+ Long createTemplateTag(@Valid DocTemplateTagSaveReqVO createReqVO);
+
+ /**
+ * 更新标签
+ *
+ * @param updateReqVO 更新信息
+ */
+ void updateTemplateTag(@Valid DocTemplateTagSaveReqVO updateReqVO);
+
+ /**
+ * 删除标签
+ *
+ * @param id 编号
+ */
+ void deleteTemplateTag(Long id);
+
+ /**
+ * 获得标签
+ *
+ * @param id 编号
+ * @return 标签
+ */
+ DocTemplateTagRespVO getTemplateTag(Long id);
+
+ /**
+ * 获得标签分页
+ *
+ * @param pageReqVO 分页查询
+ * @return 标签分页
+ */
+ PageResult getTemplateTagPage(DocTemplateTagPageReqVO pageReqVO);
+
+ /**
+ * 获得标签列表
+ *
+ * @return 标签列表
+ */
+ List getTemplateTagList();
+
+}
diff --git a/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateTagServiceImpl.java b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateTagServiceImpl.java
new file mode 100644
index 00000000..194c6e98
--- /dev/null
+++ b/zt-module-base/zt-module-base-server/src/main/java/com/zt/plat/module/base/service/doctemplate/DocTemplateTagServiceImpl.java
@@ -0,0 +1,115 @@
+package com.zt.plat.module.base.service.doctemplate;
+
+import com.zt.plat.framework.common.pojo.PageResult;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagPageReqVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagRespVO;
+import com.zt.plat.module.base.controller.admin.doctemplate.vo.DocTemplateTagSaveReqVO;
+import com.zt.plat.module.base.convert.doctemplate.DocTemplateTagConvert;
+import com.zt.plat.module.base.dal.dataobject.doctemplate.DocTemplateTagDO;
+import com.zt.plat.module.base.dal.dao.doctemplate.DocTemplateTagMapper;
+import org.springframework.stereotype.Service;
+import org.springframework.validation.annotation.Validated;
+
+import jakarta.annotation.Resource;
+import java.util.List;
+
+import static com.zt.plat.framework.common.exception.util.ServiceExceptionUtil.exception;
+import static com.zt.plat.module.base.enums.ErrorCodeConstants.TEMPLATE_TAG_NOT_EXISTS;
+
+/**
+ * 标签库 Service 实现类
+ *
+ * @author 系统生成
+ */
+@Service
+@Validated
+public class DocTemplateTagServiceImpl implements DocTemplateTagService {
+
+ @Resource
+ private DocTemplateTagMapper templateTagMapper;
+
+ @Resource
+ private DocTemplateCategoryService templateCategoryService;
+
+ @Override
+ public Long createTemplateTag(DocTemplateTagSaveReqVO createReqVO) {
+ // 插入
+ DocTemplateTagDO templateTag = DocTemplateTagConvert.INSTANCE.convert(createReqVO);
+ // 设置默认值
+ if (templateTag.getSort() == null) {
+ templateTag.setSort(0);
+ }
+ if (templateTag.getEnabled() == null) {
+ templateTag.setEnabled("1");
+ }
+ templateTagMapper.insert(templateTag);
+ // 返回
+ return templateTag.getId();
+ }
+
+ @Override
+ public void updateTemplateTag(DocTemplateTagSaveReqVO updateReqVO) {
+ // 校验存在
+ validateTemplateTagExists(updateReqVO.getId());
+ // 更新
+ DocTemplateTagDO updateObj = DocTemplateTagConvert.INSTANCE.convert(updateReqVO);
+ templateTagMapper.updateById(updateObj);
+ }
+
+ @Override
+ public void deleteTemplateTag(Long id) {
+ // 校验存在
+ validateTemplateTagExists(id);
+ // 删除
+ templateTagMapper.deleteById(id);
+ }
+
+ private void validateTemplateTagExists(Long id) {
+ if (templateTagMapper.selectById(id) == null) {
+ throw exception(TEMPLATE_TAG_NOT_EXISTS);
+ }
+ }
+
+ @Override
+ public DocTemplateTagRespVO getTemplateTag(Long id) {
+ DocTemplateTagDO templateTag = templateTagMapper.selectById(id);
+ DocTemplateTagRespVO respVO = DocTemplateTagConvert.INSTANCE.convert(templateTag);
+ // 填充分类名称
+ fillCategoryName(respVO);
+ return respVO;
+ }
+
+ @Override
+ public PageResult