Browse Source

新增出库管理模块、库存入库中间表、库存出库中间表、仓库类别模块

lingpeng.li 2 months ago
parent
commit
db0e1c795a
35 changed files with 1741 additions and 69 deletions
  1. 163 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/InventoryInboundDetailController.java
  2. 19 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/InventoryLedgerController.java
  3. 163 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/InventoryOutboundDetailController.java
  4. 188 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/OutboundManagementController.java
  5. 171 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/WarehouseCategoryController.java
  6. 11 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/CategoryQueryDTO.java
  7. 1 1
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/InventoryInboundAddDTO.java
  8. 41 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/InventoryOutboundAddDTO.java
  9. 38 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/OutboundItemsQueryDTO.java
  10. 67 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/InventoryInboundDetail.java
  11. 1 5
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/InventoryLedger.java
  12. 67 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/InventoryOutboundDetail.java
  13. 123 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/OutboundManagement.java
  14. 127 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/WarehouseCategory.java
  15. 16 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/InventoryInboundDetailMapper.java
  16. 17 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/InventoryOutboundDetailMapper.java
  17. 27 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/OutboundManagementMapper.java
  18. 16 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/WarehouseCategoryMapper.java
  19. 45 37
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/InboundManagementMapper.xml
  20. 5 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/InventoryInboundDetailMapper.xml
  21. 5 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/InventoryOutboundDetailMapper.xml
  22. 100 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/OutboundManagementMapper.xml
  23. 5 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/WarehouseCategoryMapper.xml
  24. 14 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IInventoryInboundDetailService.java
  25. 7 6
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IInventoryLedgerService.java
  26. 14 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IInventoryOutboundDetailService.java
  27. 22 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IOutboundManagementService.java
  28. 24 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IWarehouseCategoryService.java
  29. 19 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/InventoryInboundDetailServiceImpl.java
  30. 104 18
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/InventoryLedgerServiceImpl.java
  31. 19 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/InventoryOutboundDetailServiceImpl.java
  32. 36 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/OutboundManagementServiceImpl.java
  33. 39 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/WarehouseCategoryServiceImpl.java
  34. 2 2
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/vo/InboundManagementItemsVO.java
  35. 25 0
      zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/vo/OutboundManagementItemsVO.java

+ 163 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/InventoryInboundDetailController.java

@@ -0,0 +1,163 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryInboundDetail;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryInboundDetailService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 库存入库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Api(tags="库存入库中间表")
+@RestController
+@RequestMapping("/sparePartsConsumables/inventoryInboundDetail")
+@Slf4j
+public class InventoryInboundDetailController extends JeecgController<InventoryInboundDetail, IInventoryInboundDetailService> {
+	@Autowired
+	private IInventoryInboundDetailService inventoryInboundDetailService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param inventoryInboundDetail
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "库存入库中间表-分页列表查询")
+	@ApiOperation(value="库存入库中间表-分页列表查询", notes="库存入库中间表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<InventoryInboundDetail>> queryPageList(InventoryInboundDetail inventoryInboundDetail,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+        QueryWrapper<InventoryInboundDetail> queryWrapper = QueryGenerator.initQueryWrapper(inventoryInboundDetail, req.getParameterMap());
+		Page<InventoryInboundDetail> page = new Page<InventoryInboundDetail>(pageNo, pageSize);
+		IPage<InventoryInboundDetail> pageList = inventoryInboundDetailService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param inventoryInboundDetail
+	 * @return
+	 */
+	@AutoLog(value = "库存入库中间表-添加")
+	@ApiOperation(value="库存入库中间表-添加", notes="库存入库中间表-添加")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_inbound_detail:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody InventoryInboundDetail inventoryInboundDetail) {
+		inventoryInboundDetailService.save(inventoryInboundDetail);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param inventoryInboundDetail
+	 * @return
+	 */
+	@AutoLog(value = "库存入库中间表-编辑")
+	@ApiOperation(value="库存入库中间表-编辑", notes="库存入库中间表-编辑")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_inbound_detail:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody InventoryInboundDetail inventoryInboundDetail) {
+		inventoryInboundDetailService.updateById(inventoryInboundDetail);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "库存入库中间表-通过id删除")
+	@ApiOperation(value="库存入库中间表-通过id删除", notes="库存入库中间表-通过id删除")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_inbound_detail:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		inventoryInboundDetailService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "库存入库中间表-批量删除")
+	@ApiOperation(value="库存入库中间表-批量删除", notes="库存入库中间表-批量删除")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_inbound_detail:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.inventoryInboundDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "库存入库中间表-通过id查询")
+	@ApiOperation(value="库存入库中间表-通过id查询", notes="库存入库中间表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<InventoryInboundDetail> queryById(@RequestParam(name="id",required=true) String id) {
+		InventoryInboundDetail inventoryInboundDetail = inventoryInboundDetailService.getById(id);
+		if(inventoryInboundDetail==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(inventoryInboundDetail);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param inventoryInboundDetail
+    */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_inbound_detail:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, InventoryInboundDetail inventoryInboundDetail) {
+        return super.exportXls(request, inventoryInboundDetail, InventoryInboundDetail.class, "库存入库中间表");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_inbound_detail:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, InventoryInboundDetail.class);
+    }
+
+}

+ 19 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/InventoryLedgerController.java

@@ -5,6 +5,8 @@ import javax.servlet.http.HttpServletRequest;
 import javax.servlet.http.HttpServletResponse;
 import org.jeecg.common.api.vo.Result;
 import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryInboundAddDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryOutboundAddDTO;
 import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryLedger;
 import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryLedgerService;
 
@@ -160,4 +162,21 @@ public class InventoryLedgerController extends JeecgController<InventoryLedger,
         return super.importExcel(request, response, InventoryLedger.class);
     }
 
+
+	 @AutoLog(value = "入库管理添加以及维护库存台账数量")
+	 @ApiOperation(value="入库管理添加以及维护库存台账数量", notes="入库管理添加以及维护库存台账数量")
+	 @PostMapping(value = "/addInbound")
+	 public Result<String> addInbound(@RequestBody InventoryInboundAddDTO addDTO) {
+		 inventoryLedgerService.addInbound(addDTO);
+		 return Result.OK("添加成功!");
+	 }
+
+
+	 @AutoLog(value = "出库管理添加以及维护库存台账数量")
+	 @ApiOperation(value="出库管理添加以及维护库存台账数量", notes="出库管理添加以及维护库存台账数量")
+	 @PostMapping(value = "/addOutbound")
+	 public Result<String> addOutbound(@RequestBody InventoryOutboundAddDTO addDTO) {
+		 inventoryLedgerService.addOutbound(addDTO);
+		 return Result.OK("添加成功!");
+	 }
 }

+ 163 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/InventoryOutboundDetailController.java

