|
@@ -1555,7 +1555,7 @@ public class GoodsServiceImpl implements GoodsService {
|
|
|
*/
|
|
|
@Override
|
|
|
@Transactional
|
|
|
- public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku) {
|
|
|
+ public synchronized Map<String,Object> calculateGoodsDetail(String prodBarcode, String storeId, String sku, Integer sellVolume) {
|
|
|
/**
|
|
|
* 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回
|
|
|
*/
|
|
@@ -1563,101 +1563,17 @@ public class GoodsServiceImpl implements GoodsService {
|
|
|
if(goods == null) {
|
|
|
return null;
|
|
|
}
|
|
|
-
|
|
|
- String env = environment.getProperty("haikong.env");
|
|
|
+ goods.setSellVolume(sellVolume);
|
|
|
|
|
|
/*
|
|
|
* 2. 查询海仓仓库系统,判断库存是否足够
|
|
|
* */
|
|
|
- sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
|
|
|
+ /*sku = org.springframework.util.StringUtils.isEmpty(sku) ? goods.getSku() : sku;
|
|
|
String wareStockNumberKey = storeId + sku + prodBarcode;
|
|
|
String warehouseStockMapKey = Constants.WAREHOUSE_STOCK_MAP_KEY + "_" + storeId;
|
|
|
- String redisCacheWareQuantity = JedisUtil.hget(warehouseStockMapKey, wareStockNumberKey);
|
|
|
- // 保税仓或缓存中的保税仓库存
|
|
|
- Integer wareQuantity = 0;
|
|
|
- // 保税仓库存
|
|
|
- Integer realWareQuantity = 0;
|
|
|
- Integer exitRegionNumber = goods.getExitRegionNumber();
|
|
|
- String stockNum = goods.getStockNum();
|
|
|
- Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
|
|
|
- if (org.springframework.util.StringUtils.isEmpty(redisCacheWareQuantity)) {
|
|
|
- WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
|
|
|
- String queryWarehouseStockResponse = null;
|
|
|
- // 环境配置
|
|
|
- if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
|
|
|
- WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
|
|
|
- List<Criteria> criteriaList = new ArrayList<>();
|
|
|
- Criteria criteria = new Criteria();
|
|
|
- criteria.setItemId(goods.getWarehouseSysGoodId());
|
|
|
- criteria.setItemCode(goods.getSku());
|
|
|
- criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
|
|
|
- criteria.setInventoryType(Constants.InventoryType.ZP.getType());
|
|
|
- criteria.setWarehouseCode(goods.getWarehouseSn());
|
|
|
- criteriaList.add(criteria);
|
|
|
- wareQueryStockParamDTO.setCriteriaList(criteriaList);
|
|
|
- try {
|
|
|
- queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("sku:【{}】,调用海控仓库系统查询库存出现异常!", sku, e);
|
|
|
- throw new ServiceException(String.format("sku:【%s】,调用海控仓库系统查询库存出现异常!", sku));
|
|
|
- }
|
|
|
- log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
|
|
|
- if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
|
|
|
- log.error("调用库存系统接口出现错误!返回结果为空!");
|
|
|
- throw new ServiceException("调用库存系统接口出现错误!");
|
|
|
- }
|
|
|
- try {
|
|
|
- wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
|
|
|
- } catch (Exception e) {
|
|
|
- log.error("解析一步达库存系统响应数据出现错误!出现异常:", e);
|
|
|
- }
|
|
|
- if (Objects.isNull(wareQueryStockResponseDTO)) {
|
|
|
- log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
|
|
|
- throw new ServiceException("解析一步达库存系统响应数据出现错误!");
|
|
|
- }
|
|
|
- if ("failure".equals(wareQueryStockResponseDTO.getFlag())) {
|
|
|
- log.error("请求一步达库存系统返回错误响应!响应数据:{}", queryWarehouseStockResponse);
|
|
|
- throw new ServiceException(String.format("请求一步达库存系统查询库存错误!响应数据:%s", wareQueryStockResponseDTO.getMessage()));
|
|
|
- }
|
|
|
- } else {
|
|
|
- wareQueryStockResponseDTO = new WareQueryStockResponseDTO();
|
|
|
- wareQueryStockResponseDTO.setCode("0");
|
|
|
- wareQueryStockResponseDTO.setFlag("success");
|
|
|
- wareQueryStockResponseDTO.setMessage("");
|
|
|
- WareQueryStockResponseDTO.WareQueryStockResponseItemDTO wareQueryStockResponseItemDTO = new WareQueryStockResponseDTO.WareQueryStockResponseItemDTO();
|
|
|
- wareQueryStockResponseItemDTO.setQuantity(3);
|
|
|
- wareQueryStockResponseItemDTO.setItemCode(sku);
|
|
|
- wareQueryStockResponseItemDTO.setProduceCode(prodBarcode);
|
|
|
- List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> wareQueryStockResponseItemDTOS = new ArrayList<>();
|
|
|
- wareQueryStockResponseItemDTOS.add(wareQueryStockResponseItemDTO);
|
|
|
- wareQueryStockResponseDTO.setItems(wareQueryStockResponseItemDTOS);
|
|
|
- }
|
|
|
+ String redisCacheWareQuantity = JedisUtil.hget(warehouseStockMapKey, wareStockNumberKey);*/
|
|
|
|
|
|
- // 校验库存
|
|
|
- List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
|
|
|
- if (CollectionUtils.isEmpty(items)) {
|
|
|
- log.error("查询商品时:【{}】,仓库不存在该商品!", prodBarcode);
|
|
|
- throw new ServiceException(String.format("查询商品时:【%s】,仓库不存在该商品!", prodBarcode));
|
|
|
- }
|
|
|
- WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = items.get(0);
|
|
|
- // 仓库可用库存
|
|
|
- wareQuantity = itemDTO.getQuantity();
|
|
|
- realWareQuantity = wareQuantity;
|
|
|
- JedisUtil.hset(warehouseStockMapKey, wareStockNumberKey, String.valueOf(wareQuantity));
|
|
|
- } else {
|
|
|
- wareQuantity = Integer.parseInt(redisCacheWareQuantity);
|
|
|
- // 如果是缓存中有该商品保税仓的库存可用数缓存,因为这个可用数已经是经过计算的,所以这里需要加上购买数
|
|
|
- // 避免下面提示的是计算过后的库存可用数,以致于出现误解
|
|
|
- realWareQuantity = wareQuantity + sellVolume;
|
|
|
- }
|
|
|
- // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
|
|
|
- if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) > sellVolume)) {
|
|
|
- // 库存不足
|
|
|
- log.error("商品条码:【{}】,sku:【{}】,门店库存:【{}】,保税仓库存:【{}】,出区数:【{}】,该商品仓库库存不足!", prodBarcode, sku, stockNum, realWareQuantity, exitRegionNumber);
|
|
|
- throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店库存:【%s】,保税仓库存:【%s】,出区数:【%s】,该商品仓库库存不足!", prodBarcode, sku, stockNum, realWareQuantity, exitRegionNumber));
|
|
|
- } else {
|
|
|
- JedisUtil.hset(warehouseStockMapKey, wareStockNumberKey, String.valueOf(wareQuantity - sellVolume));
|
|
|
- }
|
|
|
+ validateWarehouseStock(goods, prodBarcode, sku, storeId);
|
|
|
|
|
|
goods.setDiscountedPrice(new BigDecimal(0));
|
|
|
BigDecimal retailPrice = goods.getRetailPrice();
|
|
@@ -1677,6 +1593,85 @@ public class GoodsServiceImpl implements GoodsService {
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
+ public void validateWarehouseStock(GoodsDetailsDto goods, String prodBarcode, String sku, String storeId) {
|
|
|
+ // 保税仓库存
|
|
|
+ Integer wareQuantity = 0;
|
|
|
+
|
|
|
+ String env = environment.getProperty("haikong.env");
|
|
|
+ // 保税仓库存
|
|
|
+ Integer exitRegionNumber = goods.getExitRegionNumber();
|
|
|
+ String stockNum = goods.getStockNum();
|
|
|
+ Integer sellVolume = Objects.isNull(goods.getSellVolume()) ? 1 : goods.getSellVolume();
|
|
|
+ WareQueryStockResponseDTO wareQueryStockResponseDTO = null;
|
|
|
+ String queryWarehouseStockResponse = null;
|
|
|
+ // 环境配置
|
|
|
+ if (!org.springframework.util.StringUtils.isEmpty(env) && Constants.PROD.equals(env)) {
|
|
|
+ WareQueryStockParamDTO wareQueryStockParamDTO = new WareQueryStockParamDTO();
|
|
|
+ List<Criteria> criteriaList = new ArrayList<>();
|
|
|
+ Criteria criteria = new Criteria();
|
|
|
+ criteria.setItemId(goods.getWarehouseSysGoodId());
|
|
|
+ criteria.setItemCode(goods.getSku());
|
|
|
+ criteria.setOwnerCode(haiKongProperties.getWareCompanyCode());
|
|
|
+ criteria.setInventoryType(Constants.InventoryType.ZP.getType());
|
|
|
+ criteria.setWarehouseCode(goods.getWarehouseSn());
|
|
|
+ criteriaList.add(criteria);
|
|
|
+ wareQueryStockParamDTO.setCriteriaList(criteriaList);
|
|
|
+ try {
|
|
|
+ queryWarehouseStockResponse = haiKongWarehouseTemplate.queryWarehouseStock(wareQueryStockParamDTO);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("sku:【{}】,调用海控仓库系统查询库存出现异常!", sku, e);
|
|
|
+ throw new ServiceException(String.format("sku:【%s】,调用海控仓库系统查询库存出现异常!", sku));
|
|
|
+ }
|
|
|
+ log.info("调用海控仓库系统,请求参数,门店:{}、商品条码:{}、商品编码:{},响应数据:{}", storeId, prodBarcode, sku, queryWarehouseStockResponse);
|
|
|
+ if (org.springframework.util.StringUtils.isEmpty(queryWarehouseStockResponse)) {
|
|
|
+ log.error("调用库存系统接口出现错误!返回结果为空!");
|
|
|
+ throw new ServiceException("调用库存系统接口出现错误!");
|
|
|
+ }
|
|
|
+ try {
|
|
|
+ wareQueryStockResponseDTO = (WareQueryStockResponseDTO) XmlUtils.toObject(queryWarehouseStockResponse, WareQueryStockResponseDTO.class);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.error("解析一步达库存系统响应数据出现错误!出现异常:", e);
|
|
|
+ }
|
|
|
+ if (Objects.isNull(wareQueryStockResponseDTO)) {
|
|
|
+ log.error("解析一步达库存系统响应数据出现错误!请求响应结果:{}", queryWarehouseStockResponse);
|
|
|
+ throw new ServiceException("解析一步达库存系统响应数据出现错误!");
|
|
|
+ }
|
|
|
+ if ("failure".equals(wareQueryStockResponseDTO.getFlag())) {
|
|
|
+ log.error("请求一步达库存系统返回错误响应!响应数据:{}", queryWarehouseStockResponse);
|
|
|
+ throw new ServiceException(String.format("请求一步达库存系统查询库存错误!响应数据:%s", wareQueryStockResponseDTO.getMessage()));
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ wareQueryStockResponseDTO = new WareQueryStockResponseDTO();
|
|
|
+ wareQueryStockResponseDTO.setCode("0");
|
|
|
+ wareQueryStockResponseDTO.setFlag("success");
|
|
|
+ wareQueryStockResponseDTO.setMessage("");
|
|
|
+ WareQueryStockResponseDTO.WareQueryStockResponseItemDTO wareQueryStockResponseItemDTO = new WareQueryStockResponseDTO.WareQueryStockResponseItemDTO();
|
|
|
+ wareQueryStockResponseItemDTO.setQuantity(3);
|
|
|
+ wareQueryStockResponseItemDTO.setItemCode(sku);
|
|
|
+ wareQueryStockResponseItemDTO.setProduceCode(prodBarcode);
|
|
|
+ List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> wareQueryStockResponseItemDTOS = new ArrayList<>();
|
|
|
+ wareQueryStockResponseItemDTOS.add(wareQueryStockResponseItemDTO);
|
|
|
+ wareQueryStockResponseDTO.setItems(wareQueryStockResponseItemDTOS);
|
|
|
+ }
|
|
|
+
|
|
|
+ // 校验库存
|
|
|
+ List<WareQueryStockResponseDTO.WareQueryStockResponseItemDTO> items = wareQueryStockResponseDTO.getItems();
|
|
|
+ if (CollectionUtils.isEmpty(items)) {
|
|
|
+ log.error("查询商品时:【{}】,仓库不存在该商品!", prodBarcode);
|
|
|
+ throw new ServiceException(String.format("查询商品时:【%s】,仓库不存在该商品!", prodBarcode));
|
|
|
+ }
|
|
|
+ WareQueryStockResponseDTO.WareQueryStockResponseItemDTO itemDTO = items.get(0);
|
|
|
+ // 仓库可用库存
|
|
|
+ wareQuantity = itemDTO.getQuantity();
|
|
|
+ // 保税仓库存 + 展销店库存 - 出区数 >= 购买数
|
|
|
+ if (!((wareQuantity + Integer.parseInt(stockNum) - exitRegionNumber) > sellVolume)) {
|
|
|
+ // 库存不足
|
|
|
+ log.error("商品条码:【{}】,sku:【{}】,门店库存:【{}】,保税仓库存:【{}】,出区数:【{}】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber);
|
|
|
+ throw new ServiceException(String.format("商品条码:【%s】,sku:【%s】,门店库存:【%s】,保税仓库存:【%s】,出区数:【%s】,该商品仓库库存不足!", prodBarcode, sku, stockNum, wareQuantity, exitRegionNumber));
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
public List<Map<String,Object>> selectSkuDetails(String prodBarcode, String storeId) {
|
|
|
/**
|
|
|
* 1.首先根据商品条码跟门店id查询是否有库存,没库存直接返回
|