src/main/java/com/ruoyi/basic/mapper/ProductModelMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.basic.dto.ProductModelDto; import com.ruoyi.basic.pojo.ProductModel; import com.ruoyi.basic.vo.ProductModelVo; import com.ruoyi.procurementrecord.dto.ProcurementPageDto; @@ -27,4 +28,6 @@ ProductModel selectLatestRecord(); List<Map<String, Object>> getProductAndModelList(); List<ProductModelDto> selectModelByIds( @Param("list") List<Long> productIdList); } src/main/java/com/ruoyi/common/enums/StockInQualifiedRecordTypeEnum.java
@@ -25,7 +25,9 @@ RETURN_UNSTOCK_IN("15", "éå®éè´§-ä¸åæ ¼å ¥åº"), PICK_RETURN_IN("20", "颿éæ-åæ ¼å ¥åº"), PURCHASE_RETURN_STOCK_OUT("21", "éè´éè´§"), FEED_RETURN_IN("22", "ç产éæ-åæ ¼å ¥åº"); FEED_RETURN_IN("22", "ç产éæ-åæ ¼å ¥åº"), INVENTORY_CHECK_STOCK_IN("23", "çç¹-å ¥åº"), INVENTORY_CHECK_STOCK_OUT("24", "çç¹-åºåº"); src/main/java/com/ruoyi/common/enums/StockOutQualifiedRecordTypeEnum.java
@@ -11,7 +11,8 @@ PURCHASE_RETURN_STOCK_OUT("9", "éè´éè´§"), SALE_SHIP_STOCK_OUT("13", "éå®-åè´§åºåº"), PICK_STOCK_OUT("14", "çäº§é¢æåºåº"), FEED_STOCK_OUT("15", "ç产补æåºåº"); FEED_STOCK_OUT("15", "ç产补æåºåº"), INVENTORY_CHECK_STOCK_OUT("24", "çç¹-åºåº"); private final String code; private final String value; src/main/java/com/ruoyi/procurementrecord/utils/StockUtils.java
@@ -4,7 +4,9 @@ import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.ruoyi.procurementrecord.mapper.ProcurementRecordMapper; import com.ruoyi.procurementrecord.mapper.ProcurementRecordOutMapper; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.dto.StockUninventoryDto; import com.ruoyi.stock.mapper.StockInventoryMapper; import com.ruoyi.stock.pojo.StockInRecord; @@ -87,14 +89,14 @@ * @param recordType * @param recordId */ public void addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { public StockInRecordDto addStockWithBatchNo(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(recordId); stockInventoryDto.setRecordType(String.valueOf(recordType)); stockInventoryDto.setQualitity(quantity); stockInventoryDto.setProductModelId(productModelId); stockInventoryDto.setBatchNo(batchNo); stockInventoryService.addStockInRecordOnly(stockInventoryDto); return stockInventoryService.addStockInRecordOnly(stockInventoryDto); } /** @@ -114,14 +116,14 @@ stockInventoryService.subtractStockInventory(stockInventoryDto); } public void substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { public StockOutRecordDto substractStock(Long productModelId, BigDecimal quantity, String recordType, Long recordId, String batchNo) { StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setRecordId(recordId); stockInventoryDto.setRecordType(String.valueOf(recordType)); stockInventoryDto.setQualitity(quantity); stockInventoryDto.setProductModelId(productModelId); stockInventoryDto.setBatchNo(batchNo); stockInventoryService.subtractStockInventory(stockInventoryDto); return stockInventoryService.subtractStockInventory(stockInventoryDto); } //ä¸åæ ¼åºåå é¤ src/main/java/com/ruoyi/stock/controller/StockInventoryCheckItemController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.stock.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * åºåçç¹å表 å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:44 */ @RestController @RequestMapping("/stockInventoryCheckItem") public class StockInventoryCheckItemController { } src/main/java/com/ruoyi/stock/controller/StockInventoryCheckMainController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,47 @@ package com.ruoyi.stock.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryCheckMainDto; import com.ruoyi.stock.service.StockInventoryCheckMainService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * åºåçç¹ä¸»è¡¨ å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:53 */ @RestController @RequestMapping("/stockInventoryCheckMain") @AllArgsConstructor @Tag(name = "åºåçç¹ä¸»è¡¨") public class StockInventoryCheckMainController { private final StockInventoryCheckMainService stockInventoryCheckMainService; @GetMapping("/listPage") @Operation(summary = "å页æ¥è¯¢åºåçç¹ä¸»è¡¨") public R listPage(Page page, StockInventoryCheckMainDto stockInventoryCheckMainDto) { return R.ok(stockInventoryCheckMainService.listPage(page, stockInventoryCheckMainDto)); } @GetMapping("/add") @Operation(summary = "æ·»å åºåçç¹ä¸»è¡¨") public R add(StockInventoryCheckMainDto stockInventoryCheckMainDto) { return R.ok(stockInventoryCheckMainService.add(stockInventoryCheckMainDto)); } @GetMapping("/edit") @Operation(summary = "ä¿®æ¹åºåçç¹ä¸»è¡¨") public R edit(StockInventoryCheckMainDto stockInventoryCheckMainDto) { return stockInventoryCheckMainService.updateStockInventoryCheckMainDtoById(stockInventoryCheckMainDto); } } src/main/java/com/ruoyi/stock/controller/StockInventoryCheckPlanController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,72 @@ package com.ruoyi.stock.controller; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryCheckPlanDto; import com.ruoyi.stock.service.StockInventoryCheckPlanService; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; import lombok.AllArgsConstructor; import org.springframework.web.bind.annotation.*; import java.util.List; /** * <p> * çç¹è®¡å表 å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 10:00:43 */ @RestController @RequestMapping("/stockInventoryCheckPlan") @AllArgsConstructor @Tag(name = "çç¹è®¡å表") public class StockInventoryCheckPlanController { private final StockInventoryCheckPlanService stockInventoryCheckPlanService; @GetMapping("/listPage") @Operation(summary = "å页æ¥è¯¢çç¹è®¡å表") public R listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { return R.ok(stockInventoryCheckPlanService.listPage(page, stockInventoryCheckPlanDto)); } @PostMapping("/add") @Operation(summary = "æ·»å çç¹è®¡å表") public R add(@RequestBody StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { return stockInventoryCheckPlanService.add(stockInventoryCheckPlanDto ); } @PutMapping("/update") @Operation(summary = "ä¿®æ¹çç¹è®¡å表") public R edit(@RequestBody StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { return stockInventoryCheckPlanService.edit(stockInventoryCheckPlanDto ); } @DeleteMapping("/delete") @Operation(summary = "å é¤çç¹è®¡å表") public R delete(@RequestBody List<Long> ids) { return stockInventoryCheckPlanService.delete(ids ); } @Operation(summary = "å¼å§çç¹") @PostMapping("/start/{id}") public R start(@PathVariable Long id) { return stockInventoryCheckPlanService.start(id); } @Operation(summary = "çç¹è®¡å详æ ") @GetMapping("/detail/{id}") public R detail(@PathVariable Long id) { return R.ok(stockInventoryCheckPlanService.detail(id)); } @Operation(summary = "ç»æçç¹") @PostMapping("/end") public R end(@RequestBody StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { return stockInventoryCheckPlanService.end(stockInventoryCheckPlanDto); } } src/main/java/com/ruoyi/stock/controller/StockInventoryCheckProductController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.stock.controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * <p> * åºåçç¹åå表 å端æ§å¶å¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 02:04:26 */ @RestController @RequestMapping("/stockInventoryCheckProduct") public class StockInventoryCheckProductController { } src/main/java/com/ruoyi/stock/controller/StockInventoryController.java
@@ -44,6 +44,13 @@ return R.ok(stockInventoryDtoIPage); } @GetMapping("/pagestockInventoryNoQua") @Operation(summary = "å页æ¥è¯¢åºå产åï¼ä¸è¦æ°é") public R pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) { IPage<StockInventoryDto> stockInventoryDtoIPage = stockInventoryService.pagestockInventoryNoQua(page, stockInventoryDto); return R.ok(stockInventoryDtoIPage); } @GetMapping("/pageListCombinedStockInventory") @Operation(summary = "å页æ¥è¯¢èååºåå表") public R pageListCombinedStockInventory(Page page, StockInventoryDto stockInventoryDto) { src/main/java/com/ruoyi/stock/dto/StockInventoryCheckItemDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,9 @@ package com.ruoyi.stock.dto; import com.ruoyi.stock.pojo.StockInventoryCheckItem; import lombok.Data; @Data public class StockInventoryCheckItemDto extends StockInventoryCheckItem { } src/main/java/com/ruoyi/stock/dto/StockInventoryCheckMainDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,11 @@ package com.ruoyi.stock.dto; import com.ruoyi.stock.pojo.StockInventoryCheckMain; import lombok.Data; import java.util.List; @Data public class StockInventoryCheckMainDto extends StockInventoryCheckMain { private List<StockInventoryCheckItemDto> stockInventoryCheckItemDtos; } src/main/java/com/ruoyi/stock/dto/StockInventoryCheckPlanDto.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,21 @@ package com.ruoyi.stock.dto; import com.ruoyi.stock.pojo.StockInventoryCheckItem; import com.ruoyi.stock.pojo.StockInventoryCheckPlan; import com.ruoyi.stock.pojo.StockInventoryCheckProduct; import lombok.Data; import java.util.List; @Data public class StockInventoryCheckPlanDto extends StockInventoryCheckPlan { private List<Long> productIdList; private String createBy; private String startTime; private String endTime; private List<StockInventoryCheckProduct> items; private List<StockInventoryCheckItem> checkItems; } src/main/java/com/ruoyi/stock/dto/StockInventoryDto.java
@@ -15,6 +15,7 @@ private String productName; private String model; private String unit; private String specificationModel; //å ¥åºç±»å src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckItemMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.stock.pojo.StockInventoryCheckItem; import org.apache.ibatis.annotations.Mapper; /** * <p> * åºåçç¹å表 Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:44 */ @Mapper public interface StockInventoryCheckItemMapper extends BaseMapper<StockInventoryCheckItem> { } src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckMainMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.stock.pojo.StockInventoryCheckMain; import org.apache.ibatis.annotations.Mapper; /** * <p> * åºåçç¹ä¸»è¡¨ Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:53 */ @Mapper public interface StockInventoryCheckMainMapper extends BaseMapper<StockInventoryCheckMain> { } src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckPlanMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,23 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.stock.dto.StockInventoryCheckPlanDto; import com.ruoyi.stock.pojo.StockInventoryCheckPlan; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * <p> * çç¹è®¡å表 Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 10:00:43 */ @Mapper public interface StockInventoryCheckPlanMapper extends BaseMapper<StockInventoryCheckPlan> { IPage<StockInventoryCheckPlanDto> listPage(Page page,@Param("ew") StockInventoryCheckPlanDto stockInventoryCheckPlanDto); } src/main/java/com/ruoyi/stock/mapper/StockInventoryCheckProductMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,18 @@ package com.ruoyi.stock.mapper; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.ruoyi.stock.pojo.StockInventoryCheckProduct; import org.apache.ibatis.annotations.Mapper; /** * <p> * åºåçç¹åå表 Mapper æ¥å£ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 02:04:26 */ @Mapper public interface StockInventoryCheckProductMapper extends BaseMapper<StockInventoryCheckProduct> { } src/main/java/com/ruoyi/stock/mapper/StockInventoryMapper.java
@@ -56,4 +56,8 @@ List<StockInventory> listSelectableBatchNoByProductModelIds(@Param("productModelIds") List<Long> productModelIds); List<StockInventory> getByModelId(@Param("productModelId") Long productModelId); List<StockInventoryDto> selectStockInvenrory(Long productModelId); IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, @Param("ew") StockInventoryDto stockInventoryDto); } src/main/java/com/ruoyi/stock/pojo/StockInventory.java
@@ -72,4 +72,6 @@ @TableField(fill = FieldFill.INSERT) private Long deptId; @Schema(description = "æ¯å¦éå®") private Boolean locked; } src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckItem.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,124 @@ package com.ruoyi.stock.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDateTime; /** * <p> * åºåçç¹å表 * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:44 */ @Getter @Setter @ToString @TableName("stock_inventory_check_item") @ApiModel(value = "StockInventoryCheckItem对象", description = "åºåçç¹å表") public class StockInventoryCheckItem implements Serializable { private static final long serialVersionUID = 1L; /** * 主é®ID */ @Schema(description ="主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 主表ID */ @Schema(description ="主表ID") private Long mainId; /** * ååID */ @Schema(description ="ååID") private Long productModelId; /** * ååç¼ç */ @Schema(description ="ååç¼ç ") private String productCode; /** * åååç§° */ @Schema(description ="åååç§°") private String productName; /** * è§æ ¼åå· */ @Schema(description ="è§æ ¼åå·") private String model; /** * åä½ */ @Schema(description ="åä½") private String unit; /** * æ¹å· */ @Schema(description ="æ¹å·") private String batchNo; /** * ç³»ç»åºåæ°é */ @Schema(description ="ç³»ç»åºåæ°é") private BigDecimal systemQuantity; /** * å®é çç¹æ°é */ @Schema(description ="å®é çç¹æ°é") private BigDecimal actualQuantity; /** * 差弿°éï¼å®é -ç³»ç»ï¼ */ @Schema(description ="差弿°éï¼å®é -ç³»ç»ï¼") private BigDecimal differenceQuantity; /** * 夿³¨ */ @Schema(description ="夿³¨") private String remark; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * æ´æ°æ¶é´ */ @Schema(description ="æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; private Long deptId; } src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckMain.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,129 @@ package com.ruoyi.stock.pojo; import com.baomidou.mybatisplus.annotation.*; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.math.BigDecimal; import java.time.LocalDate; import java.time.LocalDateTime; /** * <p> * åºåçç¹ä¸»è¡¨ * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:53 */ @Getter @Setter @ToString @TableName("stock_inventory_check_main") @ApiModel(value = "StockInventoryCheckMain对象", description = "åºåçç¹ä¸»è¡¨") public class StockInventoryCheckMain implements Serializable { private static final long serialVersionUID = 1L; /** * 主é®ID */ @Schema(description ="主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * çç¹åå· */ @Schema(description ="çç¹åå·") private String checkNo; /** * çç¹ç±»åï¼1-宿çç¹ï¼2-临æ¶çç¹ï¼3-æ½æ ·çç¹ */ @Schema(description ="çç¹ç±»åï¼1-宿çç¹ï¼2-临æ¶çç¹ï¼3-æ½æ ·çç¹") private String checkType; /** * çç¹æ»æ°é */ @Schema(description ="çç¹æ»æ°é") private BigDecimal totalQuantity; /** * æ¥æºç±»åï¼1-计åçæï¼2-æå¨å建 */ @Schema(description ="æ¥æºç±»åï¼1-计åçæï¼2-æå¨å建") private String sourceType; /** * æ¥æºIDï¼å ³èçç¹è®¡åIDï¼ */ @Schema(description ="æ¥æºIDï¼å ³èçç¹è®¡åIDï¼") private Long sourceId; /** * ç¶æï¼0-å¾ çç¹ï¼1-çç¹ä¸ï¼2-已宿ï¼3-å·²å®¡æ ¸ï¼4-已忶 */ @Schema(description ="ç¶æï¼0-å¾ çç¹ï¼1-çç¹ä¸ï¼2-已宿ï¼3-å·²å®¡æ ¸ï¼4-已忶") private Integer status; /** * çç¹æ¥æ */ @Schema(description ="çç¹æ¥æ") private LocalDate checkDate; /** * è´è´£äººID */ @Schema(description ="è´è´£äººID") private Long responsiblePersonId; /** * è´è´£äººå§å */ @Schema(description ="è´è´£äººå§å") private String responsiblePersonName; /** * 夿³¨ */ @Schema(description ="夿³¨") private String remark; /** * å建æ¶é´ */ @Schema(description ="å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; /** * å建人 */ @Schema(description ="å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * æ´æ°æ¶é´ */ @Schema(description ="æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * æ´æ°äºº */ @Schema(description ="æ´æ°äºº") @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; private Long deptId; } src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckPlan.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,115 @@ package com.ruoyi.stock.pojo; import com.baomidou.mybatisplus.annotation.*; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.v3.oas.annotations.media.Schema; import lombok.Getter; import lombok.Setter; import lombok.ToString; import org.springframework.format.annotation.DateTimeFormat; import java.io.Serializable; import java.time.LocalDate; import java.time.LocalDateTime; /** * <p> * çç¹è®¡å表 * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 10:00:43 */ @Getter @Setter @ToString @TableName("stock_inventory_check_plan") @ApiModel(value = "StockInventoryCheckPlan对象", description = "çç¹è®¡å表") public class StockInventoryCheckPlan implements Serializable { private static final long serialVersionUID = 1L; /** * 主é®ID */ @Schema(description = "主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; /** * 计åç¼å· */ @Schema(description = "计åç¼å·") private String planNo; /** * è´è´£äººID */ @Schema(description = "çç¹äººid") private Long checkerId; /** * è´è´£äººå§å */ @Schema(description = "çç¹äººåå") private String checkerName; /** * è®¡åæ¥æ */ @Schema(description = "è®¡åæ¥æ") @DateTimeFormat(pattern = "yyyy-MM-dd") @JsonFormat(pattern = "yyyy-MM-dd") private LocalDate planDate; /** * ç¶æï¼0-å¾ æ§è¡ï¼1-æ§è¡ä¸ï¼2-已宿ï¼3-已忶 */ @Schema(description = "ç¶æï¼0-å¾ æ§è¡ï¼1-æ§è¡ä¸ï¼2-已宿ï¼3-已忶") private Integer status; /** * å建æ¶é´ */ @Schema(description = "å建æ¶é´") @TableField(fill = FieldFill.INSERT) private LocalDate createTime; /** * å建人 */ @Schema(description = "å建人") @TableField(fill = FieldFill.INSERT) private Long createUser; /** * æ´æ°æ¶é´ */ @Schema(description = "æ´æ°æ¶é´") @TableField(fill = FieldFill.INSERT_UPDATE) private LocalDateTime updateTime; /** * æ´æ°äºº */ @Schema(description = "æ´æ°äºº") @TableField(fill = FieldFill.INSERT_UPDATE) private Long updateUser; /** * 夿³¨ */ @Schema(description = "夿³¨") private String remark; /** * å 餿 å¿ï¼0代表åå¨ 1代表å é¤ï¼ */ @Schema(description = "å 餿 å¿ï¼0代表åå¨ 1代表å é¤ï¼") private String delFlag; private Long deptId; } src/main/java/com/ruoyi/stock/pojo/StockInventoryCheckProduct.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,70 @@ package com.ruoyi.stock.pojo; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; import lombok.Setter; import lombok.ToString; import java.io.Serializable; import java.math.BigDecimal; /** * <p> * åºåçç¹åå表 * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 02:04:26 */ @Getter @Setter @ToString @TableName("stock_inventory_check_product") @ApiModel(value = "StockInventoryCheckProduct对象", description = "åºåçç¹åå表") public class StockInventoryCheckProduct implements Serializable { private static final long serialVersionUID = 1L; /** * 主é®ID */ @ApiModelProperty("主é®ID") @TableId(value = "id", type = IdType.AUTO) private Long id; private Long inventoryCheckPlanId; /** * ååID */ @ApiModelProperty("ååID") private Long productModelId; /** * åååç§° */ @ApiModelProperty("åååç§°") private String productName; /** * è§æ ¼åå· */ @ApiModelProperty("è§æ ¼åå·") private String model; /** * åä½ */ @ApiModelProperty("åä½") private String unit; /** * ç³»ç»åºåæ°é */ @ApiModelProperty("ç³»ç»åºåæ°é") private BigDecimal systemQuantity; } src/main/java/com/ruoyi/stock/service/StockInRecordService.java
@@ -12,7 +12,7 @@ public interface StockInRecordService extends IService<StockInRecord> { IPage<StockInRecordDto> listPage(Page page, StockInRecordDto stockInRecordDto); int add(StockInRecordDto stockInRecordDto); Long add(StockInRecordDto stockInRecordDto); int update(Long id, StockInRecordDto stockInRecordDto); src/main/java/com/ruoyi/stock/service/StockInventoryCheckItemService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.stock.service; import com.ruoyi.stock.pojo.StockInventoryCheckItem; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * åºåçç¹å表 æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:44 */ public interface StockInventoryCheckItemService extends IService<StockInventoryCheckItem> { } src/main/java/com/ruoyi/stock/service/StockInventoryCheckMainService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ package com.ruoyi.stock.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryCheckMainDto; import com.ruoyi.stock.pojo.StockInventoryCheckMain; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * åºåçç¹ä¸»è¡¨ æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:53 */ public interface StockInventoryCheckMainService extends IService<StockInventoryCheckMain> { IPage<StockInventoryCheckMainDto> listPage(Page page, StockInventoryCheckMainDto stockInventoryCheckMainDto); Boolean add(StockInventoryCheckMainDto stockInventoryCheckMainDto); R updateStockInventoryCheckMainDtoById(StockInventoryCheckMainDto stockInventoryCheckMainDto); } src/main/java/com/ruoyi/stock/service/StockInventoryCheckPlanService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,36 @@ package com.ruoyi.stock.service; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryCheckPlanDto; import com.ruoyi.stock.pojo.StockInventoryCheckPlan; import java.util.List; /** * <p> * çç¹è®¡å表 æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 10:00:43 */ public interface StockInventoryCheckPlanService extends IService<StockInventoryCheckPlan> { R add(StockInventoryCheckPlanDto stockInventoryCheckPlanDto); R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto); R delete(List<Long> ids); IPage<StockInventoryCheckPlanDto> listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto); R start(Long id); R end(StockInventoryCheckPlanDto stockInventoryCheckPlanDto); StockInventoryCheckPlanDto detail(Long id); } src/main/java/com/ruoyi/stock/service/StockInventoryCheckProductService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,16 @@ package com.ruoyi.stock.service; import com.ruoyi.stock.pojo.StockInventoryCheckProduct; import com.baomidou.mybatisplus.extension.service.IService; /** * <p> * åºåçç¹åå表 æå¡ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 02:04:26 */ public interface StockInventoryCheckProductService extends IService<StockInventoryCheckProduct> { } src/main/java/com/ruoyi/stock/service/StockInventoryService.java
@@ -6,6 +6,7 @@ import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInRecordDto; import com.ruoyi.stock.dto.StockInventoryDto; import com.ruoyi.stock.dto.StockOutRecordDto; import com.ruoyi.stock.pojo.StockInventory; import jakarta.servlet.http.HttpServletResponse; import org.springframework.web.multipart.MultipartFile; @@ -28,9 +29,9 @@ Boolean addstockInventory(StockInventoryDto stockInventoryDto); Boolean subtractStockInventory(StockInventoryDto stockInventoryDto); StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto); Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto); StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto); Boolean addStockOutRecordOnly(StockInventoryDto stockInventoryDto); @@ -47,4 +48,8 @@ Boolean thawStock(StockInventoryDto stockInventoryDto); List<StockInventory> getByModelId(Long modelId); List<StockInventoryDto> selectStockInvenrory(Long productModelId); IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto); } src/main/java/com/ruoyi/stock/service/StockOutRecordService.java
@@ -20,7 +20,7 @@ public interface StockOutRecordService extends IService<StockOutRecord> { IPage<StockOutRecordDto> listPage(Page page, StockOutRecordDto stockOutRecordDto); int add(StockOutRecordDto stockOutRecordDto); Long add(StockOutRecordDto stockOutRecordDto); int update(Long id, StockOutRecordDto stockOutRecordDto); src/main/java/com/ruoyi/stock/service/impl/StockInRecordServiceImpl.java
@@ -48,12 +48,13 @@ // æ°å¢å ¥åº @Override @Transactional(rollbackFor = Exception.class) public int add(StockInRecordDto stockInRecordDto) { public Long add(StockInRecordDto stockInRecordDto) { String no = OrderUtils.countTodayByCreateTime(stockInRecordMapper, "RK","inbound_batches"); stockInRecordDto.setInboundBatches(no); StockInRecord stockInRecord = new StockInRecord(); BeanUtils.copyProperties(stockInRecordDto, stockInRecord); return stockInRecordMapper.insert(stockInRecord); stockInRecordMapper.insert(stockInRecord); return stockInRecord.getId(); } @Override src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckItemServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.stock.service.impl; import com.ruoyi.stock.pojo.StockInventoryCheckItem; import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper; import com.ruoyi.stock.service.StockInventoryCheckItemService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * åºåçç¹å表 æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:44 */ @Service public class StockInventoryCheckItemServiceImpl extends ServiceImpl<StockInventoryCheckItemMapper, StockInventoryCheckItem> implements StockInventoryCheckItemService { } src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckMainServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,62 @@ package com.ruoyi.stock.service.impl; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.common.utils.bean.BeanUtils; import com.ruoyi.framework.web.domain.R; import com.ruoyi.stock.dto.StockInventoryCheckItemDto; import com.ruoyi.stock.dto.StockInventoryCheckMainDto; import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper; import com.ruoyi.stock.mapper.StockInventoryCheckMainMapper; import com.ruoyi.stock.pojo.StockInventoryCheckItem; import com.ruoyi.stock.pojo.StockInventoryCheckMain; import com.ruoyi.stock.service.StockInventoryCheckMainService; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.util.ArrayList; /** * <p> * åºåçç¹ä¸»è¡¨ æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 09:57:53 */ @Service @RequiredArgsConstructor public class StockInventoryCheckMainServiceImpl extends ServiceImpl<StockInventoryCheckMainMapper, StockInventoryCheckMain> implements StockInventoryCheckMainService { private final StockInventoryCheckItemMapper stockInventoryCheckItemMapper; private final StockInventoryCheckMainMapper stockInventoryCheckMainMapper; @Override public IPage<StockInventoryCheckMainDto> listPage(Page page, StockInventoryCheckMainDto stockInventoryCheckMainDto) { return null; } @Override public Boolean add(StockInventoryCheckMainDto stockInventoryCheckMainDto) { String checkNo = OrderUtils.countTodayByCreateTime(stockInventoryCheckMainMapper, "PD", "check_no"); stockInventoryCheckMainDto.setCheckNo(checkNo); this.save(stockInventoryCheckMainDto); ArrayList<StockInventoryCheckItem> stockInventoryCheckItems = new ArrayList<>(); for (StockInventoryCheckItemDto itemDto : stockInventoryCheckMainDto.getStockInventoryCheckItemDtos()) { StockInventoryCheckItem stockInventoryCheckItem = new StockInventoryCheckItem(); BeanUtils.copyProperties(itemDto, stockInventoryCheckItem); stockInventoryCheckItem.setMainId(stockInventoryCheckMainDto.getId()); stockInventoryCheckItems.add(stockInventoryCheckItem); } stockInventoryCheckItemMapper.insert(stockInventoryCheckItems); return true; } @Override public R updateStockInventoryCheckMainDtoById(StockInventoryCheckMainDto stockInventoryCheckMainDto) { return null; } } src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckPlanServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,235 @@ package com.ruoyi.stock.service.impl; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.StockInQualifiedRecordTypeEnum; import com.ruoyi.common.utils.OrderUtils; import com.ruoyi.framework.web.domain.R; import com.ruoyi.procurementrecord.utils.StockUtils; import com.ruoyi.project.system.domain.SysUser; import com.ruoyi.project.system.mapper.SysUserMapper; import com.ruoyi.stock.dto.*; import com.ruoyi.stock.mapper.StockInventoryCheckItemMapper; import com.ruoyi.stock.mapper.StockInventoryCheckPlanMapper; import com.ruoyi.stock.mapper.StockInventoryCheckProductMapper; import com.ruoyi.stock.pojo.*; import com.ruoyi.stock.service.*; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.Objects; /** * <p> * çç¹è®¡å表 æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 10:00:43 */ @Service @RequiredArgsConstructor public class StockInventoryCheckPlanServiceImpl extends ServiceImpl<StockInventoryCheckPlanMapper, StockInventoryCheckPlan> implements StockInventoryCheckPlanService { private final StockInventoryCheckPlanMapper stockInventoryCheckPlanMapper; private final StockInventoryCheckProductMapper stockInventoryCheckProductMapper; private final SysUserMapper sysUserMapper; private final StockInventoryCheckMainService stockInventoryCheckMainService; private final StockInventoryService stockInventoryService; private final StockInventoryCheckItemMapper stockInventoryCheckItemMapper; private final StockUtils stockUtils; private final StockInRecordService stockInRecordService; private final StockOutRecordService stockOutRecordService; @Override public IPage<StockInventoryCheckPlanDto> listPage(Page page, StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { IPage<StockInventoryCheckPlanDto> stockInventoryCheckPlanDtoIPage = stockInventoryCheckPlanMapper.listPage(page, stockInventoryCheckPlanDto); stockInventoryCheckPlanDtoIPage.getRecords().forEach(item -> { List<StockInventoryCheckProduct> stockInventoryCheckProducts = stockInventoryCheckProductMapper.selectList(new LambdaQueryWrapper<StockInventoryCheckProduct>().eq(StockInventoryCheckProduct::getInventoryCheckPlanId, item.getId())); item.setItems(stockInventoryCheckProducts); }); return stockInventoryCheckPlanDtoIPage ; } @Override public R start(Long id) { StockInventoryCheckPlan stockInventoryCheckPlan = this.getById(id); StockInventoryCheckPlanDto stockInventoryCheckPlanDto = new StockInventoryCheckPlanDto(); BeanUtil.copyProperties(stockInventoryCheckPlan, stockInventoryCheckPlanDto); List<StockInventoryCheckProduct> stockInventoryCheckProducts = stockInventoryCheckProductMapper.selectList(new LambdaQueryWrapper<StockInventoryCheckProduct>().eq(StockInventoryCheckProduct::getInventoryCheckPlanId, id)); stockInventoryCheckPlanDto.setItems(stockInventoryCheckProducts); BigDecimal totalQuantity = stockInventoryCheckPlanDto.getItems().stream() .peek(item -> { item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId()); List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId())); BigDecimal systemQty = list.stream() .map(StockInventory::getQualitity) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); item.setSystemQuantity(systemQty); }) .map(StockInventoryCheckProduct::getSystemQuantity) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); //æ°å¢åºåçç¹ ArrayList<StockInventoryCheckItemDto> stockInventoryCheckItemDtos = new ArrayList<>(); StockInventoryCheckMainDto stockInventoryCheckMainDto = new StockInventoryCheckMainDto(); stockInventoryCheckMainDto.setCheckType("1"); stockInventoryCheckMainDto.setTotalQuantity(totalQuantity); stockInventoryCheckMainDto.setSourceType("1"); stockInventoryCheckMainDto.setSourceId(stockInventoryCheckPlanDto.getId()); stockInventoryCheckMainDto.setStatus(0); stockInventoryCheckPlanDto.getItems().forEach(item -> { List<StockInventoryDto> list = stockInventoryService.selectStockInvenrory(item.getProductModelId()); //éå®åºå list.forEach(inventory -> { inventory.setLocked(true); stockInventoryService.updateById(inventory); }); for (StockInventoryDto stockInventory : list) { StockInventoryCheckItemDto stockInventoryCheckItemDto = new StockInventoryCheckItemDto(); stockInventoryCheckItemDto.setProductModelId(stockInventory.getProductModelId()); stockInventoryCheckItemDto.setBatchNo(stockInventory.getBatchNo()); stockInventoryCheckItemDto.setSystemQuantity(stockInventory.getQualitity()); stockInventoryCheckItemDto.setModel(stockInventory.getModel()); stockInventoryCheckItemDto.setUnit(stockInventory.getUnit()); stockInventoryCheckItemDto.setProductName(stockInventory.getProductName()); stockInventoryCheckItemDtos.add(stockInventoryCheckItemDto); } }); stockInventoryCheckMainDto.setStockInventoryCheckItemDtos(stockInventoryCheckItemDtos); stockInventoryCheckMainService.add(stockInventoryCheckMainDto); stockInventoryCheckPlan.setStatus(1); this.updateById(stockInventoryCheckPlan); return R.ok(); } @Override public R end(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { StockInventoryCheckPlan plan = this.getById(stockInventoryCheckPlanDto.getId()); if (plan == null) { return R.fail("çç¹åä¸åå¨"); } for (StockInventoryCheckItem item : stockInventoryCheckPlanDto.getCheckItems()) { if (item.getDifferenceQuantity() == null || item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) == 0) { continue; } StockInventoryDto stockInventoryDto = new StockInventoryDto(); stockInventoryDto.setProductModelId(item.getProductModelId()); stockInventoryDto.setBatchNo(item.getBatchNo()); stockInventoryDto.setQualitity(item.getDifferenceQuantity()); stockInventoryDto.setRecordId(stockInventoryCheckPlanDto.getId()); if (item.getDifferenceQuantity().compareTo(BigDecimal.ZERO) > 0) { stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_OUT.getCode()); StockInRecordDto stockInRecordDto = stockUtils.addStockWithBatchNo(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo()); //ç´æ¥å®¡æ ¸éè¿ stockInRecordService.batchApprove(Collections.singletonList(stockInRecordDto.getId()), 1); }else { stockInventoryDto.setRecordType(StockInQualifiedRecordTypeEnum.INVENTORY_CHECK_STOCK_IN.getCode()); StockOutRecordDto stockOutRecordDto = stockUtils.substractStock(stockInventoryDto.getProductModelId(), stockInventoryDto.getQualitity(), stockInventoryDto.getRecordType(), stockInventoryDto.getRecordId(), stockInventoryDto.getBatchNo()); //ç´æ¥å®¡æ ¸éè¿ stockOutRecordService.batchApprove(Collections.singletonList(stockOutRecordDto.getId()), 1); } } stockInventoryCheckItemMapper.updateById(stockInventoryCheckPlanDto.getCheckItems()); plan.setStatus(2); this.updateById(plan); return R.ok("çç¹å®æï¼åºåå·²è°æ´"); } @Override public StockInventoryCheckPlanDto detail(Long id) { StockInventoryCheckPlan byId = this.getById(id); if (byId == null) { return null; } StockInventoryCheckPlanDto stockInventoryCheckPlanDto = new StockInventoryCheckPlanDto(); BeanUtil.copyProperties(byId, stockInventoryCheckPlanDto); List<StockInventoryCheckProduct> items = stockInventoryCheckProductMapper.selectList( new LambdaQueryWrapper<StockInventoryCheckProduct>() .eq(StockInventoryCheckProduct::getInventoryCheckPlanId, id)); stockInventoryCheckPlanDto.setItems(items); StockInventoryCheckMain checkMain = stockInventoryCheckMainService.getOne( new LambdaQueryWrapper<StockInventoryCheckMain>() .eq(StockInventoryCheckMain::getSourceId, id)); if (checkMain != null) { List<StockInventoryCheckItem> checkItems = stockInventoryCheckItemMapper.selectList( new LambdaQueryWrapper<StockInventoryCheckItem>() .eq(StockInventoryCheckItem::getMainId, checkMain.getId())); stockInventoryCheckPlanDto.setCheckItems(checkItems); } return stockInventoryCheckPlanDto; } @Override public R add(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId()); stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName()); //çæçç¹è®¡åç¼å· if (ObjectUtils.isEmpty(stockInventoryCheckPlanDto.getPlanNo())) { stockInventoryCheckPlanDto.setPlanNo(OrderUtils.countTodayByCreateTime( stockInventoryCheckPlanMapper, "PD", "plan_no")); } //æ°å¢è®¡å this.save(stockInventoryCheckPlanDto); //设置çç¹ååå ³èIDå¹¶æ¥è¯¢ç³»ç»åºå stockInventoryCheckPlanDto.getItems().forEach(item -> { item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId()); List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId())); BigDecimal systemQty = list.stream() .map(StockInventory::getQualitity) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); item.setSystemQuantity(systemQty); }); //æ°å¢çç¹åå stockInventoryCheckProductMapper.insert(stockInventoryCheckPlanDto.getItems()); return R.ok(); } @Override public R edit(StockInventoryCheckPlanDto stockInventoryCheckPlanDto) { SysUser sysUser = sysUserMapper.selectUserById(stockInventoryCheckPlanDto.getCheckerId()); stockInventoryCheckPlanDto.setCheckerName(sysUser.getNickName()); //èµå¼ //设置çç¹ååå ³èIDå¹¶æ¥è¯¢ç³»ç»åºå stockInventoryCheckPlanDto.getItems().forEach(item -> { item.setInventoryCheckPlanId(stockInventoryCheckPlanDto.getId()); List<StockInventory> list = stockInventoryService.list(new LambdaQueryWrapper<StockInventory>().eq(StockInventory::getProductModelId, item.getProductModelId())); BigDecimal systemQty = list.stream() .map(StockInventory::getQualitity) .filter(Objects::nonNull) .reduce(BigDecimal.ZERO, BigDecimal::add); item.setSystemQuantity(systemQty); }); //æ´æ°ææ°å¢ stockInventoryCheckProductMapper.insertOrUpdate(stockInventoryCheckPlanDto.getItems()); return R.ok(this.updateById(stockInventoryCheckPlanDto)); } @Override public R delete(List<Long> ids) { List<StockInventoryCheckPlan> list = this.list(new LambdaQueryWrapper<StockInventoryCheckPlan>().in(StockInventoryCheckPlan::getId, ids)); boolean hasNonZeroStatus = list.stream().anyMatch(plan -> plan.getStatus() != null && plan.getStatus() != 0); if (hasNonZeroStatus) { return R.fail("åå¨å·²æ§è¡æè æ£å¨æ§è¡ççç¹è®¡åï¼ä¸å 许å é¤"); } return R.ok(this.removeByIds(ids)); } } src/main/java/com/ruoyi/stock/service/impl/StockInventoryCheckProductServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,20 @@ package com.ruoyi.stock.service.impl; import com.ruoyi.stock.pojo.StockInventoryCheckProduct; import com.ruoyi.stock.mapper.StockInventoryCheckProductMapper; import com.ruoyi.stock.service.StockInventoryCheckProductService; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import org.springframework.stereotype.Service; /** * <p> * åºåçç¹åå表 æå¡å®ç°ç±» * </p> * * @author è¯å¯¼è½¯ä»¶ï¼æ±èï¼æéå ¬å¸ * @since 2026-05-09 02:04:26 */ @Service public class StockInventoryCheckProductServiceImpl extends ServiceImpl<StockInventoryCheckProductMapper, StockInventoryCheckProduct> implements StockInventoryCheckProductService { } src/main/java/com/ruoyi/stock/service/impl/StockInventoryServiceImpl.java
@@ -115,7 +115,7 @@ //åºåºè°ç¨ @Override @Transactional(rollbackFor = Exception.class) public Boolean subtractStockInventory(StockInventoryDto stockInventoryDto) { public StockOutRecordDto subtractStockInventory(StockInventoryDto stockInventoryDto) { LambdaQueryWrapper<StockInventory> eq = new QueryWrapper<StockInventory>().lambda() .eq(StockInventory::getProductModelId, stockInventoryDto.getProductModelId()); if (StringUtils.isEmpty(stockInventoryDto.getBatchNo())) { @@ -130,9 +130,11 @@ stockOutRecordDto.setRecordType(stockInventoryDto.getRecordType()); stockOutRecordDto.setStockOutNum(stockInventoryDto.getQualitity()); stockOutRecordDto.setBatchNo(stockInventoryDto.getBatchNo()); stockOutRecordDto.setApprovalStatus(0); stockOutRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); stockOutRecordDto.setType("0"); stockOutRecordService.add(stockOutRecordDto); Long id = stockOutRecordService.add(stockOutRecordDto); stockInventoryDto.setId(id); StockInventory oldStockInventory = stockInventoryMapper.selectOne(eq); @@ -148,12 +150,12 @@ } stockInventoryMapper.updateSubtractStockInventory(stockInventoryDto); return true; return stockOutRecordDto; } @Override @Transactional(rollbackFor = Exception.class) public Boolean addStockInRecordOnly(StockInventoryDto stockInventoryDto) { public StockInRecordDto addStockInRecordOnly(StockInventoryDto stockInventoryDto) { String batchNo = StringUtils.trim(stockInventoryDto.getBatchNo()); if (StringUtils.isEmpty(batchNo)) { batchNo = generateAutoBatchNo(stockInventoryDto.getProductModelId()); @@ -165,11 +167,13 @@ stockInRecordDto.setRecordType(stockInventoryDto.getRecordType()); stockInRecordDto.setStockInNum(stockInventoryDto.getQualitity()); stockInRecordDto.setBatchNo(batchNo); stockInRecordDto.setApprovalStatus(0); stockInRecordDto.setProductModelId(stockInventoryDto.getProductModelId()); stockInRecordDto.setType("0"); stockInRecordDto.setRemark(stockInventoryDto.getRemark()); stockInRecordService.add(stockInRecordDto); return true; Long add = stockInRecordService.add(stockInRecordDto); stockInRecordDto.setId( add); return stockInRecordDto; } //è§åçæï¼20260424-产åç¼å·-001 @@ -434,4 +438,14 @@ public List<StockInventory> getByModelId(Long modelId) { return stockInventoryMapper.getByModelId(modelId); } @Override public List<StockInventoryDto> selectStockInvenrory(Long productModelId) { return stockInventoryMapper.selectStockInvenrory(productModelId); } @Override public IPage<StockInventoryDto> pagestockInventoryNoQua(Page page, StockInventoryDto stockInventoryDto) { return stockInventoryMapper.pagestockInventoryNoQua(page, stockInventoryDto); } } src/main/java/com/ruoyi/stock/service/impl/StockOutRecordServiceImpl.java
@@ -5,8 +5,8 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.enums.ReviewStatusEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockInUnQualifiedRecordTypeEnum; import com.ruoyi.common.enums.StockOutQualifiedRecordTypeEnum; import com.ruoyi.common.exception.base.BaseException; import com.ruoyi.common.utils.EnumUtil; import com.ruoyi.common.utils.OrderUtils; @@ -25,14 +25,12 @@ import com.ruoyi.stock.pojo.StockOutRecord; import com.ruoyi.stock.pojo.StockUninventory; import com.ruoyi.stock.service.StockOutRecordService; import lombok.AllArgsConstructor; import jakarta.servlet.http.HttpServletResponse; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import jakarta.servlet.http.HttpServletResponse; import java.util.List; /** @@ -56,12 +54,13 @@ } @Override public int add(StockOutRecordDto stockOutRecordDto) { public Long add(StockOutRecordDto stockOutRecordDto) { String no = OrderUtils.countTodayByCreateTime(stockOutRecordMapper, "CK","outbound_batches"); stockOutRecordDto.setOutboundBatches(no); StockInRecord stockInRecord = new StockInRecord(); BeanUtils.copyProperties(stockOutRecordDto, stockInRecord); return stockOutRecordMapper.insert(stockOutRecordDto); stockOutRecordMapper.insert(stockOutRecordDto); return stockOutRecordDto.getId(); } @Override src/main/resources/mapper/basic/ProductModelMapper.xml
@@ -140,5 +140,18 @@ left join product p on p.id = pm.product_id order by p.id,pm.id desc </select> <select id="selectModelByIds" resultType="com.ruoyi.basic.dto.ProductModelDto"> select pm.model,p.product_name,pm.unit from product_model pm left join product p on pm.product_id = p.id <where> <if test="list != null and list.size() > 0"> and pm.id in <foreach item="item" collection="list" separator="," open="(" close=")" index="index"> #{item} </foreach> </if> </where> </select> </mapper> src/main/resources/mapper/stock/StockInventoryCheckItemMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,26 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckItemMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckItem"> <id column="id" property="id" /> <result column="main_id" property="mainId" /> <result column="product_id" property="productId" /> <result column="product_code" property="productCode" /> <result column="product_name" property="productName" /> <result column="specification" property="specification" /> <result column="unit" property="unit" /> <result column="batch_no" property="batchNo" /> <result column="system_quantity" property="systemQuantity" /> <result column="actual_quantity" property="actualQuantity" /> <result column="difference_quantity" property="differenceQuantity" /> <result column="cost_price" property="costPrice" /> <result column="total_cost" property="totalCost" /> <result column="difference_amount" property="differenceAmount" /> <result column="remark" property="remark" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> </resultMap> </mapper> src/main/resources/mapper/stock/StockInventoryCheckMainMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,28 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckMainMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckMain"> <id column="id" property="id" /> <result column="check_no" property="checkNo" /> <result column="check_type" property="checkType" /> <result column="warehouse_id" property="warehouseId" /> <result column="warehouse_name" property="warehouseName" /> <result column="total_quantity" property="totalQuantity" /> <result column="total_amount" property="totalAmount" /> <result column="source_type" property="sourceType" /> <result column="source_id" property="sourceId" /> <result column="status" property="status" /> <result column="check_date" property="checkDate" /> <result column="responsible_person_id" property="responsiblePersonId" /> <result column="responsible_person_name" property="responsiblePersonName" /> <result column="remark" property="remark" /> <result column="create_time" property="createTime" /> <result column="create_by" property="createBy" /> <result column="update_time" property="updateTime" /> <result column="update_by" property="updateBy" /> <result column="del_flag" property="delFlag" /> </resultMap> </mapper> src/main/resources/mapper/stock/StockInventoryCheckPlanMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,32 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckPlanMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckPlan"> <id column="id" property="id" /> <result column="plan_no" property="planNo" /> <result column="status" property="status" /> <result column="create_time" property="createTime" /> <result column="update_time" property="updateTime" /> <result column="remark" property="remark" /> <result column="del_flag" property="delFlag" /> </resultMap> <select id="listPage" resultType="com.ruoyi.stock.dto.StockInventoryCheckPlanDto"> select stock_inventory_check_plan.* ,sys_user.nick_name as create_by from stock_inventory_check_plan left join sys_user on stock_inventory_check_plan.create_user = sys_user.user_id <where> <if test="ew.planNo != null and ew.planNo != ''"> and plan_no like concat('%',#{ew.planNo},'%') </if> <if test="ew.status != null"> and status = #{ew.status} </if> <if test="ew.startTime != null"> and plan_date_start between #{ew.startTime} and #{ew.endTime} </if> </where> </select> </mapper> src/main/resources/mapper/stock/StockInventoryCheckProductMapper.xml
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,15 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.stock.mapper.StockInventoryCheckProductMapper"> <!-- éç¨æ¥è¯¢æ å°ç»æ --> <resultMap id="BaseResultMap" type="com.ruoyi.stock.pojo.StockInventoryCheckProduct"> <id column="id" property="id" /> <result column="product_id" property="productId" /> <result column="product_name" property="productName" /> <result column="model" property="model" /> <result column="unit" property="unit" /> <result column="system_qty" property="systemQty" /> </resultMap> </mapper> src/main/resources/mapper/stock/StockInventoryMapper.xml
@@ -460,5 +460,34 @@ group by stock_inventory_id) as sd on sd.stock_inventory_id = spd.id where product_model_id = #{productModelId} </select> <select id="selectStockInvenrory" resultType="com.ruoyi.stock.dto.StockInventoryDto"> select spd.id, spd.batch_no,pm.model,pm.unit,p.product_name, spd.qualitity,spd.product_model_id from stock_inventory spd left join product_model pm on pm.id = spd.product_model_id left join product p on p.id = pm.product_id where product_model_id = #{productModelId} </select> <select id="pagestockInventoryNoQua" resultType="com.ruoyi.stock.dto.StockInventoryDto"> select si.product_model_id, pm.model , pm.unit, p.product_name from stock_inventory si left join product_model pm on si.product_model_id = pm.id left join product p on pm.product_id = p.id where 1 = 1 <if test="ew.productName != null and ew.productName !=''"> and p.product_name like concat('%',#{ew.productName},'%') </if> <if test="ew.model != null and ew.model !=''"> and pm.model like concat('%',#{ew.model},'%') </if> group by si.product_model_id, pm.model, pm.unit, p.product_name </select> </mapper>