@@ -0,0 +1,163 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryOutboundDetail;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryOutboundDetailService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 库存出库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Api(tags="库存出库中间表")
+@RestController
+@RequestMapping("/sparePartsConsumables/inventoryOutboundDetail")
+@Slf4j
+public class InventoryOutboundDetailController extends JeecgController<InventoryOutboundDetail, IInventoryOutboundDetailService> {
+	@Autowired
+	private IInventoryOutboundDetailService inventoryOutboundDetailService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param inventoryOutboundDetail
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "库存出库中间表-分页列表查询")
+	@ApiOperation(value="库存出库中间表-分页列表查询", notes="库存出库中间表-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<InventoryOutboundDetail>> queryPageList(InventoryOutboundDetail inventoryOutboundDetail,
+																@RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+																@RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+																HttpServletRequest req) {
+        QueryWrapper<InventoryOutboundDetail> queryWrapper = QueryGenerator.initQueryWrapper(inventoryOutboundDetail, req.getParameterMap());
+		Page<InventoryOutboundDetail> page = new Page<InventoryOutboundDetail>(pageNo, pageSize);
+		IPage<InventoryOutboundDetail> pageList = inventoryOutboundDetailService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param inventoryOutboundDetail
+	 * @return
+	 */
+	@AutoLog(value = "库存出库中间表-添加")
+	@ApiOperation(value="库存出库中间表-添加", notes="库存出库中间表-添加")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_outbound_detail:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody InventoryOutboundDetail inventoryOutboundDetail) {
+		inventoryOutboundDetailService.save(inventoryOutboundDetail);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param inventoryOutboundDetail
+	 * @return
+	 */
+	@AutoLog(value = "库存出库中间表-编辑")
+	@ApiOperation(value="库存出库中间表-编辑", notes="库存出库中间表-编辑")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_outbound_detail:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody InventoryOutboundDetail inventoryOutboundDetail) {
+		inventoryOutboundDetailService.updateById(inventoryOutboundDetail);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "库存出库中间表-通过id删除")
+	@ApiOperation(value="库存出库中间表-通过id删除", notes="库存出库中间表-通过id删除")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_outbound_detail:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		inventoryOutboundDetailService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "库存出库中间表-批量删除")
+	@ApiOperation(value="库存出库中间表-批量删除", notes="库存出库中间表-批量删除")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_outbound_detail:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.inventoryOutboundDetailService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "库存出库中间表-通过id查询")
+	@ApiOperation(value="库存出库中间表-通过id查询", notes="库存出库中间表-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<InventoryOutboundDetail> queryById(@RequestParam(name="id",required=true) String id) {
+		InventoryOutboundDetail inventoryOutboundDetail = inventoryOutboundDetailService.getById(id);
+		if(inventoryOutboundDetail==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(inventoryOutboundDetail);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param inventoryOutboundDetail
+    */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_outbound_detail:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, InventoryOutboundDetail inventoryOutboundDetail) {
+        return super.exportXls(request, inventoryOutboundDetail, InventoryOutboundDetail.class, "库存出库中间表");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_inventory_outbound_detail:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, InventoryOutboundDetail.class);
+    }
+
+}

+ 188 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/OutboundManagementController.java

@@ -0,0 +1,188 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.OutboundItemsQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.OutboundManagement;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IOutboundManagementService;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo.OutboundManagementItemsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import java.util.Arrays;
+
+/**
+ * @Description: 出库管理
+ * @Author: jeecg-boot
+ * @Date: 2025-05-20
+ * @Version: V1.0
+ */
+@Api(tags = "出库管理")
+@RestController
+@RequestMapping("/sparePartsConsumables/outboundManagement")
+@Slf4j
+public class OutboundManagementController extends JeecgController<OutboundManagement, IOutboundManagementService> {
+    @Autowired
+    private IOutboundManagementService outboundManagementService;
+
+    /**
+     * 分页列表查询
+     *
+     * @param outboundManagement
+     * @param pageNo
+     * @param pageSize
+     * @param req
+     * @return
+     */
+    //@AutoLog(value = "出库管理-分页列表查询")
+    @ApiOperation(value = "出库管理-分页列表查询", notes = "出库管理-分页列表查询")
+    @GetMapping(value = "/list")
+    public Result<IPage<OutboundManagement>> queryPageList(OutboundManagement outboundManagement,
+                                                           @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+                                                           @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+                                                           HttpServletRequest req) {
+        QueryWrapper<OutboundManagement> queryWrapper = QueryGenerator.initQueryWrapper(outboundManagement, req.getParameterMap());
+        Page<OutboundManagement> page = new Page<OutboundManagement>(pageNo, pageSize);
+        IPage<OutboundManagement> pageList = outboundManagementService.page(page, queryWrapper);
+        return Result.OK(pageList);
+    }
+
+    /**
+     * 添加
+     *
+     * @param outboundManagement
+     * @return
+     */
+    @AutoLog(value = "出库管理-添加")
+    @ApiOperation(value = "出库管理-添加", notes = "出库管理-添加")
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_outbound_management:add")
+    @PostMapping(value = "/add")
+    public Result<String> add(@RequestBody OutboundManagement outboundManagement) {
+        outboundManagementService.save(outboundManagement);
+        return Result.OK("添加成功!");
+    }
+
+    /**
+     * 编辑
+     *
+     * @param outboundManagement
+     * @return
+     */
+    @AutoLog(value = "出库管理-编辑")
+    @ApiOperation(value = "出库管理-编辑", notes = "出库管理-编辑")
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_outbound_management:edit")
+    @RequestMapping(value = "/edit", method = {RequestMethod.PUT, RequestMethod.POST})
+    public Result<String> edit(@RequestBody OutboundManagement outboundManagement) {
+        outboundManagementService.updateById(outboundManagement);
+        return Result.OK("编辑成功!");
+    }
+
+    /**
+     * 通过id删除
+     *
+     * @param id
+     * @return
+     */
+    @AutoLog(value = "出库管理-通过id删除")
+    @ApiOperation(value = "出库管理-通过id删除", notes = "出库管理-通过id删除")
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_outbound_management:delete")
+    @DeleteMapping(value = "/delete")
+    public Result<String> delete(@RequestParam(name = "id", required = true) String id) {
+        outboundManagementService.removeById(id);
+        return Result.OK("删除成功!");
+    }
+
+    /**
+     * 批量删除
+     *
+     * @param ids
+     * @return
+     */
+    @AutoLog(value = "出库管理-批量删除")
+    @ApiOperation(value = "出库管理-批量删除", notes = "出库管理-批量删除")
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_outbound_management:deleteBatch")
+    @DeleteMapping(value = "/deleteBatch")
+    public Result<String> deleteBatch(@RequestParam(name = "ids", required = true) String ids) {
+        this.outboundManagementService.removeByIds(Arrays.asList(ids.split(",")));
+        return Result.OK("批量删除成功!");
+    }
+
+    /**
+     * 通过id查询
+     *
+     * @param id
+     * @return
+     */
+    //@AutoLog(value = "出库管理-通过id查询")
+    @ApiOperation(value = "出库管理-通过id查询", notes = "出库管理-通过id查询")
+    @GetMapping(value = "/queryById")
+    public Result<OutboundManagement> queryById(@RequestParam(name = "id", required = true) String id) {
+        OutboundManagement outboundManagement = outboundManagementService.getById(id);
+        if (outboundManagement == null) {
+            return Result.error("未找到对应数据");
+        }
+        return Result.OK(outboundManagement);
+    }
+
+    /**
+     * 导出excel
+     *
+     * @param request
+     * @param outboundManagement
+     */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_outbound_management:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, OutboundManagement outboundManagement) {
+        return super.exportXls(request, outboundManagement, OutboundManagement.class, "出库管理");
+    }
+
+    /**
+     * 通过excel导入数据
+     *
+     * @param request
+     * @param response
+     * @return
+     */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_outbound_management:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, OutboundManagement.class);
+    }
+
+
+    @ApiOperation(value = "出库记录-出库管理信息与库存台账信息组合查询", notes = "出库记录-出库管理信息与库存台账信息组合查询")
+    @GetMapping("/listOutboundItems")
+    public Result<IPage<OutboundManagementItemsVO>> listOutboundItems(
+            @RequestParam(name = "pageNo", defaultValue = "1") Integer pageNo,
+            @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize,
+            OutboundItemsQueryDTO queryDTO) {
+
+        // 禁用自动 searchCount
+        Page<OutboundManagementItemsVO> page = new Page<>(pageNo, pageSize, false); // false 表示不自动 count
+
+        // 查询当前页数据
+        IPage<OutboundManagementItemsVO> pagedOutboundItems = outboundManagementService.queryOutboundItemsPage(page, queryDTO);
+
+        // 手动查询总数
+        long total = outboundManagementService.countOutboundItems(queryDTO);
+
+        // 设置数据与总数
+        page.setRecords(pagedOutboundItems.getRecords());
+        page.setTotal(total);
+
+        return Result.OK(page);
+    }
+
+}

