入库等接口

This commit is contained in:
zjf committed 2025-02-20 19:28:37 +08:00
1 parent 207b92865b
commit ec77d06197
14 files changed
+377 -4

No files matched your search

@@ -0,0 +1,86 @@
package com.bsd.pjcloud.supermarket.dto.inventoryrecords;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDate;
import java.util.List;
/**
*
* 新增一个采购计划
*/
@Data
@Schema(description = "采购计划保存对象")
public class InventoryRecordSaveDTO {
/**
* 采购计划编号
*/
@Schema(description="编号")
private String inventoryCode;
/**
* 采购计划单据日期
*/
@Schema(description="单据日期")
private LocalDate inventoryDate;
/**
* 仓库id
*/
@Schema(description="仓库id")
private String warehouseId;
/**
* 经办人id
*/
@Schema(description="经办人id")
private Long handlerUserId;
/**
* 累计进货数量
*/
@Schema(description="累计进货数量")
private Integer totalNumber;
/**
* 累计总金额
*/
@Schema(description="累计总金额")
private Integer totalAmount;
/**
* 货商
*/
@Schema(description="货商")
private Long supplierId;
/**
* 备注
*/
@Schema(description="备注")
private String remark;
/**
* 订单编号
*/
@Schema(description="订单编号")
private String orderNumber;
@Schema(description="关联码")
private String linkCode;
/**
* @Link SmCgPlanSaveItemDTO
*/
@Schema(description="采购计划-item")
private List<InventoryRecordSaveItemDTO> items;
}
@@ -0,0 +1,54 @@
package com.bsd.pjcloud.supermarket.dto.inventoryrecords;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
/**
* 采购计划-item
*
* @author zjf
* @date 2025-02-11 17:11:41
*/
@Data
@Schema(description = "采购计划-item")
public class InventoryRecordSaveItemDTO {
/**
* 库存商品id
*/
@Schema(description="库存商品id")
private Long erpSpuId;
/**
* 数量
*/
@Schema(description="数量")
private Integer quantity;
/**
* 进价
*/
@Schema(description="进价")
private Integer unitPrice;
/**
* 累计总金额
*/
@Schema(description="累计总金额")
private Integer totalAmount;
/**
* 备注
*/
@Schema(description="备注")
private String remark;
/**
* 包装单位id
*/
@Schema(description="包装单位id")
private Long unitId;
}
@@ -0,0 +1,37 @@
package com.bsd.pjcloud.supermarket.dto.inventoryrecords;
import jakarta.validation.constraints.NotNull;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.List;
/**
* 更新库存 DTO
*
* @author LeeYan9
* @since 2022-08-26
*/
@Data
@NoArgsConstructor
@AllArgsConstructor
public class UpdateStockDTO {
/**
* 商品 SKU 编号
*/
@NotNull(message = "商品 SPU 编号不能为空")
private Long id;
/**
* 库存变化数量
*
* 正数:增加库存
* 负数:扣减库存
*/
@NotNull(message = "库存变化数量不能为空")
private Integer incrCount;
}
@@ -0,0 +1,27 @@
package com.bsd.pjcloud.supermarket.vo.unit;
import com.bsd.pjcloud.common.core.util.MoneyDeserializer;
import com.bsd.pjcloud.common.core.util.MoneySerializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
@Schema(description = "包装单位价格信息")
public class UnitPriceInfo {
/**
* 零售价/单位分
*/
@Schema(description="零售价/单位分")
private Integer retailPrice;
/**
* 促销价
*/
@Schema(description="促销价")
private Integer promotionPrice;
}
@@ -9,9 +9,11 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.core.util.R;
import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.cgdd.CGPlanLinkQueryDTO;
import com.bsd.pjcloud.supermarket.dto.cgplan.ErpCgPlanDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.CGDdLinkQueryDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveDTO;
import com.bsd.pjcloud.supermarket.entity.*;
import com.bsd.pjcloud.supermarket.service.*;
import com.bsd.pjcloud.supermarket.vo.cgplan.ErpUnitVo;
@@ -116,15 +118,15 @@ public class SmErpInventoryRecordsController {
/**
* 新增出入库记录表
* @param smErpInventoryRecords 出入库记录表
* @param inventoryRecordSaveDTO 出入库记录表
* @return R
*/
@Operation(summary = "新增出入库记录表" , description = "新增出入库记录表" )
@SysLog("新增出入库记录表" )
@PostMapping
@PreAuthorize("@pms.hasPermission('supermarket_smErpInventoryRecords_add')" )
public R save(@RequestBody SmErpInventoryRecordsEntity smErpInventoryRecords) {
return R.ok(smErpInventoryRecordsService.save(smErpInventoryRecords));
public R save(@RequestBody InventoryRecordSaveDTO inventoryRecordSaveDTO) {
return R.ok(smErpInventoryRecordsService.saveInventoryRecord(inventoryRecordSaveDTO));
}
/**
@@ -12,6 +12,7 @@ import com.bsd.pjcloud.common.log.annotation.SysLog;
import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.bsd.pjcloud.supermarket.service.SmErpUnitService;
import com.bsd.pjcloud.supermarket.vo.sm.smspu.SmErpUnitVo;
import com.bsd.pjcloud.supermarket.vo.unit.UnitPriceInfo;
import org.springframework.security.access.prepost.PreAuthorize;
import com.bsd.pjcloud.common.excel.annotation.ResponseExcel;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
@@ -141,6 +142,18 @@ public class SmErpUnitController {
return smErpUnitService.list(Wrappers.lambdaQuery(supermarketUnit).in(ArrayUtil.isNotEmpty(ids), SmErpUnitEntity::getId, ids));
}
/**
* 通过条码查询商品信息和包装单位信息
* @param barCode
* @return R
*///todo 还没做,后面做吧
// @Operation(summary = "条码查询商品信息和包装单位信息" , description = "添加子单据扫码枪获取信息" )
// @PostMapping("/ad/getSupermarketUnits" )
// public R getSupermarketUnits(@RequestParam("barCode")String barCode) {
// List<UnitPriceInfo> unitPriceInfos=smErpUnitService.listScope(barCode);
// return R.ok(unitPriceInfos);
// }
// -----------------APP------------------------------
@@ -155,4 +168,19 @@ public class SmErpUnitController {
return R.ok(smErpUnitService.getSupermarketUnitsWithSpu(ids));
}
//--------------------------------AD----------------------
/**
* 通过条码查询对应的包装单位商品价格信息
* @param barCode
* @return R
*/
@Operation(summary = "条码查询对应的包装单位商品价格" , description = "条码查询对应的包装单位商品价格" )
@PostMapping("/ad/getSupermarketUnits" )
public R getSupermarketUnits(@RequestParam("barCode")String barCode) {
List<UnitPriceInfo> unitPriceInfos=smErpUnitService.listScope(barCode);
return R.ok(unitPriceInfos);
}
}
@@ -3,15 +3,20 @@ package com.bsd.pjcloud.supermarket.mapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.bsd.pjcloud.common.data.datascope.PjcloudBaseMapper;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity;
import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO;
import com.github.houbb.heaven.annotation.reflect.Param;
import org.apache.ibatis.annotations.Mapper;
import java.util.List;
@Mapper
public interface SmErpStockMapper extends PjcloudBaseMapper<SmErpStockEntity> {
IPage<StockWarnVO> selectWarnStockWithSpu(Page<SmErpStockEntity> page, @Param("param") SmErpSpuEntity param);
}
@@ -1,8 +1,16 @@
package com.bsd.pjcloud.supermarket.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsEntity;
public interface SmErpInventoryRecordsService extends IService<SmErpInventoryRecordsEntity> {
/**
* 插入出入库信息
* @param inventoryRecordSaveDTO
* @return
*/
Object saveInventoryRecord(InventoryRecordSaveDTO inventoryRecordSaveDTO);
}
@@ -3,14 +3,25 @@ package com.bsd.pjcloud.supermarket.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.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity;
import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO;
import com.github.houbb.heaven.annotation.reflect.Param;
import java.util.List;
public interface SmErpStockService extends IService<SmErpStockEntity> {
IPage<StockWarnVO> selectWarnStockWithSpu(Page<SmErpStockEntity> page,SmErpSpuEntity param);
/**
* 更新库存
* @param updateStockDTOS
* @return
*/
void updateStock(List<UpdateStockDTO> updateStockDTOS);
}
@@ -1,8 +1,10 @@
package com.bsd.pjcloud.supermarket.service;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.IService;
import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.bsd.pjcloud.supermarket.vo.erp.SmErpUnitWithSpuVo;
import com.bsd.pjcloud.supermarket.vo.unit.UnitPriceInfo;
import java.util.List;
@@ -15,4 +17,12 @@ public interface SmErpUnitService extends IService<SmErpUnitEntity> {
* @return
*/
List<SmErpUnitWithSpuVo> getSupermarketUnitsWithSpu(List<Long> ids);
/**
* 根据条形码获取价格信息
* @param barCode
* @return
*/
List<UnitPriceInfo> listScope(String barCode);
}
@@ -1,10 +1,28 @@
package com.bsd.pjcloud.supermarket.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.security.util.SecurityUtils;
import com.bsd.pjcloud.supermarket.dto.cgdd.SmCgDDSaveItemDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveItemDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpCgDdEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpCgDdItemEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpInventoryRecordsItemEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpInventoryRecordsItemMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpInventoryRecordsMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpStockMapper;
import com.bsd.pjcloud.supermarket.service.SmErpInventoryRecordsService;
import com.bsd.pjcloud.supermarket.service.SmErpStockService;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.ArrayList;
import java.util.List;
/**
* 出入库记录表
*
@@ -12,5 +30,43 @@ import org.springframework.stereotype.Service;
* @date 2025-02-10 12:15:37
*/
@Service
@AllArgsConstructor
public class SmErpInventoryRecordsServiceImpl extends ServiceImpl<SmErpInventoryRecordsMapper, SmErpInventoryRecordsEntity> implements SmErpInventoryRecordsService {
private final SmErpInventoryRecordsItemMapper smErpInventoryRecordsItemMapper;
private final SmErpStockService smErpStockService;
@Override
@Transactional
public Object saveInventoryRecord(InventoryRecordSaveDTO inventoryRecordSaveDTO) {
Long deptId = SecurityUtils.getUser().getDeptId();
SmErpInventoryRecordsEntity smErpCgDdEntity = BeanUtils.toBean(inventoryRecordSaveDTO, SmErpInventoryRecordsEntity.class);
smErpCgDdEntity.setDeptId(deptId);
smErpCgDdEntity.setCheckStatus("0");
smErpCgDdEntity.setDeptId(deptId);
int insert = baseMapper.insert(smErpCgDdEntity);
List<InventoryRecordSaveItemDTO> items = inventoryRecordSaveDTO.getItems();
List<SmErpInventoryRecordsItemEntity> cgPlanItemEntities = BeanUtils.toBean(items, SmErpInventoryRecordsItemEntity.class);
List<UpdateStockDTO> updateStockDTOS = new ArrayList<>();
for (SmErpInventoryRecordsItemEntity cgPlanItemEntity : cgPlanItemEntities) {
cgPlanItemEntity.setInventoryId(smErpCgDdEntity.getId());
cgPlanItemEntity.setDeptId(deptId);
UpdateStockDTO updateStockDTO = new UpdateStockDTO();
updateStockDTO.setId(cgPlanItemEntity.getErpSpuId());
updateStockDTO.setIncrCount(cgPlanItemEntity.getQuantity());
updateStockDTOS.add(updateStockDTO);
}
smErpInventoryRecordsItemMapper.insert(cgPlanItemEntities);
//todo 实际上应该审批后才会入库
//更新库存
smErpStockService.updateStock(updateStockDTOS);
return insert;
}
}
@@ -1,14 +1,23 @@
package com.bsd.pjcloud.supermarket.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
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.bsd.pjcloud.supermarket.dto.inventoryrecords.InventoryRecordSaveItemDTO;
import com.bsd.pjcloud.supermarket.dto.inventoryrecords.UpdateStockDTO;
import com.bsd.pjcloud.supermarket.entity.SmErpSpuEntity;
import com.bsd.pjcloud.supermarket.entity.SmErpStockEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpSpuMapper;
import com.bsd.pjcloud.supermarket.mapper.SmErpStockMapper;
import com.bsd.pjcloud.supermarket.service.SmErpStockService;
import com.bsd.pjcloud.supermarket.vo.stockwarn.StockWarnVO;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
/**
* 商品包装单位(sku)
*
@@ -16,10 +25,38 @@ import org.springframework.stereotype.Service;
* @date 2025-01-23 13:50:24
*/
@Service
@AllArgsConstructor
public class SmErpStockServiceImpl extends ServiceImpl<SmErpStockMapper, SmErpStockEntity> implements SmErpStockService {
private final SmErpSpuMapper smErpSpuMapper;
@Override
public IPage<StockWarnVO> selectWarnStockWithSpu(Page<SmErpStockEntity> page, SmErpSpuEntity param) {
return baseMapper.selectWarnStockWithSpu(page, param);
}
@Override
@Transactional
public void updateStock(List<UpdateStockDTO> updateStockDTOS) {
// 更新库存(手动乐观锁)
for (UpdateStockDTO item : updateStockDTOS) {
// 1. 先查询当前版本号
LambdaQueryWrapper<SmErpStockEntity> smErpStockEntityLambdaQueryWrapper = new LambdaQueryWrapper<SmErpStockEntity>();
smErpStockEntityLambdaQueryWrapper.eq(SmErpStockEntity::getSpuId,item.getId());
SmErpStockEntity smErpStockEntity = baseMapper.selectOne(smErpStockEntityLambdaQueryWrapper);
LambdaQueryWrapper<SmErpStockEntity> updateStockWithLockWrapper = new LambdaQueryWrapper<SmErpStockEntity>();
updateStockWithLockWrapper.eq(SmErpStockEntity::getSpuId,item.getId());
updateStockWithLockWrapper.eq(SmErpStockEntity::getVersion,smErpStockEntity.getVersion());
SmErpStockEntity updateSmErpStockEntity = new SmErpStockEntity();
updateSmErpStockEntity.setCurrentStock(smErpStockEntity.getCurrentStock()+item.getIncrCount());
int update = baseMapper.update(updateSmErpStockEntity, updateStockWithLockWrapper);
// 3. 检查更新结果
if (update == 0) {
throw new RuntimeException("库存更新冲突,请重试操作");
}
}
}
}
@@ -1,10 +1,14 @@
package com.bsd.pjcloud.supermarket.service.impl;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.bsd.pjcloud.common.core.util.BeanUtils;
import com.bsd.pjcloud.common.data.datascope.DataScope;
import com.bsd.pjcloud.supermarket.entity.SmErpUnitEntity;
import com.bsd.pjcloud.supermarket.mapper.SmErpUnitMapper;
import com.bsd.pjcloud.supermarket.service.SmErpUnitService;
import com.bsd.pjcloud.supermarket.vo.erp.SmErpUnitWithSpuVo;
import com.bsd.pjcloud.supermarket.vo.unit.UnitPriceInfo;
import org.springframework.stereotype.Service;
import java.util.List;
@@ -22,4 +26,13 @@ public class SmErpUnitServiceImpl extends ServiceImpl<SmErpUnitMapper, SmErpUnit
return baseMapper.getSupermarketUnitsWithSpu(ids);
}
@Override
public List<UnitPriceInfo> listScope(String barCode) {
LambdaQueryWrapper<SmErpUnitEntity> smErpUnitEntityLambdaQueryWrapper = new LambdaQueryWrapper<>();
smErpUnitEntityLambdaQueryWrapper.eq(SmErpUnitEntity::getBarCode,barCode);
List<SmErpUnitEntity> smErpUnitEntities = baseMapper.selectListByScope(smErpUnitEntityLambdaQueryWrapper, DataScope.of());
List<UnitPriceInfo> bean = BeanUtils.toBean(smErpUnitEntities, UnitPriceInfo.class);
return bean;
}
}
@@ -52,7 +52,6 @@
<!-- 库存预警条件 -->
(stock.base_stock + stock.current_stock) &lt; stock.inventory_lower_limit or (stock.base_stock + stock.current_stock) > stock.inventory_upper_limit
<!-- 动态查询条件 -->
<if test="param.productCode != null and param.productCode != ''">
AND spu.product_code = #{param.productCode}
</if>