From f98d8ff03c4c1b1778e1d566eb22e4d3ab6f8869 Mon Sep 17 00:00:00 2001
From: Joshi <3040996759@qq.com>
Date: Fri, 30 Jan 2026 10:49:37 +0800
Subject: [PATCH] =?UTF-8?q?feat(mat):=20=E6=B7=BB=E5=8A=A0=E9=85=8D?=
=?UTF-8?q?=E6=96=99=E7=AE=A1=E7=90=86=E7=B3=BB=E7=BB=9F=E6=A0=B8=E5=BF=83?=
=?UTF-8?q?=E5=8A=9F=E8=83=BD=E6=A8=A1=E5=9D=97?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 新增配料出库服务接口及实现类
- 实现配料配件基础信息服务及CRUD操作
- 添加配料价格变动历史记录功能
- 创建产品-配料关联中间表服务
- 实现采购单主服务管理在途库存
- 添加入库记录详情管理功能
- 完善配料出入库流程控制逻辑
---
gear-admin/pom.xml | 4 +
gear-mat/pom.xml | 23 ++++
.../MatMatPriceHistoryController.java | 102 +++++++++++++++
.../mat/controller/MatMaterialController.java | 102 +++++++++++++++
.../controller/MatMaterialOutController.java | 102 +++++++++++++++
.../mat/controller/MatProductController.java | 102 +++++++++++++++
.../MatProductMaterialRelationController.java | 102 +++++++++++++++
.../mat/controller/MatPurchaseController.java | 102 +++++++++++++++
.../MatPurchaseInDetailController.java | 102 +++++++++++++++
.../gear/mat/domain/MatMatPriceHistory.java | 57 +++++++++
.../java/com/gear/mat/domain/MatMaterial.java | 65 ++++++++++
.../com/gear/mat/domain/MatMaterialOut.java | 67 ++++++++++
.../java/com/gear/mat/domain/MatProduct.java | 57 +++++++++
.../domain/MatProductMaterialRelation.java | 57 +++++++++
.../java/com/gear/mat/domain/MatPurchase.java | 79 ++++++++++++
.../gear/mat/domain/MatPurchaseInDetail.java | 71 +++++++++++
.../mat/domain/bo/MatMatPriceHistoryBo.java | 56 +++++++++
.../com/gear/mat/domain/bo/MatMaterialBo.java | 66 ++++++++++
.../gear/mat/domain/bo/MatMaterialOutBo.java | 70 +++++++++++
.../com/gear/mat/domain/bo/MatProductBo.java | 56 +++++++++
.../bo/MatProductMaterialRelationBo.java | 56 +++++++++
.../com/gear/mat/domain/bo/MatPurchaseBo.java | 87 +++++++++++++
.../mat/domain/bo/MatPurchaseInDetailBo.java | 75 +++++++++++
.../mat/domain/vo/MatMatPriceHistoryVo.java | 62 ++++++++++
.../gear/mat/domain/vo/MatMaterialOutVo.java | 78 ++++++++++++
.../com/gear/mat/domain/vo/MatMaterialVo.java | 75 +++++++++++
.../vo/MatProductMaterialRelationVo.java | 62 ++++++++++
.../com/gear/mat/domain/vo/MatProductVo.java | 62 ++++++++++
.../mat/domain/vo/MatPurchaseInDetailVo.java | 85 +++++++++++++
.../com/gear/mat/domain/vo/MatPurchaseVo.java | 101 +++++++++++++++
.../mat/mapper/MatMatPriceHistoryMapper.java | 15 +++
.../gear/mat/mapper/MatMaterialMapper.java | 15 +++
.../gear/mat/mapper/MatMaterialOutMapper.java | 15 +++
.../com/gear/mat/mapper/MatProductMapper.java | 15 +++
.../MatProductMaterialRelationMapper.java | 15 +++
.../mat/mapper/MatPurchaseInDetailMapper.java | 15 +++
.../gear/mat/mapper/MatPurchaseMapper.java | 15 +++
.../service/IMatMatPriceHistoryService.java | 49 ++++++++
.../mat/service/IMatMaterialOutService.java | 49 ++++++++
.../gear/mat/service/IMatMaterialService.java | 49 ++++++++
.../IMatProductMaterialRelationService.java | 49 ++++++++
.../gear/mat/service/IMatProductService.java | 49 ++++++++
.../service/IMatPurchaseInDetailService.java | 49 ++++++++
.../gear/mat/service/IMatPurchaseService.java | 49 ++++++++
.../impl/MatMatPriceHistoryServiceImpl.java | 112 +++++++++++++++++
.../impl/MatMaterialOutServiceImpl.java | 114 +++++++++++++++++
.../service/impl/MatMaterialServiceImpl.java | 114 +++++++++++++++++
...MatProductMaterialRelationServiceImpl.java | 112 +++++++++++++++++
.../service/impl/MatProductServiceImpl.java | 112 +++++++++++++++++
.../impl/MatPurchaseInDetailServiceImpl.java | 115 +++++++++++++++++
.../service/impl/MatPurchaseServiceImpl.java | 117 ++++++++++++++++++
.../mapper/MatMatPriceHistoryMapper.xml | 22 ++++
.../resources/mapper/MatMaterialMapper.xml | 24 ++++
.../resources/mapper/MatMaterialOutMapper.xml | 24 ++++
.../resources/mapper/MatProductMapper.xml | 22 ++++
.../MatProductMaterialRelationMapper.xml | 22 ++++
.../mapper/MatPurchaseInDetailMapper.xml | 25 ++++
.../resources/mapper/MatPurchaseMapper.xml | 27 ++++
gear-mes/src/main/resources/mapper/is | 0
pom.xml | 6 +
60 files changed, 3601 insertions(+)
create mode 100644 gear-mat/pom.xml
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatMatPriceHistoryController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatMaterialController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatMaterialOutController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatProductController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatProductMaterialRelationController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseInDetailController.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatMatPriceHistory.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatMaterial.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatMaterialOut.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatProduct.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatProductMaterialRelation.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatPurchase.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/MatPurchaseInDetail.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatMatPriceHistoryBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialOutBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductMaterialRelationBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseInDetailBo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatMatPriceHistoryVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialOutVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductMaterialRelationVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseInDetailVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatMatPriceHistoryMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialOutMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatProductMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatProductMaterialRelationMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseInDetailMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseMapper.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatMatPriceHistoryService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatMaterialOutService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatMaterialService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatProductMaterialRelationService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatProductService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseInDetailService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatMatPriceHistoryServiceImpl.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialOutServiceImpl.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatProductMaterialRelationServiceImpl.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatProductServiceImpl.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseInDetailServiceImpl.java
create mode 100644 gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java
create mode 100644 gear-mat/src/main/resources/mapper/MatMatPriceHistoryMapper.xml
create mode 100644 gear-mat/src/main/resources/mapper/MatMaterialMapper.xml
create mode 100644 gear-mat/src/main/resources/mapper/MatMaterialOutMapper.xml
create mode 100644 gear-mat/src/main/resources/mapper/MatProductMapper.xml
create mode 100644 gear-mat/src/main/resources/mapper/MatProductMaterialRelationMapper.xml
create mode 100644 gear-mat/src/main/resources/mapper/MatPurchaseInDetailMapper.xml
create mode 100644 gear-mat/src/main/resources/mapper/MatPurchaseMapper.xml
delete mode 100644 gear-mes/src/main/resources/mapper/is
diff --git a/gear-admin/pom.xml b/gear-admin/pom.xml
index 31e01a3..f167d09 100644
--- a/gear-admin/pom.xml
+++ b/gear-admin/pom.xml
@@ -111,6 +111,10 @@
com.gear.mes
gear-mes
+
+ com.gear
+ gear-mat
+
diff --git a/gear-mat/pom.xml b/gear-mat/pom.xml
new file mode 100644
index 0000000..1eeb908
--- /dev/null
+++ b/gear-mat/pom.xml
@@ -0,0 +1,23 @@
+
+ 4.0.0
+
+ com.gear
+ FURNITURE-OA
+ 0.8.3
+
+ gear-mat
+ Archetype - gear-mat
+ http://maven.apache.org
+
+
+
+ com.gear
+ gear-common
+
+
+ commons-collections
+ commons-collections
+
+
+
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatMatPriceHistoryController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatMatPriceHistoryController.java
new file mode 100644
index 0000000..57e28f9
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatMatPriceHistoryController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatMatPriceHistoryVo;
+import com.gear.mat.domain.bo.MatMatPriceHistoryBo;
+import com.gear.mat.service.IMatMatPriceHistoryService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 配料价格/均价变动历史
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/matPriceHistory")
+public class MatMatPriceHistoryController extends BaseController {
+
+ private final IMatMatPriceHistoryService iMatMatPriceHistoryService;
+
+ /**
+ * 查询配料价格/均价变动历史列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatMatPriceHistoryBo bo, PageQuery pageQuery) {
+ return iMatMatPriceHistoryService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出配料价格/均价变动历史列表
+ */
+ @Log(title = "配料价格/均价变动历史", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatMatPriceHistoryBo bo, HttpServletResponse response) {
+ List list = iMatMatPriceHistoryService.queryList(bo);
+ ExcelUtil.exportExcel(list, "配料价格/均价变动历史", MatMatPriceHistoryVo.class, response);
+ }
+
+ /**
+ * 获取配料价格/均价变动历史详细信息
+ *
+ * @param historyId 主键
+ */
+ @GetMapping("/{historyId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long historyId) {
+ return R.ok(iMatMatPriceHistoryService.queryById(historyId));
+ }
+
+ /**
+ * 新增配料价格/均价变动历史
+ */
+ @Log(title = "配料价格/均价变动历史", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatMatPriceHistoryBo bo) {
+ return toAjax(iMatMatPriceHistoryService.insertByBo(bo));
+ }
+
+ /**
+ * 修改配料价格/均价变动历史
+ */
+ @Log(title = "配料价格/均价变动历史", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatMatPriceHistoryBo bo) {
+ return toAjax(iMatMatPriceHistoryService.updateByBo(bo));
+ }
+
+ /**
+ * 删除配料价格/均价变动历史
+ *
+ * @param historyIds 主键串
+ */
+ @Log(title = "配料价格/均价变动历史", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{historyIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] historyIds) {
+ return toAjax(iMatMatPriceHistoryService.deleteWithValidByIds(Arrays.asList(historyIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatMaterialController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatMaterialController.java
new file mode 100644
index 0000000..2ac9c55
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatMaterialController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatMaterialVo;
+import com.gear.mat.domain.bo.MatMaterialBo;
+import com.gear.mat.service.IMatMaterialService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 配料配件基础信息
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/material")
+public class MatMaterialController extends BaseController {
+
+ private final IMatMaterialService iMatMaterialService;
+
+ /**
+ * 查询配料配件基础信息列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatMaterialBo bo, PageQuery pageQuery) {
+ return iMatMaterialService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出配料配件基础信息列表
+ */
+ @Log(title = "配料配件基础信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatMaterialBo bo, HttpServletResponse response) {
+ List list = iMatMaterialService.queryList(bo);
+ ExcelUtil.exportExcel(list, "配料配件基础信息", MatMaterialVo.class, response);
+ }
+
+ /**
+ * 获取配料配件基础信息详细信息
+ *
+ * @param materialId 主键
+ */
+ @GetMapping("/{materialId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long materialId) {
+ return R.ok(iMatMaterialService.queryById(materialId));
+ }
+
+ /**
+ * 新增配料配件基础信息
+ */
+ @Log(title = "配料配件基础信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatMaterialBo bo) {
+ return toAjax(iMatMaterialService.insertByBo(bo));
+ }
+
+ /**
+ * 修改配料配件基础信息
+ */
+ @Log(title = "配料配件基础信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatMaterialBo bo) {
+ return toAjax(iMatMaterialService.updateByBo(bo));
+ }
+
+ /**
+ * 删除配料配件基础信息
+ *
+ * @param materialIds 主键串
+ */
+ @Log(title = "配料配件基础信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{materialIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] materialIds) {
+ return toAjax(iMatMaterialService.deleteWithValidByIds(Arrays.asList(materialIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatMaterialOutController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatMaterialOutController.java
new file mode 100644
index 0000000..a95e20d
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatMaterialOutController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatMaterialOutVo;
+import com.gear.mat.domain.bo.MatMaterialOutBo;
+import com.gear.mat.service.IMatMaterialOutService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 配料出库
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/materialOut")
+public class MatMaterialOutController extends BaseController {
+
+ private final IMatMaterialOutService iMatMaterialOutService;
+
+ /**
+ * 查询配料出库列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatMaterialOutBo bo, PageQuery pageQuery) {
+ return iMatMaterialOutService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出配料出库列表
+ */
+ @Log(title = "配料出库", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatMaterialOutBo bo, HttpServletResponse response) {
+ List list = iMatMaterialOutService.queryList(bo);
+ ExcelUtil.exportExcel(list, "配料出库", MatMaterialOutVo.class, response);
+ }
+
+ /**
+ * 获取配料出库详细信息
+ *
+ * @param outId 主键
+ */
+ @GetMapping("/{outId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long outId) {
+ return R.ok(iMatMaterialOutService.queryById(outId));
+ }
+
+ /**
+ * 新增配料出库
+ */
+ @Log(title = "配料出库", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatMaterialOutBo bo) {
+ return toAjax(iMatMaterialOutService.insertByBo(bo));
+ }
+
+ /**
+ * 修改配料出库
+ */
+ @Log(title = "配料出库", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatMaterialOutBo bo) {
+ return toAjax(iMatMaterialOutService.updateByBo(bo));
+ }
+
+ /**
+ * 删除配料出库
+ *
+ * @param outIds 主键串
+ */
+ @Log(title = "配料出库", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{outIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] outIds) {
+ return toAjax(iMatMaterialOutService.deleteWithValidByIds(Arrays.asList(outIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatProductController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatProductController.java
new file mode 100644
index 0000000..fc03bbd
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatProductController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatProductVo;
+import com.gear.mat.domain.bo.MatProductBo;
+import com.gear.mat.service.IMatProductService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 产品基础信息
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/product")
+public class MatProductController extends BaseController {
+
+ private final IMatProductService iMatProductService;
+
+ /**
+ * 查询产品基础信息列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatProductBo bo, PageQuery pageQuery) {
+ return iMatProductService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出产品基础信息列表
+ */
+ @Log(title = "产品基础信息", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatProductBo bo, HttpServletResponse response) {
+ List list = iMatProductService.queryList(bo);
+ ExcelUtil.exportExcel(list, "产品基础信息", MatProductVo.class, response);
+ }
+
+ /**
+ * 获取产品基础信息详细信息
+ *
+ * @param productId 主键
+ */
+ @GetMapping("/{productId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long productId) {
+ return R.ok(iMatProductService.queryById(productId));
+ }
+
+ /**
+ * 新增产品基础信息
+ */
+ @Log(title = "产品基础信息", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatProductBo bo) {
+ return toAjax(iMatProductService.insertByBo(bo));
+ }
+
+ /**
+ * 修改产品基础信息
+ */
+ @Log(title = "产品基础信息", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatProductBo bo) {
+ return toAjax(iMatProductService.updateByBo(bo));
+ }
+
+ /**
+ * 删除产品基础信息
+ *
+ * @param productIds 主键串
+ */
+ @Log(title = "产品基础信息", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{productIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] productIds) {
+ return toAjax(iMatProductService.deleteWithValidByIds(Arrays.asList(productIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatProductMaterialRelationController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatProductMaterialRelationController.java
new file mode 100644
index 0000000..de7dc7e
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatProductMaterialRelationController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatProductMaterialRelationVo;
+import com.gear.mat.domain.bo.MatProductMaterialRelationBo;
+import com.gear.mat.service.IMatProductMaterialRelationService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 产品-配料关联中间
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/productMaterialRelation")
+public class MatProductMaterialRelationController extends BaseController {
+
+ private final IMatProductMaterialRelationService iMatProductMaterialRelationService;
+
+ /**
+ * 查询产品-配料关联中间列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatProductMaterialRelationBo bo, PageQuery pageQuery) {
+ return iMatProductMaterialRelationService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出产品-配料关联中间列表
+ */
+ @Log(title = "产品-配料关联中间", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatProductMaterialRelationBo bo, HttpServletResponse response) {
+ List list = iMatProductMaterialRelationService.queryList(bo);
+ ExcelUtil.exportExcel(list, "产品-配料关联中间", MatProductMaterialRelationVo.class, response);
+ }
+
+ /**
+ * 获取产品-配料关联中间详细信息
+ *
+ * @param relationId 主键
+ */
+ @GetMapping("/{relationId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long relationId) {
+ return R.ok(iMatProductMaterialRelationService.queryById(relationId));
+ }
+
+ /**
+ * 新增产品-配料关联中间
+ */
+ @Log(title = "产品-配料关联中间", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatProductMaterialRelationBo bo) {
+ return toAjax(iMatProductMaterialRelationService.insertByBo(bo));
+ }
+
+ /**
+ * 修改产品-配料关联中间
+ */
+ @Log(title = "产品-配料关联中间", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatProductMaterialRelationBo bo) {
+ return toAjax(iMatProductMaterialRelationService.updateByBo(bo));
+ }
+
+ /**
+ * 删除产品-配料关联中间
+ *
+ * @param relationIds 主键串
+ */
+ @Log(title = "产品-配料关联中间", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{relationIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] relationIds) {
+ return toAjax(iMatProductMaterialRelationService.deleteWithValidByIds(Arrays.asList(relationIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseController.java
new file mode 100644
index 0000000..e13bec3
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatPurchaseVo;
+import com.gear.mat.domain.bo.MatPurchaseBo;
+import com.gear.mat.service.IMatPurchaseService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 采购单主(管理在途库存)
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/purchase")
+public class MatPurchaseController extends BaseController {
+
+ private final IMatPurchaseService iMatPurchaseService;
+
+ /**
+ * 查询采购单主(管理在途库存)列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatPurchaseBo bo, PageQuery pageQuery) {
+ return iMatPurchaseService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出采购单主(管理在途库存)列表
+ */
+ @Log(title = "采购单主(管理在途库存)", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatPurchaseBo bo, HttpServletResponse response) {
+ List list = iMatPurchaseService.queryList(bo);
+ ExcelUtil.exportExcel(list, "采购单主(管理在途库存)", MatPurchaseVo.class, response);
+ }
+
+ /**
+ * 获取采购单主(管理在途库存)详细信息
+ *
+ * @param purchaseId 主键
+ */
+ @GetMapping("/{purchaseId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long purchaseId) {
+ return R.ok(iMatPurchaseService.queryById(purchaseId));
+ }
+
+ /**
+ * 新增采购单主(管理在途库存)
+ */
+ @Log(title = "采购单主(管理在途库存)", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatPurchaseBo bo) {
+ return toAjax(iMatPurchaseService.insertByBo(bo));
+ }
+
+ /**
+ * 修改采购单主(管理在途库存)
+ */
+ @Log(title = "采购单主(管理在途库存)", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatPurchaseBo bo) {
+ return toAjax(iMatPurchaseService.updateByBo(bo));
+ }
+
+ /**
+ * 删除采购单主(管理在途库存)
+ *
+ * @param purchaseIds 主键串
+ */
+ @Log(title = "采购单主(管理在途库存)", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{purchaseIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] purchaseIds) {
+ return toAjax(iMatPurchaseService.deleteWithValidByIds(Arrays.asList(purchaseIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseInDetailController.java b/gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseInDetailController.java
new file mode 100644
index 0000000..0d282ce
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/controller/MatPurchaseInDetailController.java
@@ -0,0 +1,102 @@
+package com.gear.mat.controller;
+
+import java.util.List;
+import java.util.Arrays;
+import java.util.concurrent.TimeUnit;
+
+import lombok.RequiredArgsConstructor;
+import javax.servlet.http.HttpServletResponse;
+import javax.validation.constraints.*;
+import cn.dev33.satoken.annotation.SaCheckPermission;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.validation.annotation.Validated;
+import com.gear.common.annotation.RepeatSubmit;
+import com.gear.common.annotation.Log;
+import com.gear.common.core.controller.BaseController;
+import com.gear.common.core.domain.PageQuery;
+import com.gear.common.core.domain.R;
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import com.gear.common.core.validate.QueryGroup;
+import com.gear.common.enums.BusinessType;
+import com.gear.common.utils.poi.ExcelUtil;
+import com.gear.mat.domain.vo.MatPurchaseInDetailVo;
+import com.gear.mat.domain.bo.MatPurchaseInDetailBo;
+import com.gear.mat.service.IMatPurchaseInDetailService;
+import com.gear.common.core.page.TableDataInfo;
+
+/**
+ * 入库记录
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Validated
+@RequiredArgsConstructor
+@RestController
+@RequestMapping("/mat/purchaseInDetail")
+public class MatPurchaseInDetailController extends BaseController {
+
+ private final IMatPurchaseInDetailService iMatPurchaseInDetailService;
+
+ /**
+ * 查询入库记录列表
+ */
+ @GetMapping("/list")
+ public TableDataInfo list(MatPurchaseInDetailBo bo, PageQuery pageQuery) {
+ return iMatPurchaseInDetailService.queryPageList(bo, pageQuery);
+ }
+
+ /**
+ * 导出入库记录列表
+ */
+ @Log(title = "入库记录", businessType = BusinessType.EXPORT)
+ @PostMapping("/export")
+ public void export(MatPurchaseInDetailBo bo, HttpServletResponse response) {
+ List list = iMatPurchaseInDetailService.queryList(bo);
+ ExcelUtil.exportExcel(list, "入库记录", MatPurchaseInDetailVo.class, response);
+ }
+
+ /**
+ * 获取入库记录详细信息
+ *
+ * @param detailId 主键
+ */
+ @GetMapping("/{detailId}")
+ public R getInfo(@NotNull(message = "主键不能为空")
+ @PathVariable Long detailId) {
+ return R.ok(iMatPurchaseInDetailService.queryById(detailId));
+ }
+
+ /**
+ * 新增入库记录
+ */
+ @Log(title = "入库记录", businessType = BusinessType.INSERT)
+ @RepeatSubmit()
+ @PostMapping()
+ public R add(@Validated(AddGroup.class) @RequestBody MatPurchaseInDetailBo bo) {
+ return toAjax(iMatPurchaseInDetailService.insertByBo(bo));
+ }
+
+ /**
+ * 修改入库记录
+ */
+ @Log(title = "入库记录", businessType = BusinessType.UPDATE)
+ @RepeatSubmit()
+ @PutMapping()
+ public R edit(@Validated(EditGroup.class) @RequestBody MatPurchaseInDetailBo bo) {
+ return toAjax(iMatPurchaseInDetailService.updateByBo(bo));
+ }
+
+ /**
+ * 删除入库记录
+ *
+ * @param detailIds 主键串
+ */
+ @Log(title = "入库记录", businessType = BusinessType.DELETE)
+ @DeleteMapping("/{detailIds}")
+ public R remove(@NotEmpty(message = "主键不能为空")
+ @PathVariable Long[] detailIds) {
+ return toAjax(iMatPurchaseInDetailService.deleteWithValidByIds(Arrays.asList(detailIds), true));
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatMatPriceHistory.java b/gear-mat/src/main/java/com/gear/mat/domain/MatMatPriceHistory.java
new file mode 100644
index 0000000..14ebffe
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatMatPriceHistory.java
@@ -0,0 +1,57 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 配料价格/均价变动历史对象 mat_mat_price_history
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_mat_price_history")
+public class MatMatPriceHistory extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ *
+ */
+ @TableId(value = "history_id")
+ private Long historyId;
+ /**
+ * 配料ID
+ */
+ private Long materialId;
+ /**
+ * 本次入库价格
+ */
+ private BigDecimal price;
+ /**
+ * 本次计算后的均价
+ */
+ private BigDecimal avgPrice;
+ /**
+ * 本次入库数量
+ */
+ private BigDecimal quantity;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatMaterial.java b/gear-mat/src/main/java/com/gear/mat/domain/MatMaterial.java
new file mode 100644
index 0000000..541ce8f
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatMaterial.java
@@ -0,0 +1,65 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 配料配件基础信息对象 mat_material
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_material")
+public class MatMaterial extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 配料ID 主键
+ */
+ @TableId(value = "material_id")
+ private Long materialId;
+ /**
+ * 配料名称
+ */
+ private String materialName;
+ /**
+ * 配料规格
+ */
+ private String spec;
+ /**
+ * 配料型号
+ */
+ private String model;
+ /**
+ * 厂家
+ */
+ private String factory;
+ /**
+ * 计量单位 个/公斤/米等
+ */
+ private String unit;
+ /**
+ * 现存库存(已入库) 不能为负
+ */
+ private BigDecimal currentStock;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatMaterialOut.java b/gear-mat/src/main/java/com/gear/mat/domain/MatMaterialOut.java
new file mode 100644
index 0000000..3f751d7
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatMaterialOut.java
@@ -0,0 +1,67 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 配料出库对象 mat_material_out
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_material_out")
+public class MatMaterialOut extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 出库ID 主键
+ */
+ @TableId(value = "out_id")
+ private Long outId;
+ /**
+ * 出库单号 唯一 如O20260130001
+ */
+ private String outNo;
+ /**
+ * 配料ID 关联t_material.id
+ */
+ private Long materialId;
+ /**
+ * 本次出库数量 不能超过现存库存
+ */
+ private BigDecimal outNum;
+ /**
+ * 出库原因 生产使用/样品/报废等
+ */
+ private String outReason;
+ /**
+ * 出库操作人
+ */
+ private String operator;
+ /**
+ * 实际出库时间
+ */
+ private Date outTime;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatProduct.java b/gear-mat/src/main/java/com/gear/mat/domain/MatProduct.java
new file mode 100644
index 0000000..28a1b6d
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatProduct.java
@@ -0,0 +1,57 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 产品基础信息对象 mat_product
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_product")
+public class MatProduct extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 产品ID 主键
+ */
+ @TableId(value = "product_id")
+ private Long productId;
+ /**
+ * 产品名称
+ */
+ private String productName;
+ /**
+ * 产品规格
+ */
+ private String spec;
+ /**
+ * 产品型号
+ */
+ private String model;
+ /**
+ * 产品单价 可手动维护
+ */
+ private BigDecimal unitPrice;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatProductMaterialRelation.java b/gear-mat/src/main/java/com/gear/mat/domain/MatProductMaterialRelation.java
new file mode 100644
index 0000000..d53a20f
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatProductMaterialRelation.java
@@ -0,0 +1,57 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 产品-配料关联中间对象 mat_product_material_relation
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_product_material_relation")
+public class MatProductMaterialRelation extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 关联ID 主键
+ */
+ @TableId(value = "relation_id")
+ private Long relationId;
+ /**
+ * 产品ID 关联t_product.id
+ */
+ private Long productId;
+ /**
+ * 配料ID 关联t_material.id
+ */
+ private Long materialId;
+ /**
+ * 单产品所需配料数量 默认为1
+ */
+ private BigDecimal materialNum;
+ /**
+ * 配料排序 用于前端展示顺序
+ */
+ private Long sort;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatPurchase.java b/gear-mat/src/main/java/com/gear/mat/domain/MatPurchase.java
new file mode 100644
index 0000000..753b399
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatPurchase.java
@@ -0,0 +1,79 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 采购单主(管理在途库存)对象 mat_purchase
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_purchase")
+public class MatPurchase extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 采购单ID 主键
+ */
+ @TableId(value = "purchase_id")
+ private Long purchaseId;
+ /**
+ * 采购单号 唯一 如P20260130001
+ */
+ private String purchaseNo;
+ /**
+ * 厂家
+ */
+ private String factory;
+ /**
+ * 配料ID 关联material.id
+ */
+ private Long materialId;
+ /**
+ * 采购计划数量
+ */
+ private BigDecimal planNum;
+ /**
+ * 采购单价(本次录入价格)
+ */
+ private BigDecimal purchasePrice;
+ /**
+ * 采购截止日期(要求入库日期)
+ */
+ private Date deadline;
+ /**
+ * 采购状态 1-待入(在途) 2-已完成(全部入库) 3-已取消(归零) 4-部分入库
+ */
+ private Integer status;
+ /**
+ * 取消时间 状态为3时赋值
+ */
+ private Date cancelTime;
+ /**
+ * 采购人/操作人
+ */
+ private String operator;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/MatPurchaseInDetail.java b/gear-mat/src/main/java/com/gear/mat/domain/MatPurchaseInDetail.java
new file mode 100644
index 0000000..f9f14ea
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/MatPurchaseInDetail.java
@@ -0,0 +1,71 @@
+package com.gear.mat.domain;
+
+import com.baomidou.mybatisplus.annotation.*;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import java.io.Serializable;
+import java.util.Date;
+import java.math.BigDecimal;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 入库记录对象 mat_purchase_in_detail
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@EqualsAndHashCode(callSuper = true)
+@TableName("mat_purchase_in_detail")
+public class MatPurchaseInDetail extends BaseEntity {
+
+ private static final long serialVersionUID=1L;
+
+ /**
+ * 入库明细ID 主键
+ */
+ @TableId(value = "detail_id")
+ private Long detailId;
+ /**
+ * 采购单ID 关联t_purchase.id
+ */
+ private Long purchaseId;
+ /**
+ * 配料ID 关联t_material.id 冗余字段 提升查询效率
+ */
+ private Long materialId;
+ /**
+ * 本次入库数量
+ */
+ private BigDecimal inNum;
+ /**
+ * 本次入库单价(同采购单单价)
+ */
+ private BigDecimal inPrice;
+ /**
+ * 本次入库金额 计算列
+ */
+ private BigDecimal inAmount;
+ /**
+ * 实际入库时间
+ */
+ private Date inTime;
+ /**
+ * 入库操作人
+ */
+ private String operator;
+ /**
+ * 删除标志(0=正常,1=已删除)
+ */
+ @TableLogic
+ private Integer delFlag;
+ /**
+ * 备注
+ */
+ private String remark;
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMatPriceHistoryBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMatPriceHistoryBo.java
new file mode 100644
index 0000000..b5d6f0a
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMatPriceHistoryBo.java
@@ -0,0 +1,56 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 配料价格/均价变动历史业务对象 mat_mat_price_history
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatMatPriceHistoryBo extends BaseEntity {
+
+ /**
+ *
+ */
+ private Long historyId;
+
+ /**
+ * 配料ID
+ */
+ private Long materialId;
+
+ /**
+ * 本次入库价格
+ */
+ private BigDecimal price;
+
+ /**
+ * 本次计算后的均价
+ */
+ private BigDecimal avgPrice;
+
+ /**
+ * 本次入库数量
+ */
+ private BigDecimal quantity;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialBo.java
new file mode 100644
index 0000000..c9baa88
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialBo.java
@@ -0,0 +1,66 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 配料配件基础信息业务对象 mat_material
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatMaterialBo extends BaseEntity {
+
+ /**
+ * 配料ID 主键
+ */
+ private Long materialId;
+
+ /**
+ * 配料名称
+ */
+ private String materialName;
+
+ /**
+ * 配料规格
+ */
+ private String spec;
+
+ /**
+ * 配料型号
+ */
+ private String model;
+
+ /**
+ * 厂家
+ */
+ private String factory;
+
+ /**
+ * 计量单位 个/公斤/米等
+ */
+ private String unit;
+
+ /**
+ * 现存库存(已入库) 不能为负
+ */
+ private BigDecimal currentStock;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialOutBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialOutBo.java
new file mode 100644
index 0000000..37cce7d
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatMaterialOutBo.java
@@ -0,0 +1,70 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 配料出库业务对象 mat_material_out
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatMaterialOutBo extends BaseEntity {
+
+ /**
+ * 出库ID 主键
+ */
+ private Long outId;
+
+ /**
+ * 出库单号 唯一 如O20260130001
+ */
+ private String outNo;
+
+ /**
+ * 配料ID 关联t_material.id
+ */
+ private Long materialId;
+
+ /**
+ * 本次出库数量 不能超过现存库存
+ */
+ private BigDecimal outNum;
+
+ /**
+ * 出库原因 生产使用/样品/报废等
+ */
+ private String outReason;
+
+ /**
+ * 出库操作人
+ */
+ private String operator;
+
+ /**
+ * 实际出库时间
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date outTime;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductBo.java
new file mode 100644
index 0000000..ee39f51
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductBo.java
@@ -0,0 +1,56 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 产品基础信息业务对象 mat_product
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatProductBo extends BaseEntity {
+
+ /**
+ * 产品ID 主键
+ */
+ private Long productId;
+
+ /**
+ * 产品名称
+ */
+ private String productName;
+
+ /**
+ * 产品规格
+ */
+ private String spec;
+
+ /**
+ * 产品型号
+ */
+ private String model;
+
+ /**
+ * 产品单价 可手动维护
+ */
+ private BigDecimal unitPrice;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductMaterialRelationBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductMaterialRelationBo.java
new file mode 100644
index 0000000..a503945
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatProductMaterialRelationBo.java
@@ -0,0 +1,56 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 产品-配料关联中间业务对象 mat_product_material_relation
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatProductMaterialRelationBo extends BaseEntity {
+
+ /**
+ * 关联ID 主键
+ */
+ private Long relationId;
+
+ /**
+ * 产品ID 关联t_product.id
+ */
+ private Long productId;
+
+ /**
+ * 配料ID 关联t_material.id
+ */
+ private Long materialId;
+
+ /**
+ * 单产品所需配料数量 默认为1
+ */
+ private BigDecimal materialNum;
+
+ /**
+ * 配料排序 用于前端展示顺序
+ */
+ private Long sort;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseBo.java
new file mode 100644
index 0000000..dff39b0
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseBo.java
@@ -0,0 +1,87 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 采购单主(管理在途库存)业务对象 mat_purchase
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatPurchaseBo extends BaseEntity {
+
+ /**
+ * 采购单ID 主键
+ */
+ private Long purchaseId;
+
+ /**
+ * 采购单号 唯一 如P20260130001
+ */
+ private String purchaseNo;
+
+ /**
+ * 厂家
+ */
+ private String factory;
+
+ /**
+ * 配料ID 关联material.id
+ */
+ private Long materialId;
+
+ /**
+ * 采购计划数量
+ */
+ private BigDecimal planNum;
+
+ /**
+ * 采购单价(本次录入价格)
+ */
+ private BigDecimal purchasePrice;
+
+ /**
+ * 采购截止日期(要求入库日期)
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date deadline;
+
+ /**
+ * 采购状态 1-待入(在途) 2-已完成(全部入库) 3-已取消(归零) 4-部分入库
+ */
+ private Integer status;
+
+ /**
+ * 取消时间 状态为3时赋值
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date cancelTime;
+
+ /**
+ * 采购人/操作人
+ */
+ private String operator;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseInDetailBo.java b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseInDetailBo.java
new file mode 100644
index 0000000..037eeba
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/bo/MatPurchaseInDetailBo.java
@@ -0,0 +1,75 @@
+package com.gear.mat.domain.bo;
+
+import com.gear.common.core.validate.AddGroup;
+import com.gear.common.core.validate.EditGroup;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import javax.validation.constraints.*;
+
+import java.util.Date;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.gear.common.core.domain.BaseEntity;
+
+/**
+ * 入库记录业务对象 mat_purchase_in_detail
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class MatPurchaseInDetailBo extends BaseEntity {
+
+ /**
+ * 入库明细ID 主键
+ */
+ private Long detailId;
+
+ /**
+ * 采购单ID 关联t_purchase.id
+ */
+ private Long purchaseId;
+
+ /**
+ * 配料ID 关联t_material.id 冗余字段 提升查询效率
+ */
+ private Long materialId;
+
+ /**
+ * 本次入库数量
+ */
+ private BigDecimal inNum;
+
+ /**
+ * 本次入库单价(同采购单单价)
+ */
+ private BigDecimal inPrice;
+
+ /**
+ * 本次入库金额 计算列
+ */
+ private BigDecimal inAmount;
+
+ /**
+ * 实际入库时间
+ */
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date inTime;
+
+ /**
+ * 入库操作人
+ */
+ private String operator;
+
+ /**
+ * 备注
+ */
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMatPriceHistoryVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMatPriceHistoryVo.java
new file mode 100644
index 0000000..ecdff1c
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMatPriceHistoryVo.java
@@ -0,0 +1,62 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 配料价格/均价变动历史视图对象 mat_mat_price_history
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatMatPriceHistoryVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ *
+ */
+ @ExcelProperty(value = "")
+ private Long historyId;
+
+ /**
+ * 配料ID
+ */
+ @ExcelProperty(value = "配料ID")
+ private Long materialId;
+
+ /**
+ * 本次入库价格
+ */
+ @ExcelProperty(value = "本次入库价格")
+ private BigDecimal price;
+
+ /**
+ * 本次计算后的均价
+ */
+ @ExcelProperty(value = "本次计算后的均价")
+ private BigDecimal avgPrice;
+
+ /**
+ * 本次入库数量
+ */
+ @ExcelProperty(value = "本次入库数量")
+ private BigDecimal quantity;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialOutVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialOutVo.java
new file mode 100644
index 0000000..0f984bb
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialOutVo.java
@@ -0,0 +1,78 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 配料出库视图对象 mat_material_out
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatMaterialOutVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 出库ID 主键
+ */
+ @ExcelProperty(value = "出库ID 主键")
+ private Long outId;
+
+ /**
+ * 出库单号 唯一 如O20260130001
+ */
+ @ExcelProperty(value = "出库单号 唯一 如O20260130001")
+ private String outNo;
+
+ /**
+ * 配料ID 关联t_material.id
+ */
+ @ExcelProperty(value = "配料ID 关联t_material.id")
+ private Long materialId;
+
+ /**
+ * 本次出库数量 不能超过现存库存
+ */
+ @ExcelProperty(value = "本次出库数量 不能超过现存库存")
+ private BigDecimal outNum;
+
+ /**
+ * 出库原因 生产使用/样品/报废等
+ */
+ @ExcelProperty(value = "出库原因 生产使用/样品/报废等")
+ private String outReason;
+
+ /**
+ * 出库操作人
+ */
+ @ExcelProperty(value = "出库操作人")
+ private String operator;
+
+ /**
+ * 实际出库时间
+ */
+ @ExcelProperty(value = "实际出库时间")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date outTime;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialVo.java
new file mode 100644
index 0000000..e444269
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatMaterialVo.java
@@ -0,0 +1,75 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 配料配件基础信息视图对象 mat_material
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatMaterialVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 配料ID 主键
+ */
+ @ExcelProperty(value = "配料ID 主键")
+ private Long materialId;
+
+ /**
+ * 配料名称
+ */
+ @ExcelProperty(value = "配料名称")
+ private String materialName;
+
+ /**
+ * 配料规格
+ */
+ @ExcelProperty(value = "配料规格")
+ private String spec;
+
+ /**
+ * 配料型号
+ */
+ @ExcelProperty(value = "配料型号")
+ private String model;
+
+ /**
+ * 厂家
+ */
+ @ExcelProperty(value = "厂家")
+ private String factory;
+
+ /**
+ * 计量单位 个/公斤/米等
+ */
+ @ExcelProperty(value = "计量单位 个/公斤/米等")
+ private String unit;
+
+ /**
+ * 现存库存(已入库) 不能为负
+ */
+ @ExcelProperty(value = "现存库存", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "已=入库")
+ private BigDecimal currentStock;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductMaterialRelationVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductMaterialRelationVo.java
new file mode 100644
index 0000000..df2d8cb
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductMaterialRelationVo.java
@@ -0,0 +1,62 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 产品-配料关联中间视图对象 mat_product_material_relation
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatProductMaterialRelationVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 关联ID 主键
+ */
+ @ExcelProperty(value = "关联ID 主键")
+ private Long relationId;
+
+ /**
+ * 产品ID 关联t_product.id
+ */
+ @ExcelProperty(value = "产品ID 关联t_product.id")
+ private Long productId;
+
+ /**
+ * 配料ID 关联t_material.id
+ */
+ @ExcelProperty(value = "配料ID 关联t_material.id")
+ private Long materialId;
+
+ /**
+ * 单产品所需配料数量 默认为1
+ */
+ @ExcelProperty(value = "单产品所需配料数量 默认为1")
+ private BigDecimal materialNum;
+
+ /**
+ * 配料排序 用于前端展示顺序
+ */
+ @ExcelProperty(value = "配料排序 用于前端展示顺序")
+ private Long sort;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductVo.java
new file mode 100644
index 0000000..ad5b715
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatProductVo.java
@@ -0,0 +1,62 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 产品基础信息视图对象 mat_product
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatProductVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 产品ID 主键
+ */
+ @ExcelProperty(value = "产品ID 主键")
+ private Long productId;
+
+ /**
+ * 产品名称
+ */
+ @ExcelProperty(value = "产品名称")
+ private String productName;
+
+ /**
+ * 产品规格
+ */
+ @ExcelProperty(value = "产品规格")
+ private String spec;
+
+ /**
+ * 产品型号
+ */
+ @ExcelProperty(value = "产品型号")
+ private String model;
+
+ /**
+ * 产品单价 可手动维护
+ */
+ @ExcelProperty(value = "产品单价 可手动维护")
+ private BigDecimal unitPrice;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseInDetailVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseInDetailVo.java
new file mode 100644
index 0000000..a19b13e
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseInDetailVo.java
@@ -0,0 +1,85 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 入库记录视图对象 mat_purchase_in_detail
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatPurchaseInDetailVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 入库明细ID 主键
+ */
+ @ExcelProperty(value = "入库明细ID 主键")
+ private Long detailId;
+
+ /**
+ * 采购单ID 关联t_purchase.id
+ */
+ @ExcelProperty(value = "采购单ID 关联t_purchase.id")
+ private Long purchaseId;
+
+ /**
+ * 配料ID 关联t_material.id 冗余字段 提升查询效率
+ */
+ @ExcelProperty(value = "配料ID 关联t_material.id 冗余字段 提升查询效率")
+ private Long materialId;
+
+ /**
+ * 本次入库数量
+ */
+ @ExcelProperty(value = "本次入库数量")
+ private BigDecimal inNum;
+
+ /**
+ * 本次入库单价(同采购单单价)
+ */
+ @ExcelProperty(value = "本次入库单价", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "同=采购单单价")
+ private BigDecimal inPrice;
+
+ /**
+ * 本次入库金额 计算列
+ */
+ @ExcelProperty(value = "本次入库金额 计算列")
+ private BigDecimal inAmount;
+
+ /**
+ * 实际入库时间
+ */
+ @ExcelProperty(value = "实际入库时间")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date inTime;
+
+ /**
+ * 入库操作人
+ */
+ @ExcelProperty(value = "入库操作人")
+ private String operator;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java
new file mode 100644
index 0000000..c78c323
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/domain/vo/MatPurchaseVo.java
@@ -0,0 +1,101 @@
+package com.gear.mat.domain.vo;
+
+import java.math.BigDecimal;
+import java.util.Date;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.gear.common.annotation.ExcelDictFormat;
+import com.gear.common.convert.ExcelDictConvert;
+import lombok.Data;
+import java.util.Date;
+
+
+
+/**
+ * 采购单主(管理在途库存)视图对象 mat_purchase
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@Data
+@ExcelIgnoreUnannotated
+public class MatPurchaseVo {
+
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 采购单ID 主键
+ */
+ @ExcelProperty(value = "采购单ID 主键")
+ private Long purchaseId;
+
+ /**
+ * 采购单号 唯一 如P20260130001
+ */
+ @ExcelProperty(value = "采购单号 唯一 如P20260130001")
+ private String purchaseNo;
+
+ /**
+ * 厂家
+ */
+ @ExcelProperty(value = "厂家")
+ private String factory;
+
+ /**
+ * 配料ID 关联material.id
+ */
+ @ExcelProperty(value = "配料ID 关联material.id")
+ private Long materialId;
+
+ /**
+ * 采购计划数量
+ */
+ @ExcelProperty(value = "采购计划数量")
+ private BigDecimal planNum;
+
+ /**
+ * 采购单价(本次录入价格)
+ */
+ @ExcelProperty(value = "采购单价", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "本=次录入价格")
+ private BigDecimal purchasePrice;
+
+ /**
+ * 采购截止日期(要求入库日期)
+ */
+ @ExcelProperty(value = "采购截止日期", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "要=求入库日期")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date deadline;
+
+ /**
+ * 采购状态 1-待入(在途) 2-已完成(全部入库) 3-已取消(归零) 4-部分入库
+ */
+ @ExcelProperty(value = "采购状态 1-待入", converter = ExcelDictConvert.class)
+ @ExcelDictFormat(readConverterExp = "在=途")
+ private Integer status;
+
+ /**
+ * 取消时间 状态为3时赋值
+ */
+ @ExcelProperty(value = "取消时间 状态为3时赋值")
+ @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+ @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
+ private Date cancelTime;
+
+ /**
+ * 采购人/操作人
+ */
+ @ExcelProperty(value = "采购人/操作人")
+ private String operator;
+
+ /**
+ * 备注
+ */
+ @ExcelProperty(value = "备注")
+ private String remark;
+
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatMatPriceHistoryMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatMatPriceHistoryMapper.java
new file mode 100644
index 0000000..fc3e527
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatMatPriceHistoryMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatMatPriceHistory;
+import com.gear.mat.domain.vo.MatMatPriceHistoryVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 配料价格/均价变动历史Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatMatPriceHistoryMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialMapper.java
new file mode 100644
index 0000000..43c6678
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatMaterial;
+import com.gear.mat.domain.vo.MatMaterialVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 配料配件基础信息Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatMaterialMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialOutMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialOutMapper.java
new file mode 100644
index 0000000..a9b4aa4
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatMaterialOutMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatMaterialOut;
+import com.gear.mat.domain.vo.MatMaterialOutVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 配料出库Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatMaterialOutMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatProductMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatProductMapper.java
new file mode 100644
index 0000000..b37d8d8
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatProductMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatProduct;
+import com.gear.mat.domain.vo.MatProductVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品基础信息Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatProductMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatProductMaterialRelationMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatProductMaterialRelationMapper.java
new file mode 100644
index 0000000..4cd85b3
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatProductMaterialRelationMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatProductMaterialRelation;
+import com.gear.mat.domain.vo.MatProductMaterialRelationVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 产品-配料关联中间Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatProductMaterialRelationMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseInDetailMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseInDetailMapper.java
new file mode 100644
index 0000000..f6ba4f3
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseInDetailMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatPurchaseInDetail;
+import com.gear.mat.domain.vo.MatPurchaseInDetailVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 入库记录Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatPurchaseInDetailMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseMapper.java b/gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseMapper.java
new file mode 100644
index 0000000..8a0c2e4
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/mapper/MatPurchaseMapper.java
@@ -0,0 +1,15 @@
+package com.gear.mat.mapper;
+
+import com.gear.mat.domain.MatPurchase;
+import com.gear.mat.domain.vo.MatPurchaseVo;
+import com.gear.common.core.mapper.BaseMapperPlus;
+
+/**
+ * 采购单主(管理在途库存)Mapper接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface MatPurchaseMapper extends BaseMapperPlus {
+
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatMatPriceHistoryService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatMatPriceHistoryService.java
new file mode 100644
index 0000000..302c3c1
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatMatPriceHistoryService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatMatPriceHistory;
+import com.gear.mat.domain.vo.MatMatPriceHistoryVo;
+import com.gear.mat.domain.bo.MatMatPriceHistoryBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 配料价格/均价变动历史Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatMatPriceHistoryService {
+
+ /**
+ * 查询配料价格/均价变动历史
+ */
+ MatMatPriceHistoryVo queryById(Long historyId);
+
+ /**
+ * 查询配料价格/均价变动历史列表
+ */
+ TableDataInfo queryPageList(MatMatPriceHistoryBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询配料价格/均价变动历史列表
+ */
+ List queryList(MatMatPriceHistoryBo bo);
+
+ /**
+ * 新增配料价格/均价变动历史
+ */
+ Boolean insertByBo(MatMatPriceHistoryBo bo);
+
+ /**
+ * 修改配料价格/均价变动历史
+ */
+ Boolean updateByBo(MatMatPriceHistoryBo bo);
+
+ /**
+ * 校验并批量删除配料价格/均价变动历史信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatMaterialOutService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatMaterialOutService.java
new file mode 100644
index 0000000..24f31a2
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatMaterialOutService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatMaterialOut;
+import com.gear.mat.domain.vo.MatMaterialOutVo;
+import com.gear.mat.domain.bo.MatMaterialOutBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 配料出库Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatMaterialOutService {
+
+ /**
+ * 查询配料出库
+ */
+ MatMaterialOutVo queryById(Long outId);
+
+ /**
+ * 查询配料出库列表
+ */
+ TableDataInfo queryPageList(MatMaterialOutBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询配料出库列表
+ */
+ List queryList(MatMaterialOutBo bo);
+
+ /**
+ * 新增配料出库
+ */
+ Boolean insertByBo(MatMaterialOutBo bo);
+
+ /**
+ * 修改配料出库
+ */
+ Boolean updateByBo(MatMaterialOutBo bo);
+
+ /**
+ * 校验并批量删除配料出库信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatMaterialService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatMaterialService.java
new file mode 100644
index 0000000..1417fdc
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatMaterialService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatMaterial;
+import com.gear.mat.domain.vo.MatMaterialVo;
+import com.gear.mat.domain.bo.MatMaterialBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 配料配件基础信息Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatMaterialService {
+
+ /**
+ * 查询配料配件基础信息
+ */
+ MatMaterialVo queryById(Long materialId);
+
+ /**
+ * 查询配料配件基础信息列表
+ */
+ TableDataInfo queryPageList(MatMaterialBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询配料配件基础信息列表
+ */
+ List queryList(MatMaterialBo bo);
+
+ /**
+ * 新增配料配件基础信息
+ */
+ Boolean insertByBo(MatMaterialBo bo);
+
+ /**
+ * 修改配料配件基础信息
+ */
+ Boolean updateByBo(MatMaterialBo bo);
+
+ /**
+ * 校验并批量删除配料配件基础信息信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatProductMaterialRelationService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatProductMaterialRelationService.java
new file mode 100644
index 0000000..7ea589f
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatProductMaterialRelationService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatProductMaterialRelation;
+import com.gear.mat.domain.vo.MatProductMaterialRelationVo;
+import com.gear.mat.domain.bo.MatProductMaterialRelationBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 产品-配料关联中间Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatProductMaterialRelationService {
+
+ /**
+ * 查询产品-配料关联中间
+ */
+ MatProductMaterialRelationVo queryById(Long relationId);
+
+ /**
+ * 查询产品-配料关联中间列表
+ */
+ TableDataInfo queryPageList(MatProductMaterialRelationBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询产品-配料关联中间列表
+ */
+ List queryList(MatProductMaterialRelationBo bo);
+
+ /**
+ * 新增产品-配料关联中间
+ */
+ Boolean insertByBo(MatProductMaterialRelationBo bo);
+
+ /**
+ * 修改产品-配料关联中间
+ */
+ Boolean updateByBo(MatProductMaterialRelationBo bo);
+
+ /**
+ * 校验并批量删除产品-配料关联中间信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatProductService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatProductService.java
new file mode 100644
index 0000000..dcc7df4
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatProductService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatProduct;
+import com.gear.mat.domain.vo.MatProductVo;
+import com.gear.mat.domain.bo.MatProductBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 产品基础信息Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatProductService {
+
+ /**
+ * 查询产品基础信息
+ */
+ MatProductVo queryById(Long productId);
+
+ /**
+ * 查询产品基础信息列表
+ */
+ TableDataInfo queryPageList(MatProductBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询产品基础信息列表
+ */
+ List queryList(MatProductBo bo);
+
+ /**
+ * 新增产品基础信息
+ */
+ Boolean insertByBo(MatProductBo bo);
+
+ /**
+ * 修改产品基础信息
+ */
+ Boolean updateByBo(MatProductBo bo);
+
+ /**
+ * 校验并批量删除产品基础信息信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseInDetailService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseInDetailService.java
new file mode 100644
index 0000000..6679816
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseInDetailService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatPurchaseInDetail;
+import com.gear.mat.domain.vo.MatPurchaseInDetailVo;
+import com.gear.mat.domain.bo.MatPurchaseInDetailBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 入库记录Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatPurchaseInDetailService {
+
+ /**
+ * 查询入库记录
+ */
+ MatPurchaseInDetailVo queryById(Long detailId);
+
+ /**
+ * 查询入库记录列表
+ */
+ TableDataInfo queryPageList(MatPurchaseInDetailBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询入库记录列表
+ */
+ List queryList(MatPurchaseInDetailBo bo);
+
+ /**
+ * 新增入库记录
+ */
+ Boolean insertByBo(MatPurchaseInDetailBo bo);
+
+ /**
+ * 修改入库记录
+ */
+ Boolean updateByBo(MatPurchaseInDetailBo bo);
+
+ /**
+ * 校验并批量删除入库记录信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java b/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java
new file mode 100644
index 0000000..717122f
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/IMatPurchaseService.java
@@ -0,0 +1,49 @@
+package com.gear.mat.service;
+
+import com.gear.mat.domain.MatPurchase;
+import com.gear.mat.domain.vo.MatPurchaseVo;
+import com.gear.mat.domain.bo.MatPurchaseBo;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+
+import java.util.Collection;
+import java.util.List;
+
+/**
+ * 采购单主(管理在途库存)Service接口
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+public interface IMatPurchaseService {
+
+ /**
+ * 查询采购单主(管理在途库存)
+ */
+ MatPurchaseVo queryById(Long purchaseId);
+
+ /**
+ * 查询采购单主(管理在途库存)列表
+ */
+ TableDataInfo queryPageList(MatPurchaseBo bo, PageQuery pageQuery);
+
+ /**
+ * 查询采购单主(管理在途库存)列表
+ */
+ List queryList(MatPurchaseBo bo);
+
+ /**
+ * 新增采购单主(管理在途库存)
+ */
+ Boolean insertByBo(MatPurchaseBo bo);
+
+ /**
+ * 修改采购单主(管理在途库存)
+ */
+ Boolean updateByBo(MatPurchaseBo bo);
+
+ /**
+ * 校验并批量删除采购单主(管理在途库存)信息
+ */
+ Boolean deleteWithValidByIds(Collection ids, Boolean isValid);
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatMatPriceHistoryServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMatPriceHistoryServiceImpl.java
new file mode 100644
index 0000000..392b1b1
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMatPriceHistoryServiceImpl.java
@@ -0,0 +1,112 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatMatPriceHistoryBo;
+import com.gear.mat.domain.vo.MatMatPriceHistoryVo;
+import com.gear.mat.domain.MatMatPriceHistory;
+import com.gear.mat.mapper.MatMatPriceHistoryMapper;
+import com.gear.mat.service.IMatMatPriceHistoryService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 配料价格/均价变动历史Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatMatPriceHistoryServiceImpl implements IMatMatPriceHistoryService {
+
+ private final MatMatPriceHistoryMapper baseMapper;
+
+ /**
+ * 查询配料价格/均价变动历史
+ */
+ @Override
+ public MatMatPriceHistoryVo queryById(Long historyId){
+ return baseMapper.selectVoById(historyId);
+ }
+
+ /**
+ * 查询配料价格/均价变动历史列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatMatPriceHistoryBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询配料价格/均价变动历史列表
+ */
+ @Override
+ public List queryList(MatMatPriceHistoryBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatMatPriceHistoryBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getMaterialId() != null, MatMatPriceHistory::getMaterialId, bo.getMaterialId());
+ lqw.eq(bo.getPrice() != null, MatMatPriceHistory::getPrice, bo.getPrice());
+ lqw.eq(bo.getAvgPrice() != null, MatMatPriceHistory::getAvgPrice, bo.getAvgPrice());
+ lqw.eq(bo.getQuantity() != null, MatMatPriceHistory::getQuantity, bo.getQuantity());
+ return lqw;
+ }
+
+ /**
+ * 新增配料价格/均价变动历史
+ */
+ @Override
+ public Boolean insertByBo(MatMatPriceHistoryBo bo) {
+ MatMatPriceHistory add = BeanUtil.toBean(bo, MatMatPriceHistory.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setHistoryId(add.getHistoryId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改配料价格/均价变动历史
+ */
+ @Override
+ public Boolean updateByBo(MatMatPriceHistoryBo bo) {
+ MatMatPriceHistory update = BeanUtil.toBean(bo, MatMatPriceHistory.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatMatPriceHistory entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除配料价格/均价变动历史
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialOutServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialOutServiceImpl.java
new file mode 100644
index 0000000..ab70220
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialOutServiceImpl.java
@@ -0,0 +1,114 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatMaterialOutBo;
+import com.gear.mat.domain.vo.MatMaterialOutVo;
+import com.gear.mat.domain.MatMaterialOut;
+import com.gear.mat.mapper.MatMaterialOutMapper;
+import com.gear.mat.service.IMatMaterialOutService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 配料出库Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatMaterialOutServiceImpl implements IMatMaterialOutService {
+
+ private final MatMaterialOutMapper baseMapper;
+
+ /**
+ * 查询配料出库
+ */
+ @Override
+ public MatMaterialOutVo queryById(Long outId){
+ return baseMapper.selectVoById(outId);
+ }
+
+ /**
+ * 查询配料出库列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatMaterialOutBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询配料出库列表
+ */
+ @Override
+ public List queryList(MatMaterialOutBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatMaterialOutBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getOutNo()), MatMaterialOut::getOutNo, bo.getOutNo());
+ lqw.eq(bo.getMaterialId() != null, MatMaterialOut::getMaterialId, bo.getMaterialId());
+ lqw.eq(bo.getOutNum() != null, MatMaterialOut::getOutNum, bo.getOutNum());
+ lqw.eq(StringUtils.isNotBlank(bo.getOutReason()), MatMaterialOut::getOutReason, bo.getOutReason());
+ lqw.eq(StringUtils.isNotBlank(bo.getOperator()), MatMaterialOut::getOperator, bo.getOperator());
+ lqw.eq(bo.getOutTime() != null, MatMaterialOut::getOutTime, bo.getOutTime());
+ return lqw;
+ }
+
+ /**
+ * 新增配料出库
+ */
+ @Override
+ public Boolean insertByBo(MatMaterialOutBo bo) {
+ MatMaterialOut add = BeanUtil.toBean(bo, MatMaterialOut.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setOutId(add.getOutId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改配料出库
+ */
+ @Override
+ public Boolean updateByBo(MatMaterialOutBo bo) {
+ MatMaterialOut update = BeanUtil.toBean(bo, MatMaterialOut.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatMaterialOut entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除配料出库
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java
new file mode 100644
index 0000000..225f5a7
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatMaterialServiceImpl.java
@@ -0,0 +1,114 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatMaterialBo;
+import com.gear.mat.domain.vo.MatMaterialVo;
+import com.gear.mat.domain.MatMaterial;
+import com.gear.mat.mapper.MatMaterialMapper;
+import com.gear.mat.service.IMatMaterialService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 配料配件基础信息Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatMaterialServiceImpl implements IMatMaterialService {
+
+ private final MatMaterialMapper baseMapper;
+
+ /**
+ * 查询配料配件基础信息
+ */
+ @Override
+ public MatMaterialVo queryById(Long materialId){
+ return baseMapper.selectVoById(materialId);
+ }
+
+ /**
+ * 查询配料配件基础信息列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatMaterialBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询配料配件基础信息列表
+ */
+ @Override
+ public List queryList(MatMaterialBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatMaterialBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.like(StringUtils.isNotBlank(bo.getMaterialName()), MatMaterial::getMaterialName, bo.getMaterialName());
+ lqw.eq(StringUtils.isNotBlank(bo.getSpec()), MatMaterial::getSpec, bo.getSpec());
+ lqw.eq(StringUtils.isNotBlank(bo.getModel()), MatMaterial::getModel, bo.getModel());
+ lqw.eq(StringUtils.isNotBlank(bo.getFactory()), MatMaterial::getFactory, bo.getFactory());
+ lqw.eq(StringUtils.isNotBlank(bo.getUnit()), MatMaterial::getUnit, bo.getUnit());
+ lqw.eq(bo.getCurrentStock() != null, MatMaterial::getCurrentStock, bo.getCurrentStock());
+ return lqw;
+ }
+
+ /**
+ * 新增配料配件基础信息
+ */
+ @Override
+ public Boolean insertByBo(MatMaterialBo bo) {
+ MatMaterial add = BeanUtil.toBean(bo, MatMaterial.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setMaterialId(add.getMaterialId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改配料配件基础信息
+ */
+ @Override
+ public Boolean updateByBo(MatMaterialBo bo) {
+ MatMaterial update = BeanUtil.toBean(bo, MatMaterial.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatMaterial entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除配料配件基础信息
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatProductMaterialRelationServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatProductMaterialRelationServiceImpl.java
new file mode 100644
index 0000000..7100e70
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatProductMaterialRelationServiceImpl.java
@@ -0,0 +1,112 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatProductMaterialRelationBo;
+import com.gear.mat.domain.vo.MatProductMaterialRelationVo;
+import com.gear.mat.domain.MatProductMaterialRelation;
+import com.gear.mat.mapper.MatProductMaterialRelationMapper;
+import com.gear.mat.service.IMatProductMaterialRelationService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 产品-配料关联中间Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatProductMaterialRelationServiceImpl implements IMatProductMaterialRelationService {
+
+ private final MatProductMaterialRelationMapper baseMapper;
+
+ /**
+ * 查询产品-配料关联中间
+ */
+ @Override
+ public MatProductMaterialRelationVo queryById(Long relationId){
+ return baseMapper.selectVoById(relationId);
+ }
+
+ /**
+ * 查询产品-配料关联中间列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatProductMaterialRelationBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询产品-配料关联中间列表
+ */
+ @Override
+ public List queryList(MatProductMaterialRelationBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatProductMaterialRelationBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getProductId() != null, MatProductMaterialRelation::getProductId, bo.getProductId());
+ lqw.eq(bo.getMaterialId() != null, MatProductMaterialRelation::getMaterialId, bo.getMaterialId());
+ lqw.eq(bo.getMaterialNum() != null, MatProductMaterialRelation::getMaterialNum, bo.getMaterialNum());
+ lqw.eq(bo.getSort() != null, MatProductMaterialRelation::getSort, bo.getSort());
+ return lqw;
+ }
+
+ /**
+ * 新增产品-配料关联中间
+ */
+ @Override
+ public Boolean insertByBo(MatProductMaterialRelationBo bo) {
+ MatProductMaterialRelation add = BeanUtil.toBean(bo, MatProductMaterialRelation.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setRelationId(add.getRelationId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改产品-配料关联中间
+ */
+ @Override
+ public Boolean updateByBo(MatProductMaterialRelationBo bo) {
+ MatProductMaterialRelation update = BeanUtil.toBean(bo, MatProductMaterialRelation.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatProductMaterialRelation entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除产品-配料关联中间
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatProductServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatProductServiceImpl.java
new file mode 100644
index 0000000..8d4bd42
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatProductServiceImpl.java
@@ -0,0 +1,112 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatProductBo;
+import com.gear.mat.domain.vo.MatProductVo;
+import com.gear.mat.domain.MatProduct;
+import com.gear.mat.mapper.MatProductMapper;
+import com.gear.mat.service.IMatProductService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 产品基础信息Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatProductServiceImpl implements IMatProductService {
+
+ private final MatProductMapper baseMapper;
+
+ /**
+ * 查询产品基础信息
+ */
+ @Override
+ public MatProductVo queryById(Long productId){
+ return baseMapper.selectVoById(productId);
+ }
+
+ /**
+ * 查询产品基础信息列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatProductBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询产品基础信息列表
+ */
+ @Override
+ public List queryList(MatProductBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatProductBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.like(StringUtils.isNotBlank(bo.getProductName()), MatProduct::getProductName, bo.getProductName());
+ lqw.eq(StringUtils.isNotBlank(bo.getSpec()), MatProduct::getSpec, bo.getSpec());
+ lqw.eq(StringUtils.isNotBlank(bo.getModel()), MatProduct::getModel, bo.getModel());
+ lqw.eq(bo.getUnitPrice() != null, MatProduct::getUnitPrice, bo.getUnitPrice());
+ return lqw;
+ }
+
+ /**
+ * 新增产品基础信息
+ */
+ @Override
+ public Boolean insertByBo(MatProductBo bo) {
+ MatProduct add = BeanUtil.toBean(bo, MatProduct.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setProductId(add.getProductId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改产品基础信息
+ */
+ @Override
+ public Boolean updateByBo(MatProductBo bo) {
+ MatProduct update = BeanUtil.toBean(bo, MatProduct.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatProduct entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除产品基础信息
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseInDetailServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseInDetailServiceImpl.java
new file mode 100644
index 0000000..648f80d
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseInDetailServiceImpl.java
@@ -0,0 +1,115 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatPurchaseInDetailBo;
+import com.gear.mat.domain.vo.MatPurchaseInDetailVo;
+import com.gear.mat.domain.MatPurchaseInDetail;
+import com.gear.mat.mapper.MatPurchaseInDetailMapper;
+import com.gear.mat.service.IMatPurchaseInDetailService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 入库记录Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatPurchaseInDetailServiceImpl implements IMatPurchaseInDetailService {
+
+ private final MatPurchaseInDetailMapper baseMapper;
+
+ /**
+ * 查询入库记录
+ */
+ @Override
+ public MatPurchaseInDetailVo queryById(Long detailId){
+ return baseMapper.selectVoById(detailId);
+ }
+
+ /**
+ * 查询入库记录列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatPurchaseInDetailBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询入库记录列表
+ */
+ @Override
+ public List queryList(MatPurchaseInDetailBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatPurchaseInDetailBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(bo.getPurchaseId() != null, MatPurchaseInDetail::getPurchaseId, bo.getPurchaseId());
+ lqw.eq(bo.getMaterialId() != null, MatPurchaseInDetail::getMaterialId, bo.getMaterialId());
+ lqw.eq(bo.getInNum() != null, MatPurchaseInDetail::getInNum, bo.getInNum());
+ lqw.eq(bo.getInPrice() != null, MatPurchaseInDetail::getInPrice, bo.getInPrice());
+ lqw.eq(bo.getInAmount() != null, MatPurchaseInDetail::getInAmount, bo.getInAmount());
+ lqw.eq(bo.getInTime() != null, MatPurchaseInDetail::getInTime, bo.getInTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getOperator()), MatPurchaseInDetail::getOperator, bo.getOperator());
+ return lqw;
+ }
+
+ /**
+ * 新增入库记录
+ */
+ @Override
+ public Boolean insertByBo(MatPurchaseInDetailBo bo) {
+ MatPurchaseInDetail add = BeanUtil.toBean(bo, MatPurchaseInDetail.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setDetailId(add.getDetailId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改入库记录
+ */
+ @Override
+ public Boolean updateByBo(MatPurchaseInDetailBo bo) {
+ MatPurchaseInDetail update = BeanUtil.toBean(bo, MatPurchaseInDetail.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatPurchaseInDetail entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除入库记录
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java b/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java
new file mode 100644
index 0000000..461a115
--- /dev/null
+++ b/gear-mat/src/main/java/com/gear/mat/service/impl/MatPurchaseServiceImpl.java
@@ -0,0 +1,117 @@
+package com.gear.mat.service.impl;
+
+import cn.hutool.core.bean.BeanUtil;
+import com.gear.common.utils.StringUtils;
+import com.gear.common.core.page.TableDataInfo;
+import com.gear.common.core.domain.PageQuery;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.core.toolkit.Wrappers;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import com.gear.mat.domain.bo.MatPurchaseBo;
+import com.gear.mat.domain.vo.MatPurchaseVo;
+import com.gear.mat.domain.MatPurchase;
+import com.gear.mat.mapper.MatPurchaseMapper;
+import com.gear.mat.service.IMatPurchaseService;
+
+import java.util.List;
+import java.util.Map;
+import java.util.Collection;
+
+/**
+ * 采购单主(管理在途库存)Service业务层处理
+ *
+ * @author ruoyi
+ * @date 2026-01-30
+ */
+@RequiredArgsConstructor
+@Service
+public class MatPurchaseServiceImpl implements IMatPurchaseService {
+
+ private final MatPurchaseMapper baseMapper;
+
+ /**
+ * 查询采购单主(管理在途库存)
+ */
+ @Override
+ public MatPurchaseVo queryById(Long purchaseId){
+ return baseMapper.selectVoById(purchaseId);
+ }
+
+ /**
+ * 查询采购单主(管理在途库存)列表
+ */
+ @Override
+ public TableDataInfo queryPageList(MatPurchaseBo bo, PageQuery pageQuery) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ Page result = baseMapper.selectVoPage(pageQuery.build(), lqw);
+ return TableDataInfo.build(result);
+ }
+
+ /**
+ * 查询采购单主(管理在途库存)列表
+ */
+ @Override
+ public List queryList(MatPurchaseBo bo) {
+ LambdaQueryWrapper lqw = buildQueryWrapper(bo);
+ return baseMapper.selectVoList(lqw);
+ }
+
+ private LambdaQueryWrapper buildQueryWrapper(MatPurchaseBo bo) {
+ Map params = bo.getParams();
+ LambdaQueryWrapper lqw = Wrappers.lambdaQuery();
+ lqw.eq(StringUtils.isNotBlank(bo.getPurchaseNo()), MatPurchase::getPurchaseNo, bo.getPurchaseNo());
+ lqw.eq(StringUtils.isNotBlank(bo.getFactory()), MatPurchase::getFactory, bo.getFactory());
+ lqw.eq(bo.getMaterialId() != null, MatPurchase::getMaterialId, bo.getMaterialId());
+ lqw.eq(bo.getPlanNum() != null, MatPurchase::getPlanNum, bo.getPlanNum());
+ lqw.eq(bo.getPurchasePrice() != null, MatPurchase::getPurchasePrice, bo.getPurchasePrice());
+ lqw.eq(bo.getDeadline() != null, MatPurchase::getDeadline, bo.getDeadline());
+ lqw.eq(bo.getStatus() != null, MatPurchase::getStatus, bo.getStatus());
+ lqw.eq(bo.getCancelTime() != null, MatPurchase::getCancelTime, bo.getCancelTime());
+ lqw.eq(StringUtils.isNotBlank(bo.getOperator()), MatPurchase::getOperator, bo.getOperator());
+ return lqw;
+ }
+
+ /**
+ * 新增采购单主(管理在途库存)
+ */
+ @Override
+ public Boolean insertByBo(MatPurchaseBo bo) {
+ MatPurchase add = BeanUtil.toBean(bo, MatPurchase.class);
+ validEntityBeforeSave(add);
+ boolean flag = baseMapper.insert(add) > 0;
+ if (flag) {
+ bo.setPurchaseId(add.getPurchaseId());
+ }
+ return flag;
+ }
+
+ /**
+ * 修改采购单主(管理在途库存)
+ */
+ @Override
+ public Boolean updateByBo(MatPurchaseBo bo) {
+ MatPurchase update = BeanUtil.toBean(bo, MatPurchase.class);
+ validEntityBeforeSave(update);
+ return baseMapper.updateById(update) > 0;
+ }
+
+ /**
+ * 保存前的数据校验
+ */
+ private void validEntityBeforeSave(MatPurchase entity){
+ //TODO 做一些数据校验,如唯一约束
+ }
+
+ /**
+ * 批量删除采购单主(管理在途库存)
+ */
+ @Override
+ public Boolean deleteWithValidByIds(Collection ids, Boolean isValid) {
+ if(isValid){
+ //TODO 做一些业务上的校验,判断是否需要校验
+ }
+ return baseMapper.deleteBatchIds(ids) > 0;
+ }
+}
diff --git a/gear-mat/src/main/resources/mapper/MatMatPriceHistoryMapper.xml b/gear-mat/src/main/resources/mapper/MatMatPriceHistoryMapper.xml
new file mode 100644
index 0000000..d5a6d9e
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatMatPriceHistoryMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mat/src/main/resources/mapper/MatMaterialMapper.xml b/gear-mat/src/main/resources/mapper/MatMaterialMapper.xml
new file mode 100644
index 0000000..a6de0e0
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatMaterialMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mat/src/main/resources/mapper/MatMaterialOutMapper.xml b/gear-mat/src/main/resources/mapper/MatMaterialOutMapper.xml
new file mode 100644
index 0000000..765b35e
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatMaterialOutMapper.xml
@@ -0,0 +1,24 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mat/src/main/resources/mapper/MatProductMapper.xml b/gear-mat/src/main/resources/mapper/MatProductMapper.xml
new file mode 100644
index 0000000..d5e4bbb
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatProductMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mat/src/main/resources/mapper/MatProductMaterialRelationMapper.xml b/gear-mat/src/main/resources/mapper/MatProductMaterialRelationMapper.xml
new file mode 100644
index 0000000..e351432
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatProductMaterialRelationMapper.xml
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mat/src/main/resources/mapper/MatPurchaseInDetailMapper.xml b/gear-mat/src/main/resources/mapper/MatPurchaseInDetailMapper.xml
new file mode 100644
index 0000000..6b46091
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatPurchaseInDetailMapper.xml
@@ -0,0 +1,25 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mat/src/main/resources/mapper/MatPurchaseMapper.xml b/gear-mat/src/main/resources/mapper/MatPurchaseMapper.xml
new file mode 100644
index 0000000..50aa3aa
--- /dev/null
+++ b/gear-mat/src/main/resources/mapper/MatPurchaseMapper.xml
@@ -0,0 +1,27 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/gear-mes/src/main/resources/mapper/is b/gear-mes/src/main/resources/mapper/is
deleted file mode 100644
index e69de29..0000000
diff --git a/pom.xml b/pom.xml
index 53ba953..873adbc 100644
--- a/pom.xml
+++ b/pom.xml
@@ -381,6 +381,11 @@
gear-mes
${gear.version}
+
+ com.gear
+ gear-mat
+ ${gear.version}
+
@@ -398,6 +403,7 @@
gear-system
gear-oa
gear-mes
+ gear-mat
pom