+ 171 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/controller/WarehouseCategoryController.java

@@ -0,0 +1,171 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.controller;
+
+import java.util.Arrays;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+import org.jeecg.common.api.vo.Result;
+import org.jeecg.common.system.query.QueryGenerator;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.CategoryQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.WarehouseCategory;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IWarehouseCategoryService;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import lombok.extern.slf4j.Slf4j;
+
+import org.jeecg.common.system.base.controller.JeecgController;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.*;
+import org.springframework.web.servlet.ModelAndView;
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+import org.jeecg.common.aspect.annotation.AutoLog;
+import org.apache.shiro.authz.annotation.RequiresPermissions;
+
+ /**
+ * @Description: 仓库类别
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Api(tags="仓库类别")
+@RestController
+@RequestMapping("/sparePartsConsumables/warehouseCategory")
+@Slf4j
+public class WarehouseCategoryController extends JeecgController<WarehouseCategory, IWarehouseCategoryService> {
+	@Autowired
+	private IWarehouseCategoryService warehouseCategoryService;
+	
+	/**
+	 * 分页列表查询
+	 *
+	 * @param warehouseCategory
+	 * @param pageNo
+	 * @param pageSize
+	 * @param req
+	 * @return
+	 */
+	//@AutoLog(value = "仓库类别-分页列表查询")
+	@ApiOperation(value="仓库类别-分页列表查询", notes="仓库类别-分页列表查询")
+	@GetMapping(value = "/list")
+	public Result<IPage<WarehouseCategory>> queryPageList(WarehouseCategory warehouseCategory,
+								   @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
+								   @RequestParam(name="pageSize", defaultValue="10") Integer pageSize,
+								   HttpServletRequest req) {
+        QueryWrapper<WarehouseCategory> queryWrapper = QueryGenerator.initQueryWrapper(warehouseCategory, req.getParameterMap());
+		Page<WarehouseCategory> page = new Page<WarehouseCategory>(pageNo, pageSize);
+		IPage<WarehouseCategory> pageList = warehouseCategoryService.page(page, queryWrapper);
+		return Result.OK(pageList);
+	}
+	
+	/**
+	 *   添加
+	 *
+	 * @param warehouseCategory
+	 * @return
+	 */
+	@AutoLog(value = "仓库类别-添加")
+	@ApiOperation(value="仓库类别-添加", notes="仓库类别-添加")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_warehouse_category:add")
+	@PostMapping(value = "/add")
+	public Result<String> add(@RequestBody WarehouseCategory warehouseCategory) {
+		warehouseCategoryService.save(warehouseCategory);
+		return Result.OK("添加成功!");
+	}
+	
+	/**
+	 *  编辑
+	 *
+	 * @param warehouseCategory
+	 * @return
+	 */
+	@AutoLog(value = "仓库类别-编辑")
+	@ApiOperation(value="仓库类别-编辑", notes="仓库类别-编辑")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_warehouse_category:edit")
+	@RequestMapping(value = "/edit", method = {RequestMethod.PUT,RequestMethod.POST})
+	public Result<String> edit(@RequestBody WarehouseCategory warehouseCategory) {
+		warehouseCategoryService.updateById(warehouseCategory);
+		return Result.OK("编辑成功!");
+	}
+	
+	/**
+	 *   通过id删除
+	 *
+	 * @param id
+	 * @return
+	 */
+	@AutoLog(value = "仓库类别-通过id删除")
+	@ApiOperation(value="仓库类别-通过id删除", notes="仓库类别-通过id删除")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_warehouse_category:delete")
+	@DeleteMapping(value = "/delete")
+	public Result<String> delete(@RequestParam(name="id",required=true) String id) {
+		warehouseCategoryService.removeById(id);
+		return Result.OK("删除成功!");
+	}
+	
+	/**
+	 *  批量删除
+	 *
+	 * @param ids
+	 * @return
+	 */
+	@AutoLog(value = "仓库类别-批量删除")
+	@ApiOperation(value="仓库类别-批量删除", notes="仓库类别-批量删除")
+	@RequiresPermissions("sparePartsConsumables:sbsmzq_warehouse_category:deleteBatch")
+	@DeleteMapping(value = "/deleteBatch")
+	public Result<String> deleteBatch(@RequestParam(name="ids",required=true) String ids) {
+		this.warehouseCategoryService.removeByIds(Arrays.asList(ids.split(",")));
+		return Result.OK("批量删除成功!");
+	}
+	
+	/**
+	 * 通过id查询
+	 *
+	 * @param id
+	 * @return
+	 */
+	//@AutoLog(value = "仓库类别-通过id查询")
+	@ApiOperation(value="仓库类别-通过id查询", notes="仓库类别-通过id查询")
+	@GetMapping(value = "/queryById")
+	public Result<WarehouseCategory> queryById(@RequestParam(name="id",required=true) String id) {
+		WarehouseCategory warehouseCategory = warehouseCategoryService.getById(id);
+		if(warehouseCategory==null) {
+			return Result.error("未找到对应数据");
+		}
+		return Result.OK(warehouseCategory);
+	}
+
+    /**
+    * 导出excel
+    *
+    * @param request
+    * @param warehouseCategory
+    */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_warehouse_category:exportXls")
+    @RequestMapping(value = "/exportXls")
+    public ModelAndView exportXls(HttpServletRequest request, WarehouseCategory warehouseCategory) {
+        return super.exportXls(request, warehouseCategory, WarehouseCategory.class, "仓库类别");
+    }
+
+    /**
+      * 通过excel导入数据
+    *
+    * @param request
+    * @param response
+    * @return
+    */
+    @RequiresPermissions("sparePartsConsumables:sbsmzq_warehouse_category:importExcel")
+    @RequestMapping(value = "/importExcel", method = RequestMethod.POST)
+    public Result<?> importExcel(HttpServletRequest request, HttpServletResponse response) {
+        return super.importExcel(request, response, WarehouseCategory.class);
+    }
+
+	 @GetMapping("/allList")
+	 @ApiOperation(value = "查询所有仓库类别信息")
+	 public Result<?> allList(CategoryQueryDTO queryDTO){
+
+		 return Result.OK(warehouseCategoryService.getAllList(queryDTO));
+	 }
+
+}

+ 11 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/CategoryQueryDTO.java

@@ -0,0 +1,11 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto;
+
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+@Data
+public class CategoryQueryDTO {
+
+    @ApiModelProperty("类别名称")
+    private String name;
+}

+ 1 - 1
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/InventoryLedgerQueryDTO.java → zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/InventoryInboundAddDTO.java

