From 3dca71367e6c3a9fc6407de42dd1ec70a5f1b53d Mon Sep 17 00:00:00 2001 From: wusiyu <2015098864@qq.com> Date: Fri, 23 Jan 2026 11:15:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86-=E9=87=8F?= =?UTF-8?q?=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 00000000..98ca023d --- /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 00000000..6b29091d --- /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 00000000..e33c7c5b --- /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 00000000..ce83840a --- /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 00000000..ad545dfd --- /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 00000000..bf7ed108 --- /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 00000000..153eb9f4 --- /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 00000000..c82672d5 --- /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 00000000..b11a1e2c --- /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 00000000..e8198fd8 --- /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 00000000..5c2cbd25 --- /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 00000000..86b00362 --- /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 00000000..31418a20 --- /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 00000000..d980f5e7 --- /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; + } + + +} +