From dada568893b28343ae6a3d2b12dd479d52cd2877 Mon Sep 17 00:00:00 2001 From: wusiyu <2015098864@qq.com> Date: Mon, 25 May 2026 10:04:17 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BB=93=E5=BA=93=E7=AE=A1=E7=90=86=E6=96=B0?= =?UTF-8?q?=E5=A2=9E=E7=9F=B3=E5=A2=A8=E6=A8=A1=E5=87=BA=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../wms/pojo/dto/StGraphiteMoldOutDTO.java | 26 ++ .../wms/pojo/entity/StGraphiteMoldOut.java | 151 ++++++++ .../wms/pojo/vo/StGraphiteMoldOutVO.java | 24 ++ .../StGraphiteMoldOutController.java | 234 ++++++++++++ .../wms/excel/StGraphiteMoldOutExcel.java | 164 +++++++++ .../wms/mapper/StGraphiteMoldOutMapper.java | 52 +++ .../wms/mapper/StGraphiteMoldOutMapper.xml | 118 ++++++ .../service/IStGraphiteMoldOutService.java | 51 +++ .../impl/StGraphiteMoldOutServiceImpl.java | 345 ++++++++++++++++++ .../wms/wrapper/StGraphiteMoldOutWrapper.java | 36 ++ 10 files changed, 1201 insertions(+) create mode 100644 blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StGraphiteMoldOutDTO.java create mode 100644 blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java create mode 100644 blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StGraphiteMoldOutVO.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGraphiteMoldOutExcel.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java create mode 100644 blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGraphiteMoldOutWrapper.java diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StGraphiteMoldOutDTO.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StGraphiteMoldOutDTO.java new file mode 100644 index 000000000..8372d0bcc --- /dev/null +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/dto/StGraphiteMoldOutDTO.java @@ -0,0 +1,26 @@ +package org.springblade.wms.pojo.dto; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.wms.pojo.entity.StGraphiteMoldOut; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOutDTO + * @description: 石墨模出库 数据传输对象实体类 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ + +@Data +@EqualsAndHashCode(callSuper = true) +public class StGraphiteMoldOutDTO extends StGraphiteMoldOut { + @Serial + private static final long serialVersionUID = 1L; + + + +} diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java new file mode 100644 index 000000000..0b91e948b --- /dev/null +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/entity/StGraphiteMoldOut.java @@ -0,0 +1,151 @@ +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; +import java.util.Date; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOut + * @description: 石墨模出库 实体类 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ + +@Data +@TableName("ST_GRAPHITE_MOLD_OUT") +@Schema(description = "StGraphiteMoldOut对象") +@EqualsAndHashCode(callSuper = true) +public class StGraphiteMoldOut extends TenantEntity { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 出库凭证信息 + */ + @Schema(description = "出库凭证信息") + private Long sirId; + + /** + * 生产单号 + */ + @TableField(value = "YO_CODE") + private String yoCode; + + /** + * 批次号 + */ + @Schema(description = "批次号") + private String piNo; + + /** + * 流程卡号 + */ + @Schema(description = "流程卡号") + private String cardNo; + + /** + * 物料ID + */ + @Schema(description = "物料ID") + private Long goodsId; + + /** + * 物料编号 + */ + @Schema(description = "物料编号") + private String goodsCode; + + /** + * 物料名称 + */ + @Schema(description = "物料名称") + private String goodsName; + + /** + * 物料需求量 + */ + @Schema(description = "物料需求量") + private Double needQuantity; + + /** + * 库房ID + */ + @Schema(description = "库房ID") + private Long shId; + + /** + * 库房名称 + */ + @Schema(description = "库房名称") + private String shName; + + /** + * 库位ID + */ + @Schema(description = "库位ID") + private Long slId; + + /** + * 库位号 + */ + @Schema(description = "库位号") + private String location; + + /** + * 已出库数量 + */ + @Schema(description = "已出库数量") + private Double outedQuantity; + + /** + * 出库时间 + */ + @Schema(description = "出库时间") + private Date outTime; + + /** + * 出库人 + */ + @Schema(description = "出库人") + private Long outUser; + + /** + * 出库单号 + */ + @Schema(description = "出库单号") + private String outCode; + + /** + * 库存ID + */ + @Schema(description = "库存ID") + private Long rlsId; + + /** + * 状态 + */ + @Schema(description = "状态") + private Long curStatus; + + /** + * 可用库存数量 + */ + @TableField(exist = false) + private Double stockQty; + + /** + * 领料人ID + */ + @Schema(description = "领料人ID") + private Long picker; + +} diff --git a/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StGraphiteMoldOutVO.java b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StGraphiteMoldOutVO.java new file mode 100644 index 000000000..ef1fe1a0a --- /dev/null +++ b/blade-service-api/blade-wms-api/src/main/java/org/springblade/wms/pojo/vo/StGraphiteMoldOutVO.java @@ -0,0 +1,24 @@ +package org.springblade.wms.pojo.vo; + +import lombok.Data; +import lombok.EqualsAndHashCode; +import org.springblade.wms.pojo.entity.StGraphiteMoldOut; + +import java.io.Serial; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOutVO + * @description: 石墨模出库 视图实体类 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ +@Data +@EqualsAndHashCode(callSuper = true) +public class StGraphiteMoldOutVO extends StGraphiteMoldOut { + @Serial + private static final long serialVersionUID = 1L; + + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java new file mode 100644 index 000000000..e2287665c --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/controller/StGraphiteMoldOutController.java @@ -0,0 +1,234 @@ +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.log.annotation.ApiLog; +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.secure.utils.AuthUtil; +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.StGraphiteMoldOutExcel; +import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; +import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; +import org.springblade.wms.pojo.vo.StStockInoutRecordVO; +import org.springblade.wms.service.IStGraphiteMoldOutService; +import org.springblade.wms.service.IStStockInoutRecordService; +import org.springblade.wms.wrapper.StGraphiteMoldOutWrapper; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Map; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOutController + * @description: 石墨模出库 控制器 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ + +@RestController +@AllArgsConstructor +@RequestMapping("/stGraphiteMoldOut") +@Tag(name = "石墨模出库", description = "石墨模出库接口") +public class StGraphiteMoldOutController extends BladeController { + + private final IStGraphiteMoldOutService stGraphiteMoldOutService; + private final IStStockInoutRecordService stStockInoutRecordService; + + /** + * 石墨模出库 详情 + */ + @GetMapping("/detail") + @ApiOperationSupport(order = 1) + @ApiLog("石墨模出库 详情") + @Operation(summary = "详情", description = "传入stGraphiteMoldOut") + public R detail(StGraphiteMoldOut stGraphiteMoldOut) { + StGraphiteMoldOut detail = stGraphiteMoldOutService.getOne(Condition.getQueryWrapper(stGraphiteMoldOut)); + return R.data(StGraphiteMoldOutWrapper.build().entityVO(detail)); + } + + /** + * 石墨模出库 分页 + */ + @GetMapping("/list") + @ApiOperationSupport(order = 2) + @ApiLog("石墨模出库 分页") + @Operation(summary = "分页", description = "传入stGraphiteMoldOut") + public R> list(@Parameter(hidden = true) @RequestParam Map stGraphiteMoldOut, Query query) { + IPage pages = stGraphiteMoldOutService.page(Condition.getPage(query), Condition.getQueryWrapper(stGraphiteMoldOut, StGraphiteMoldOut.class)); + return R.data(StGraphiteMoldOutWrapper.build().pageVO(pages)); + } + + /** + * 石墨模出库 自定义分页 + */ + @GetMapping("/page") + @ApiOperationSupport(order = 3) + @ApiLog("石墨模出库 自定义分页") + @Operation(summary = "分页", description = "传入stGraphiteMoldOut") + public R> page(StGraphiteMoldOutVO stGraphiteMoldOut, Query query) { + IPage pages = stGraphiteMoldOutService.selectStGraphiteMoldOutPage(Condition.getPage(query), stGraphiteMoldOut); + return R.data(pages); + } + + /** + * 石墨模出库 新增 + */ + @PostMapping("/save") + @ApiOperationSupport(order = 4) + @ApiLog("石墨模出库 新增") + @Operation(summary = "新增", description = "传入stGraphiteMoldOut") + public R save(@Valid @RequestBody StGraphiteMoldOut stGraphiteMoldOut) { + return R.status(stGraphiteMoldOutService.save(stGraphiteMoldOut)); + } + + /** + * 石墨模出库 修改 + */ + @PostMapping("/update") + @ApiOperationSupport(order = 5) + @ApiLog("石墨模出库 修改") + @Operation(summary = "修改", description = "传入stGraphiteMoldOut") + public R update(@Valid @RequestBody StGraphiteMoldOut stGraphiteMoldOut) { + return R.status(stGraphiteMoldOutService.updateById(stGraphiteMoldOut)); + } + + /** + * 石墨模出库 新增或修改 + */ + @PostMapping("/submit") + @ApiOperationSupport(order = 6) + @ApiLog("石墨模出库 新增或修改") + @Operation(summary = "新增或修改", description = "传入stGraphiteMoldOut") + public R submit(@Valid @RequestBody StGraphiteMoldOut stGraphiteMoldOut) { + return R.status(stGraphiteMoldOutService.saveOrUpdate(stGraphiteMoldOut)); + } + + /** + * 石墨模出库 删除 + */ + @PostMapping("/remove") + @ApiOperationSupport(order = 7) + @ApiLog("石墨模出库 删除") + @Operation(summary = "逻辑删除", description = "传入ids") + public R remove(@Parameter(description = "主键集合", required = true) @RequestParam String ids) { + return R.status(stGraphiteMoldOutService.deleteLogic(Func.toLongList(ids))); + } + + /** + * 石墨模出库 生成出库单号 + */ + @GetMapping("/generateCode") + @ApiOperationSupport(order = 8) + @ApiLog("石墨模出库 生成出库单号") + @Operation(summary = "生成石墨模出库单号", description = "获取新单据号并返回空账单对象") + public R generateCode() { + // 1. 生成单号 + String sirCode = stStockInoutRecordService.generateCode(); + + // 2. 封装合表 VO + StStockInoutRecordVO vo = new StStockInoutRecordVO(); + vo.setSirCode(sirCode); + vo.setCreateUser(AuthUtil.getUserId()); + + return R.data(vo); + } + + /** + * 生成石墨模预出库单 + */ + @PostMapping("/generateOrder") + @ApiOperationSupport(order = 9) + @ApiLog("生成石墨模预出库单") + @Operation(summary = "生成石墨模预出库单", description = "按物料编号+规格等条件查库存,库存充足生成预出库单,不足返回指定提示") + public R> generatePreOutOrder( + @Parameter(description = "石墨模预出库信息", required = true) + @RequestBody StGraphiteMoldOutDTO dto + ) { + return R.data(stGraphiteMoldOutService.generatePreOutOrder(dto)); + } + + /** + * 批量生成石墨模预出库单 + */ + @PostMapping("/batchGenerateOrder") + @ApiOperationSupport(order = 10) + @ApiLog("批量生成石墨模预出库单") + @Operation(summary = "批量生成石墨模预出库单", description = "批量传入石墨模信息,逐条校验库存,成功生成预出库单,失败收集提示信息(一条失败不影响其他)") + public R> batchGeneratePreOutOrder( + @Parameter(description = "石墨模预出库信息集合", required = true) + @RequestBody List dtoList + ) { + Map result = stGraphiteMoldOutService.batchGeneratePreOutOrder(dtoList); + return R.data(result); + } + + /** + * 扫码查询/新增待出库数据 + */ + @GetMapping("/scanCard") + @ApiOperationSupport(order = 11) + @ApiLog("扫码查询/新增待出库数据") + @Operation(summary = "扫码处理石墨模出库", description = "传入流程卡号,查询/新增待出库数据") + public R> scanCard( + @Parameter(description = "流程卡号(扫码内容)", required = true) @RequestParam String cardNo) { + return R.data(stGraphiteMoldOutService.scanCardProcess(cardNo, AuthUtil.getUser())); + } + + /** + * 编辑出库数量后 提交确认出库 + */ + @PostMapping("/submitOutStock") + @ApiOperationSupport(order = 12) + @ApiLog("编辑出库数量后 提交确认出库") + @Operation(summary = "石墨模出库-提交确认出库", description = "填写出库数量后提交,写入出入库记录并扣减库存,变更为已出库状态") + public R submitOutStock(@RequestBody StGraphiteMoldOut stGraphiteMoldOut) { + BladeUser user = AuthUtil.getUser(); + StGraphiteMoldOut result = stGraphiteMoldOutService.submitOutStock(stGraphiteMoldOut, user); + return R.data(result); + } + + /** + * 编辑出库数量后 批量出库 + */ + @PostMapping("/batchSubmitOutStock") + @ApiOperationSupport(order = 13) + @ApiLog("编辑出库数量后 批量出库") + @Operation(summary = "石墨模出库-提交确认出库", description = "填写出库数量后提交,写入出入库记录并扣减库存,变更为已出库状态") + public R> batchSubmitOutStock(@RequestBody List paramList) { + BladeUser user = AuthUtil.getUser(); + List result = stGraphiteMoldOutService.batchSubmitOutStock(paramList, user); + return R.data(result); + } + + /** + * 导出数据 + */ + @IsAdmin + @GetMapping("/export-stGraphiteMoldOut") + @ApiOperationSupport(order = 14) + @ApiLog("导出数据") + @Operation(summary = "导出数据", description = "传入stGraphiteMoldOut") + public void exportStGraphiteMoldOut(@Parameter(hidden = true) @RequestParam Map stGraphiteMoldOut, BladeUser bladeUser, HttpServletResponse response) { + QueryWrapper queryWrapper = Condition.getQueryWrapper(stGraphiteMoldOut, StGraphiteMoldOut.class); + List list = stGraphiteMoldOutService.exportStGraphiteMoldOut(queryWrapper); + ExcelUtil.export(response, "石墨模出库数据" + DateUtil.time(), "石墨模出库数据表", list, StGraphiteMoldOutExcel.class); + } + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGraphiteMoldOutExcel.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGraphiteMoldOutExcel.java new file mode 100644 index 000000000..69a60c470 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/excel/StGraphiteMoldOutExcel.java @@ -0,0 +1,164 @@ +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 StGraphiteMoldOutExcel + * @description: 石墨模出库 Excel实体类 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ + +@Data +@ColumnWidth(25) +@HeadRowHeight(20) +@ContentRowHeight(18) +public class StGraphiteMoldOutExcel implements Serializable { + + @Serial + private static final long serialVersionUID = 1L; + + /** + * 主键 + */ + @ColumnWidth(20) + @ExcelProperty("主键") + private Long id; + /** + * 租户ID + */ + @ColumnWidth(20) + @ExcelProperty("租户ID") + private String tenantId; + /** + * 是否已删除 + */ + @ColumnWidth(20) + @ExcelProperty("是否已删除") + private Long isDeleted; + /** + * 出库凭证信息 + */ + @ColumnWidth(20) + @ExcelProperty("出库凭证信息") + private Long sirId; + /** + * 车间订单号 + */ + @ColumnWidth(20) + @ExcelProperty("车间订单号") + private String woCode; + /** + * 生产单号 + */ + @ColumnWidth(20) + @ExcelProperty("生产单号") + private String yoCode; + /** + * 零件号 + */ + @ColumnWidth(20) + @ExcelProperty("零件号") + private String partCode; + /** + * 零件名称 + */ + @ColumnWidth(20) + @ExcelProperty("零件名称") + private String partName; + /** + * 批次号 + */ + @ColumnWidth(20) + @ExcelProperty("批次号") + private String piNo; + /** + * 流程卡号 + */ + @ColumnWidth(20) + @ExcelProperty("流程卡号") + private String cardNo; + /** + * 物料需求量 + */ + @ColumnWidth(20) + @ExcelProperty("物料需求量") + private Double needQuantity; + /** + * 已出库数量 + */ + @ColumnWidth(20) + @ExcelProperty("已出库数量") + private Double outedQuantity; + /** + * 状态 + */ + @ColumnWidth(20) + @ExcelProperty("状态") + private Long curStatus; + /** + * 出库时间 + */ + @ColumnWidth(20) + @ExcelProperty("出库时间") + private Date outTime; + /** + * 出库人 + */ + @ColumnWidth(20) + @ExcelProperty("出库人") + private Long outUser; + /** + * 物料ID + */ + @ColumnWidth(20) + @ExcelProperty("物料ID") + private Long goodsId; + /** + * 库位ID + */ + @ColumnWidth(20) + @ExcelProperty("库位ID") + private Long slId; + /** + * 库房ID + */ + @ColumnWidth(20) + @ExcelProperty("库房ID") + private Long shId; + /** + * 库存ID + */ + @ColumnWidth(20) + @ExcelProperty("库存ID") + private Long rlsId; + /** + * 出库单号 + */ + @ColumnWidth(20) + @ExcelProperty("出库单号") + private String outCode; + /** + * 备注 + */ + @ColumnWidth(20) + @ExcelProperty("备注") + private String memo; + /** + * 领料人ID + */ + @ColumnWidth(20) + @ExcelProperty("领料人ID") + private Long picker; + +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.java new file mode 100644 index 000000000..cc14e2d02 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.java @@ -0,0 +1,52 @@ +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.desk.order.pojo.entity.YieldOrder; +import org.springblade.desk.produce.pojo.entity.WorkOrder; +import org.springblade.wms.excel.StGraphiteMoldOutExcel; +import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; + +import java.util.List; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOutMapper + * @description: 石墨模出库 Mapper 接口 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ + +public interface StGraphiteMoldOutMapper extends BaseMapper { + + /** + * 自定义分页 + * + * @param page 分页参数 + * @param stGraphiteMoldOut 查询参数 + * @return List + */ + List selectStGraphiteMoldOutPage(IPage page, StGraphiteMoldOutVO stGraphiteMoldOut); + + /** + * 获取导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportStGraphiteMoldOut(@Param("ew") Wrapper queryWrapper); + + StGraphiteMoldOut getBySirId(Long sirId); + + WorkOrder getByWoCode(String cardNo); + + YieldOrder getByYoCode(String cardNo); + + YieldOrder getByYieldOrder(String yoCode); + + List getYieldOrderList(Long id, String yieldType); +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml new file mode 100644 index 000000000..f188ca3a3 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/mapper/StGraphiteMoldOutMapper.xml @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java new file mode 100644 index 000000000..64fcf136f --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/IStGraphiteMoldOutService.java @@ -0,0 +1,51 @@ +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.StGraphiteMoldOutExcel; +import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; +import org.springblade.wms.pojo.entity.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; + +import java.util.List; +import java.util.Map; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName IStGraphiteMoldOutService + * @description: 石墨模出库 服务类 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ +public interface IStGraphiteMoldOutService extends BaseService { + /** + * 自定义分页 + * + * @param page 分页参数 + * @param stGraphiteMoldOut 查询参数 + * @return IPage + */ + IPage selectStGraphiteMoldOutPage(IPage page, StGraphiteMoldOutVO stGraphiteMoldOut); + + + /** + * 导出数据 + * + * @param queryWrapper 查询条件 + * @return List + */ + List exportStGraphiteMoldOut(Wrapper queryWrapper); + + List scanCardProcess(String cardNo, BladeUser user); + + StGraphiteMoldOut submitOutStock(StGraphiteMoldOut stGraphiteMoldOut, BladeUser user); + + List generatePreOutOrder(StGraphiteMoldOutDTO dto); + + Map batchGeneratePreOutOrder(List dtoList); + + List batchSubmitOutStock(List paramList, BladeUser user); +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java new file mode 100644 index 000000000..3e6069757 --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/service/impl/StGraphiteMoldOutServiceImpl.java @@ -0,0 +1,345 @@ +package org.springblade.wms.service.impl; + +import cn.hutool.core.util.IdUtil; +import com.baomidou.mybatisplus.core.conditions.Wrapper; +import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import jakarta.annotation.Resource; +import org.springblade.core.log.exception.ServiceException; +import org.springblade.core.mp.base.BaseServiceImpl; +import org.springblade.core.secure.BladeUser; +import org.springblade.desk.order.pojo.entity.YieldOrder; +import org.springblade.wms.excel.StGraphiteMoldOutExcel; +import org.springblade.wms.mapper.StGraphiteMoldOutMapper; +import org.springblade.wms.mapper.StRealtimeStockMapper; +import org.springblade.wms.pojo.dto.StGraphiteMoldOutDTO; +import org.springblade.wms.pojo.entity.*; +import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; +import org.springblade.wms.service.*; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.util.CollectionUtils; + +import java.util.*; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOutServiceImpl + * @description: 石墨模出库 服务实现类 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ + +@Service +public class StGraphiteMoldOutServiceImpl extends BaseServiceImpl implements IStGraphiteMoldOutService { + @Resource + StRealtimeStockMapper stRealtimeStockMapper; + @Resource + IStStockInoutRecordService stStockInoutRecordService; + @Resource + IStRealtimeStockService stRealtimeStockService; + @Resource + IStGoodsService stGoodsService; + @Resource + IStStorehouseService stStorehouseService; + @Resource + IStStorageLocationService stStorageLocationService; + + @Override + public IPage selectStGraphiteMoldOutPage(IPage page, StGraphiteMoldOutVO stGraphiteMoldOut) { + return page.setRecords(baseMapper.selectStGraphiteMoldOutPage(page, stGraphiteMoldOut)); + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List generatePreOutOrder(StGraphiteMoldOutDTO dto) { + if (dto == null) { + throw new ServiceException("石墨模信息不能为空,无法生成预出库单"); + } + Date now = new Date(); + + YieldOrder faYieldOrder = baseMapper.getByYoCode(dto.getCardNo()); + if (faYieldOrder == null) { + throw new RuntimeException("根据生产订单ID【" + dto.getCardNo() + "】未查询到生产订单信息"); + } + + List preOutStockList = new ArrayList<>(); + + String goodsCode = faYieldOrder.getPartCode(); + Double requireQty = faYieldOrder.getYpQty(); + System.out.println("石墨模编码:" + goodsCode + ",总需求:" + requireQty); + + List candidateStockList = new ArrayList<>(); + double totalUsable = 0.0; + while (true) { + StRealtimeStock maxStock = stRealtimeStockMapper.selectMaxUsableStockByMoldAttr(goodsCode); + + if (maxStock == null) { + break; + } + + double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D); + double usableQty = maxStock.getQuantity() - occupyQty; + + if (usableQty <= 0) { + break; + } + + candidateStockList.add(maxStock); + totalUsable += usableQty; + + if (totalUsable >= requireQty) { + break; + } + } + + if (totalUsable < requireQty - 0.001) { + throw new ServiceException("石墨模【" + goodsCode + "】库存不足,无法生成!需求数量:" + requireQty + ",可用库存:" + totalUsable); + } + + double remainingQty = requireQty; + for (StRealtimeStock maxStock : candidateStockList) { + if (remainingQty <= 0.001) { + break; + } + + double occupyQty = Optional.ofNullable(maxStock.getOccupyQuantity()).orElse(0D); + double usableQty = maxStock.getQuantity() - occupyQty; + double actualTake = Math.min(usableQty, remainingQty); + + StGraphiteMoldOut preOutStock = new StGraphiteMoldOut(); + preOutStock.setYoCode(faYieldOrder.getYoCode()); + preOutStock.setCardNo(dto.getCardNo()); + + preOutStock.setOutCode(stStockInoutRecordService.generateCode()); + preOutStock.setNeedQuantity(requireQty); + preOutStock.setGoodsId(maxStock.getGoodsId()); + StGoods stGoods = stGoodsService.getById(maxStock.getGoodsId()); + preOutStock.setGoodsName(stGoods.getGoodsName()); + preOutStock.setGoodsCode(stGoods.getGoodsCode()); + preOutStock.setSlId(maxStock.getSlId()); + StStorageLocation location = stStorageLocationService.getById(maxStock.getSlId()); + preOutStock.setLocation(location.getLocation()); + preOutStock.setShId(maxStock.getShId()); + StStorehouse storehouse = stStorehouseService.getById(maxStock.getShId()); + preOutStock.setShName(storehouse.getShName()); + preOutStock.setRlsId(maxStock.getId()); + preOutStock.setPiNo(maxStock.getPiNo()); + + preOutStock.setCurStatus(0L); + preOutStock.setCreateTime(now); + preOutStock.setUpdateTime(now); + + preOutStockList.add(preOutStock); + System.out.println("石墨模[编码:" + goodsCode + "]库存充足,已构建预出库信息,库存ID:" + maxStock.getId()); + + double newOccupy = occupyQty + actualTake; + maxStock.setOccupyQuantity(newOccupy); + stRealtimeStockService.updateById(maxStock); + + StRealtimeStockLock lock = new StRealtimeStockLock(); + lock.setId(IdUtil.getSnowflake().nextId()); + lock.setRlsId(maxStock.getId()); + lock.setWoNo(preOutStock.getCardNo()); + lock.setOccupyQuantity(actualTake); + lock.setStatus(0); + stRealtimeStockMapper.insertStockLock(lock); + remainingQty -= actualTake; + } + System.out.println("石墨模[编码:" + goodsCode + "] 预出库全部完成!"); + + this.saveBatch(preOutStockList); + return preOutStockList; + } + + @Override + public Map batchGeneratePreOutOrder(List dtoList) { + Map resultMap = new HashMap<>(2); + List successList = new ArrayList<>(); + List failMsgList = new ArrayList<>(); + + if (CollectionUtils.isEmpty(dtoList)) { + failMsgList.add("批量生成失败:石墨模信息集合不能为空"); + resultMap.put("successList", successList); + resultMap.put("failMsgList", failMsgList); + return resultMap; + } + + for (int i = 0; i < dtoList.size(); i++) { + StGraphiteMoldOutDTO dto = dtoList.get(i); + try { + List preOutOrderList = this.generatePreOutOrder(dto); + for (StGraphiteMoldOut item : preOutOrderList) { + if (item != null) { + successList.add(item); + } + } + } catch (ServiceException e) { + failMsgList.add(String.format("第%s条:%s", i + 1, e.getMessage())); + } catch (Exception e) { + failMsgList.add(String.format("第%s条:生成失败,未知异常:%s", i + 1, e.getMessage())); + } + } + + resultMap.put("successList", successList); + resultMap.put("failMsgList", failMsgList); + return resultMap; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public List scanCardProcess(String cardNo, BladeUser user) { + QueryWrapper queryWrapper = new QueryWrapper<>(); + queryWrapper.eq("card_no", cardNo); + queryWrapper.eq("cur_status", 0L); + + List waitOutList = baseMapper.selectList(queryWrapper); + + if (!CollectionUtils.isEmpty(waitOutList)) { + for (StGraphiteMoldOut waitOut : waitOutList) { + StRealtimeStock stock = stRealtimeStockService.getById(waitOut.getRlsId()); + + if (stock != null) { + waitOut.setStockQty(stock.getQuantity() - stock.getOccupyQuantity()); + waitOut.setPiNo(stock.getPiNo()); + } + StGoods stGoods = stGoodsService.getById(waitOut.getGoodsId()); + waitOut.setGoodsCode(stGoods.getGoodsCode()); + waitOut.setGoodsName(stGoods.getGoodsName()); + StStorehouse storehouse = stStorehouseService.getById(waitOut.getShId()); + waitOut.setShName(storehouse.getShName()); + StStorageLocation location = stStorageLocationService.getById(waitOut.getSlId()); + waitOut.setLocation(location.getLocation()); + } + return waitOutList; + }else { + StGraphiteMoldOutDTO dto = new StGraphiteMoldOutDTO(); + dto.setCardNo(cardNo); + + List stGraphiteMoldOutList = this.generatePreOutOrder(dto); + if (!CollectionUtils.isEmpty(stGraphiteMoldOutList)) { + for (StGraphiteMoldOut waitOut : stGraphiteMoldOutList) { + StRealtimeStock stock = stRealtimeStockService.getById(waitOut.getRlsId()); + + if (stock != null) { + waitOut.setStockQty(stock.getQuantity() - stock.getOccupyQuantity()); + waitOut.setPiNo(stock.getPiNo()); + } + StGoods stGoods = stGoodsService.getById(waitOut.getGoodsId()); + waitOut.setGoodsCode(stGoods.getGoodsCode()); + waitOut.setGoodsName(stGoods.getGoodsName()); + StStorehouse storehouse = stStorehouseService.getById(waitOut.getShId()); + waitOut.setShName(storehouse.getShName()); + StStorageLocation location = stStorageLocationService.getById(waitOut.getSlId()); + waitOut.setLocation(location.getLocation()); + } + return stGraphiteMoldOutList; + } + } + return null; + } + + @Override + @Transactional(rollbackFor = Exception.class) + public StGraphiteMoldOut submitOutStock(StGraphiteMoldOut param, BladeUser user) { + List outList = new ArrayList<>(); + outList.add(param); + List resultList = this.batchSubmitOutStock(outList, user); + return resultList.isEmpty() ? null : resultList.get(0); + } + + @Transactional(rollbackFor = Exception.class) + public List batchSubmitOutStock(List paramList, BladeUser user) { + if (paramList == null || paramList.isEmpty()) { + throw new ServiceException("出库数据不能为空"); + } + Long userId = Long.valueOf(user.getUserId()); + Date nowDate = new Date(); + + List allInoutList = new ArrayList<>(); + List stockList = new ArrayList<>(); + List resultList = new ArrayList<>(); + + for (StGraphiteMoldOut param : paramList) { + if (param.getId() == null) { + throw new ServiceException("出库数据ID不能为空"); + } + if (param.getOutedQuantity() == null || param.getOutedQuantity() <= 0) { + throw new ServiceException("流程卡号【"+param.getCardNo()+"】请填写正确的出库数量,数量必须大于0"); + } + + StGraphiteMoldOut outEntity = this.getById(param.getId()); + if (outEntity == null) { + throw new ServiceException("主键ID【"+param.getId()+"】未查询到该待出库数据"); + } + if (outEntity.getCurStatus() != 0L) { + throw new ServiceException("流程卡号【"+outEntity.getCardNo()+"】非待出库状态,无法提交出库"); + } + + StRealtimeStock realtimeStock = stRealtimeStockService.getById(outEntity.getRlsId()); + if (realtimeStock != null) { + stockList.add(realtimeStock); + } + + if (param.getOutedQuantity() > realtimeStock.getQuantity()) { + throw new ServiceException("流程卡号【"+outEntity.getCardNo()+"】出库数量不能大于库存总数量,库存数量为:" + realtimeStock.getQuantity()); + } + + outEntity.setRlsId(param.getRlsId()); + outEntity.setGoodsId(param.getGoodsId()); + outEntity.setShId(param.getShId()); + outEntity.setSlId(param.getSlId()); + outEntity.setOutedQuantity(param.getOutedQuantity()); + outEntity.setOutUser(userId); + outEntity.setOutTime(nowDate); + outEntity.setCurStatus(1L); + outEntity.setUpdateUser(userId); + outEntity.setUpdateTime(nowDate); + outEntity.setPicker(param.getPicker()); + this.updateById(outEntity); + + StStockInoutRecord inoutRecord = new StStockInoutRecord(); + inoutRecord.setCheckNo(outEntity.getCardNo()); + inoutRecord.setSirCode(outEntity.getOutCode()); + inoutRecord.setSlId(outEntity.getSlId()); + inoutRecord.setRlsId(outEntity.getRlsId()); + inoutRecord.setShId(outEntity.getShId()); + inoutRecord.setGoodsId(outEntity.getGoodsId()); + inoutRecord.setPiNo(realtimeStock.getPiNo()); + inoutRecord.setStovePiNo(realtimeStock.getStovePiNo()); + inoutRecord.setQuantity(param.getOutedQuantity()); + inoutRecord.setUnitPrice(realtimeStock.getBalanceMoney()); + inoutRecord.setSirMoney(param.getOutedQuantity() * realtimeStock.getBalanceMoney()); + inoutRecord.setInOutType(StStockInoutRecord.OUT_TYPE); + + inoutRecord.setInOutSource(StStockInoutRecord.INOUT_SOURCE_GRAPHITE_MOLD_OUT); + inoutRecord.setInOutDate(nowDate); + + inoutRecord.setUserId(param.getPicker()); + inoutRecord.setCreateUser(userId); + inoutRecord.setCreateTime(nowDate); + inoutRecord.setUpdateUser(userId); + inoutRecord.setUpdateTime(nowDate); + + stStockInoutRecordService.save(inoutRecord); + allInoutList.add(inoutRecord); + + outEntity.setSirId(inoutRecord.getId()); + this.updateById(outEntity); + resultList.add(outEntity); + } + + if (!allInoutList.isEmpty() && !stockList.isEmpty()) { + stRealtimeStockService.reviseRealTimeStock(allInoutList, stockList, null); + } + + return resultList; + } + + @Override + public List exportStGraphiteMoldOut(Wrapper queryWrapper) { + List list = baseMapper.exportStGraphiteMoldOut(queryWrapper); + return list; + } +} diff --git a/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGraphiteMoldOutWrapper.java b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGraphiteMoldOutWrapper.java new file mode 100644 index 000000000..a11d31e9c --- /dev/null +++ b/blade-service/blade-wms/src/main/java/org/springblade/wms/wrapper/StGraphiteMoldOutWrapper.java @@ -0,0 +1,36 @@ +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.StGraphiteMoldOut; +import org.springblade.wms.pojo.vo.StGraphiteMoldOutVO; + +import java.util.Objects; + +/** + * @version 1.0 + * @program: jonhon-mes-svr + * @ClassName StGraphiteMoldOutWrapper + * @description: 石墨模出库 包装类,返回视图层所需的字段 + * @autor: WuSiYu + * @create 2025-xx-xx xx:xx + **/ +public class StGraphiteMoldOutWrapper extends BaseEntityWrapper { + + public static StGraphiteMoldOutWrapper build() { + return new StGraphiteMoldOutWrapper(); + } + + @Override + public StGraphiteMoldOutVO entityVO(StGraphiteMoldOut stGraphiteMoldOut) { + StGraphiteMoldOutVO stGraphiteMoldOutVO = Objects.requireNonNull(BeanUtil.copyProperties(stGraphiteMoldOut, StGraphiteMoldOutVO.class)); + + //User createUser = UserCache.getUser(stGraphiteMoldOut.getCreateUser()); + //User updateUser = UserCache.getUser(stGraphiteMoldOut.getUpdateUser()); + //stGraphiteMoldOutVO.setCreateUserName(createUser.getName()); + //stGraphiteMoldOutVO.setUpdateUserName(updateUser.getName()); + + return stGraphiteMoldOutVO; + } + +}