@@ -9,7 +9,7 @@ import java.util.Date;
 import java.util.List;
 
 @Data
-public class InventoryLedgerQueryDTO {
+public class InventoryInboundAddDTO {
 
     @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
     @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")

+ 41 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/InventoryOutboundAddDTO.java

@@ -0,0 +1,41 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+import java.util.List;
+
+@Data
+public class InventoryOutboundAddDTO {
+
+    @JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd")
+    @ApiModelProperty(value = "出库时间")
+    private Date outboundDate;
+
+    @ApiModelProperty(value = "出库人")
+    private String outboundPerson;
+
+    @ApiModelProperty(value = "出库类型")
+    private Integer outboundType;
+
+    @ApiModelProperty(value = "出库仓库")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "关联单号")
+    private String relatedOrderNo;
+
+
+    private List<InventoryOutboundAddDTO.InventoryLedgerSingle> inventoryLedgerList;
+
+    @Data
+    public static class InventoryLedgerSingle {
+
+        private String materialId;
+
+        private Integer count;
+    }
+}

+ 38 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/dto/OutboundItemsQueryDTO.java

@@ -0,0 +1,38 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.util.Date;
+
+@Data
+public class OutboundItemsQueryDTO {
+
+    @ApiModelProperty(value = "出库单号")
+    private String outboundOrderNo;
+
+    @ApiModelProperty(value = "出库人")
+    private String outboundPerson;
+
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "出库时间")
+    private Date outboundDate;
+
+    @ApiModelProperty(value = "出库类型")
+    private Integer outboundType;
+
+    @ApiModelProperty(value = "出库仓库")
+    private String warehouseName;
+
+    @ApiModelProperty(value = "物料编号")
+    private String materialCode;
+
+    @ApiModelProperty(value = "物料名称")
+    private String materialName;
+
+    @ApiModelProperty(value = "规格型号")
+    private String spec;
+}

+ 67 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/InventoryInboundDetail.java

@@ -0,0 +1,67 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 库存入库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Data
+@TableName("sbsmzq_inventory_inbound_detail")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="sbsmzq_inventory_inbound_detail对象", description="库存入库中间表")
+public class InventoryInboundDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+	/**所属部门*/
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+	/**入库单ID*/
+	@Excel(name = "入库单ID", width = 15)
+    @ApiModelProperty(value = "入库单ID")
+    private String inboundId;
+	/**库存记录id*/
+	@Excel(name = "库存记录id", width = 15)
+    @ApiModelProperty(value = "库存记录id")
+    private String inventoryLedgerId;
+	/**数量*/
+	@Excel(name = "数量", width = 15)
+    @ApiModelProperty(value = "数量")
+    private Integer quantity;
+}

+ 1 - 5
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/InventoryLedger.java

@@ -155,9 +155,5 @@ public class InventoryLedger implements Serializable {
     @Excel(name = "平均价", width = 15)
     @ApiModelProperty(value = "平均价")
     private BigDecimal averagePrice;
-    /**
-     * 入库管理id
-     */
-    @ApiModelProperty(value = "入库管理id")
-    private String inboundId;
+
 }

+ 67 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/InventoryOutboundDetail.java

@@ -0,0 +1,67 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 库存出库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Data
+@TableName("sbsmzq_inventory_outbound_detail")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value="sbsmzq_inventory_outbound_detail对象", description="库存出库中间表")
+public class InventoryOutboundDetail implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+	/**主键*/
+	@TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+	/**创建人*/
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+	/**创建日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+	/**更新人*/
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+	/**更新日期*/
+	@JsonFormat(timezone = "GMT+8",pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern="yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+	/**所属部门*/
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+	/**出库单ID*/
+	@Excel(name = "出库单ID", width = 15)
+    @ApiModelProperty(value = "出库单ID")
+    private String outboundId;
+	/**库存记录ID*/
+	@Excel(name = "库存记录ID", width = 15)
+    @ApiModelProperty(value = "库存记录ID")
+    private String inventoryLedgerId;
+	/**数量*/
+	@Excel(name = "数量", width = 15)
+    @ApiModelProperty(value = "数量")
+    private Integer quantity;
+}

+ 123 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/OutboundManagement.java

@@ -0,0 +1,123 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 出库管理
+ * @Author: jeecg-boot
+ * @Date: 2025-05-20
+ * @Version: V1.0
+ */
+@Data
+@TableName("sbsmzq_outbound_management")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "sbsmzq_outbound_management对象", description = "出库管理")
+public class OutboundManagement implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * id
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "id")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 出库单号
+     */
+    @Excel(name = "出库单号", width = 15)
+    @ApiModelProperty(value = "出库单号")
+    private String outboundOrderNo;
+    /**
+     * 出库人
+     */
+    @Excel(name = "出库人", width = 15)
+    @ApiModelProperty(value = "出库人")
+    private String outboundPerson;
+    /**
+     * 出库时间
+     */
+    @Excel(name = "出库时间", width = 20, format = "yyyy-MM-dd HH:mm:ss")
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "出库时间")
+    private Date outboundDate;
+    /**
+     * 出库类型
+     */
+    @Excel(name = "出库类型", width = 15)
+    @ApiModelProperty(value = "出库类型")
+    private Integer outboundType;
+    /**
+     * 出库仓库
+     */
+    @Excel(name = "出库仓库", width = 15)
+    @ApiModelProperty(value = "出库仓库")
+    private String warehouseName;
+    /**
+     * 领用部门
+     */
+    @Excel(name = "领用部门", width = 15)
+    @ApiModelProperty(value = "领用部门")
+    private String receiveDepartment;
+    /**
+     * 项目
+     */
+    @Excel(name = "项目", width = 15)
+    @ApiModelProperty(value = "项目")
+    private String project;
+    /**
+     * 领料人
+     */
+    @Excel(name = "领料人", width = 15)
+    @ApiModelProperty(value = "领料人")
+    private String receiver;
+    /**
+     * 关联单号
+     */
+    @Excel(name = "关联单号", width = 15)
+    @ApiModelProperty(value = "关联单号")
+    private String relatedOrderNo;
+}

+ 127 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/entity/WarehouseCategory.java

