From 40ac0fd62faca6b81b8708b5a7b222e29029a35c Mon Sep 17 00:00:00 2001
From: sunjianxi <839419401@qq.com>
Date: Fri, 23 Jan 2026 09:48:32 +0800
Subject: [PATCH 1/4] =?UTF-8?q?=E6=8E=92=E4=BA=A7=E5=AE=9A=E6=97=B6?=
=?UTF-8?q?=E4=BB=BB=E5=8A=A1=E4=BF=AE=E6=94=B9-sjx?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
blade-ops/blade-job/pom.xml | 4 +++
.../scheduling/InitResourceProcessor.java | 32 +++++++++++++++++++
.../scheduling/SchedulingProcessor.java | 32 +++++++++++++++++++
.../scheduling/feign/IWorkOrderClient.java | 4 +++
.../feign/IWorkOrderClientFallback.java | 5 +++
.../scheduling/feign/WorkOrderClient.java | 23 +++++++++++++
.../scheduling/mapper/WorkOrderMapper.xml | 2 +-
.../impl/EquipResourceServiceImpl.java | 4 +++
.../impl/PersonResourceServiceImpl.java | 2 ++
.../service/impl/WorkOrderServiceImpl.java | 16 ++++++----
.../scheduling/task/InitResourceJob.java | 2 +-
.../scheduling/task/SchedulingJob.java | 2 +-
12 files changed, 119 insertions(+), 9 deletions(-)
create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java
create mode 100644 blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java
diff --git a/blade-ops/blade-job/pom.xml b/blade-ops/blade-job/pom.xml
index 8d7b5745f..afa588a59 100644
--- a/blade-ops/blade-job/pom.xml
+++ b/blade-ops/blade-job/pom.xml
@@ -52,6 +52,10 @@
4.6.0.RELEASE
compile
+
+ org.springblade
+ blade-scheduling-api
+
diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java
new file mode 100644
index 000000000..1ab224301
--- /dev/null
+++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/InitResourceProcessor.java
@@ -0,0 +1,32 @@
+package org.springblade.job.processor.scheduling;
+
+import jakarta.annotation.Resource;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.scheduling.feign.IWorkOrderClient;
+import org.springframework.stereotype.Component;
+import tech.powerjob.worker.core.processor.ProcessResult;
+import tech.powerjob.worker.core.processor.TaskContext;
+import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 排产-定期生成设备和人力资源
+ */
+@Component
+@Data
+@Slf4j
+public class InitResourceProcessor implements BasicProcessor {
+
+ @Resource
+ private IWorkOrderClient client;
+
+ @Override
+ public ProcessResult process(TaskContext context) throws Exception {
+ log.info("初始化资源定时任务开始");
+ CompletableFuture runFuture = CompletableFuture.runAsync(()->client.initResource());
+ log.info("初始化资源定时任务结束");
+ return new ProcessResult(true);
+ }
+}
diff --git a/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java
new file mode 100644
index 000000000..334adac8b
--- /dev/null
+++ b/blade-ops/blade-job/src/main/java/org/springblade/job/processor/scheduling/SchedulingProcessor.java
@@ -0,0 +1,32 @@
+package org.springblade.job.processor.scheduling;
+
+import jakarta.annotation.Resource;
+import lombok.Data;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.scheduling.feign.IWorkOrderClient;
+import org.springframework.stereotype.Component;
+import tech.powerjob.worker.core.processor.ProcessResult;
+import tech.powerjob.worker.core.processor.TaskContext;
+import tech.powerjob.worker.core.processor.sdk.BasicProcessor;
+
+import java.util.concurrent.CompletableFuture;
+
+/**
+ * 排产-排产定时任务
+ */
+@Component
+@Data
+@Slf4j
+public class SchedulingProcessor implements BasicProcessor {
+
+ @Resource
+ private IWorkOrderClient client;
+
+ @Override
+ public ProcessResult process(TaskContext context) throws Exception {
+ log.info("排产定时任务开始");
+ CompletableFuture runFuture = CompletableFuture.runAsync(()->client.scheduling());
+ log.info("排产定时任务结束");
+ return new ProcessResult(true);
+ }
+}
diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java
index 0f0af6143..896306a69 100644
--- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java
+++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClient.java
@@ -21,6 +21,7 @@ public interface IWorkOrderClient {
String API_PREFIX = "/feign/client/workOrder";
String SCHEDULING = API_PREFIX + "/scheduling";
+ String INIT_RESOURCE = API_PREFIX + "/initResource";
/**
* 排产
@@ -28,4 +29,7 @@ public interface IWorkOrderClient {
*/
@GetMapping(SCHEDULING)
R scheduling();
+
+ @GetMapping(INIT_RESOURCE)
+ R initResource();
}
diff --git a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java
index 076be6dc8..107560769 100644
--- a/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java
+++ b/blade-service-api/blade-scheduling-api/src/main/java/org/springblade/scheduling/feign/IWorkOrderClientFallback.java
@@ -40,4 +40,9 @@ public class IWorkOrderClientFallback implements IWorkOrderClient {
public R scheduling() {
return R.fail("获取数据失败");
}
+
+ @Override
+ public R initResource() {
+ return R.fail("初始化资源失败");
+ }
}
diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java
index 980e90bec..10a8bb4c6 100644
--- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java
+++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/feign/WorkOrderClient.java
@@ -28,12 +28,19 @@ package org.springblade.scheduling.scheduling.feign;
import io.swagger.v3.oas.annotations.Hidden;
import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang3.time.DateFormatUtils;
import org.springblade.core.tenant.annotation.NonDS;
import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
import org.springblade.scheduling.feign.IWorkOrderClient;
+import org.springblade.scheduling.scheduling.service.IEquipResourceService;
+import org.springblade.scheduling.scheduling.service.IPersonResourceService;
import org.springblade.scheduling.scheduling.service.IWorkOrderService;
import org.springframework.web.bind.annotation.RestController;
+import java.util.Date;
+
/**
* 字典服务Feign实现类
@@ -44,14 +51,30 @@ import org.springframework.web.bind.annotation.RestController;
@Hidden
@RestController
@AllArgsConstructor
+@Slf4j
public class WorkOrderClient implements IWorkOrderClient {
private final IWorkOrderService workOrderService;
+ private final IPersonResourceService personResourceService;
+
+ private final IEquipResourceService equipResourceService;
+
@Override
public R scheduling() {
+ log.info("排产任务开始:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
workOrderService.scheduling();
+ log.info("排查任务结束:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
+ return R.success();
+ }
+
+ @Override
+ public R initResource() {
+ log.info("初始化资源开始:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
+ equipResourceService.initEquipResource();
+ personResourceService.initPersonResource();
+ log.info("初始化资源结束:" + DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
return R.success();
}
}
diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
index 665327133..cc8571901 100644
--- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
+++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/mapper/WorkOrderMapper.xml
@@ -94,7 +94,7 @@
a.card_no AS "cardNO",
g.priority_aps AS "priorityAps",
g.product_ident AS "productIdent",
- to_char(g.release_date,'YYYY-MM-DD') AS "releaseDate",
+ to_char(g.receive_time,'YYYY-MM-DD') AS "receiveTime",
f.name AS "currentProcessName",
d.name AS "processName",
to_char(b.start_time,'YYYY-MM-DD HH24:MI') AS "startTime",
diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java
index bf7323a25..74d77890c 100644
--- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java
+++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/EquipResourceServiceImpl.java
@@ -31,6 +31,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import lombok.AllArgsConstructor;
+import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.DateFormatUtils;
import org.apache.commons.lang3.time.DateUtils;
@@ -61,6 +62,7 @@ import java.util.Map;
*/
@Service
@AllArgsConstructor
+@Slf4j
public class EquipResourceServiceImpl extends BaseServiceImpl implements IEquipResourceService {
private final IEquipAbilityService equipAbilityService;
@@ -78,6 +80,7 @@ public class EquipResourceServiceImpl extends BaseServiceImpl equipAbilityList = equipAbilityService.list(Wrappers.lambdaQuery().isNotNull(EquipAbilityEntity::getWorkCenterId).isNotNull(EquipAbilityEntity::getCraftId).isNotNull(EquipAbilityEntity::getEquipCode));
@@ -98,6 +101,7 @@ public class EquipResourceServiceImpl extends BaseServiceImpl deleteList = this.list(Wrappers.lambdaQuery().le(EquipResourceEntity::getDateTime,DateFormatUtils.format(DateUtils.addDays(date,-3),"yyyy-MM-dd")));
deleteList.forEach(item -> baseMapper.deleteById(item.getId()));
+ log.info("初始化设备资源结束:"+ DateFormatUtils.format(new Date(),"yyyy-MM-dd HH:mm:ss"));
}
public void initSingleEquipResource(EquipAbilityEntity entity){
diff --git a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
index e58133e30..b7547a405 100644
--- a/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
+++ b/blade-service/blade-scheduling/src/main/java/org/springblade/scheduling/scheduling/service/impl/PersonResourceServiceImpl.java
@@ -74,6 +74,7 @@ public class PersonResourceServiceImpl extends BaseServiceImpl sameFurnaceMap = new HashMap<>();
//烧结同炉
if(sintMap.containsKey(craft.getPpsId())){
- Boolean isSameFurnace = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap);
+ sameFurnaceMap = sameFurnace(order,craft,workPlanList,prevProcessEnd,glassCodeStr,sintMap);
//同炉的话就不用走下面的匹配了,直接下一工序
- if(isSameFurnace){
+ if(sameFurnaceMap.get("isSameFurnace").toString() == "true"){
continue;
}
}
@@ -532,8 +533,8 @@ public class WorkOrderServiceImpl extends BaseServiceImpl workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map> sintMap){
+ public Map sameFurnace(YieldOrderEntity order,YieldOrderCraftEntity craft,List workPlanList,LocalDateTime prevProcessEnd,String glassCodeStr,Map> sintMap){
+ Map map = new HashMap<>();
Boolean isSameFurnace = false;
if(order.getYieldType() == 2 || order.getYieldType() == 3){//烧结订单
//获取当前工序的所有温度曲线
@@ -1325,6 +1327,7 @@ public class WorkOrderServiceImpl extends BaseServiceImpl
Date: Fri, 23 Jan 2026 11:15:00 +0800
Subject: [PATCH 2/4] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-?=
=?UTF-8?q?=E9=87=8F=E5=85=B7=E5=BA=93=E6=9F=A5=E8=AF=A2?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../controller/StRealtimeStockController.java | 267 +++++++++
.../wms/excel/StRealtimeStockExcel.java | 231 ++++++++
.../wms/mapper/StRealtimeStockMapper.java | 73 +++
.../wms/mapper/StRealtimeStockMapper.xml | 352 ++++++++++++
.../wms/pojo/dto/StRealtimeStockDTO.java | 25 +
.../wms/pojo/entity/StRealtimeStock.java | 196 +++++++
.../wms/pojo/entity/StStorehouse.java | 91 +++
.../wms/pojo/vo/PrintParentWoLabel.java | 21 +
.../wms/pojo/vo/PrintStoresList.java | 86 +++
.../springblade/wms/pojo/vo/PrintWoLabel.java | 41 ++
.../wms/pojo/vo/StRealtimeStockVO.java | 54 ++
.../wms/service/IStRealtimeStockService.java | 82 +++
.../impl/StRealtimeStockServiceImpl.java | 539 ++++++++++++++++++
.../wms/wrapper/StRealtimeStockWrapper.java | 39 ++
14 files changed, 2097 insertions(+)
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java
new file mode 100644
index 000000000..98ca023d5
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StRealtimeStockController.java
@@ -0,0 +1,267 @@
+package org.springblade.wms.controller;
+
+
+import cn.hutool.core.util.StrUtil;
+import com.alibaba.excel.write.handler.WriteHandler;
+import com.alibaba.fastjson.JSONArray;
+import com.alibaba.fastjson.JSONObject;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import jakarta.servlet.http.HttpServletRequest;
+import lombok.AllArgsConstructor;
+import jakarta.validation.Valid;
+
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.log.annotation.ApiLog;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.annotation.IsAdmin;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.core.tool.utils.TemplateUtil;
+import org.springblade.wms.pojo.entity.StRealtimeStock;
+import org.springblade.wms.pojo.entity.StStorehouse;
+import org.springblade.wms.pojo.vo.PrintParentWoLabel;
+import org.springblade.wms.pojo.vo.PrintStoresList;
+import org.springblade.wms.pojo.vo.PrintWoLabel;
+import org.springframework.web.bind.annotation.*;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.wms.pojo.vo.StRealtimeStockVO;
+import org.springblade.wms.excel.StRealtimeStockExcel;
+import org.springblade.wms.wrapper.StRealtimeStockWrapper;
+import org.springblade.wms.service.IStRealtimeStockService;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.tool.constant.BladeConstant;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.List;
+import jakarta.servlet.http.HttpServletResponse;
+
+import static org.springblade.core.excel.util.ExcelUtil.export;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockController
+ * @description: 仓库实时结余表 控制器
+ * @autor: WuSiYu
+ * @create 2025-12-15 15:04
+ **/
+
+
+/**
+ * 仓库实时结余表 控制器
+ *
+ * @author BladeX
+ * @since 2025-12-15
+ */
+@RestController
+@AllArgsConstructor
+@RequestMapping("/stRealtimeStock")
+@Tag(name = "仓库实时结余表", description = "仓库实时结余表接口")
+@Slf4j
+public class StRealtimeStockController extends BladeController {
+
+ private final IStRealtimeStockService stRealtimeStockService;
+
+ /**
+ * 仓库实时结余表 详情
+ */
+ @GetMapping("/detail")
+ @ApiOperationSupport(order = 1)
+ @Operation(summary = "详情", description = "传入stRealtimeStock")
+ public R detail(StRealtimeStock stRealtimeStock) {
+ StRealtimeStock detail = stRealtimeStockService.getOne(Condition.getQueryWrapper(stRealtimeStock));
+ return R.data(StRealtimeStockWrapper.build().entityVO(detail));
+ }
+ /**
+ * 仓库实时结余表 分页
+ */
+ @GetMapping("/list")
+ @ApiOperationSupport(order = 2)
+ @Operation(summary = "分页", description = "传入stRealtimeStock")
+ public R> list(@Parameter(hidden = true) @RequestParam Map stRealtimeStock, Query query) {
+ IPage pages = stRealtimeStockService.page(Condition.getPage(query), Condition.getQueryWrapper(stRealtimeStock, StRealtimeStock.class));
+ return R.data(StRealtimeStockWrapper.build().pageVO(pages));
+ }
+
+ /**
+ * 仓库实时结余表 自定义分页
+ */
+ @GetMapping("/page")
+ @ApiOperationSupport(order = 3)
+ @Operation(summary = "分页", description = "传入stRealtimeStock")
+ public R> page(StRealtimeStockVO stRealtimeStock, Query query) {
+ IPage pages = stRealtimeStockService.selectStRealtimeStockPage(Condition.getPage(query), stRealtimeStock);
+ return R.data(pages);
+ }
+
+ /**
+ * 量具库存表 分页
+ */
+ @GetMapping("/pageToolsData")
+ @ApiOperationSupport(order = 3)
+ @Operation(summary = "分页加载量具库存数据", description = "传入stRealtimeStock,默认过滤量具类型仓库,按sumNum排序")
+ public R> pageToolsData(StRealtimeStockVO stRealtimeStock, Query query) {
+
+ if (StrUtil.isBlank(query.getAscs()) && StrUtil.isBlank(query.getDescs())) {
+ query.setDescs("sumNum"); // 默认按sumNum降序排序
+ }
+ IPage pages = stRealtimeStockService.selectToolsStockPage(Condition.getPage(query), stRealtimeStock);
+
+ return R.data(pages);
+ }
+
+ /**
+ * 仓库实时结余表 新增
+ */
+ @PostMapping("/save")
+ @ApiOperationSupport(order = 4)
+ @Operation(summary = "新增", description = "传入stRealtimeStock")
+ public R save(@Valid @RequestBody StRealtimeStock stRealtimeStock) {
+ return R.status(stRealtimeStockService.save(stRealtimeStock));
+ }
+
+ /**
+ * 仓库实时结余表 修改
+ */
+ @PostMapping("/update")
+ @ApiOperationSupport(order = 5)
+ @Operation(summary = "修改", description = "传入stRealtimeStock")
+ public R update(@Valid @RequestBody StRealtimeStock stRealtimeStock) {
+ return R.status(stRealtimeStockService.updateById(stRealtimeStock));
+ }
+
+ /**
+ * 仓库实时结余表 新增或修改
+ */
+ @PostMapping("/submit")
+ @ApiOperationSupport(order = 6)
+ @Operation(summary = "新增或修改", description = "传入stRealtimeStock")
+ public R submit(@Valid @RequestBody StRealtimeStock stRealtimeStock) {
+ return R.status(stRealtimeStockService.saveOrUpdate(stRealtimeStock));
+ }
+
+ /**
+ * 仓库实时结余表 删除
+ */
+ @PostMapping("/remove")
+ @ApiOperationSupport(order = 7)
+ @Operation(summary = "逻辑删除", description = "传入ids")
+ public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
+ return R.status(stRealtimeStockService.deleteLogic(Func.toLongList(ids)));
+ }
+
+ /**
+ * 仓库实时结余表 打印标签
+ */
+ @PostMapping("/printWoLabel")
+ @ApiOperationSupport(order = 8)
+ @Operation(summary = "打印标签", description = "传入rlsIdList(主键集合)、quantity(打印数量)、exportType(导出类型)")
+ public void printLabel(
+ @Parameter(hidden = true) @RequestBody JSONObject data,
+ @Parameter(hidden = true) HttpServletRequest request,
+ @Parameter(hidden = true) HttpServletResponse response
+ ) throws Exception {
+ // 解析请求参数
+ List rlsIdList = JSONArray.parseArray(data.getString("rlsIdList"), Long.class);
+ Short quantity = data.getShort("quantity");
+ Short exportType = data.getShort("exportType");
+
+ // 调用服务层获取打印数据
+ List list = stRealtimeStockService.printPrintWoLabel(rlsIdList, quantity);
+
+ // 构建导出参数
+ Map map = new HashMap<>(1);
+
+ // 调用导出方法
+ export(response, "打印标签" + DateUtil.time(), "打印标签数据表", list, PrintParentWoLabel.class);
+ }
+
+
+ /**
+ * 仓库实时结余表 打印
+ */
+ @PostMapping("/print")
+ @ApiOperationSupport(order = 9)
+ @Operation(summary = "打印流程卡", description = "传入idArr(主键集合)、exportType(导出类型)、reportId(报表ID)")
+ public void print(
+ @Parameter(description = "打印参数(idArr:主键集合, exportType:导出类型, reportId:报表ID)", required = true)
+ @RequestBody JSONObject data,
+ @Parameter(hidden = true) HttpServletRequest request,
+ @Parameter(hidden = true) HttpServletResponse response
+ ) {
+ try {
+ // 解析主键集合
+ List idArr = JSONArray.parseArray(data.getString("idArr"), Long.class);
+ // 解析导出类型
+ Short exportType = data.getShort("exportType");
+
+ // 校验主键集合非空
+ if (Func.isNotEmpty(idArr)) {
+ // 解析报表ID
+ String reportId = data.getString("reportId");
+ // 校验报表ID非空
+ if (Func.isNotBlank(reportId)) {
+ // 调用服务层获取打印数据
+ List list = stRealtimeStockService.printStRealtimeStockList(idArr);
+ // 执行导出打印
+ export(response, "流程卡打印","reportId", list, PrintStoresList.class);
+ }
+ }
+ } catch (Exception e) {
+ log.error("仓库实时结余表打印异常", e);
+ response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
+ }
+ }
+
+ @RequestMapping(
+ value = {"/listprintData"},
+ method = {RequestMethod.POST}
+ )
+ @ApiOperationSupport(order = 10)
+ @Operation(summary = "获取打印数据列表", description = "传入idArr(主键集合)获取打印数据")
+ public R> listprintData(
+ @Parameter(description = "请求参数(idArr:主键集合)", required = true)
+ @RequestBody JSONObject data
+ ) {
+ try {
+ List idArr = JSONArray.parseArray(Func.toStr(data.get("idArr")), Long.class);
+ if (Func.isEmpty(idArr)) {
+ return R.fail("主键集合idArr不能为空");
+ }
+ List list = stRealtimeStockService.printStRealtimeStockList(idArr);
+ return R.data(list);
+ } catch (Exception e) {
+ log.error("获取打印数据异常", e);
+ return R.fail("获取打印数据失败:" + e.getMessage());
+ }
+ }
+
+
+ /**
+ * 导出数据
+ */
+ @IsAdmin
+ @GetMapping("/export-stRealtimeStock")
+ @ApiOperationSupport(order = 11)
+ @Operation(summary = "导出数据", description = "传入stRealtimeStock")
+ public void exportStRealtimeStock(@Parameter(hidden = true) @RequestParam Map stRealtimeStock, BladeUser bladeUser, HttpServletResponse response) {
+ QueryWrapper queryWrapper = Condition.getQueryWrapper(stRealtimeStock, StRealtimeStock.class);
+ //if (!AuthUtil.isAdministrator()) {
+ // queryWrapper.lambda().eq(StRealtimeStock::getTenantId, bladeUser.getTenantId());
+ //}
+ //queryWrapper.lambda().eq(StRealtimeStockEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
+ List list = stRealtimeStockService.exportStRealtimeStock(queryWrapper);
+ export(response, "仓库实时结余表数据" + DateUtil.time(), "仓库实时结余表数据表", list, StRealtimeStockExcel.class);
+ }
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java
new file mode 100644
index 000000000..6b29091df
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StRealtimeStockExcel.java
@@ -0,0 +1,231 @@
+package org.springblade.wms.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockExcel
+ * @description: 仓库实时结余表 Excel实体类
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:51
+ **/
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class StRealtimeStockExcel implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("主键")
+ private Long id;
+ /**
+ * 租户ID(默认值:000000)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("租户ID(默认值:000000)")
+ private String tenantId;
+ /**
+ * 是否已删除(默认值:0)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否已删除(默认值:0)")
+ private Long isDeleted;
+ /**
+ * 库房ID
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("库房ID")
+ private Long shId;
+ /**
+ * 物料ID(关联st_goods表)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料ID(关联st_goods表)")
+ private Long goodsId;
+ /**
+ * 库位ID
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("库位ID")
+ private Long slId;
+ /**
+ * 批次号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("批次号")
+ private String piNo;
+ /**
+ * 库存数量
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("库存数量")
+ private Double quantity;
+ /**
+ * 金额-单价
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("金额-单价")
+ private Double balanceMoney;
+ /**
+ * 质量等级
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("质量等级")
+ private String quantityLevel;
+ /**
+ * 过期/报废日期
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("过期/报废日期")
+ private Date scrapCycle;
+ /**
+ * 质量编号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("质量编号")
+ private String checkCode;
+ /**
+ * 是否模架物料(1=是/0=否)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否模架物料(1=是/0=否)")
+ private Boolean moldBaseMaterial;
+ /**
+ * 模架物料库存对应模架库存ID
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("模架物料库存对应模架库存ID")
+ private Long moldRlsId;
+ /**
+ * 是否停用(1=是/0=否)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否停用(1=是/0=否)")
+ private Boolean stopUse;
+ /**
+ * 累计次数
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("累计次数")
+ private Long sumNum;
+ /**
+ * 库存来源(1=采购/2=生产/3=调拨等)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("库存来源(1=采购/2=生产/3=调拨等)")
+ private Long stockSource;
+ /**
+ * 待保养次数
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("待保养次数")
+ private Long stayMaintainNum;
+ /**
+ * 物料状态
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料状态")
+ private Long goodsStatus;
+ /**
+ * 分厂类型
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("分厂类型")
+ private Long facilityType;
+ /**
+ * 分厂ID
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("分厂ID")
+ private Long deptId;
+ /**
+ * 条码号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("条码号")
+ private String barCode;
+ /**
+ * 占用数量
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("占用数量")
+ private Double occupyQuantity;
+ /**
+ * 炉批号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("炉批号")
+ private String stovePiNo;
+ /**
+ * 到期送检是否申请
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("到期送检是否申请")
+ private Boolean applyFor;
+ /**
+ * 供方代码
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("供方代码")
+ private String splyCode;
+ /**
+ * 限用标记
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("限用标记")
+ private Long limitUseFlag;
+ /**
+ * ERP入库时间
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("ERP入库时间")
+ private Date erpStorageTime;
+ /**
+ * 是否印字
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否印字")
+ private Boolean printMark;
+ /**
+ * 粉重
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("粉重")
+ private String powderWeight;
+ /**
+ * 材料号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("材料号")
+ private String materialNo;
+ /**
+ * 厚度
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("厚度")
+ private String thickness;
+ /**
+ * 备注
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("备注")
+ private String memo;
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java
new file mode 100644
index 000000000..e33c7c5b8
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.java
@@ -0,0 +1,73 @@
+package org.springblade.wms.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.wms.excel.StRealtimeStockExcel;
+import org.springblade.wms.pojo.entity.StRealtimeStock;
+import org.springblade.wms.pojo.vo.StRealtimeStockVO;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockMapper
+ * @description: 仓库实时结余表 Mapper 接口
+ * @autor: WuSiYu
+ * @create 2025-12-15 15:00
+ **/
+
+public interface StRealtimeStockMapper extends BaseMapper {
+
+ /**
+ * 自定义分页
+ *
+ * @param page 分页参数
+ * @param stRealtimeStock 查询参数
+ * @return List
+ */
+ List selectStRealtimeStockPage(IPage page, StRealtimeStockVO stRealtimeStock);
+
+
+ /**
+ * 获取导出数据
+ *
+ * @param queryWrapper 查询条件
+ * @return List
+ */
+ List exportStRealtimeStock(@Param("ew") Wrapper queryWrapper);
+
+ Double getByShId(@Param("shId") Long shId);
+
+ Double getQuantityBySlId(@Param("slId") Long slId);
+
+ StRealtimeStock getBySlId(@Param("slId") Long slId);
+
+ Boolean findBySlId(@Param("slId") Long slId);
+
+ Double findPriceByParams(Long goodsId, String checkNo);
+
+ IPage selectByGoodsIdShId(Long goodsId, Long shId, String deptId);
+
+ IPage selectGoodsOut(IPage page, String filterValue, Long shId, Long goodsId);
+
+ StRealtimeStock getFirstByGoodsCodeAndDeptId(String goodsCode, String deptId);
+
+ StRealtimeStock getByBarCode(String barCode);
+
+ StRealtimeStock getByGoodsCode(String barCode);
+
+ StRealtimeStock getSynchById(Long rlsId);
+
+ List selectStockGoodsPage(IPage page, StRealtimeStockVO stRealtimeStock);
+
+ boolean checkRealTimeLock(String woCode, String rlsId);
+
+ void updateRealTimeLock(String woCode, String string, double doubleValue);
+
+ List selectToolsStockPage(IPage page, StRealtimeStockVO stRealtimeStock);
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
new file mode 100644
index 000000000..ce83840a7
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StRealtimeStockMapper.xml
@@ -0,0 +1,352 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ UPDATE ST_REALTIME_STOCK_LOCK
+ SET OCCUPY_QUANTITY = OCCUPY_QUANTITY + #{doubleValue},
+ STATUS = CASE
+ WHEN ZY_QUANTITY + #{doubleValue} = 0 THEN 1
+ ELSE 0
+ END
+ WHERE WO_NO = #{woNo}
+ AND ID = #{id}
+
+
+
+
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java
new file mode 100644
index 000000000..ad545dfd7
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StRealtimeStockDTO.java
@@ -0,0 +1,25 @@
+package org.springblade.wms.pojo.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.wms.pojo.entity.StRealtimeStock;
+
+import java.io.Serial;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockDTO
+ * @description: 仓库实时结余表 数据传输对象实体类
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:48
+ **/
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StRealtimeStockDTO extends StRealtimeStock {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java
new file mode 100644
index 000000000..bf7ed108d
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StRealtimeStock.java
@@ -0,0 +1,196 @@
+package org.springblade.wms.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+import org.springblade.wms.mapper.StGoodsMapper;
+import org.springframework.data.annotation.Transient;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStock
+ * @description: 仓库实时结余表 实体类
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:45
+ **/
+
+@Data
+@TableName("ST_REALTIME_STOCK")
+@Schema(description = "StRealtimeStock对象")
+@EqualsAndHashCode(callSuper = true)
+public class StRealtimeStock extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 库房ID
+ */
+ @Schema(description = "库房ID")
+ private Long shId;
+ /**
+ * 物料ID(关联st_goods表)
+ */
+ @Schema(description = "物料ID(关联st_goods表)")
+ @TableField("goods_id")
+ private Long goodsId;
+ /**
+ * 库位ID
+ */
+ @Schema(description = "库位ID")
+ private Long slId;
+ /**
+ * 批次号
+ */
+ @Schema(description = "批次号")
+ private String piNo;
+ /**
+ * 库存数量
+ */
+ @Schema(description = "库存数量")
+ private Double quantity;
+ /**
+ * 金额-单价
+ */
+ @Schema(description = "金额-单价")
+ private Double balanceMoney;
+ /**
+ * 质量等级
+ */
+ @Schema(description = "质量等级")
+ private String quantityLevel;
+ /**
+ * 过期/报废日期
+ */
+ @Schema(description = "过期/报废日期")
+ private Date scrapCycle;
+ /**
+ * 质量编号
+ */
+ @Schema(description = "质量编号")
+ private String checkCode;
+ /**
+ * 是否模架物料(1=是/0=否)
+ */
+ @Schema(description = "是否模架物料(1=是/0=否)")
+ private Boolean moldBaseMaterial;
+ /**
+ * 模架物料库存对应模架库存ID
+ */
+ @Schema(description = "模架物料库存对应模架库存ID")
+ private Long moldRlsId;
+ /**
+ * 是否停用(1=是/0=否)
+ */
+ @Schema(description = "是否停用(1=是/0=否)")
+ private Boolean stopUse;
+ /**
+ * 累计次数
+ */
+ @Schema(description = "累计次数")
+ private Long sumNum;
+ /**
+ * 库存来源(1=采购/2=生产/3=调拨等)
+ */
+ @Schema(description = "库存来源(1=采购/2=生产/3=调拨等)")
+ private Long stockSource;
+ /**
+ * 待保养次数
+ */
+ @Schema(description = "待保养次数")
+ private Long stayMaintainNum;
+ /**
+ * 物料状态
+ */
+ @Schema(description = "物料状态")
+ private Long goodsStatus;
+ /**
+ * 分厂类型
+ */
+ @Schema(description = "分厂类型")
+ private Long facilityType;
+ /**
+ * 分厂ID
+ */
+ @Schema(description = "分厂ID")
+ private String deptId;
+ /**
+ * 条码号
+ */
+ @Schema(description = "条码号")
+ private String barCode;
+ /**
+ * 占用数量
+ */
+ @Schema(description = "占用数量")
+ private Double occupyQuantity;
+ /**
+ * 炉批号
+ */
+ @Schema(description = "炉批号")
+ private String stovePiNo;
+ /**
+ * 到期送检是否申请
+ */
+ @Schema(description = "到期送检是否申请")
+ private Boolean applyFor;
+ /**
+ * 供方代码
+ */
+ @Schema(description = "供方代码")
+ private String splyCode;
+ /**
+ * 限用标记
+ */
+ @Schema(description = "限用标记")
+ private Long limitUseFlag;
+ /**
+ * ERP入库时间
+ */
+ @Schema(description = "ERP入库时间")
+ private Date erpStorageTime;
+ /**
+ * 是否印字
+ */
+ @Schema(description = "是否印字")
+ private Boolean printMark;
+ /**
+ * 粉重
+ */
+ @Schema(description = "粉重")
+ private String powderWeight;
+ /**
+ * 材料号
+ */
+ @Schema(description = "材料号")
+ private String materialNo;
+ /**
+ * 厚度
+ */
+ @Schema(description = "厚度")
+ private String thickness;
+ /**
+ * 备注
+ */
+ @Schema(description = "备注")
+ private String memo;
+
+ /**
+ * 保管员
+ */
+// @Transient
+// private String keeper;
+
+// @Transient
+ private Double outQuantity;
+
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java
new file mode 100644
index 000000000..153eb9f42
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorehouse.java
@@ -0,0 +1,91 @@
+package org.springblade.wms.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StStorehouse
+ * @description: 库房维护表 实体类
+ * @autor: WuSiYu
+ * @create 2025-12-18 14:16
+ **/
+
+@Data
+@TableName("ST_STOREHOUSE")
+@Schema(description = "StStorehouse对象")
+@EqualsAndHashCode(callSuper = true)
+public class StStorehouse extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 库房编号
+ */
+ @Schema(description = "库房编号")
+ private String shCode;
+ /**
+ * 库房名称
+ */
+ @Schema(description = "库房名称")
+ private String shName;
+ /**
+ * 所属分类
+ */
+ @Schema(description = "所属分类")
+ private Short type;
+ /**
+ * 工装分类
+ */
+ @Schema(description = "工装分类")
+ private Short toolingType;
+ /**
+ * 库房层级
+ */
+ @Schema(description = "库房层级")
+ private String shLevel;
+ /**
+ * 部门ID
+ */
+ @Schema(description = "部门ID")
+ private String deptId;
+ /**
+ * 保管员ID
+ */
+ @Schema(description = "保管员ID")
+ private Long saveUser;
+ /**
+ * 类别说明
+ */
+ @Schema(description = "类别说明")
+ private String memo;
+
+ // 模具库
+ public static final Short TYPE_MOLD = 0;
+ // 材料库
+ public static final Short TYPE_PART = 1;
+ // 刀具库
+ public static final Short TYPE_TOOL = 2;
+ // 工装库
+ public static final Short TYPE_WORK = 3;
+ // 电极库
+ public static final Short TYPE_ELECTRODE = 4;
+ // 量具库
+ public static final Short TYPE_RULE = 5;
+ // 夹具库
+ public static final Short TYPE_JIA_JU = 6;
+
+ public static Short TOOLING_TYPE_MOLD = 0;//模具
+ public static Short TOOLING_TYPE_TOOL = 1;//工装
+ public static Short TOOLING_TYPE_RULE = 2;//量具
+
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java
new file mode 100644
index 000000000..c82672d56
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintParentWoLabel.java
@@ -0,0 +1,21 @@
+package org.springblade.wms.pojo.vo;
+
+import lombok.Data;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName PrintParentWoLabel
+ * @description: 库存打印标签数据模型(父)
+ * @autor: WuSiYu
+ * @create 2025-12-17 09:50
+ **/
+
+@Data
+public class PrintParentWoLabel {
+
+ private PrintWoLabel plOne;
+ private PrintWoLabel plTwo;
+ private PrintWoLabel plThree;
+ private PrintWoLabel plFour;
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java
new file mode 100644
index 000000000..b11a1e2cf
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintStoresList.java
@@ -0,0 +1,86 @@
+package org.springblade.wms.pojo.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName PrintStoresList
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-17 18:01
+ **/
+@Data
+public class PrintStoresList implements java.io.Serializable {
+ /**
+ * 供货单位
+ */
+ private String supplier;
+ /**
+ * 物料信息
+ */
+ private String materialMess;
+ /**
+ * 物料编码
+ */
+ private String materialCode;
+ /**
+ * 入库日期
+ */
+ private String inStore;
+ /**
+ * 库位号
+ */
+ private String locator;
+ /**
+ * 单位
+ */
+ private String unit;
+ /**
+ * 检验编号
+ */
+ private String testCode;
+ /**
+ * 到期日期
+ */
+ private String matureDate;
+ /**
+ * 批次号
+ */
+ private String batchNo;
+ /**
+ * 生产标识
+ */
+ private String identification;
+ /**
+ * 炉批号
+ */
+ private String heatNo;
+ /**
+ * 日期
+ */
+ private String date;
+ /**
+ * 摘要
+ */
+ private String memo;
+ /**
+ * 收入数
+ */
+ private String income;
+ /**
+ * 发出数
+ */
+ private String issueNum;
+ /**
+ * 结存数
+ */
+ private String balance;
+ /**
+ * 经手人
+ */
+ private String handledBy;
+
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java
new file mode 100644
index 000000000..e8198fd89
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/PrintWoLabel.java
@@ -0,0 +1,41 @@
+package org.springblade.wms.pojo.vo;
+
+import lombok.Data;
+
+import java.io.Serializable;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName PrintWoLabel
+ * @description: 库存打印标签数据模型(子)
+ * @autor: WuSiYu
+ * @create 2025-12-17 10:00
+ **/
+
+
+@Data
+public class PrintWoLabel implements Serializable {
+
+ /**
+ * 条码号
+ */
+ private String rsId;
+ /**
+ * 编码
+ */
+ private String code;
+ /**
+ * 名称
+ */
+ private String name;
+ /**
+ * 检验编号
+ */
+ private String checkCode;
+ /**
+ * 日期
+ */
+ private String date;
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java
new file mode 100644
index 000000000..5c2cbd257
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StRealtimeStockVO.java
@@ -0,0 +1,54 @@
+package org.springblade.wms.pojo.vo;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.wms.pojo.entity.StRealtimeStock;
+
+import java.io.Serial;
+import java.math.BigDecimal;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockVO
+ * @description: 仓库实时结余表 视图实体类
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:49
+ **/
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StRealtimeStockVO extends StRealtimeStock {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ private Long id; // 主键ID
+ private Long goodsId; // 物料ID
+ private Double quantity; // 库存数量
+ private Double lockQuantity;
+ private Double onthewayQuantity;
+ private Double currentQuantity;
+ private String piNo; // 批号
+ private Long slId; // 库位ID
+ private String barCode; // 条形码
+ private Date scrapCycle; // 报废周期
+ private String checkCode; // 检验码
+ private String splyCode; // 供应商编码
+ private String goodsName;
+ private String shName;
+ private Long shId;
+ private String location;
+ private String specifications;
+ @TableField(exist = false)
+ private String filterValue;
+ private Boolean special; // 特殊标识
+ private Double syQuantity;
+
+ @TableField(exist = false)
+ private String goodsCodeAndGoodsName;
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java
new file mode 100644
index 000000000..86b003628
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStRealtimeStockService.java
@@ -0,0 +1,82 @@
+package org.springblade.wms.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.wms.excel.StRealtimeStockExcel;
+import org.springblade.wms.pojo.entity.StRealtimeStock;
+import org.springblade.wms.pojo.entity.StStockInoutRecord;
+import org.springblade.wms.pojo.entity.StStorageLocation;
+import org.springblade.wms.pojo.entity.StStoreBill;
+import org.springblade.wms.pojo.vo.PrintParentWoLabel;
+import org.springblade.wms.pojo.vo.PrintStoresList;
+import org.springblade.wms.pojo.vo.StRealtimeStockVO;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName IStRealtimeStockService
+ * @description: 仓库实时结余表 服务类
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:56
+ **/
+
+public interface IStRealtimeStockService extends BaseService {
+ /**
+ * 自定义分页
+ *
+ * @param page 分页参数
+ * @param stRealtimeStock 查询参数
+ * @return IPage
+ */
+ IPage selectStRealtimeStockPage(IPage page, StRealtimeStockVO stRealtimeStock);
+
+
+ /**
+ * 导出数据
+ *
+ * @param queryWrapper 查询条件
+ * @return List
+ */
+ List exportStRealtimeStock(Wrapper queryWrapper);
+
+ List printPrintWoLabel(List rlsIdList, Short quantity);
+
+ List printStRealtimeStockList(List idArr);
+
+ Double getByShId(Long keyId);
+
+ Double getQuantityBySlId(Long slId);
+
+ StRealtimeStock getBySlId(Long slId);
+
+ boolean findBySlId(Long slId);
+
+ void updateLocation(Long id, StStorageLocation lo);
+
+ List reviseRealTimeStock(List inoutList, List stockList, List splyCodeList);
+
+ Double findPriceByParams(Long goodsId, String checkNo);
+
+ IPage selectByGoodsIdShId(Long goodsId, Long shId, String deptId);
+
+// IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, String deptId, Integer current, Integer size);
+
+ StRealtimeStock getFirstByGoodsCodeAndDeptId(String goodsCode, String deptId);
+
+ StRealtimeStock getByBarCode(String barCode);
+
+ StRealtimeStock getByGoodsCode(String barCode);
+
+ IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, IPage page);
+
+ void stockProcessing(List storeBillList, Short billsourceBorrow, BladeUser user) throws Exception ;
+
+ IPage selectStockGoodsPage(IPage page, StRealtimeStockVO stRealtimeStock);
+
+ IPage selectToolsStockPage(IPage page, StRealtimeStockVO stRealtimeStock);
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java
new file mode 100644
index 000000000..31418a201
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StRealtimeStockServiceImpl.java
@@ -0,0 +1,539 @@
+package org.springblade.wms.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import cn.hutool.core.util.StrUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
+import jakarta.annotation.Resource;
+import org.apache.commons.lang3.StringUtils;
+import org.springblade.common.exception.BusinessException;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.wms.excel.StRealtimeStockExcel;
+import org.springblade.wms.mapper.StGoodsMapper;
+import org.springblade.wms.mapper.StRealtimeStockMapper;
+import org.springblade.wms.mapper.StStorageLocationMapper;
+import org.springblade.wms.pojo.entity.*;
+import org.springblade.wms.pojo.vo.PrintParentWoLabel;
+import org.springblade.wms.pojo.vo.PrintStoresList;
+import org.springblade.wms.pojo.vo.PrintWoLabel;
+import org.springblade.wms.pojo.vo.StRealtimeStockVO;
+import org.springblade.wms.service.*;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.text.DecimalFormat;
+import java.time.LocalDateTime;
+import java.util.*;
+import java.util.stream.Collectors;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockServiceImpl
+ * @description: 仓库实时结余表 服务实现类
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:58
+ **/
+
+@Service
+public class StRealtimeStockServiceImpl extends BaseServiceImpl implements IStRealtimeStockService {
+
+ @Resource
+ private StRealtimeStockMapper stRealtimeStockMapper;
+ @Resource
+ private StGoodsMapper stGoodsMapper;
+ @Resource
+ private StStorageLocationMapper stStorageLocationMapper;
+ @Resource
+ private IStGoodsService stGoodsService;
+ @Resource
+ private IStStoreBillService stStoreBillService;
+ @Resource
+ private IStLockGoodsService stLockGoodsService;
+ @Resource
+ private IStOtherOutRecordService stOtherOutRecordService;
+
+
+ @Override
+ public IPage selectStRealtimeStockPage(IPage page, StRealtimeStockVO stRealtimeStock) {
+ return page.setRecords(baseMapper.selectStRealtimeStockPage(page, stRealtimeStock));
+ }
+
+ @Override
+ public IPage selectStockGoodsPage(IPage page, StRealtimeStockVO stRealtimeStock) {
+ return page.setRecords(baseMapper.selectStockGoodsPage(page, stRealtimeStock));
+ }
+
+ @Override
+ public IPage selectToolsStockPage(IPage page, StRealtimeStockVO stRealtimeStock) {
+ return page.setRecords(baseMapper.selectToolsStockPage(page, stRealtimeStock));
+ }
+
+ @Override
+ public List printPrintWoLabel(List rlsIdList, Short quantity) {
+ if (rlsIdList == null || rlsIdList.size() == 0) {
+ return null;
+ }
+ List rlsIdListAll = new ArrayList<>();
+ for (int i = 0; i < quantity; i++) {
+ rlsIdListAll.addAll(rlsIdList);
+ }
+ rlsIdListAll = rlsIdListAll.stream().sorted(Long::compareTo).collect(Collectors.toList());
+ Map> map = new HashMap<>(1);
+ List list = null;
+ Integer num = 0;
+ int i = 1;
+ PrintWoLabel printWoLabel;
+ PrintParentWoLabel printParentWoLabel = null;
+ StRealtimeStock stRealtimeStock;
+ List plList = new ArrayList<>();
+ for (Long id : rlsIdListAll) {
+ if (!map.containsKey(num)) {
+ list = new ArrayList<>();
+ map.put(num, list);
+ printParentWoLabel = new PrintParentWoLabel();
+ }
+ list.add(id);
+ printWoLabel = new PrintWoLabel();
+ stRealtimeStock = stRealtimeStockMapper.selectById(id);
+ printWoLabel.setRsId(String.valueOf(id));
+ StGoods goods = stGoodsMapper.selectById(stRealtimeStock.getGoodsId());
+ printWoLabel.setCode(goods.getGoodsCode());
+ printWoLabel.setName(goods.getGoodsName());
+ printWoLabel.setCheckCode(stRealtimeStock.getCheckCode());
+ Date scrapCycle = stRealtimeStock.getScrapCycle();
+ if (scrapCycle != null) {
+ printWoLabel.setDate(scrapCycle.toString());
+ } else {
+ printWoLabel.setDate("");
+ }
+ if (list.size() == 1) {
+ printParentWoLabel.setPlOne(printWoLabel);
+ }
+ if (list.size() == 2) {
+ printParentWoLabel.setPlTwo(printWoLabel);
+ }
+ if (list.size() == 3) {
+ printParentWoLabel.setPlThree(printWoLabel);
+ }
+ if (list.size() == 4) {
+ printParentWoLabel.setPlFour(printWoLabel);
+ plList.add(printParentWoLabel);
+ num++;
+ } else if (i == rlsIdListAll.size()) {
+ plList.add(printParentWoLabel);
+ }
+ i++;
+ }
+ return plList;
+ }
+
+ @Override
+ public List printStRealtimeStockList(List idArr) {
+ List pcdLst = new ArrayList<>();
+ for (Long rlsId : idArr) {
+ PrintStoresList psl = new PrintStoresList();
+ // 组装头
+ this.makeHead(psl, rlsId);
+ pcdLst.add(psl);
+ }
+ return pcdLst;
+ }
+
+ private void makeHead(PrintStoresList psl, Long rlsId) {
+ StRealtimeStock sts = this.getById(rlsId);
+ StGoods goods = stGoodsMapper.selectById(sts.getGoodsId());
+ psl.setMaterialMess(goods.getGoodsCode() + goods.getGoodsName());
+ psl.setMaterialCode(goods.getGoodsCode());
+ psl.setInStore(sts.getCreateTime().toString());
+ StStorageLocation stStorageLocation = stStorageLocationMapper.selectById(sts.getSlId());
+ psl.setLocator(stStorageLocation.getLocation());
+ psl.setUnit(goods.getUnitName());
+ psl.setTestCode(sts.getCheckCode() != null ? sts.getCheckCode() : "");
+ psl.setMatureDate(sts.getScrapCycle() != null ? sts.getScrapCycle().toString() : "");
+ psl.setBatchNo(sts.getPiNo());
+ psl.setIdentification(goods.getMaterialModel());
+ psl.setSupplier("");
+ psl.setHeatNo(sts.getStovePiNo() != null ? sts.getStovePiNo() : "");
+ psl.setDate(sts.getCreateTime().toString());
+ psl.setMemo("");
+ psl.setIncome(goods.getPurchaseQuantity() != null ? goods.getPurchaseQuantity().toString() : "");
+ DecimalFormat df = new DecimalFormat("#");
+ psl.setBalance(df.format(sts.getQuantity()));
+// psl.setHandledBy(sts.getKeeper());
+ }
+
+ @Override
+ public Double getByShId(Long shId) {
+ return stRealtimeStockMapper.getByShId(shId);
+ }
+
+ @Override
+ public Double getQuantityBySlId(Long slId) {
+ return stRealtimeStockMapper.getQuantityBySlId(slId);
+ }
+
+ @Override
+ public StRealtimeStock getBySlId(Long slId) {
+ return stRealtimeStockMapper.getBySlId(slId);
+ }
+
+ @Override
+ public boolean findBySlId(Long slId) {
+ return stRealtimeStockMapper.findBySlId(slId);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void updateLocation(Long id, StStorageLocation newStorageLocation) {
+ StRealtimeStock stock = stRealtimeStockMapper.selectById(id);
+ if (stock == null) {
+ throw new ServiceException("实时库存不存在,rlsId=" + id);
+ }
+ if (newStorageLocation == null || newStorageLocation.getShId() == null) {
+ throw new ServiceException("目标库位信息不完整");
+ }
+ stock.setShId(newStorageLocation.getShId());
+ stock.setSlId(newStorageLocation.getId());
+ stRealtimeStockMapper.updateById(stock);
+ }
+
+ @Override
+ public List reviseRealTimeStock(List inoutList, List stockList, List splyCodeList) {
+ // 前置校验:避免空列表和索引越界
+ if (inoutList == null || inoutList.isEmpty()) {
+ throw new IllegalArgumentException("StStockInoutRecord出入库记录列表不能为空!");
+ }
+ // 校验前两个List长度一致性(保证明细与库存对象一一对应)
+ if (stockList != null && stockList.size() != inoutList.size()) {
+ throw new IllegalArgumentException("StStockInoutRecord与StRealtimeStock两个列表长度不一致,无法批量处理!");
+ }
+
+ // 初始化返回集合,收集批量处理的rlsId
+ List rlsIdList = new ArrayList<>();
+
+ // 遍历出入库记录列表,批量执行核心业务逻辑
+ for (int i = 0; i < inoutList.size(); i++) {
+ // 3.1 获取当前索引对应的单个对象
+ StStockInoutRecord inout = inoutList.get(i);
+ // 兼容stockList为null的情况,避免空指针
+ StRealtimeStock stock = (stockList != null && stockList.size() > i) ? stockList.get(i) : null;
+
+ // 核心业务逻辑
+ Double quantity = inout.getQuantity();
+ Double balanceMoney = inout.getSirMoney() == null ? 0.0 : inout.getSirMoney(); // 字段名若变更需同步调整
+
+
+ if (inout.getInOutSource() < StStockInoutRecord.INOUT_SOURCE_QUOTA_OUT) {
+ //入库逻辑
+ if (StStockInoutRecord.INOUT_SOURCE_PURCHASE_RECEIPT.equals(inout.getInOutSource())) {
+ // 1.减在途
+ if (!inout.getMoldBaseMaterial()) {
+ stGoodsService.addOnthewayQuantity(inout.getGoodsId(),
+ BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+ }
+ // 2.增当前库存
+ stGoodsService.addCurQuantity(inout.getGoodsId(), quantity);
+
+// } else if (StStockInoutRecord.INOUT_SOURCE_PRODUCE_PURCHASE_RECEIPT.equals(inout.getBillFlag())) {
+// //生产入库:增库存
+// stGoodsService.addCurQuantity(inout.getGoods().getGoodsId(), quantity);
+ } else if (StStockInoutRecord.INOUT_SOURCE_OTHER_PURCHASE_RECEIPT.equals(inout.getInOutSource())
+ || StStockInoutRecord.INOUT_SOURCE_PRODUCTION_MATERIAL_RETURN.equals(inout.getInOutSource())) {
+ //其他入库/生产退料:增库存
+ stGoodsService.addCurQuantity(inout.getGoodsId(), quantity);
+ } else if (StStockInoutRecord.INOUT_SOURCE_TRANSFER_RECEIPT.equals(inout.getInOutSource())) {
+ //调拨入库
+ // 1.减在途
+ stGoodsService.addOnthewayQuantity(inout.getGoodsId(),
+ BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+ // 2.增当前库存
+ stGoodsService.addCurQuantity(inout.getGoodsId(), quantity);
+ } else if (StStockInoutRecord.INOUT_SOURCE_WAREHOUSE_TRANSFER.equals(inout.getInOutSource())) {
+ //库转移入库
+ // 1.减在途
+ if (!inout.getMoldBaseMaterial()) {
+ stGoodsService.addOnthewayQuantity(inout.getGoodsId(),
+ BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+ }
+ // 2.增当前库存
+ stGoodsService.addCurQuantity(inout.getGoodsId(), quantity);
+ }
+// } else {
+// //出库逻辑
+// if (stock == null) {
+// throw new RuntimeException("第" + (i+1) + "条出入库记录对应的出库物料为空,请选择出库物料!");
+// }
+// stock = stRealtimeStockMapper.getSynchById(stock.getId());
+// //当前库位库存小于出库数量
+// if (stock.getQuantity() < quantity) {
+// throw new RuntimeException("第" + (i+1) + "条出入库记录当前库位库存不足,出库失败!");
+// }
+// // 获取物料信息
+// StGoods stGoods = stGoodsService.getById(inout.getGoodsId());
+//
+// if (StStockInoutRecord.INOUT_SOURCE_QUOTA_OUT.equals(inout.getInOutSource())) {
+// //配额出库
+// //1.减锁料
+// PvBomRequest pvBomRequest = inout.getBrId();
+// if (pvBomRequest != null) {
+//
+// StLockGoods lockGoods = stLockGoodsService.getByBrId(pvBomRequest.getId());
+// //锁料中数量
+// Double lockingQuantity = null;
+// if (lockGoods != null) {
+// lockingQuantity =
+// BigDecimal.valueOf(lockGoods.getLockQuantity()).subtract(BigDecimal.valueOf(lockGoods.getOutQuantity())).doubleValue();
+// } else {
+// lockingQuantity = 0.0;
+// }
+// if (lockingQuantity < 0) {
+// lockingQuantity = 0.0;
+// }
+// // 判断可用库存是否充足
+// Double surplusQuantity =
+// stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity();
+// if (surplusQuantity < quantity - lockingQuantity) {
+// throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,出库失败");
+// }
+// if (lockGoods != null) {
+// stLockGoodsService.addOutQuantity(quantity, lockGoods.getId());
+// }
+// if (quantity < lockingQuantity) {
+// stGoodsService.addLockQuantity(inout.getGoodsId(),
+// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+// } else {
+// stGoodsService.addLockQuantity(inout.getGoodsId(),
+// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(lockingQuantity)).doubleValue());
+// }
+//
+// //2 减库存
+// stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+// }
+//
+// } else if (StStockInoutRecord.INOUT_SOURCE_OTHER_OUT.equals(inout.getInOutSource())
+// || StStockInoutRecord.INOUT_SOURCE_TOOl_OUT.equals(inout.getInOutSource())) {
+// if (StringUtils.isNotBlank(inout.getWoCode()) && stock.getId() != null) {
+//// if (!this.checkRealTimeLock(inout.getWoCode(),stock.getId().toString()) && !(inout.getMemo().indexOf("补")!=-1)) {
+//// throw new RuntimeException("第" + (i+1) + "条出入库记录热表玻璃饼出库需匹配预占用,此工作订单无预占用!");
+//// }
+// if (!this.checkRealTimeLock(inout.getWoCode(), stock.getId().toString())) {
+// StOtherOutRecord stOtherOutRecord = stOtherOutRecordService.getBySirId(inout.getId());
+// if (StringUtils.isNotBlank(stOtherOutRecord.getMemo())) {
+// if (!(stOtherOutRecord.getMemo().indexOf("补") != -1)) {
+// throw new ServiceException("热表玻璃饼出库需匹配预占用,此工作订单无预占用!");
+// }
+// } else {
+// throw new ServiceException("热表玻璃饼出库需匹配预占用,此工作订单无预占用!");
+// }
+// }
+// }
+// //其他出库/刀具出库:校验可用库存并减库存
+// Double surplusQuantity =
+// stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity();
+// if (surplusQuantity < quantity) {
+// throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,出库失败");
+// }
+// stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+// } else if (StStockInoutRecord.INOUT_SOURCE_ASSIGN_OUT.equals(inout.getInOutSource())) {
+// if (!stock.getMoldBaseMaterial()) {
+// //生产领料出库
+//// StUseGoodsDetail detail = stUseGoodsDetailService.queryByAbdId(inout.getAbdId()); // 字段名若变更需调整
+//// PvBomRequest pvBomRequest = null;
+//// if (detail != null) {
+//// pvBomRequest = detail.getPrWorkpiece().getDsSelfParts().getPvBomRequest();
+//// }
+//
+// //1.减锁料
+//// if (pvBomRequest != null) {
+//// StLockGoods lockGoods = stLockGoodsService.getByBrId(pvBomRequest.getId());
+// Double lockingQuantity = null;
+// if (lockGoods != null) {
+// lockingQuantity =
+// BigDecimal.valueOf(lockGoods.getLockQuantity()).subtract(BigDecimal.valueOf(lockGoods.getOutQuantity())).doubleValue();
+// } else {
+// lockingQuantity = 0.0;
+// }
+// if (lockingQuantity < 0) {
+// lockingQuantity = 0.0;
+// }
+// // 校验可用库存
+// Double surplusQuantity =
+// stGoods.getCurrentQuantity() + stGoods.getOnthewayQuantity() - stGoods.getLockQuantity();
+// if (surplusQuantity < quantity - lockingQuantity) {
+// throw new ServiceException(stGoods.getGoodsCode() + "可用库存不足,出库失败");
+// }
+// if (lockGoods != null) {
+// stLockGoodsService.addOutQuantity(quantity, lockGoods.getId());
+// }
+// if (quantity < lockingQuantity) {
+// stGoodsService.addLockQuantity(inout.getGoodsId(),
+// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+// } else {
+// stGoodsService.addLockQuantity(inout.getGoodsId(),
+// BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(lockingQuantity)).doubleValue());
+// }
+// //2.减库存
+// stGoodsService.addCurQuantity(inout.getGoodsId(), BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue());
+// }
+// }
+// }
+//
+// quantity = BigDecimal.valueOf(0).subtract(BigDecimal.valueOf(quantity)).doubleValue();
+ }
+
+ // 调用底层方法,获取单个rlsId并添加到返回集合
+// Long rlsId = this.reviseRealTimeStock(stock, inout, quantity, balanceMoney, splyCode);
+// rlsIdList.add(rlsId);
+ }
+//
+// // 返回批量处理后的rlsId列表
+ return rlsIdList;
+ }
+
+ @Transactional(rollbackFor = Exception.class)
+ public Long reviseRealTimeStock(StRealtimeStock stock,
+ StStockInoutRecord inout,
+ Double quantity,
+ Double balanceMoney,
+ String splyCode) {
+
+ /* 1. 无记录 → 新增 */
+ if (stock == null) {
+ StRealtimeStock entity = new StRealtimeStock();
+ entity.setGoodsId(inout.getGoodsId());
+ entity.setShId(inout.getShId());
+ entity.setSlId(inout.getSlId());
+ entity.setPiNo(inout.getPiNo());
+ entity.setStovePiNo(inout.getStovePiNo());
+ entity.setThickness(inout.getThickness());
+ entity.setQuantity(quantity);
+ entity.setOccupyQuantity(0D);
+ entity.setBalanceMoney(balanceMoney);
+ entity.setCreateTime(Optional.ofNullable(inout.getInOutDate()).orElse(new Date()));
+ entity.setQuantityLevel(inout.getQuantityLevel());
+ entity.setScrapCycle(inout.getScrapCycle());
+ entity.setCheckCode(inout.getCheckNo());
+ entity.setMoldBaseMaterial(inout.getMoldBaseMaterial());
+ entity.setBarCode(inout.getBarCode());
+ entity.setSplyCode(splyCode);
+ entity.setDeptId(inout.getDeptId());
+ this.save(entity);
+ return entity.getId();
+ }
+
+ /* 2. 有记录 → 累加数量 & 更新 */
+ StRealtimeStock db = baseMapper.getSynchById(stock.getId());
+ double newQty = NumberUtil.add(BigDecimal.valueOf(db.getQuantity()),
+ BigDecimal.valueOf(quantity))
+ .doubleValue();
+ db.setQuantity(newQty);
+ db.setBalanceMoney(balanceMoney);
+ db.setSplyCode(splyCode);
+
+ /* 车间订单锁料 */
+ double newOccupy = NumberUtil
+ .add(BigDecimal.valueOf(db.getOccupyQuantity()),
+ BigDecimal.valueOf(quantity))
+ .doubleValue();
+
+ if (StrUtil.isNotBlank(inout.getWoCode()) && newOccupy >= 0) {
+ db.setOccupyQuantity(newOccupy);
+ this.updateRealTimeLock(inout.getWoCode(), db.getId(), newOccupy);
+ }
+ this.updateById(db);
+ return db.getId();
+ }
+
+ private void updateRealTimeLock(String woCode, Long id, double doubleValue) {
+ baseMapper.updateRealTimeLock(woCode, id.toString(), doubleValue);
+ }
+
+ private boolean checkRealTimeLock(String woCode, String rlsId) {
+ return baseMapper.checkRealTimeLock(woCode, rlsId);
+ }
+
+ @Override
+ public Double findPriceByParams(Long goodsId, String checkNo) {
+ return baseMapper.findPriceByParams(goodsId, checkNo);
+ }
+
+ @Override
+ public IPage selectByGoodsIdShId(Long goodsId, Long shId, String deptId) {
+ return baseMapper.selectByGoodsIdShId(goodsId, shId, deptId);
+ }
+
+// @Override
+// public IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, String deptId, Integer current, Integer size) {
+// int curr = current == null || current < 1 ? 1 : current;
+// int sz = size == null || size < 1 ? 10 : size;
+// IPage page = new Page<>(curr, sz);
+// return baseMapper.selectGoodsOut(page, filterValue, shId, goodsId, deptId);
+// }
+
+
+ @Override
+ public void stockProcessing(List sbList, Short status, BladeUser curUserInfo) throws Exception {
+ StRealtimeStock rs = null;
+ for (StStoreBill sb : sbList) {
+ rs = this.getById(sb.getGoodsId());
+ if(rs == null){
+ throw new BusinessException("当前物料无可用库存,无法借出!");
+ }
+ if (status.equals(StStoreBill.BILLSOURCE_BORROW)) {
+ Double surplusQuantity = rs.getQuantity() - rs.getOccupyQuantity();
+ if (sb.getQuantity() > surplusQuantity) {
+ throw new BusinessException("库存剩余数量不足!");
+ }
+ rs.setOccupyQuantity(rs.getOccupyQuantity() + sb.getQuantity());
+ this.updateById(rs);
+ } else if (status.equals(StStoreBill.BILLSOURCE_RETURN)) {
+ if (sb.getBillSource().equals(StStoreBill.BILLSOURCE_RETURN)) {
+ rs.setSumNum(rs.getSumNum() + sb.getUseNum());
+ this.updateById(rs);
+ }
+ }
+ sb = stStoreBillService.getById(sb.getId());
+ sb.setCurStatus(StStoreBill.CURSTATUS_COMPLETE);
+ stStoreBillService.updateById(sb);
+ }
+ }
+
+ @Override
+ public IPage selectGoodsOut(String filterValue, Long shId, Long goodsId, IPage page) {
+ return this.baseMapper.selectGoodsOut(page, filterValue, shId, goodsId);
+ }
+
+ @Override
+ public StRealtimeStock getFirstByGoodsCodeAndDeptId(String goodsCode, String deptId) {
+ return baseMapper.getFirstByGoodsCodeAndDeptId(goodsCode, deptId);
+ }
+
+ @Override
+ public StRealtimeStock getByBarCode(String barCode) {
+ return baseMapper.getByBarCode(barCode);
+ }
+
+ @Override
+ public StRealtimeStock getByGoodsCode(String barCode) {
+ return baseMapper.getByGoodsCode(barCode);
+ }
+
+ @Override
+ public List exportStRealtimeStock (Wrapper < StRealtimeStock > queryWrapper) {
+ List stRealtimeStockList = baseMapper.exportStRealtimeStock(queryWrapper);
+ //stRealtimeStockList.forEach(stRealtimeStock -> {
+ // stRealtimeStock.setTypeName(DictCache.getValue(DictEnum.YES_NO, StRealtimeStock.getType()));
+ //});
+ return stRealtimeStockList;
+ }
+
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java
new file mode 100644
index 000000000..d980f5e78
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StRealtimeStockWrapper.java
@@ -0,0 +1,39 @@
+package org.springblade.wms.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.wms.pojo.entity.StRealtimeStock;
+import org.springblade.wms.pojo.vo.StRealtimeStockVO;
+
+import java.util.Objects;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StRealtimeStockWrapper
+ * @description: 仓库实时结余表 包装类,返回视图层所需的字段
+ * @autor: WuSiYu
+ * @create 2025-12-15 14:54
+ **/
+
+public class StRealtimeStockWrapper extends BaseEntityWrapper {
+
+ public static StRealtimeStockWrapper build() {
+ return new StRealtimeStockWrapper();
+ }
+
+ @Override
+ public StRealtimeStockVO entityVO(StRealtimeStock stRealtimeStock) {
+ StRealtimeStockVO stRealtimeStockVO = Objects.requireNonNull(BeanUtil.copyProperties(stRealtimeStock, StRealtimeStockVO.class));
+
+ //User createUser = UserCache.getUser(stRealtimeStock.getCreateUser());
+ //User updateUser = UserCache.getUser(stRealtimeStock.getUpdateUser());
+ //stRealtimeStockVO.setCreateUserName(createUser.getName());
+ //stRealtimeStockVO.setUpdateUserName(updateUser.getName());
+
+ return stRealtimeStockVO;
+ }
+
+
+}
+
From 06855268a35add6eafe2f556c9e8ecd4ac23cdbf Mon Sep 17 00:00:00 2001
From: wusiyu <2015098864@qq.com>
Date: Fri, 23 Jan 2026 11:45:14 +0800
Subject: [PATCH 3/4] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-?=
=?UTF-8?q?=E7=89=A9=E6=96=99=E4=BF=A1=E6=81=AF?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wms/controller/StGoodsController.java | 167 +++++++++
.../springblade/wms/excel/StGoodsExcel.java | 326 ++++++++++++++++++
.../springblade/wms/mapper/StGoodsMapper.java | 47 +++
.../springblade/wms/mapper/StGoodsMapper.xml | 109 ++++++
.../springblade/wms/pojo/dto/StGoodsDTO.java | 24 ++
.../springblade/wms/pojo/entity/StGoods.java | 277 +++++++++++++++
.../springblade/wms/pojo/vo/StGoodsVO.java | 24 ++
.../wms/service/IStGoodsService.java | 55 +++
.../wms/service/impl/StGoodsServiceImpl.java | 200 +++++++++++
.../wms/wrapper/StGoodsWrapper.java | 39 +++
10 files changed, 1268 insertions(+)
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java
new file mode 100644
index 000000000..3a8d702d6
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGoodsController.java
@@ -0,0 +1,167 @@
+package org.springblade.wms.controller;
+
+import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;
+import io.swagger.v3.oas.annotations.Operation;
+import io.swagger.v3.oas.annotations.Parameter;
+import io.swagger.v3.oas.annotations.tags.Tag;
+import jakarta.servlet.http.HttpServletResponse;
+import jakarta.validation.Valid;
+import lombok.AllArgsConstructor;
+import org.springblade.core.boot.ctrl.BladeController;
+import org.springblade.core.excel.util.ExcelUtil;
+import org.springblade.core.mp.support.Condition;
+import org.springblade.core.mp.support.Query;
+import org.springblade.core.secure.BladeUser;
+import org.springblade.core.secure.annotation.IsAdmin;
+import org.springblade.core.tool.api.R;
+import org.springblade.core.tool.utils.DateUtil;
+import org.springblade.core.tool.utils.Func;
+import org.springblade.wms.excel.StGoodsExcel;
+import org.springblade.wms.pojo.entity.StGoods;
+import org.springblade.wms.pojo.vo.StGoodsVO;
+import org.springblade.wms.service.IStGoodsService;
+import org.springblade.wms.wrapper.StGoodsWrapper;
+import org.springframework.validation.annotation.Validated;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.Map;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsController
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-10 11:39
+ **/
+
+@RestController
+@AllArgsConstructor
+@RequestMapping("/stGoods")
+@Tag(name = "物料信息表", description = "物料信息表接口")
+public class StGoodsController extends BladeController {
+
+ private final IStGoodsService stGoodsService;
+
+ /**
+ * 物料信息表 详情
+ */
+ @GetMapping("/detail")
+ @ApiOperationSupport(order = 1)
+ @Operation(summary = "详情", description = "传入stGoods")
+ public R detail(StGoods stGoods) {
+ StGoods detail = stGoodsService.getOne(Condition.getQueryWrapper(stGoods));
+ return R.data(StGoodsWrapper.build().entityVO(detail));
+ }
+ /**
+ * 物料信息表 分页
+ */
+ @GetMapping("/list")
+ @ApiOperationSupport(order = 2)
+ @Operation(summary = "分页", description = "传入stGoods")
+ public R> list(@Parameter(hidden = true) @RequestParam Map stGoods, Query query) {
+ QueryWrapper wrapper = Condition.getQueryWrapper(stGoods, StGoods.class);
+ wrapper.eq("is_deleted", 0);
+ IPage pages = stGoodsService.page(Condition.getPage(query), Condition.getQueryWrapper(stGoods, StGoods.class));
+ return R.data(StGoodsWrapper.build().pageVO(pages));
+ }
+
+ /**
+ * 物料信息表 自定义分页
+ */
+ @GetMapping("/page")
+ @ApiOperationSupport(order = 3)
+ @Operation(summary = "分页", description = "传入stGoods")
+ public R> page(StGoodsVO stGoods, Query query) {
+ stGoods.setIsDeleted(0);
+ IPage pages = stGoodsService.selectStGoodsPage(Condition.getPage(query), stGoods);
+ return R.data(pages);
+ }
+
+ /**
+ * 物料信息表 新增
+ */
+ @PostMapping("/save")
+ @ApiOperationSupport(order = 4)
+ @Operation(summary = "新增", description = "传入stGoods")
+ public R save(@Valid @RequestBody String goodsCode) throws Exception{
+ stGoodsService.saveGoods(goodsCode);
+ return R.success();
+ }
+
+ /**
+ * 物料信息表 修改
+ */
+ @PostMapping("/update")
+ @ApiOperationSupport(order = 5)
+ @Operation(summary = "修改", description = "传入stGoods")
+ public R update(@Valid @RequestBody StGoods stGoods) {
+ return R.status(stGoodsService.updateById(stGoods));
+ }
+
+ /**
+ * 物料信息表 新增或修改
+ */
+ @PostMapping("/submit")
+ @ApiOperationSupport(order = 6)
+ @Operation(summary = "新增或修改", description = "传入stGoods")
+ public R submit(@Valid @RequestBody StGoods stGoods) {
+ return R.status(stGoodsService.saveOrUpdate(stGoods));
+ }
+
+ /**
+ * 物料信息表 删除
+ */
+ @PostMapping("/remove")
+ @ApiOperationSupport(order = 7)
+ @Operation(summary = "逻辑删除", description = "传入ids")
+ public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) {
+ return R.status(stGoodsService.deleteLogic(Func.toLongList(ids)));
+ }
+
+ /**
+ * 设置物料状态
+ */
+ @PostMapping("/setUsed")
+ @ApiOperationSupport(order = 8)
+ @Operation(summary = "设置物料状态", description = "传入goodsId(物料ID)和used(状态:true=启用,false=禁用)")
+ public R setUsed(@Validated @RequestBody StGoods stGoods) throws Exception {
+ stGoodsService.changeUsed(stGoods.getId(), stGoods.getUsed());
+ return R.success();
+ }
+
+ /**
+ * 根据物料编码查询物料
+ */
+ @GetMapping("/getGoodsByGoodsCode")
+ @ApiOperationSupport(order = 9)
+ @Operation(summary = "根据物料编码查询物料", description = "传入物料编码goodsCode(路径参数)")
+ public R getGoodsByGoodsCode(
+ @Validated
+ @PathVariable(value = "goodsCode") String goodsCode
+ ) throws Exception {
+ Object goods = stGoodsService.queryByCode(goodsCode);
+ return R.data(goods);
+ }
+
+ /**
+ * 导出数据
+ */
+ @IsAdmin
+ @GetMapping("/export-stGoods")
+ @ApiOperationSupport(order = 10)
+ @Operation(summary = "导出数据", description = "传入stGoods")
+ public void exportStGoods(@Parameter(hidden = true) @RequestParam Map stGoods, BladeUser bladeUser, HttpServletResponse response) {
+ QueryWrapper queryWrapper = Condition.getQueryWrapper(stGoods, StGoods.class);
+ //if (!AuthUtil.isAdministrator()) {
+ // queryWrapper.lambda().eq(StGoods::getTenantId, bladeUser.getTenantId());
+ //}
+ //queryWrapper.lambda().eq(StGoodsEntity::getIsDeleted, BladeConstant.DB_NOT_DELETED);
+ List list = stGoodsService.exportStGoods(queryWrapper);
+ ExcelUtil.export(response, "物料信息表数据" + DateUtil.time(), "物料信息表数据表", list, StGoodsExcel.class);
+ }
+
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java
new file mode 100644
index 000000000..77428609e
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGoodsExcel.java
@@ -0,0 +1,326 @@
+package org.springblade.wms.excel;
+
+import com.alibaba.excel.annotation.ExcelProperty;
+import com.alibaba.excel.annotation.write.style.ColumnWidth;
+import com.alibaba.excel.annotation.write.style.ContentRowHeight;
+import com.alibaba.excel.annotation.write.style.HeadRowHeight;
+import lombok.Data;
+
+import java.io.Serial;
+import java.io.Serializable;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsExcel
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:26
+ **/
+
+@Data
+@ColumnWidth(25)
+@HeadRowHeight(20)
+@ContentRowHeight(18)
+public class StGoodsExcel implements Serializable {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 主键
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("主键")
+ private Long id;
+ /**
+ * 租户ID(默认值:000000)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("租户ID(默认值:000000)")
+ private String tenantId;
+ /**
+ * 是否已删除(默认值:0)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否已删除(默认值:0)")
+ private Long isDeleted;
+ /**
+ * 物料编码
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料编码")
+ private String goodsCode;
+ /**
+ * 物料名称
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料名称")
+ private String goodsName;
+ /**
+ * 最高库存
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("最高库存")
+ private Double maxNum;
+ /**
+ * 最低库存
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("最低库存")
+ private Double minNum;
+ /**
+ * 采购数量
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("采购数量")
+ private Double purchaseQuantity;
+ /**
+ * 必检标识
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("必检标识")
+ private Short mustCheck;
+ /**
+ * 是否停用(默认值:0)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否停用(默认值:0)")
+ private Boolean used;
+ /**
+ * 使用件数核算
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("使用件数核算")
+ private Short numAcc;
+ /**
+ * 产地
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("产地")
+ private String madeIn;
+ /**
+ * 单价
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("单价")
+ private Double price;
+ /**
+ * 等级
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("等级")
+ private String grade;
+ /**
+ * 来源 1=自制 2=外购
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("来源 1=自制 2=外购")
+ private Short source;
+ /**
+ * 组件模式
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("组件模式")
+ private String prtType;
+ /**
+ * 版本
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("版本")
+ private String releaseNo;
+ /**
+ * 版本时间
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("版本时间")
+ private Date releaseNoTime;
+ /**
+ * 型号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("型号")
+ private String materialModel;
+ /**
+ * 重量
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("重量")
+ private Double weight;
+ /**
+ * 计量单位
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("计量单位")
+ private String unitName;
+ /**
+ * 产品类别
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("产品类别")
+ private String productCategory;
+ /**
+ * 规格型号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("规格型号")
+ private String specifications;
+ /**
+ * 技术条件
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("技术条件")
+ private String productTechSpec;
+ /**
+ * 密度
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("密度")
+ private Double density;
+ /**
+ * 图号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("图号")
+ private String drawingNo;
+ /**
+ * 变更通告编号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("变更通告编号")
+ private String ecnNo;
+ /**
+ * 是否成品(默认值:0)
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否成品(默认值:0)")
+ private Short endItem;
+ /**
+ * 优选等级
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("优选等级")
+ private String priority;
+ /**
+ * 超级链接
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("超级链接")
+ private String partLink;
+ /**
+ * 腔数
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("腔数")
+ private String cavityNo;
+ /**
+ * 采购部门
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("采购部门")
+ private Long deptId;
+ /**
+ * 物料类别
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料类别")
+ private Long gcId;
+ /**
+ * 生命周期状态
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("生命周期状态")
+ private String partRevisionStatus;
+ /**
+ * 牌号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("牌号")
+ private String tradeMark;
+ /**
+ * 备注
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("备注")
+ private String remark;
+ /**
+ * 锁料数量
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("锁料数量")
+ private Double lockQuantity;
+ /**
+ * 在途数量
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("在途数量")
+ private Double onthewayQuantity;
+ /**
+ * 当前库存
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("当前库存")
+ private Double currentQuantity;
+ /**
+ * 物料类型
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料类型")
+ private Long goodsType;
+ /**
+ * 大类
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("大类")
+ private String matBigClassify;
+ /**
+ * 小类
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("小类")
+ private String matSmallClassify;
+ /**
+ * 检验编号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("检验编号")
+ private String checkCode;
+ /**
+ * 批次号
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("批次号")
+ private String batch;
+ /**
+ * 表面积
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("表面积")
+ private Double sectionArea;
+ /**
+ * 物料属性
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("物料属性")
+ private Long materialProperty;
+ /**
+ * PDM单位
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("PDM单位")
+ private String pdmUnit;
+ /**
+ * 是否工艺审批
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否工艺审批")
+ private String processApproval;
+ /**
+ * 是否最低库存预警
+ */
+ @ColumnWidth(20)
+ @ExcelProperty("是否最低库存预警")
+ private String minWarning;
+
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java
new file mode 100644
index 000000000..bf5e2c61e
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.java
@@ -0,0 +1,47 @@
+package org.springblade.wms.mapper;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.mapper.BaseMapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.apache.ibatis.annotations.Param;
+import org.springblade.wms.excel.StGoodsExcel;
+import org.springblade.wms.pojo.entity.StGoods;
+import org.springblade.wms.pojo.vo.StGoodsVO;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsMapper
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:23
+ **/
+
+public interface StGoodsMapper extends BaseMapper {
+
+ /**
+ * 自定义分页
+ *
+ * @param page 分页参数
+ * @param stGoods 查询参数
+ * @return List
+ */
+ List selectStGoodsPage(IPage page, StGoodsVO stGoods);
+
+ StGoods queryByCode(@Param("goodsCode") String goodsCode);
+
+ /**
+ * 获取导出数据
+ *
+ * @param queryWrapper 查询条件
+ * @return List
+ */
+ List exportStGoods(@Param("ew") Wrapper queryWrapper);
+
+ StGoods queryByCodeAndVersion(@Param("patno") String prtno, @Param("releaseNo") String releaseNo);
+
+ List selectFindAllGoodsPage(IPage page, StGoodsVO stGoods);
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml
new file mode 100644
index 000000000..bc025cc0b
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGoodsMapper.xml
@@ -0,0 +1,109 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java
new file mode 100644
index 000000000..cdb58eee0
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/dto/StGoodsDTO.java
@@ -0,0 +1,24 @@
+package org.springblade.wms.pojo.dto;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.wms.pojo.entity.StGoods;
+
+import java.io.Serial;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsDTO
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:14
+ **/
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StGoodsDTO extends StGoods {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java
new file mode 100644
index 000000000..272627f73
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StGoods.java
@@ -0,0 +1,277 @@
+package org.springblade.wms.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.*;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.mp.base.BaseEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoods
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-09 18:11
+ **/
+
+@Data
+@TableName("ST_GOODS")
+@Schema(description = "StGoods对象")
+@EqualsAndHashCode(callSuper = true)
+public class StGoods extends BaseEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 物料编码
+ */
+ @Schema(description = "物料编码")
+ private String goodsCode;
+ /**
+ * 物料名称
+ */
+ @Schema(description = "物料名称")
+ private String goodsName;
+ /**
+ * 最高库存
+ */
+ @Schema(description = "最高库存")
+ private Double maxNum;
+ /**
+ * 最低库存
+ */
+ @Schema(description = "最低库存")
+ private Double minNum;
+ /**
+ * 采购数量
+ */
+ @Schema(description = "采购数量")
+ private Double purchaseQuantity;
+ /**
+ * 必检标识
+ */
+ @Schema(description = "必检标识")
+ private Short mustCheck;
+ /**
+ * 是否停用(默认值:0)
+ */
+ @Schema(description = "是否停用(默认值:0)")
+ private Boolean used;
+ /**
+ * 使用件数核算
+ */
+ @Schema(description = "使用件数核算")
+ private Short numAcc;
+ /**
+ * 产地
+ */
+ @Schema(description = "产地")
+ private String madeIn;
+ /**
+ * 单价
+ */
+ @Schema(description = "单价")
+ private Double price;
+ /**
+ * 等级
+ */
+ @Schema(description = "等级")
+ private String grade;
+ /**
+ * 来源 1=自制 2=外购
+ */
+ @Schema(description = "来源 1=自制 2=外购")
+ private Short source;
+ /**
+ * 组件模式
+ */
+ @Schema(description = "组件模式")
+ private String prtType;
+ /**
+ * 版本
+ */
+ @Schema(description = "版本")
+ private String releaseNo;
+ /**
+ * 版本时间
+ */
+ @Schema(description = "版本时间")
+ private Date releaseNoTime;
+ /**
+ * 型号
+ */
+ @Schema(description = "型号")
+ private String materialModel;
+ /**
+ * 重量
+ */
+ @Schema(description = "重量")
+ private Double weight;
+ /**
+ * 计量单位
+ */
+ @Schema(description = "计量单位")
+ private String unitName;
+ /**
+ * 产品类别
+ */
+ @Schema(description = "产品类别")
+ private String productCategory;
+ /**
+ * 规格型号
+ */
+ @Schema(description = "规格型号")
+ private String specifications;
+ /**
+ * 技术条件
+ */
+ @Schema(description = "技术条件")
+ private String productTechSpec;
+ /**
+ * 密度
+ */
+ @Schema(description = "密度")
+ private Double density;
+ /**
+ * 图号
+ */
+ @Schema(description = "图号")
+ private String drawingNo;
+ /**
+ * 变更通告编号
+ */
+ @Schema(description = "变更通告编号")
+ private String ecnNo;
+ /**
+ * 是否成品(默认值:0)
+ */
+ @Schema(description = "是否成品(默认值:0)")
+ private Short endItem;
+ /**
+ * 优选等级
+ */
+ @Schema(description = "优选等级")
+ private String priority;
+ /**
+ * 超级链接
+ */
+ @Schema(description = "超级链接")
+ private String partLink;
+ /**
+ * 腔数
+ */
+ @Schema(description = "腔数")
+ private String cavityNo;
+ /**
+ * 采购部门
+ */
+ @Schema(description = "采购部门")
+ private Long deptId;
+ /**
+ * 物料类别
+ */
+ @Schema(description = "物料类别")
+ private Long gcId;
+ /**
+ * 生命周期状态
+ */
+ @Schema(description = "生命周期状态")
+ private String partRevisionStatus;
+ /**
+ * 牌号
+ */
+ @Schema(description = "牌号")
+ private String tradeMark;
+ /**
+ * 备注
+ */
+ @Schema(description = "备注")
+ private String remark;
+ /**
+ * 锁料数量
+ */
+ @Schema(description = "锁料数量")
+ private Double lockQuantity;
+ /**
+ * 在途数量
+ */
+ @Schema(description = "在途数量")
+ private Double onthewayQuantity;
+ /**
+ * 当前库存
+ */
+ @Schema(description = "当前库存")
+ private Double currentQuantity;
+ /**
+ * 物料类型
+ */
+ @Schema(description = "物料类型")
+ private Long goodsType;
+ /**
+ * 大类
+ */
+ @Schema(description = "大类")
+ private String matBigClassify;
+ /**
+ * 小类
+ */
+ @Schema(description = "小类")
+ private String matSmallClassify;
+ /**
+ * 检验编号
+ */
+ @Schema(description = "检验编号")
+ private String checkCode;
+ /**
+ * 批次号
+ */
+ @Schema(description = "批次号")
+ private String batch;
+ /**
+ * 表面积
+ */
+ @Schema(description = "表面积")
+ private Double sectionArea;
+ /**
+ * 物料属性
+ */
+ @Schema(description = "物料属性")
+ private Long materialProperty;
+ /**
+ * PDM单位
+ */
+ @Schema(description = "PDM单位")
+ private String pdmUnit;
+ /**
+ * 是否工艺审批
+ */
+ @Schema(description = "是否工艺审批")
+ private String processApproval;
+ /**
+ * 是否最低库存预警
+ */
+ @Schema(description = "是否最低库存预警")
+ private String minWarning;
+
+ /**
+ * 自制
+ */
+ public static Short MAKE_PROPERTIES_SELF = 1;
+ /**
+ * 外购
+ */
+ public static Short MAKE_PROPERTIES_OUT = 2;
+
+ public void setSourceByStr(String str) {
+ if ("自制".equals(str)) {
+ this.source = MAKE_PROPERTIES_SELF;
+ } else if ("外购".equals(str)) {
+ this.source = MAKE_PROPERTIES_OUT;
+ }
+ }
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java
new file mode 100644
index 000000000..6b1cbbb24
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/vo/StGoodsVO.java
@@ -0,0 +1,24 @@
+package org.springblade.wms.pojo.vo;
+
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.wms.pojo.entity.StGoods;
+
+import java.io.Serial;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsVO
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:15
+ **/
+
+@Data
+@EqualsAndHashCode(callSuper = true)
+public class StGoodsVO extends StGoods {
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+}
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java
new file mode 100644
index 000000000..d89002be6
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGoodsService.java
@@ -0,0 +1,55 @@
+package org.springblade.wms.service;
+
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import org.springblade.core.mp.base.BaseService;
+import org.springblade.wms.excel.StGoodsExcel;
+import org.springblade.wms.pojo.entity.StGoods;
+import org.springblade.wms.pojo.vo.StGoodsVO;
+
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName IStGoodsService
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:18
+ **/
+
+public interface IStGoodsService extends BaseService {
+ /**
+ * 自定义分页
+ *
+ * @param page 分页参数
+ * @param stGoods 查询参数
+ * @return IPage
+ */
+ IPage selectStGoodsPage(IPage page, StGoodsVO stGoods);
+
+ void changeUsed(Long id, Boolean used) throws Exception;
+
+ StGoods queryByCode(String goodsCode);
+
+ /**
+ * 导出数据
+ *
+ * @param queryWrapper 查询条件
+ * @return List
+ */
+ List exportStGoods(Wrapper queryWrapper);
+
+ void saveGoods(String goodsCode) throws Exception;
+
+ StGoods queryByCodeAndVersion(String prtno, String releaseNo);
+
+ void addOnthewayQuantity(Long goodsId, Double num);
+
+ void addCurQuantity(Long goodsId, Double quantity);
+
+ IPage selectFindAllGoodsPage(IPage page, StGoodsVO stGoods);
+
+ void addLockQuantity(Long goodsId, double v);
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java
new file mode 100644
index 000000000..f2d6c4bd4
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGoodsServiceImpl.java
@@ -0,0 +1,200 @@
+package org.springblade.wms.service.impl;
+
+import cn.hutool.core.util.NumberUtil;
+import com.baomidou.mybatisplus.core.conditions.Wrapper;
+import com.baomidou.mybatisplus.core.metadata.IPage;
+import jakarta.annotation.Resource;
+import lombok.extern.slf4j.Slf4j;
+import org.springblade.core.log.exception.ServiceException;
+import org.springblade.core.mp.base.BaseServiceImpl;
+import org.springblade.wms.excel.StGoodsExcel;
+import org.springblade.wms.mapper.StGoodsClassMapper;
+import org.springblade.wms.mapper.StGoodsMapper;
+import org.springblade.wms.pojo.dto.StPdmPartDTO;
+import org.springblade.wms.pojo.entity.StGoods;
+import org.springblade.wms.pojo.entity.StGoodsExt;
+import org.springblade.wms.pojo.vo.StGoodsVO;
+import org.springblade.wms.service.IStGoodsExtService;
+import org.springblade.wms.service.IStGoodsService;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.math.BigDecimal;
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsServiceImpl
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:21
+ **/
+
+@Service
+@Slf4j
+public class StGoodsServiceImpl extends BaseServiceImpl implements IStGoodsService {
+ @Resource
+ private StHttpRequestService stHttpRequestService;
+ @Resource
+ private IStGoodsExtService stGoodsExtService;
+
+ @Override
+ public IPage selectStGoodsPage(IPage page, StGoodsVO stGoods) {
+ return page.setRecords(baseMapper.selectStGoodsPage(page, stGoods));
+ }
+
+ @Override
+ public IPage selectFindAllGoodsPage(IPage page, StGoodsVO stGoods) {
+ return page.setRecords(baseMapper.selectFindAllGoodsPage(page, stGoods));
+ }
+
+ @Override
+ public void saveGoods(String goodsCode) throws Exception {
+ StGoods stGoods = baseMapper.queryByCode(goodsCode);
+ if (stGoods != null) {
+ throw new Exception("该物料已存在!");
+ } else {
+ List prtnoList = new ArrayList<>();
+ prtnoList.add(goodsCode);
+// saveGoodsInfo(prtnoList);
+
+ }
+ }
+
+ /*public void saveGoodsInfo(List prtnoList) throws Exception {
+ StGoods goods = null;
+ //查询物料信息
+ List pdmPartInfo = stHttpRequestService.getPdmPartInfo(prtnoList);
+ log.debug("pdmPartInfo:{}", pdmPartInfo);
+
+ if (pdmPartInfo != null) {
+ for (StPdmPartDTO dto : pdmPartInfo) {
+ //保存物料信息
+ goods = this.queryByCodeAndVersion(dto.getPrtno(), dto.getReleaseNo());
+ if (goods == null) {
+ goods = new StGoods();
+ // goods.setDept();
+ goods.setDrawingNo(dto.getDrwpartno());
+ goods.setGoodsCode(dto.getPrtno());
+ goods.setGoodsName(dto.getPrtdesc());
+ goods.setDensity(dto.getDensity());
+ goods.setPrtType(dto.getPrtType());
+ goods.setSourceByStr(dto.getSource());
+ goods.setSpecifications(dto.getMtlspcf());
+ goods.setUnitName(dto.getPrtum());
+ goods.setCavityNo(dto.getCavityNo());
+ goods.setProductCategory(dto.getProductCategory());
+ goods.setEcnNo(dto.getEcnNo());
+ goods.setEndItem(dto.getEndItem());
+ goods.setMaterialModel(dto.getMaterialModel());
+ goods.setPartLink(dto.getPartLink());
+ goods.setPriority(dto.getPriority());
+ goods.setPartRevisionStatus(dto.getPartRevisionStatus());
+ goods.setProductTechSpec(dto.getProductTechSpec());
+ goods.setWeight(dto.getWeight());
+ goods.setReleaseNo(dto.getReleaseNo());
+ goods.setRemark(dto.getRemark());
+ goods.setTradeMark(dto.getTradeMark());
+ goods.setUsed(Boolean.TRUE);
+ goods.setIsDeleted(0);
+ goods.setCreateTime(new Date());
+ goods.setReleaseNoTime(dto.getRcdchgdatd());
+ this.save(goods);
+ }
+ }
+ }
+ }*/
+
+ @Override
+ public StGoods queryByCodeAndVersion(String prtno, String releaseNo) {
+ return baseMapper.queryByCodeAndVersion(prtno, releaseNo);
+ }
+
+ @Override
+ public void changeUsed(Long id, Boolean used) throws Exception {
+ StGoods stGoods = this.getById(id);
+ if (stGoods == null) {
+ return;
+ }
+ stGoods.setUsed(used);
+ this.updateById(stGoods);
+
+ }
+
+ @Override
+ public StGoods queryByCode(String goodsCode) {
+ return baseMapper.queryByCode(goodsCode);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void addOnthewayQuantity(Long goodsId, Double num) {
+ StGoods coGoods = baseMapper.selectById(goodsId);
+ if (coGoods == null) {
+ throw new ServiceException("物料不存在或已停用:ID=" + goodsId);
+ }
+
+ // 累加在途数量(负值自动归零)
+ double ontheway = NumberUtil.add(
+ BigDecimal.valueOf(coGoods.getOnthewayQuantity()),
+ BigDecimal.valueOf(num)
+ ).doubleValue();
+ if (ontheway < 0) {
+ ontheway = 0D;
+ }
+ coGoods.setOnthewayQuantity(ontheway);
+ baseMapper.updateById(coGoods);
+ }
+
+ @Override
+ @Transactional(rollbackFor = Exception.class)
+ public void addCurQuantity(Long goodsId, Double num) {
+ StGoods stGoods = baseMapper.selectById(goodsId);
+ if (stGoods == null) {
+ throw new ServiceException("物料不存在:ID=" + goodsId);
+ }
+
+ // 累加当前库存(负值自动归零)
+ double curQuantity = NumberUtil.add(
+ BigDecimal.valueOf(stGoods.getCurrentQuantity()),
+ BigDecimal.valueOf(num)
+ ).doubleValue();
+ if (curQuantity < 0) {
+ curQuantity = 0D;
+ }
+ stGoods.setCurrentQuantity(curQuantity);
+ baseMapper.updateById(stGoods);
+
+ // 同步更新物料扩展表二级库存
+ StGoodsExt stGoodsExt = stGoodsExtService.getById(stGoods.getId());
+ if (stGoodsExt != null) {
+ stGoodsExt.setLastStore(curQuantity);
+ stGoodsExtService.updateById(stGoodsExt);
+ }
+ }
+
+ @Override
+ public void addLockQuantity(Long goodsId, double num) {
+ StGoods stGoods = this.getById(goodsId);
+ Double lockQuantity =
+ BigDecimal.valueOf(stGoods.getLockQuantity()).add(BigDecimal.valueOf(num)).doubleValue();
+ if (lockQuantity < 0) {
+ lockQuantity = 0d;
+ }
+ stGoods.setLockQuantity(lockQuantity);
+ }
+
+ @Override
+ public List exportStGoods(Wrapper queryWrapper) {
+ List stGoodsList = baseMapper.exportStGoods(queryWrapper);
+ //stGoodsList.forEach(stGoods -> {
+ // stGoods.setTypeName(DictCache.getValue(DictEnum.YES_NO, StGoods.getType()));
+ //});
+ return stGoodsList;
+ }
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java
new file mode 100644
index 000000000..9a07a8788
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGoodsWrapper.java
@@ -0,0 +1,39 @@
+package org.springblade.wms.wrapper;
+
+import org.springblade.core.mp.support.BaseEntityWrapper;
+import org.springblade.core.tool.utils.BeanUtil;
+import org.springblade.wms.pojo.entity.StGoods;
+import org.springblade.wms.pojo.vo.StGoodsVO;
+
+import java.util.Objects;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StGoodsWrapper
+ * @description:
+ * @autor: WuSiYu
+ * @create 2025-12-12 14:30
+ **/
+
+public class StGoodsWrapper extends BaseEntityWrapper {
+
+ public static StGoodsWrapper build() {
+ return new StGoodsWrapper();
+ }
+
+ @Override
+ public StGoodsVO entityVO(StGoods stGoods) {
+ StGoodsVO stGoodsVO = Objects.requireNonNull(BeanUtil.copyProperties(stGoods, StGoodsVO.class));
+
+ //User createUser = UserCache.getUser(stGoods.getCreateUser());
+ //User updateUser = UserCache.getUser(stGoods.getUpdateUser());
+ //stGoodsVO.setCreateUserName(createUser.getName());
+ //stGoodsVO.setUpdateUserName(updateUser.getName());
+
+ return stGoodsVO;
+ }
+
+
+}
+
From 046942137bb0a49241d215410daba7ff9f151797 Mon Sep 17 00:00:00 2001
From: wusiyu <2015098864@qq.com>
Date: Fri, 23 Jan 2026 14:11:53 +0800
Subject: [PATCH 4/4] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-?=
=?UTF-8?q?=E9=83=A8=E5=88=86=E5=AE=9E=E4=BD=93=E7=B1=BB?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
.../wms/pojo/entity/StStockInoutRecord.java | 172 ++++++++++++++++++
.../wms/pojo/entity/StStorageLocation.java | 67 +++++++
.../wms/pojo/entity/StStoreBill.java | 150 +++++++++++++++
3 files changed, 389 insertions(+)
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java
create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java
new file mode 100644
index 000000000..652a0763c
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStockInoutRecord.java
@@ -0,0 +1,172 @@
+package org.springblade.wms.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+import org.springframework.data.annotation.Transient;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StStockInoutRecord
+ * @description: 出入库记录表 实体类
+ * @autor: WuSiYu
+ * @create 2026-01-04 11:08
+ **/
+
+@Data
+@TableName("ST_STOCK_INOUT_RECORD")
+@Schema(description = "StStockInoutRecord对象")
+@EqualsAndHashCode(callSuper = true)
+public class StStockInoutRecord extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 库位ID(关联st_storage_location表主键)
+ */
+ @Schema(description = "库位ID(关联st_storage_location表主键)")
+ private Long slId;
+ /**
+ * 库存ID(关联st_realtime_stock表主键)
+ */
+ @Schema(description = "库存ID(关联st_realtime_stock表主键)")
+ private Long rlsId;
+ /**
+ * 仓库ID(关联st_storehouse表主键)
+ */
+ @Schema(description = "仓库ID(关联st_storehouse表主键)")
+ private Long shId;
+ /**
+ * 批号
+ */
+ @Schema(description = "批号")
+ private String piNo;
+ /**
+ * 出入库数量
+ */
+ @Schema(description = "出入库数量")
+ private Double quantity;
+ /**
+ * 金额
+ */
+ @Schema(description = "金额")
+ private Double sirMoney;
+ /**
+ * 采购单号
+ */
+ @Schema(description = "采购单号")
+ private String buyCode;
+ /**
+ * 检验单号
+ */
+ @Schema(description = "检验单号")
+ private String checkNo;
+ /**
+ * 生产标识
+ */
+ @Schema(description = "生产标识")
+ private String quantityLevel;
+ /**
+ * 是否模架物料 1=是/0=否(默认值:0)
+ */
+ @Schema(description = "是否模架物料 1=是/0=否(默认值:0)")
+ private Boolean moldBaseMaterial;
+ /**
+ * 过期/报废日期
+ */
+ @Schema(description = "过期/报废日期")
+ private Date scrapCycle;
+ /**
+ * 炉批号
+ */
+ @Schema(description = "炉批号")
+ private String stovePiNo;
+ /**
+ * 分厂id
+ */
+ @Schema(description = "分厂id")
+ private String deptId;
+ /**
+ * 车间订单号
+ */
+ @Schema(description = "车间订单号")
+ private String woCode;
+ /**
+ * 出入库类型/出库或入库
+ */
+ @Schema(description = "出入库类型/出库或入库")
+ private String inOutType;
+ /**
+ * 出入库原因
+ */
+ @Schema(description = "出入库原因")
+ private String inOutReason;
+ /**
+ * 出入库日期
+ */
+ @Schema(description = "出入库日期")
+ private Date inOutDate;
+ /**
+ * 出入库来源
+ */
+ @Schema(description = "出入库来源")
+ private Short inOutSource;
+ /**
+ * 业务人员/领用人ID
+ */
+ @Schema(description = "业务人员/领用人ID")
+ private Long userId;
+ /**
+ * 出入库单号
+ */
+ @Schema(description = "出入库单号")
+ private String sirCode;
+ /**
+ * 物料ID(关联st_goods表主键)
+ */
+ @Schema(description = "物料ID(关联st_goods表主键)")
+ private Long goodsId;
+ /**
+ * 总金额
+ */
+ private Double allMoney;
+ /**
+ * 保管员
+ */
+ private String keeper;
+ /**
+ * 厚度
+ */
+ private String thickness;
+ /**
+ * 物料需求ID
+ */
+ @Schema(description = "物料需求ID关联PvBomRequest")
+ private Long brId;
+
+ private Date warehousingDate;
+
+ private String barCode;
+
+ /*1:采购入库,2.生产入库,3:其他入库,4调拨入库,5erp转移入库,7生产退料
+ 11:配额出库,12:其他出库,13:领料出库 15刀具出库*/
+ public static final Short INOUT_SOURCE_PURCHASE_RECEIPT = 1;
+ public static final Short INOUT_SOURCE_PRODUCE_PURCHASE_RECEIPT = 2;
+ public static final Short INOUT_SOURCE_OTHER_PURCHASE_RECEIPT = 3;
+ public static final Short INOUT_SOURCE_TRANSFER_RECEIPT = 4;
+ public static final Short INOUT_SOURCE_WAREHOUSE_TRANSFER = 5;
+ public static final Short INOUT_SOURCE_PRODUCTION_MATERIAL_RETURN = 7;
+ public static final Short INOUT_SOURCE_QUOTA_OUT = 11;
+ public static final Short INOUT_SOURCE_OTHER_OUT = 12;
+ public static final Short INOUT_SOURCE_ASSIGN_OUT = 13;
+ public static final Short INOUT_SOURCE_TOOl_OUT = 15;
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java
new file mode 100644
index 000000000..a8421aa04
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStorageLocation.java
@@ -0,0 +1,67 @@
+package org.springblade.wms.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.io.Serial;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StStorageLocation
+ * @description: 库位维护表 实体类
+ * @autor: WuSiYu
+ * @create 2025-12-18 14:33
+ **/
+
+@Data
+@TableName("ST_STORAGE_LOCATION")
+@Schema(description = "StStorageLocation对象")
+@EqualsAndHashCode(callSuper = true)
+public class StStorageLocation extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 库房ID(关联st_storehouse表)
+ */
+ @Schema(description = "库房ID(关联st_storehouse表)")
+ private Long shId;
+ /**
+ * 库位号
+ */
+ @Schema(description = "库位号")
+ private String location;
+ /**
+ * 物料编号(关联st_goods表goods_code字段)
+ */
+ @Schema(description = "物料编号(关联st_goods表goods_code字段)")
+ private String goodsCode;
+ /**
+ * 物料名称
+ */
+ @Schema(description = "物料名称")
+ private String goodsName;
+ /**
+ * 物料规格
+ */
+ @Schema(description = "物料规格")
+ private String specifications;
+ /**
+ * 型号/牌号
+ */
+ @Schema(description = "型号/牌号")
+ private String materialModel;
+ /**
+ * 部门ID
+ */
+ @Schema(description = "部门ID")
+ private Long deptId;
+
+}
+
diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java
new file mode 100644
index 000000000..56de0942e
--- /dev/null
+++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/pojo/entity/StStoreBill.java
@@ -0,0 +1,150 @@
+package org.springblade.wms.pojo.entity;
+
+import com.baomidou.mybatisplus.annotation.TableName;
+import io.swagger.v3.oas.annotations.media.Schema;
+import lombok.Data;
+import lombok.EqualsAndHashCode;
+import org.springblade.core.tenant.mp.TenantEntity;
+
+import java.io.Serial;
+import java.util.Date;
+
+/**
+ * @version 1.0
+ * @program: jonhon-mes-svr
+ * @ClassName StStoreBill
+ * @description: 仓库凭证 实体类
+ * @autor: WuSiYu
+ * @create 2026-01-15 13:21
+ **/
+
+@Data
+@TableName("ST_STORE_BILL")
+@Schema(description = "StStoreBill对象")
+@EqualsAndHashCode(callSuper = true)
+public class StStoreBill extends TenantEntity {
+
+ @Serial
+ private static final long serialVersionUID = 1L;
+
+ /**
+ * 凭证分类;1,物料入库;2,物料出库;3,借用;4,归还;5,调出;6,调入;7,提请 ;
+ */
+ @Schema(description = "凭证分类;1,物料入库;2,物料出库;3,借用;4,归还;5,调出;6,调入;7,提请 ;")
+ private Short billFlag;
+ /**
+ * 收发标志;true:入库,false:出库
+ */
+ @Schema(description = "收发标志;true:入库,false:出库")
+ private String reCeOrSend;
+ /**
+ * 物料信息
+ */
+ @Schema(description = "物料信息")
+ private Long goodsId;
+ /**
+ * 数量
+ */
+ @Schema(description = "数量")
+ private Double quantity;
+ /**
+ * 批号
+ */
+ @Schema(description = "批号")
+ private String piNo;
+ /**
+ * 金额
+ */
+ @Schema(description = "金额")
+ private Double money;
+ /**
+ * 使用次数
+ */
+ @Schema(description = "使用次数")
+ private Long useNum;
+ /**
+ * 检验编码
+ */
+ @Schema(description = "检验编码")
+ private String checkCode;
+ /**
+ * 凭证单号
+ */
+ @Schema(description = "凭证单号")
+ private String billCode;
+ /**
+ * 凭证日期
+ */
+ @Schema(description = "凭证日期")
+ private Date billDate;
+ /**
+ * 部门;外键(部门)
+ */
+ @Schema(description = "部门;外键(部门)")
+ private String deptId;
+ /**
+ * 人员;外键(人员)
+ */
+ @Schema(description = "人员;外键(人员)")
+ private Long billMan;
+ /**
+ * 原因;外键(原因)
+ */
+ @Schema(description = "原因;外键(原因)")
+ private String bcId;
+ /**
+ * 来源;0:正常;1:采购;2:生产;
+ */
+ @Schema(description = "来源;0:正常;1:采购;2:生产;")
+ private Short billSource;
+ /**
+ * 备注
+ */
+ @Schema(description = "备注")
+ private String memo;
+ /**
+ * 仓库;外键(仓库)
+ */
+ @Schema(description = "仓库;外键(仓库)")
+ private Long stoId;
+ /**
+ * 状态;1:新建,20:完成
+ */
+ @Schema(description = "状态;1:新建,20:完成")
+ private Short curStatus;
+ /**
+ * 到期日期
+ */
+ @Schema(description = "到期日期")
+ private Date expirationDate;
+ /**
+ * 库位ID
+ */
+ @Schema(description = "库位ID")
+ private Long slId;
+ /**
+ * 库房ID
+ */
+ @Schema(description = "库房ID")
+ private Long shId;
+
+ /**
+ * 借用
+ */
+ public static Short BILLSOURCE_BORROW = 4;
+ /**
+ * 归还
+ */
+ public static Short BILLSOURCE_RETURN = 5;
+
+ /**
+ * 新建
+ */
+ public static Short CURSTATUS_NEW = 1;
+ /**
+ * 完成
+ */
+ public static Short CURSTATUS_COMPLETE = 20;
+
+}
+