package com.java110.goods.bmo.storeOrder.impl; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import com.java110.core.annotation.Java110Transactional; import com.java110.core.factory.GenerateCodeFactory; import com.java110.core.factory.Java110TransactionalFactory; import com.java110.dto.groupBuyProductSpec.GroupBuyProductSpecDto; import com.java110.dto.productSpecValue.ProductSpecValueDto; import com.java110.dto.storeOrder.StoreOrderDto; import com.java110.dto.storeOrderCart.StoreOrderCartDto; import com.java110.goods.bmo.storeOrder.ISaveStoreOrderBMO; import com.java110.intf.IStoreOrderCartInnerServiceSMO; import com.java110.intf.IStoreOrderInnerServiceSMO; import com.java110.intf.goods.IGroupBuyProductSpecInnerServiceSMO; import com.java110.intf.goods.IProductInnerServiceSMO; import com.java110.intf.goods.IProductSpecValueInnerServiceSMO; import com.java110.po.groupBuyProductSpec.GroupBuyProductSpecPo; import com.java110.po.productSpecValue.ProductSpecValuePo; import com.java110.po.storeOrder.StoreOrderPo; import com.java110.po.storeOrderCart.StoreOrderCartPo; import com.java110.utils.lock.DistributedLock; import com.java110.utils.util.Assert; import com.java110.utils.util.StringUtil; import com.java110.vo.ResultVo; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Service; import java.math.BigDecimal; import java.util.List; @Service("saveStoreOrderBMOImpl") public class SaveStoreOrderBMOImpl implements ISaveStoreOrderBMO { @Autowired private IStoreOrderInnerServiceSMO storeOrderInnerServiceSMOImpl; @Autowired private IStoreOrderCartInnerServiceSMO storeOrderCartInnerServiceSMOImpl; @Autowired private IProductInnerServiceSMO productInnerServiceSMOImpl; @Autowired private IProductSpecValueInnerServiceSMO productSpecValueInnerServiceSMOImpl; @Autowired private IGroupBuyProductSpecInnerServiceSMO groupBuyProductSpecInnerServiceSMOImpl; /** * 添加小区信息 * * @param storeOrderPo * @param goodsList [ * { * cartId:"123",//没有写-1 * productId:"产品ID", * valueId:"产品规格ID", * cartNum:1,//购买数量 * storeId:"产品商户ID", *

* } * ] * @return 订单服务能够接受的报文 */ @Java110Transactional public ResponseEntity save(StoreOrderPo storeOrderPo, JSONArray goodsList) { storeOrderPo.setOrderId(GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_orderId)); storeOrderPo.setPayPrice("0"); storeOrderPo.setTotalPrice("0"); storeOrderPo.setFreightPrice("0"); storeOrderPo.setState(StoreOrderDto.STATE_WAIT_PAY); storeOrderPo.setOId(StringUtil.isEmpty(Java110TransactionalFactory.getOId()) ? "-1" : Java110TransactionalFactory.getOId()); JSONObject goods = null; for (int goodsIndex = 0; goodsIndex < goodsList.size(); goodsIndex++) { goods = goodsList.getJSONObject(goodsIndex); saveStoreOrderCart(goods, storeOrderPo); } int flag = storeOrderInnerServiceSMOImpl.saveStoreOrder(storeOrderPo); if (flag < 1) { return ResultVo.createResponseEntity(ResultVo.CODE_ERROR, "保存失败"); } return ResultVo.createResponseEntity(ResultVo.CODE_OK, "保存成功", storeOrderPo); } /** * 保存购物车 * * @param goods 商品 * @param storeOrderPo */ private void saveStoreOrderCart(JSONObject goods, StoreOrderPo storeOrderPo) { Assert.hasKeyAndValue(goods, "cartId", "未包含购物车ID"); Assert.hasKeyAndValue(goods, "productId", "未包含商品"); Assert.hasKeyAndValue(goods, "valueId", "未包含商品规格"); Assert.hasKeyAndValue(goods, "cartNum", "未包含商品数量"); Assert.hasKeyAndValue(goods, "storeId", "未包含商户"); int flag = 0; ProductSpecValueDto productSpecValueDto = null; GroupBuyProductSpecDto groupBuyProductSpecDto = null; //开始锁代码 String requestId = DistributedLock.getLockUUID(); String key = this.getClass().getSimpleName() + goods.getString("productId") + goods.getString("valueId"); try { DistributedLock.waitGetDistributedLock(key, requestId); productSpecValueDto = getProductSpecValueDto(goods); //查询是否 拼团产品 groupBuyProductSpecDto = getGroupBuyProduct(productSpecValueDto); } finally { DistributedLock.releaseDistributedLock(requestId, key); } if (goods.getString("carId").startsWith("-")) { goods.put("carId", GenerateCodeFactory.getGeneratorId(GenerateCodeFactory.CODE_PREFIX_cartId)); } String payPrice = groupBuyProductSpecDto == null ? productSpecValueDto.getPrice() : groupBuyProductSpecDto.getGroupPrice(); StoreOrderCartPo storeOrderCartPo = new StoreOrderCartPo(); storeOrderCartPo.setCartId(goods.getString("carId")); storeOrderCartPo.setCartNum(goods.getString("cartNum")); storeOrderCartPo.setFreightPrice("0"); storeOrderCartPo.setOrderId(storeOrderPo.getOrderId()); storeOrderCartPo.setPayPrice(payPrice); storeOrderCartPo.setPersonId(storeOrderPo.getPersonId()); storeOrderCartPo.setProductId(goods.getString("productId")); storeOrderCartPo.setState(StoreOrderCartDto.STATE_WAIT_BUY); storeOrderCartPo.setStoreId(goods.getString("storeId")); storeOrderCartPo.setValueId(goods.getString("valueId")); storeOrderCartPo.setPrice(productSpecValueDto.getPrice()); flag = storeOrderCartInnerServiceSMOImpl.saveStoreOrderCart(storeOrderCartPo); if (flag < 1) { throw new IllegalArgumentException("保存购物车失败"); } BigDecimal orderPayPrice = new BigDecimal(Double.parseDouble(storeOrderPo.getPayPrice())); double oPayPrice = orderPayPrice.add(new BigDecimal(Double.parseDouble(payPrice))).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); storeOrderPo.setPayPrice(oPayPrice + ""); BigDecimal orderPrice = new BigDecimal(Double.parseDouble(storeOrderPo.getTotalPrice())); double oPrice = orderPrice.add(new BigDecimal(Double.parseDouble(storeOrderCartPo.getPrice()))).setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue(); storeOrderPo.setPayPrice(oPrice + ""); } private GroupBuyProductSpecDto getGroupBuyProduct(ProductSpecValueDto productSpecValueDto) { GroupBuyProductSpecDto groupBuyProductSpecDto; int flag; groupBuyProductSpecDto = new GroupBuyProductSpecDto(); groupBuyProductSpecDto.setStoreId(productSpecValueDto.getStoreId()); groupBuyProductSpecDto.setProductId(productSpecValueDto.getProductId()); groupBuyProductSpecDto.setValueId(productSpecValueDto.getValueId()); List groupBuyProductSpecDtos = groupBuyProductSpecInnerServiceSMOImpl.queryGroupBuyProductSpecs(groupBuyProductSpecDto); if (groupBuyProductSpecDtos == null || groupBuyProductSpecDtos.size() < 1) { return null; } groupBuyProductSpecDto = groupBuyProductSpecDtos.get(0); int groupStock = Integer.parseInt(groupBuyProductSpecDto.getStock()); if (groupStock < 1) { return null; } GroupBuyProductSpecPo groupBuyProductSpecPo = new GroupBuyProductSpecPo(); groupBuyProductSpecPo.setStoreId(productSpecValueDto.getStoreId()); groupBuyProductSpecPo.setProductId(productSpecValueDto.getProductId()); groupBuyProductSpecPo.setValueId(productSpecValueDto.getValueId()); groupBuyProductSpecPo.setGroupStock((groupStock - 1) + ""); groupBuyProductSpecPo.setGroupSales((Integer.parseInt(groupBuyProductSpecDto.getGroupSales()) + 1) + ""); flag = groupBuyProductSpecInnerServiceSMOImpl.updateGroupBuyProductSpec(groupBuyProductSpecPo); if (flag < 1) { throw new IllegalArgumentException("减库存失败"); } return groupBuyProductSpecDto; } private ProductSpecValueDto getProductSpecValueDto(JSONObject goods) { ProductSpecValueDto productSpecValueDto; int flag;//查询 产品 及价格 并且 减库存 productSpecValueDto = new ProductSpecValueDto(); productSpecValueDto.setProductId(goods.getString("productId")); productSpecValueDto.setValueId(goods.getString("valueId")); productSpecValueDto.setStoreId(goods.getString("storeId")); List productSpecValueDtos = productSpecValueInnerServiceSMOImpl.queryProductSpecValues(productSpecValueDto); Assert.listOnlyOne(productSpecValueDtos, "不存在 该产品信息"); productSpecValueDto = productSpecValueDtos.get(0); int stock = Integer.parseInt(productSpecValueDto.getStock()); if (stock < 1) { throw new IllegalArgumentException("库存不足"); } ProductSpecValuePo productSpecValuePo = new ProductSpecValuePo(); productSpecValuePo.setValueId(productSpecValueDto.getValueId()); productSpecValuePo.setProductId(productSpecValueDto.getProductId()); productSpecValuePo.setStoreId(productSpecValueDto.getStoreId()); productSpecValuePo.setSales((Integer.parseInt(productSpecValueDto.getSales()) + 1) + ""); productSpecValuePo.setStock((stock - 1) + ""); flag = productSpecValueInnerServiceSMOImpl.updateProductSpecValue(productSpecValuePo); if (flag < 1) { throw new IllegalArgumentException("减库存失败"); } return productSpecValueDto; } }