@@ -0,0 +1,127 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity;
+
+import com.baomidou.mybatisplus.annotation.IdType;
+import com.baomidou.mybatisplus.annotation.TableId;
+import com.baomidou.mybatisplus.annotation.TableName;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import lombok.experimental.Accessors;
+import org.jeecgframework.poi.excel.annotation.Excel;
+import org.springframework.format.annotation.DateTimeFormat;
+
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @Description: 仓库类别
+ * @Author: jeecg-boot
+ * @Date: 2025-05-20
+ * @Version: V1.0
+ */
+@Data
+@TableName("sbsmzq_warehouse_category")
+@Accessors(chain = true)
+@EqualsAndHashCode(callSuper = false)
+@ApiModel(value = "sbsmzq_warehouse_category对象", description = "仓库类别")
+public class WarehouseCategory implements Serializable {
+    private static final long serialVersionUID = 1L;
+
+    /**
+     * 主键
+     */
+    @TableId(type = IdType.ASSIGN_ID)
+    @ApiModelProperty(value = "主键")
+    private String id;
+    /**
+     * 创建人
+     */
+    @ApiModelProperty(value = "创建人")
+    private String createBy;
+    /**
+     * 创建日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "创建日期")
+    private Date createTime;
+    /**
+     * 更新人
+     */
+    @ApiModelProperty(value = "更新人")
+    private String updateBy;
+    /**
+     * 更新日期
+     */
+    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
+    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
+    @ApiModelProperty(value = "更新日期")
+    private Date updateTime;
+    /**
+     * 所属部门
+     */
+    @ApiModelProperty(value = "所属部门")
+    private String sysOrgCode;
+    /**
+     * 类别名称
+     */
+    @Excel(name = "类别名称", width = 15)
+    @ApiModelProperty(value = "类别名称")
+    private String name;
+    /**
+     * 编号
+     */
+    @Excel(name = "编号", width = 15)
+    @ApiModelProperty(value = "编号")
+    private String number;
+    /**
+     * 父节点ID
+     */
+    @Excel(name = "父节点ID", width = 15)
+    @ApiModelProperty(value = "父节点ID")
+    private String pid;
+    /**
+     * 类型
+     */
+    @Excel(name = "类型", width = 15)
+    @ApiModelProperty(value = "类型")
+    private Integer type;
+    /**
+     * 图标路径
+     */
+    @Excel(name = "图标路径", width = 15)
+    @ApiModelProperty(value = "图标路径")
+    private String icon;
+    /**
+     * 是否默认展开(1 是,0 否)
+     */
+    @Excel(name = "是否默认展开(1 是,0 否)", width = 15)
+    @ApiModelProperty(value = "是否默认展开(1 是,0 否)")
+    private Integer open;
+    /**
+     * 排序字段
+     */
+    @Excel(name = "排序字段", width = 15)
+    @ApiModelProperty(value = "排序字段")
+    private Integer sortOrder;
+    /**
+     * 备注
+     */
+    @Excel(name = "备注", width = 15)
+    @ApiModelProperty(value = "备注")
+    private String remark;
+    /**
+     * 标签
+     */
+    @Excel(name = "标签", width = 15)
+    @ApiModelProperty(value = "标签")
+    private String tag;
+    /**
+     * 节点类型
+     */
+    @Excel(name = "节点类型", width = 15)
+    @ApiModelProperty(value = "节点类型")
+    private String nodeType;
+}

