package com.iotechn.unimall.app.api.order;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.dobbinsoft.fw.core.exception.AppServiceException;
import com.dobbinsoft.fw.core.exception.ServiceException;
import com.dobbinsoft.fw.core.util.GeneratorUtil;
import com.dobbinsoft.fw.pay.enums.PayChannelType;
import com.dobbinsoft.fw.pay.service.pay.MatrixPayService;
import com.dobbinsoft.fw.support.component.CacheComponent;
import com.dobbinsoft.fw.support.component.LockComponent;
import com.dobbinsoft.fw.support.component.MachineComponent;
import com.dobbinsoft.fw.support.model.Page;
import com.dobbinsoft.fw.support.mq.DelayedMessageQueue;
import com.dobbinsoft.fw.support.service.BaseService;
import com.iotechn.unimall.biz.client.erp.ErpClient;
import com.iotechn.unimall.biz.executor.GlobalExecutor;
import com.iotechn.unimall.biz.service.address.AddressBizService;
import com.iotechn.unimall.biz.service.cart.CartBizService;
import com.iotechn.unimall.biz.service.coupon.CouponBizService;
import com.iotechn.unimall.biz.service.freight.FreightTemplateBizService;
import com.iotechn.unimall.biz.service.groupshop.GroupShopBizService;
import com.iotechn.unimall.biz.service.notify.AdminNotifyBizService;
import com.iotechn.unimall.biz.service.order.OrderBizService;
import com.iotechn.unimall.biz.service.pay.PayBizService;
import com.iotechn.unimall.biz.service.product.ProductBizService;
import com.iotechn.unimall.data.constant.CacheConst;
import com.iotechn.unimall.data.constant.LockConst;
import com.iotechn.unimall.data.domain.AddressDO;
import com.iotechn.unimall.data.domain.OrderDO;
import com.iotechn.unimall.data.domain.OrderSkuDO;
import com.iotechn.unimall.data.domain.SpuDO;
import com.iotechn.unimall.data.dto.AdminDTO;
import com.iotechn.unimall.data.dto.CouponUserDTO;
import com.iotechn.unimall.data.dto.UserDTO;
import com.iotechn.unimall.data.dto.freight.ShipTraceDTO;
import com.iotechn.unimall.data.dto.order.OrderDTO;
import com.iotechn.unimall.data.dto.order.OrderRequestDTO;
import com.iotechn.unimall.data.dto.order.OrderRequestSkuDTO;
import com.iotechn.unimall.data.dto.product.GroupShopDTO;
import com.iotechn.unimall.data.dto.product.GroupShopSkuDTO;
import com.iotechn.unimall.data.dto.product.SkuDTO;
import com.iotechn.unimall.data.enums.*;
import com.iotechn.unimall.data.exception.ExceptionDefinition;
import com.iotechn.unimall.data.mapper.OrderMapper;
import com.iotechn.unimall.data.mapper.OrderSkuMapper;
import com.iotechn.unimall.data.mapper.SkuMapper;
import com.iotechn.unimall.data.model.FreightCalcModel;
import com.iotechn.unimall.data.model.OrderCalcSkuModel;
import com.iotechn.unimall.data.model.SkuStockInfoModel;
import com.iotechn.unimall.data.properties.UnimallOrderProperties;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.Assert;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.stream.Collectors;
/**
* Created by rize on 2019/7/4.
*/
@Service
public class OrderServiceImpl extends BaseService<UserDTO, AdminDTO> implements OrderService {
private static final Logger logger = LoggerFactory.getLogger(OrderServiceImpl.class);
@Autowired
private SkuMapper skuMapper;
@Autowired
private CouponBizService couponBizService;
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderSkuMapper orderSkuMapper;
@Autowired
private CartBizService cartBizService;
@Autowired
private MatrixPayService payService;
@Autowired
private PayBizService payBizService;
@Autowired
private LockComponent lockComponent;
@Autowired
private AddressBizService addressBizService;
@Autowired
private OrderBizService orderBizService;
@Autowired
private FreightTemplateBizService freightTemplateBizService;
@Autowired
private GroupShopBizService groupShopBizService;
@Autowired
private AdminNotifyBizService adminNotifyBizService;
@Autowired
private CacheComponent cacheComponent;
@Autowired
private ProductBizService productBizService;
@Autowired
private DelayedMessageQueue delayedMessageQueue;
@Autowired
private MachineComponent machineComponent;
@Value("${com.dobbinsoft.fw.env}")
private String ENV;
@Autowired
private UnimallOrderProperties unimallOrderProperties;
@Autowired
private ErpClient erpClient;
@Override
@Transactional(rollbackFor = Exception.class)
public String takeOrder(OrderRequestDTO orderRequest, String channel, Long userId) throws ServiceException {
if (lockComponent.tryLock(LockConst.TAKE_ORDER_LOCK + userId, 20)) {
//加上乐观锁,防止用户重复提交订单
List<OrderRequestSkuDTO> skuList = orderRequest.getSkuList();
boolean calcStockFlag = false;
try {
UserDTO user = sessionUtil.getUser();
//用户会员等级
Integer userLevel = user.getLevel();
if (user.getStatus().intValue() != UserStatusType.ACTIVE.getCode()) {
throw new AppServiceException(ExceptionDefinition.ORDER_USER_IS_NOT_ACTIVE);
}
// 对Sku排序,防止相互拿锁,两边都无法结算的情况。
orderRequest.getSkuList().sort((o1, o2) -> (int) (o1.getSkuId() - o2.getSkuId()));
//参数强校验 START
if (CollectionUtils.isEmpty(skuList) || orderRequest.getTotalPrice() == null) {
throw new AppServiceException(ExceptionDefinition.PARAM_CHECK_FAILED);
}
if (orderRequest.getTotalPrice() <= 0) {
throw new AppServiceException(ExceptionDefinition.ORDER_PRICE_MUST_GT_ZERO);
}
// 若是卖虚拟物品,不需要收货地址,可以将此行注释掉
if (orderRequest.getAddressId() == null) {
throw new AppServiceException(ExceptionDefinition.ORDER_ADDRESS_CANNOT_BE_NULL);
}
// 收货地址对象
AddressDO addressDO = addressBizService.getAddressById(orderRequest.getAddressId());
// 库存不足列表,用于提示前端
List<SkuStockInfoModel> stockErrorSkuList = new LinkedList<>();
// 商品状态异常列表,用于提示前端
List<Long> statusErrorSkuList = new LinkedList<>();
// 从缓存读取,用于计算的列表。属于SkuDO的部分属性。
List<OrderCalcSkuModel> calcSkuList = new ArrayList<>();
// 将SkuIds 查取出来
List<Long> skuIds = new ArrayList<>();
for (OrderRequestSkuDTO orderRequestSkuDTO : skuList) {
Long skuId = orderRequestSkuDTO.getSkuId();
skuIds.add(skuId);
OrderCalcSkuModel orderCalcSpuDTO = cacheComponent.getHashObj(CacheConst.PRT_SPU_HASH_BUCKET, "P" + orderRequestSkuDTO.getSpuId(), OrderCalcSkuModel.class);
if (orderCalcSpuDTO == null) {
// 尝试从DB中读取
SpuDO spuFromDB = productBizService.getProductByIdFromDB(orderRequestSkuDTO.getSpuId());
if (spuFromDB == null || (spuFromDB.getStatus() == SpuStatusType.STOCK
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
本源码项目是基于Java的unimall多端商城系统设计,包含685个文件,主要使用Java、Vue、JavaScript、CSS、HTML和Shell编程语言。该项目是一个B2C商城系统,支持微信小程序、H5、安卓App和苹果App等多种终端。系统支持集群部署和单机部署,适用于B2C商城、O2O外卖、社区超市、生鲜等多种业务场景。unimall采用uniapp编码,使用Java开发,SpringBoot框架和MySQL数据库。通过该项目,开发者可以快速搭建一个多终端的商城系统,提高业务运营效率。系统界面友好,易于操作,适合用于各类电子商务场景。
资源推荐
资源详情
资源评论
收起资源包目录
基于Java的unimall多端商城系统设计源码 (682个子文件)
.babelrc 313B
nginx.conf 2KB
unimall.v3.dobbinsoft.com.conf 816B
index.css 414KB
skin.min.css 42KB
visualblocks.css 5KB
content.min.css 4KB
u-parse.css 4KB
content.inline.min.css 3KB
prism.css 2KB
Winglau14-lotusAddress.css 2KB
Dockerfile 1KB
Dockerfile_demo 860B
.editorconfig 243B
tinymce.eot 18KB
tinymce-small.eot 9KB
.eslintignore 34B
401.gif 160KB
loader.gif 3KB
smiley-cool.gif 354B
smiley-wink.gif 350B
smiley-smile.gif 344B
smiley-laughing.gif 343B
smiley-foot-in-mouth.gif 342B
smiley-frown.gif 340B
smiley-kiss.gif 338B
smiley-surprised.gif 338B
smiley-undecided.gif 337B
smiley-innocent.gif 336B
smiley-yell.gif 336B
smiley-embarassed.gif 331B
smiley-cry.gif 329B
smiley-tongue-out.gif 328B
smiley-sealed.gif 323B
smiley-money-mouth.gif 321B
object.gif 152B
anchor.gif 53B
trans.gif 43B
.gitignore 1000B
.gitignore 237B
method.html 18KB
document.html 4KB
index.html 514B
favicon.ico 17KB
OrderServiceImpl.java 40KB
ProductBizService.java 31KB
UserServiceImpl.java 30KB
DobbinErpClient.java 25KB
ExceptionDefinition.java 24KB
AdminProductServiceImpl.java 18KB
AdminGroupShopServiceImpl.java 16KB
CheckQuartz.java 16KB
AdminServiceImpl.java 13KB
AdminOrderServiceImpl.java 13KB
OrderPayCallbackHandler.java 12KB
OrderBizService.java 11KB
GeneratorServiceImpl.java 10KB
AdminCategoryServiceImpl.java 10KB
PayConfig.java 9KB
OpenPlatformStorageDatabaseImpl.java 9KB
AppraiseServiceImpl.java 8KB
UserService.java 8KB
AdminFreightTemplateServiceImpl.java 8KB
CouponServiceImpl.java 7KB
ProductServiceImpl.java 7KB
AddressServiceImpl.java 7KB
AdminCouponService.java 7KB
RoleServiceImpl.java 7KB
FreightTemplateBizService.java 6KB
UserBizService.java 6KB
CategoryBizService.java 6KB
KdniaoTrackQueryAPI.java 5KB
AdminOrderService.java 5KB
OrderService.java 5KB
AdminProductService.java 5KB
CartServiceImpl.java 5KB
AdminCouponServiceImpl.java 5KB
AdminVipOrderServiceImpl.java 5KB
AdminService.java 5KB
AdminFreightTemplateService.java 5KB
VipOrderServiceImpl.java 5KB
SpuDTO.java 5KB
CacheConst.java 5KB
IntegralServiceImpl.java 5KB
AdminAdvertService.java 5KB
AdminGroupShopService.java 4KB
AdminUserServiceImpl.java 4KB
AdminAdvertServiceImpl.java 4KB
AdminCategoryService.java 4KB
AdminVipTemplateService.java 4KB
UniNotifyAdminNotifyBizServiceImpl.java 4KB
AddressService.java 4KB
OrderDTO.java 4KB
RoleService.java 4KB
OrderDO.java 4KB
AdminUserService.java 4KB
DashboardServiceImpl.java 4KB
ErpSku.java 4KB
VipOrderPayCallbackHandler.java 4KB
SearchWrapperModel.java 4KB
共 682 条
- 1
- 2
- 3
- 4
- 5
- 6
- 7
资源评论
沐知全栈开发
- 粉丝: 4767
- 资源: 3372
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 基于javascript实现的蚁群算法(JS代码)
- 基于python实现的随机森林(python代码)
- python读取excel到数据库中,简单的数据库管理脚本
- 7777端口抓包数据集
- IMG_0694.GIF
- 基于图像的三维模型重建C++源代码+文档说明(高分课程设计)
- 基于聚焦法的工件立体测量方案,根据数据进行三维重建 使用HALCON处理图像,MATLAB拟合数据+源代码+数据集+效果图
- 锄战三国村 修改:货币使用不减 v1.10(2) 原创 (中文).apk
- 基于python实现的单目双目视觉三维重建+源代码+图像图片(高分课程设计)
- 基于C+++OPENCV的全景图像拼接源码(课程设计)
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功