+ 16 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/InventoryInboundDetailMapper.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryInboundDetail;
+
+/**
+ * @Description: 库存入库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Mapper
+public interface InventoryInboundDetailMapper extends BaseMapper<InventoryInboundDetail> {
+
+}

+ 17 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/InventoryOutboundDetailMapper.java

@@ -0,0 +1,17 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryOutboundDetail;
+
+
+/**
+ * @Description: 库存出库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Mapper
+public interface InventoryOutboundDetailMapper extends BaseMapper<InventoryOutboundDetail> {
+
+}

+ 27 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/OutboundManagementMapper.java

@@ -0,0 +1,27 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper;
+
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.OutboundItemsQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.OutboundManagement;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo.OutboundManagementItemsVO;
+
+/**
+ * @Description: 出库管理
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Mapper
+public interface OutboundManagementMapper extends BaseMapper<OutboundManagement> {
+
+    boolean existsByCode(@Param("code") String code);
+
+    IPage<OutboundManagementItemsVO> queryOutboundItemsPage(Page<OutboundManagementItemsVO> page, @Param("query") OutboundItemsQueryDTO query);
+
+    long countOutboundItems(@Param("query") OutboundItemsQueryDTO query);
+
+}

+ 16 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/WarehouseCategoryMapper.java

@@ -0,0 +1,16 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper;
+
+import org.apache.ibatis.annotations.Mapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.WarehouseCategory;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+
+/**
+ * @Description: 仓库类别
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Mapper
+public interface WarehouseCategoryMapper extends BaseMapper<WarehouseCategory> {
+
+}

+ 45 - 37
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/InboundManagementMapper.xml

@@ -12,84 +12,92 @@
     <select id="queryInboundItemsPage"
             resultType="org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo.InboundManagementItemsVO">
         SELECT
-        ds.id AS inboundId,
-        ds.inbound_order_no,
-        ds.inbound_date,
-        ds.inbound_person,
-        ds.inbound_type,
-        ds.inbound_warehouse,
-        ds.return_person,
-        ti.id AS inventoryId,
-        ti.material_code,
-        ti.material_name,
-        ti.spec,
-        ti.location,
-        ti.quantity
-        FROM sbsmzq_inbound_management ds
-        LEFT JOIN sbsmzq_inventory_ledger ti
-        ON ds.id COLLATE utf8mb4_general_ci = ti.inbound_id COLLATE utf8mb4_general_ci
+        im.id AS inboundId,
+        im.inbound_order_no,
+        im.inbound_date,
+        im.inbound_person,
+        im.inbound_type,
+        im.inbound_warehouse,
+        im.return_person,
+
+        il.id AS inventoryId,
+        il.material_code,
+        il.material_name,
+        il.spec,
+        il.location,
+
+        iid.quantity AS quantity  -- 入库数量来自中间表
+
+        FROM sbsmzq_inventory_inbound_detail iid
+        LEFT JOIN sbsmzq_inbound_management im ON iid.inbound_id = im.id
+        LEFT JOIN sbsmzq_inventory_ledger il ON iid.inventory_ledger_id = il.id
+
         <where>
             <if test="query.inboundOrderNo != null and query.inboundOrderNo != ''">
-                AND ds.inbound_order_no LIKE CONCAT('%', #{query.inboundOrderNo}, '%')
+                AND im.inbound_order_no LIKE CONCAT('%', #{query.inboundOrderNo}, '%')
             </if>
             <if test="query.inboundPerson != null and query.inboundPerson != ''">
-                AND ds.inbound_person = #{query.inboundPerson}
+                AND im.inbound_person = #{query.inboundPerson}
             </if>
             <if test="query.inboundType != null and query.inboundType != ''">
-                AND ds.inbound_type = #{query.inboundType}
+                AND im.inbound_type = #{query.inboundType}
             </if>
             <if test="query.inboundWarehouse != null and query.inboundWarehouse != ''">
-                AND ds.inbound_warehouse LIKE CONCAT('%', #{query.inboundWarehouse}, '%')
+                AND im.inbound_warehouse LIKE CONCAT('%', #{query.inboundWarehouse}, '%')
             </if>
             <if test="query.inboundDate != null">
-                AND ds.inbound_date = #{query.inboundDate}
+                AND im.inbound_date = #{query.inboundDate}
             </if>
             <if test="query.materialCode != null and query.materialCode != ''">
-                AND ti.material_code LIKE CONCAT('%', #{query.materialCode}, '%')
+                AND il.material_code LIKE CONCAT('%', #{query.materialCode}, '%')
             </if>
             <if test="query.materialName != null and query.materialName != ''">
-                AND ti.material_name LIKE CONCAT('%', #{query.materialName}, '%')
+                AND il.material_name LIKE CONCAT('%', #{query.materialName}, '%')
             </if>
             <if test="query.spec != null and query.spec != ''">
-                AND ti.spec LIKE CONCAT('%', #{query.spec}, '%')
+                AND il.spec LIKE CONCAT('%', #{query.spec}, '%')
             </if>
         </where>
-        ORDER BY ds.create_time DESC
+
+        ORDER BY im.create_time DESC
     </select>
 
 
+
     <select id="countInboundItems" resultType="java.lang.Long">
         SELECT COUNT(1)
-        FROM sbsmzq_inbound_management ds
-        LEFT JOIN sbsmzq_inventory_ledger ti
-        ON ds.id COLLATE utf8mb4_general_ci = ti.inbound_id COLLATE utf8mb4_general_ci
+        FROM sbsmzq_inventory_inbound_detail iid
+        LEFT JOIN sbsmzq_inbound_management im ON iid.inbound_id = im.id
+        LEFT JOIN sbsmzq_inventory_ledger il ON iid.inventory_ledger_id = il.id
+
         <where>
             <if test="query.inboundOrderNo != null and query.inboundOrderNo != ''">
-                AND ds.inbound_order_no LIKE CONCAT('%', #{query.inboundOrderNo}, '%')
+                AND im.inbound_order_no LIKE CONCAT('%', #{query.inboundOrderNo}, '%')
             </if>
             <if test="query.inboundPerson != null and query.inboundPerson != ''">
-                AND ds.inbound_person = #{query.inboundPerson}
+                AND im.inbound_person = #{query.inboundPerson}
             </if>
             <if test="query.inboundType != null and query.inboundType != ''">
-                AND ds.inbound_type = #{query.inboundType}
+                AND im.inbound_type = #{query.inboundType}
             </if>
             <if test="query.inboundWarehouse != null and query.inboundWarehouse != ''">
-                AND ds.inbound_warehouse LIKE CONCAT('%', #{query.inboundWarehouse}, '%')
+                AND im.inbound_warehouse LIKE CONCAT('%', #{query.inboundWarehouse}, '%')
             </if>
             <if test="query.inboundDate != null">
-                AND ds.inbound_date = #{query.inboundDate}
+                AND im.inbound_date = #{query.inboundDate}
             </if>
             <if test="query.materialCode != null and query.materialCode != ''">
-                AND ti.material_code LIKE CONCAT('%', #{query.materialCode}, '%')
+                AND il.material_code LIKE CONCAT('%', #{query.materialCode}, '%')
             </if>
             <if test="query.materialName != null and query.materialName != ''">
-                AND ti.material_name LIKE CONCAT('%', #{query.materialName}, '%')
+                AND il.material_name LIKE CONCAT('%', #{query.materialName}, '%')
             </if>
             <if test="query.spec != null and query.spec != ''">
-                AND ti.spec LIKE CONCAT('%', #{query.spec}, '%')
+                AND il.spec LIKE CONCAT('%', #{query.spec}, '%')
             </if>
         </where>
-        ORDER BY ds.create_time DESC
+
+        ORDER BY im.create_time DESC
     </select>
 
 </mapper>

+ 5 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/InventoryInboundDetailMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InventoryInboundDetailMapper">
+
+</mapper>

+ 5 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/InventoryOutboundDetailMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.demo.sparePartsConsumables.mapper.InventoryOutboundDetailMapper">
+
+</mapper>

+ 100 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/OutboundManagementMapper.xml

@@ -0,0 +1,100 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.OutboundManagementMapper">
+
+    <select id="existsByCode" resultType="boolean" parameterType="string">
+        SELECT COUNT(1) > 0
+        FROM sbsmzq_outbound_management
+        WHERE outbound_order_no = #{code}
+    </select>
+
+    <select id="queryOutboundItemsPage"
+            resultType="org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo.OutboundManagementItemsVO">
+        SELECT
+        om.id AS outboundId,
+        om.outbound_order_no,
+        om.outbound_date,
+        om.outbound_person,
+        om.outbound_type,
+        om.warehouse_name,
+
+        il.id AS inventoryId,
+        il.material_code,
+        il.material_name,
+        il.spec,
+        il.location,
+
+        iod.quantity AS quantity  -- 出库数量来自中间表
+
+        FROM sbsmzq_inventory_outbound_detail iod
+        LEFT JOIN sbsmzq_outbound_management om ON iod.outbound_id = om.id
+        LEFT JOIN sbsmzq_inventory_ledger il ON iod.inventory_ledger_id = il.id
+
+        <where>
+            <if test="query.outboundOrderNo != null and query.outboundOrderNo != ''">
+                AND om.outbound_order_no LIKE CONCAT('%', #{query.outboundOrderNo}, '%')
+            </if>
+            <if test="query.outboundPerson != null and query.outboundPerson != ''">
+                AND om.outbound_person = #{query.outboundPerson}
+            </if>
+            <if test="query.outboundType != null and query.outboundType != ''">
+                AND om.outbound_type = #{query.outboundType}
+            </if>
+            <if test="query.warehouseName != null and query.warehouseName != ''">
+                AND om.warehouse_name = #{query.warehouseName}
+            </if>
+            <if test="query.outboundDate != null">
+                AND om.outbound_date = #{query.outboundDate}
+            </if>
+            <if test="query.materialCode != null and query.materialCode != ''">
+                AND il.material_code LIKE CONCAT('%', #{query.materialCode}, '%')
+            </if>
+            <if test="query.materialName != null and query.materialName != ''">
+                AND il.material_name LIKE CONCAT('%', #{query.materialName}, '%')
+            </if>
+            <if test="query.spec != null and query.spec != ''">
+                AND il.spec LIKE CONCAT('%', #{query.spec}, '%')
+            </if>
+        </where>
+
+        ORDER BY om.create_time DESC
+    </select>
+
+
+
+    <select id="countOutboundItems" resultType="java.lang.Long">
+        SELECT COUNT(1)
+        FROM sbsmzq_inventory_outbound_detail iod
+        LEFT JOIN sbsmzq_outbound_management om ON iod.outbound_id = om.id
+        LEFT JOIN sbsmzq_inventory_ledger il ON iod.inventory_ledger_id = il.id
+
+        <where>
+            <if test="query.outboundOrderNo != null and query.outboundOrderNo != ''">
+                AND om.outbound_order_no LIKE CONCAT('%', #{query.outboundOrderNo}, '%')
+            </if>
+            <if test="query.outboundPerson != null and query.outboundPerson != ''">
+                AND om.outbound_person = #{query.outboundPerson}
+            </if>
+            <if test="query.outboundType != null and query.outboundType != ''">
+                AND om.outbound_type = #{query.outboundType}
+            </if>
+            <if test="query.warehouseName != null and query.warehouseName != ''">
+                AND om.warehouse_name = #{query.warehouseName}
+            </if>
+            <if test="query.outboundDate != null">
+                AND om.outbound_date = #{query.outboundDate}
+            </if>
+            <if test="query.materialCode != null and query.materialCode != ''">
+                AND il.material_code LIKE CONCAT('%', #{query.materialCode}, '%')
+            </if>
+            <if test="query.materialName != null and query.materialName != ''">
+                AND il.material_name LIKE CONCAT('%', #{query.materialName}, '%')
+            </if>
+            <if test="query.spec != null and query.spec != ''">
+                AND il.spec LIKE CONCAT('%', #{query.spec}, '%')
+            </if>
+        </where>
+
+        ORDER BY om.create_time DESC
+    </select>
+</mapper>

+ 5 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/mapper/xml/WarehouseCategoryMapper.xml

@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
+<mapper namespace="org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.WarehouseCategoryMapper">
+
+</mapper>

+ 14 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IInventoryInboundDetailService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryInboundDetail;
+
+/**
+ * @Description: 库存入库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+public interface IInventoryInboundDetailService extends IService<InventoryInboundDetail> {
+
+}

+ 7 - 6
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IInventoryLedgerService.java

@@ -1,19 +1,20 @@
 package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service;
 
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryLedgerQueryDTO;
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryLedger;
 import com.baomidou.mybatisplus.extension.service.IService;
-
-import java.util.List;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryInboundAddDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryOutboundAddDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryLedger;
 
 /**
  * @Description: 库存台账
  * @Author: jeecg-boot
- * @Date:   2025-05-16
+ * @Date: 2025-05-16
  * @Version: V1.0
  */
 public interface IInventoryLedgerService extends IService<InventoryLedger> {
 
-    void addInventoryLedgers(InventoryLedgerQueryDTO inventoryLedgerQueryDTO);
+    void addInbound(InventoryInboundAddDTO addDTO);
+
+    void addOutbound(InventoryOutboundAddDTO addDTO);
 
 }

+ 14 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IInventoryOutboundDetailService.java

@@ -0,0 +1,14 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryOutboundDetail;
+
+/**
+ * @Description: 库存出库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+public interface IInventoryOutboundDetailService extends IService<InventoryOutboundDetail> {
+
+}

+ 22 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IOutboundManagementService.java

@@ -0,0 +1,22 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.OutboundItemsQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.OutboundManagement;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo.OutboundManagementItemsVO;
+
+/**
+ * @Description: 出库管理
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+public interface IOutboundManagementService extends IService<OutboundManagement> {
+
+    IPage<OutboundManagementItemsVO> queryOutboundItemsPage(Page<OutboundManagementItemsVO> page, OutboundItemsQueryDTO query);
+
+    long countOutboundItems(OutboundItemsQueryDTO query);
+
+}

+ 24 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/IWarehouseCategoryService.java

@@ -0,0 +1,24 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service;
+
+import com.baomidou.mybatisplus.extension.service.IService;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.CategoryQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.WarehouseCategory;
+
+import java.util.List;
+
+/**
+ * @Description: 仓库类别
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+public interface IWarehouseCategoryService extends IService<WarehouseCategory> {
+
+    /**
+     * 查询所有仓库类别信息
+     *
+     * @return List<WarehouseCategory> list
+     */
+    List<WarehouseCategory> getAllList(CategoryQueryDTO queryDTO);
+
+}

+ 19 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/InventoryInboundDetailServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.impl;
+
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryInboundDetail;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InventoryInboundDetailMapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryInboundDetailService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 库存入库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Service
+public class InventoryInboundDetailServiceImpl extends ServiceImpl<InventoryInboundDetailMapper, InventoryInboundDetail> implements IInventoryInboundDetailService {
+
+}

+ 104 - 18
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/InventoryLedgerServiceImpl.java

@@ -4,17 +4,17 @@ import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import lombok.extern.slf4j.Slf4j;
 import org.jeecg.common.util.oConvertUtils;
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryLedgerQueryDTO;
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InboundManagement;
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryLedger;
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InboundManagementMapper;
-import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InventoryLedgerMapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryInboundAddDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.InventoryOutboundAddDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.*;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.*;
 import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryLedgerService;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
 import java.time.LocalDate;
 import java.time.format.DateTimeFormatter;
+import java.util.Optional;
 
 /**
  * @Description: 库存台账
@@ -32,19 +32,29 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
     @Autowired
     private InboundManagementMapper inboundManagementMapper;
 
+    @Autowired
+    private OutboundManagementMapper outboundManagementMapper;
+
+    @Autowired
+    private InventoryOutboundDetailMapper inventoryOutboundDetailMapper;
+
+    @Autowired
+    private InventoryInboundDetailMapper inventoryInboundDetailMapper;
+
+
     @Override
-    public void addInventoryLedgers(InventoryLedgerQueryDTO inventoryLedgerQueryDTO) {
+    public void addInbound(InventoryInboundAddDTO addDTO) {
 
-        if (oConvertUtils.listIsNotEmpty(inventoryLedgerQueryDTO.getInventoryLedgerList())) {
+        if (oConvertUtils.listIsNotEmpty(addDTO.getInventoryLedgerList())) {
 
             InboundManagement inboundManagement = new InboundManagement();
 
-            inboundManagement.setInboundDate(inventoryLedgerQueryDTO.getInboundDate());
-            inboundManagement.setInboundPerson(inventoryLedgerQueryDTO.getInboundPerson());
-            inboundManagement.setInboundType(inventoryLedgerQueryDTO.getInboundType());
-            inboundManagement.setInboundWarehouse(inventoryLedgerQueryDTO.getInboundWarehouse());
-            inboundManagement.setRelatedOrderNo(inventoryLedgerQueryDTO.getRelatedOrderNo());
-            inboundManagement.setReturnPerson(inventoryLedgerQueryDTO.getReturnPerson());
+            inboundManagement.setInboundDate(addDTO.getInboundDate());
+            inboundManagement.setInboundPerson(addDTO.getInboundPerson());
+            inboundManagement.setInboundType(addDTO.getInboundType());
+            inboundManagement.setInboundWarehouse(addDTO.getInboundWarehouse());
+            inboundManagement.setRelatedOrderNo(addDTO.getRelatedOrderNo());
+            inboundManagement.setReturnPerson(addDTO.getReturnPerson());
 
             // 入库单号生成
             String prefix = "RK";
@@ -52,10 +62,13 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
             String baseCode = prefix + datePart;
 
             String inboundOrderNo = null;
-            int maxRetries = 10;
-            for (int i = 1; i <= maxRetries; i++) {
-                String serial = String.format("%04d", i);
+            int maxRetries = 20; // 尝试 20 次随机生成
+
+            for (int i = 0; i < maxRetries; i++) {
+                int randomNum = (int)(Math.random() * 10000); // 0 ~ 9999
+                String serial = String.format("%04d", randomNum);
                 String fullCode = baseCode + serial;
+
                 boolean exists = inboundManagementMapper.existsByCode(fullCode);
                 if (!exists) {
                     inboundOrderNo = fullCode;
@@ -70,7 +83,7 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
             inboundManagement.setInboundOrderNo(inboundOrderNo);
             inboundManagementMapper.insert(inboundManagement);
 
-            for (InventoryLedgerQueryDTO.InventoryLedgerSingle inventoryLedgerSingle : inventoryLedgerQueryDTO.getInventoryLedgerList()) {
+            for (InventoryInboundAddDTO.InventoryLedgerSingle inventoryLedgerSingle : addDTO.getInventoryLedgerList()) {
 
                 LambdaQueryWrapper<InventoryLedger> queryWrapper = new LambdaQueryWrapper<>();
                 queryWrapper.eq(InventoryLedger::getId, inventoryLedgerSingle.getMaterialId()).last("limit 1");
@@ -79,7 +92,80 @@ public class InventoryLedgerServiceImpl extends ServiceImpl<InventoryLedgerMappe
 
                 if (inventoryLedger != null) {
                     inventoryLedger.setQuantity(inventoryLedgerSingle.getCount());
-                    inventoryLedger.setInboundId(inboundManagement.getId());
+
+                    InventoryInboundDetail detail = new InventoryInboundDetail();
+                    detail.setInboundId(inboundManagement.getId());
+                    detail.setInventoryLedgerId(inventoryLedger.getId());
+                    detail.setQuantity(inventoryLedgerSingle.getCount());
+                    inventoryInboundDetailMapper.insert(detail);
+
+                    inventoryLedgerMapper.updateById(inventoryLedger);
+                } else {
+                    log.warn("未找到物料ID为 {} 的库存记录", inventoryLedgerSingle.getMaterialId());
+                }
+            }
+        }
+    }
+
+    @Override
+    public void addOutbound(InventoryOutboundAddDTO addDTO) {
+
+        if (oConvertUtils.listIsNotEmpty(addDTO.getInventoryLedgerList())) {
+
+            OutboundManagement outboundManagement = new OutboundManagement();
+
+            outboundManagement.setOutboundDate(addDTO.getOutboundDate());
+            outboundManagement.setOutboundPerson(addDTO.getOutboundPerson());
+            outboundManagement.setOutboundType(addDTO.getOutboundType());
+            outboundManagement.setWarehouseName(addDTO.getWarehouseName());
+            outboundManagement.setRelatedOrderNo(addDTO.getRelatedOrderNo());
+
+            // 出库单号生成
+            String prefix = "CK";
+            String datePart = LocalDate.now().format(DateTimeFormatter.ofPattern("yyyyMMdd"));
+            String baseCode = prefix + datePart;
+
+            String outboundOrderNo = null;
+            int maxRetries = 20;
+            for (int i = 1; i <= maxRetries; i++) {
+                int randomNum = (int)(Math.random() * 10000); // 0 ~ 9999
+                String serial = String.format("%04d", randomNum);
+                String fullCode = baseCode + serial;
+
+                boolean exists = outboundManagementMapper.existsByCode(fullCode);
+                if (!exists) {
+                    outboundOrderNo = fullCode;
+                    break;
+                }
+            }
+
+            if (outboundOrderNo == null) {
+                throw new RuntimeException("生成唯一出库单号失败,请稍后重试");
+            }
+
+            outboundManagement.setOutboundOrderNo(outboundOrderNo);
+            outboundManagementMapper.insert(outboundManagement);
+
+            for (InventoryOutboundAddDTO.InventoryLedgerSingle inventoryLedgerSingle : addDTO.getInventoryLedgerList()) {
+
+                LambdaQueryWrapper<InventoryLedger> queryWrapper = new LambdaQueryWrapper<>();
+                queryWrapper.eq(InventoryLedger::getId, inventoryLedgerSingle.getMaterialId()).last("limit 1");
+
+                InventoryLedger inventoryLedger = inventoryLedgerMapper.selectOne(queryWrapper);
+
+                if (inventoryLedger != null) {
+                    int quantity = Optional.ofNullable(inventoryLedger.getQuantity()).orElse(0);
+                    int count = Optional.ofNullable(inventoryLedgerSingle.getCount()).orElse(0);
+                    if (quantity < count) {
+                        throw new IllegalArgumentException("库存不足,不能减少这么多数量");
+                    }
+                    inventoryLedger.setQuantity(quantity - count);
+
+                    InventoryOutboundDetail detail = new InventoryOutboundDetail();
+                    detail.setOutboundId(outboundManagement.getId());
+                    detail.setInventoryLedgerId(inventoryLedger.getId());
+                    detail.setQuantity(count);
+                    inventoryOutboundDetailMapper.insert(detail);
 
                     inventoryLedgerMapper.updateById(inventoryLedger);
                 } else {

+ 19 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/InventoryOutboundDetailServiceImpl.java

@@ -0,0 +1,19 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.impl;
+
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.InventoryOutboundDetail;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.InventoryOutboundDetailMapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IInventoryOutboundDetailService;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 库存出库中间表
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Service
+public class InventoryOutboundDetailServiceImpl extends ServiceImpl<InventoryOutboundDetailMapper, InventoryOutboundDetail> implements IInventoryOutboundDetailService {
+
+}

+ 36 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/OutboundManagementServiceImpl.java

@@ -0,0 +1,36 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.impl;
+
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.OutboundItemsQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.OutboundManagement;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.OutboundManagementMapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IOutboundManagementService;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo.OutboundManagementItemsVO;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+
+/**
+ * @Description: 出库管理
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Service
+public class OutboundManagementServiceImpl extends ServiceImpl<OutboundManagementMapper, OutboundManagement> implements IOutboundManagementService {
+
+    @Autowired
+    private OutboundManagementMapper outboundManagementMapper;
+
+    @Override
+    public IPage<OutboundManagementItemsVO> queryOutboundItemsPage(Page<OutboundManagementItemsVO> page, OutboundItemsQueryDTO query) {
+        return outboundManagementMapper.queryOutboundItemsPage(page,query);
+    }
+
+    @Override
+    public long countOutboundItems(OutboundItemsQueryDTO query) {
+        return outboundManagementMapper.countOutboundItems(query);
+    }
+}

+ 39 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/service/impl/WarehouseCategoryServiceImpl.java

@@ -0,0 +1,39 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.impl;
+
+import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.dto.CategoryQueryDTO;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.entity.WarehouseCategory;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.mapper.WarehouseCategoryMapper;
+import org.jeecg.modules.sparePartsConsumables.inventoryManagement.service.IWarehouseCategoryService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+import org.springframework.util.StringUtils;
+
+import java.util.List;
+
+/**
+ * @Description: 仓库类别
+ * @Author: jeecg-boot
+ * @Date:   2025-05-20
+ * @Version: V1.0
+ */
+@Service
+public class WarehouseCategoryServiceImpl extends ServiceImpl<WarehouseCategoryMapper, WarehouseCategory> implements IWarehouseCategoryService {
+
+    @Autowired
+    private WarehouseCategoryMapper warehouseCategoryMapper;
+
+    @Override
+    public List<WarehouseCategory> getAllList(CategoryQueryDTO queryDTO) {
+        LambdaQueryWrapper<WarehouseCategory> wrapper = new LambdaQueryWrapper<>();
+
+        if (StringUtils.hasText(queryDTO.getName())) {
+            wrapper.like(WarehouseCategory::getName, queryDTO.getName());
+        }
+
+        List<WarehouseCategory> warehouseCategoryList = warehouseCategoryMapper.selectList(wrapper);
+
+        return warehouseCategoryList;
+    }
+}

+ 2 - 2
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/vo/InboundManagementItemsVO.java

@@ -7,10 +7,10 @@ import java.util.Date;
 @Data
 public class InboundManagementItemsVO {
 
-    //InboundManagement 字段
+    //POutboundManagement 字段
     private String inboundId;       //入库管理id
     private String inboundOrderNo;  //入库单号
-    private Date inboundDate;       //入库单号
+    private Date inboundDate;       //入库时间
     private String inboundPerson;   //入库人
     private Integer inboundType;    //入库类型
     private String inboundWarehouse; //入库仓库

+ 25 - 0
zgzt-sbsmzq/jeecg-module-lifecycle/src/main/java/org/jeecg/modules/sparePartsConsumables/inventoryManagement/vo/OutboundManagementItemsVO.java

@@ -0,0 +1,25 @@
+package org.jeecg.modules.sparePartsConsumables.inventoryManagement.vo;
+
+import lombok.Data;
+
+import java.util.Date;
+
+@Data
+public class OutboundManagementItemsVO {
+
+    //OutboundManagement 字段
+    private String outboundId;       //出库管理id
+    private String outboundOrderNo;  //出库单号
+    private Date outboundDate;       //出库时间
+    private String outboundPerson;   //出库人
+    private Integer outboundType;    //出库类型
+    private String warehouseName;    //出库仓库
+
+    //InventoryLedger 字段
+    private String inventoryId;  //库存id
+    private String materialCode; // 物料编号
+    private String materialName;  // 物料名称
+    private String spec;     // 规格型号
+    private String location; // 库位
+    private Integer quantity; // 出库数量 or 实际数量
+}