|
@@ -30,11 +30,14 @@ import com.zhongzheng.modules.inform.service.IInformUserService;
|
|
|
import com.zhongzheng.modules.order.bo.*;
|
|
import com.zhongzheng.modules.order.bo.*;
|
|
|
import com.zhongzheng.modules.order.domain.Order;
|
|
import com.zhongzheng.modules.order.domain.Order;
|
|
|
import com.zhongzheng.modules.order.domain.OrderGoods;
|
|
import com.zhongzheng.modules.order.domain.OrderGoods;
|
|
|
|
|
+import com.zhongzheng.modules.order.domain.OrderInput;
|
|
|
import com.zhongzheng.modules.order.mapper.OrderMapper;
|
|
import com.zhongzheng.modules.order.mapper.OrderMapper;
|
|
|
import com.zhongzheng.modules.order.service.IOrderBusinessService;
|
|
import com.zhongzheng.modules.order.service.IOrderBusinessService;
|
|
|
import com.zhongzheng.modules.order.service.IOrderGoodsService;
|
|
import com.zhongzheng.modules.order.service.IOrderGoodsService;
|
|
|
|
|
+import com.zhongzheng.modules.order.service.IOrderInputService;
|
|
|
import com.zhongzheng.modules.order.service.IOrderService;
|
|
import com.zhongzheng.modules.order.service.IOrderService;
|
|
|
import com.zhongzheng.modules.order.vo.OrderGoodsVo;
|
|
import com.zhongzheng.modules.order.vo.OrderGoodsVo;
|
|
|
|
|
+import com.zhongzheng.modules.order.vo.OrderInputVo;
|
|
|
import com.zhongzheng.modules.order.vo.OrderListVo;
|
|
import com.zhongzheng.modules.order.vo.OrderListVo;
|
|
|
import com.zhongzheng.modules.order.vo.OrderVo;
|
|
import com.zhongzheng.modules.order.vo.OrderVo;
|
|
|
import com.zhongzheng.modules.user.service.IUserService;
|
|
import com.zhongzheng.modules.user.service.IUserService;
|
|
@@ -100,6 +103,9 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private ICourseBusinessService iCourseBusinessService;
|
|
private ICourseBusinessService iCourseBusinessService;
|
|
|
|
|
|
|
|
|
|
+ @Autowired
|
|
|
|
|
+ private IOrderInputService iOrderInputService;
|
|
|
|
|
+
|
|
|
@Autowired
|
|
@Autowired
|
|
|
private RedisCache redisCache;
|
|
private RedisCache redisCache;
|
|
|
|
|
|
|
@@ -217,6 +223,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
|
|
|
|
|
BigDecimal totalPrice = new BigDecimal(0);
|
|
BigDecimal totalPrice = new BigDecimal(0);
|
|
|
BigDecimal payPrice = new BigDecimal(0);
|
|
BigDecimal payPrice = new BigDecimal(0);
|
|
|
|
|
+ List<OrderGoods> freeList = new ArrayList<>();
|
|
|
//生成订单
|
|
//生成订单
|
|
|
for (OrderGoodsAddBo g : goodsList) {
|
|
for (OrderGoodsAddBo g : goodsList) {
|
|
|
//订单商品
|
|
//订单商品
|
|
@@ -284,21 +291,191 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
|
|
if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
|
|
|
this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
|
|
this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
|
|
|
}
|
|
}
|
|
|
-
|
|
|
|
|
|
|
+ //商品0元加入免费商品列表
|
|
|
|
|
+ if(orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO)==0){
|
|
|
|
|
+ freeList.add(orderGoods);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
add.setOrderSn(out_trade_no);
|
|
add.setOrderSn(out_trade_no);
|
|
|
add.setOrderFrom(Order.FROM_PLAT);
|
|
add.setOrderFrom(Order.FROM_PLAT);
|
|
|
add.setPayPrice(payPrice);
|
|
add.setPayPrice(payPrice);
|
|
|
add.setOrderPrice(totalPrice);
|
|
add.setOrderPrice(totalPrice);
|
|
|
|
|
+ //订单0元
|
|
|
|
|
+ if(payPrice.compareTo(BigDecimal.ZERO)==0){
|
|
|
|
|
+ //完全收费
|
|
|
|
|
+ add.setOrderStatus(Order.PAY_FULL);
|
|
|
|
|
+ add.setStatus(1);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
this.save(add);
|
|
this.save(add);
|
|
|
|
|
+ //处理免费商品
|
|
|
|
|
+ for( OrderGoods orderGoods : freeList){
|
|
|
|
|
+ dealFreeGoods(orderGoods,add);
|
|
|
|
|
+ }
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
result.put("orderId",add.getOrderId());
|
|
result.put("orderId",add.getOrderId());
|
|
|
result.put("orderSn",out_trade_no);
|
|
result.put("orderSn",out_trade_no);
|
|
|
return result;
|
|
return result;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ *系统录单
|
|
|
|
|
+ * @param bo
|
|
|
|
|
+ * @return
|
|
|
|
|
+ */
|
|
|
|
|
+ @Override
|
|
|
|
|
+ @Transactional(rollbackFor = Exception.class)
|
|
|
|
|
+ public Map<String, Object> placePlatInputOrder(OrderAddBo bo) {
|
|
|
|
|
+ List<OrderGoodsAddBo> goodsList = bo.getGoodsList();
|
|
|
|
|
+ if(goodsList==null||goodsList.size()<1){
|
|
|
|
|
+ throw new CustomException("商品列表为空");
|
|
|
|
|
+ }
|
|
|
|
|
+ if(Validator.isEmpty(bo.getInputOrderSn())){
|
|
|
|
|
+ throw new CustomException("录单单号为空");
|
|
|
|
|
+ }
|
|
|
|
|
+ OrderInput orderInput = iOrderInputService.queryBySn(bo.getInputOrderSn());
|
|
|
|
|
+ if(Validator.isEmpty(orderInput)){
|
|
|
|
|
+ throw new CustomException("录单单号不存在");
|
|
|
|
|
+ }
|
|
|
|
|
+ Order add = BeanUtil.toBean(bo, Order.class);
|
|
|
|
|
+ validEntityBeforeSave(add);
|
|
|
|
|
+ add.setCreateTime(DateUtils.getNowTime());
|
|
|
|
|
+ add.setUpdateTime(DateUtils.getNowTime());
|
|
|
|
|
+ add.setOrderType(Order.CONSUME_ORDER);
|
|
|
|
|
+ add.setCreateUsername(bo.getCreateBy());//
|
|
|
|
|
+ //生成订单号
|
|
|
|
|
+ String out_trade_no = DateUtils.getDateOrderSn();
|
|
|
|
|
+
|
|
|
|
|
+ BigDecimal totalPrice = new BigDecimal(0);
|
|
|
|
|
+ BigDecimal payPrice = new BigDecimal(0);
|
|
|
|
|
+ BigDecimal receivedPrice = new BigDecimal(0);
|
|
|
|
|
+ //收费的商品列表,不含免费
|
|
|
|
|
+ List<OrderGoods> payList = new ArrayList<>();
|
|
|
|
|
+ List<OrderGoods> freeList = new ArrayList<>();
|
|
|
|
|
+ //生成订单
|
|
|
|
|
+ for (OrderGoodsAddBo g : goodsList) {
|
|
|
|
|
+ //订单商品
|
|
|
|
|
+ Goods goods = iGoodsService.getOne(new LambdaQueryWrapper<Goods>().eq(Goods::getGoodsId,g.getGoodsId()));
|
|
|
|
|
+ if(goods.getGoodsStatus()!=1){
|
|
|
|
|
+ throw new CustomException("商品尚未上架");
|
|
|
|
|
+ }
|
|
|
|
|
+ OrderGoods orderGoods = BeanUtil.toBean(g, OrderGoods.class);
|
|
|
|
|
+ orderGoods.setOrderSn(out_trade_no);
|
|
|
|
|
+ if(g.getGoodsInputData()!=null){
|
|
|
|
|
+ orderGoods.setGoodsInputData(JSON.toJSONString(g.getGoodsInputData()));
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ //成交价
|
|
|
|
|
+ orderGoods.setGoodsRealPrice(g.getGoodsRealPrice());
|
|
|
|
|
+
|
|
|
|
|
+ orderGoods.setCreateTime(DateUtils.getNowTime());
|
|
|
|
|
+ orderGoods.setUpdateTime(DateUtils.getNowTime());
|
|
|
|
|
+ orderGoods.setGoodsReceived(g.getGoodsReceived());
|
|
|
|
|
+
|
|
|
|
|
+ //订单标准价格不计算优惠
|
|
|
|
|
+ totalPrice = totalPrice.add(goods.getStandPrice());
|
|
|
|
|
+ //实际应收价格
|
|
|
|
|
+ payPrice = payPrice.add(g.getGoodsRealPrice());
|
|
|
|
|
+ //已收价格
|
|
|
|
|
+ receivedPrice = receivedPrice.add(g.getGoodsReceived());
|
|
|
|
|
+ boolean orderGoodsRs = iOrderGoodsService.save(orderGoods);
|
|
|
|
|
+ boolean canRepeatBuy = false;
|
|
|
|
|
+ //视频商品安排班级
|
|
|
|
|
+ if(goods.getGoodsType()==1){
|
|
|
|
|
+ if(Validator.isNotEmpty(goods.getStudyCount())){
|
|
|
|
|
+ orderGoods.setStudyCount(goods.getStudyCount()-1); //默认消耗一次学习机会
|
|
|
|
|
+ }else{
|
|
|
|
|
+ orderGoods.setStudyCount(0L);//没配置则为0
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ Long gradeId = null;
|
|
|
|
|
+ //判断是否购买历史班级都过期
|
|
|
|
|
+ canRepeatBuy =this.canBuyRepeatGoods(g.getGoodsId(),bo.getUserId());
|
|
|
|
|
+ if(g.getGoodsInputData()!=null){
|
|
|
|
|
+ gradeId = g.getGoodsInputData().getGradeId();
|
|
|
|
|
+ //判断是否有购买过
|
|
|
|
|
+ Long oldOrderGoodsId = getHaveBuyGoods(g.getGoodsId(),bo.getUserId());
|
|
|
|
|
+ if(Validator.isNotEmpty(oldOrderGoodsId)){
|
|
|
|
|
+ //有指定选班模板且视频商品班级已过期,记录复购状态
|
|
|
|
|
+ orderGoods.setRebuyOrderGoodsId(oldOrderGoodsId);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ String requestId = IdUtil.simpleUUID();
|
|
|
|
|
+ RedisLockEntity redisLockEntity = new RedisLockEntity();
|
|
|
|
|
+ redisLockEntity.setLockKey(RedisLockEntity.KEY_LOCK_GRADE);
|
|
|
|
|
+ redisLockEntity.setRequestId(requestId);
|
|
|
|
|
+ if(redisCache.lock(redisLockEntity)){
|
|
|
|
|
+ arrangeGrade(goods.getGoodsName(),goods.getGoodsId(),orderGoods.getOrderGoodsId(),gradeId,add.getUserId(),out_trade_no,goods.getBusinessId());
|
|
|
|
|
+ redisCache.unlockLua(redisLockEntity);
|
|
|
|
|
+ }
|
|
|
|
|
+ iOrderGoodsService.updateById(orderGoods);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ if(!canRepeatBuy&&goods.getGoodsType()!=3&&goods.getGoodsType()!=4){
|
|
|
|
|
+ this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
|
|
|
|
|
+ }
|
|
|
|
|
+ //商品0元或已收费加入收费商品列表
|
|
|
|
|
+ if(g.getGoodsRealPrice().compareTo(BigDecimal.ZERO)==0){
|
|
|
|
|
+ //免费的
|
|
|
|
|
+ freeList.add(orderGoods);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(g.getGoodsRealPrice().compareTo(BigDecimal.ZERO)>0&&g.getGoodsReceived().compareTo(BigDecimal.ZERO)>0){
|
|
|
|
|
+ //有收费的
|
|
|
|
|
+ payList.add(orderGoods);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ add.setOrderSn(out_trade_no);
|
|
|
|
|
+ add.setOrderFrom(Order.FROM_PLAT);
|
|
|
|
|
+ add.setPayPrice(payPrice);//需要支付价格
|
|
|
|
|
+ add.setOrderPrice(totalPrice);//标准价格
|
|
|
|
|
+ add.setReceivedPrice(receivedPrice);//已支付
|
|
|
|
|
+ //有已收费的商品
|
|
|
|
|
+ if((freeList.size()+payList.size())>0){
|
|
|
|
|
+ add.setOrderStatus(Order.ORDER_STATUS_PAY);
|
|
|
|
|
+ if(payPrice.compareTo(BigDecimal.ZERO)==0){
|
|
|
|
|
+ //总订单0元
|
|
|
|
|
+ add.setPayStatus(Order.PAY_FREE);
|
|
|
|
|
+ }
|
|
|
|
|
+ else if(payPrice.compareTo(receivedPrice)==0){
|
|
|
|
|
+ //完全收费
|
|
|
|
|
+ add.setPayStatus(Order.PAY_FULL);
|
|
|
|
|
+ }else {
|
|
|
|
|
+ //部分收费
|
|
|
|
|
+ add.setPayStatus(Order.PAY_PART);
|
|
|
|
|
+ }
|
|
|
|
|
+ add.setStatus(1);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ this.save(add);
|
|
|
|
|
+ //处理收费商品,生成计费单
|
|
|
|
|
+ for( OrderGoods orderGoods : payList){
|
|
|
|
|
+
|
|
|
|
|
+ }
|
|
|
|
|
+ //处理免费商品
|
|
|
|
|
+ for( OrderGoods orderGoods : freeList){
|
|
|
|
|
+ dealFreeGoods(orderGoods,add);
|
|
|
|
|
+ }
|
|
|
|
|
+ Map<String, Object> result = new HashMap<>();
|
|
|
|
|
+ result.put("orderId",add.getOrderId());
|
|
|
|
|
+ result.put("orderSn",out_trade_no);
|
|
|
|
|
+ return result;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ private void dealFreeGoods(OrderGoods orderGoods,Order order){
|
|
|
|
|
+ //免费商品
|
|
|
|
|
+ orderGoods.setPayStatus(OrderGoods.PAY_FREE);
|
|
|
|
|
+ orderGoods.setGoodsReceived(orderGoods.getGoodsRealPrice());
|
|
|
|
|
+ //设置商品服务期
|
|
|
|
|
+ orderGoods = iWxPayService.setServiceTime(orderGoods);
|
|
|
|
|
+ iOrderGoodsService.updateById(orderGoods);
|
|
|
|
|
+ //给用户增加商品考试次数前培次数
|
|
|
|
|
+ iWxPayService.updateUserExamGoods(orderGoods,order);
|
|
|
|
|
+ iWxPayService.joinLockGrade(order.getOrderSn(),orderGoods.getGoodsId(),orderGoods.getOrderGoodsId());
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
@Override
|
|
@Override
|
|
|
@Transactional(rollbackFor = Exception.class)
|
|
@Transactional(rollbackFor = Exception.class)
|
|
|
public Map<String, String> placeSmallOrder(OrderAddBo bo) {
|
|
public Map<String, String> placeSmallOrder(OrderAddBo bo) {
|
|
@@ -317,6 +494,7 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
BigDecimal totalPrice = new BigDecimal(0);
|
|
BigDecimal totalPrice = new BigDecimal(0);
|
|
|
BigDecimal payPrice = new BigDecimal(0);
|
|
BigDecimal payPrice = new BigDecimal(0);
|
|
|
String body = "中正祥粤云-";
|
|
String body = "中正祥粤云-";
|
|
|
|
|
+ List<OrderGoods> freeList = new ArrayList<>();
|
|
|
//生成订单
|
|
//生成订单
|
|
|
for (OrderGoodsAddBo g : goodsList) {
|
|
for (OrderGoodsAddBo g : goodsList) {
|
|
|
//订单商品
|
|
//订单商品
|
|
@@ -386,6 +564,10 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
|
|
this.checkBuyGoods(g.getGoodsId(),bo.getUserId(),goods.getGoodsType());
|
|
|
}
|
|
}
|
|
|
iShoppingCartService.deleteByGoodsId(g.getGoodsId(),bo.getUserId());
|
|
iShoppingCartService.deleteByGoodsId(g.getGoodsId(),bo.getUserId());
|
|
|
|
|
+ //商品0元加入免费商品列表
|
|
|
|
|
+ if(orderGoods.getGoodsPrice().compareTo(BigDecimal.ZERO)==0){
|
|
|
|
|
+ freeList.add(orderGoods);
|
|
|
|
|
+ }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
add.setOrderSn(out_trade_no);
|
|
add.setOrderSn(out_trade_no);
|
|
@@ -393,14 +575,30 @@ public class OrderServiceImpl extends ServiceImpl<OrderMapper, Order> implements
|
|
|
add.setPayPrice(payPrice);
|
|
add.setPayPrice(payPrice);
|
|
|
|
|
|
|
|
add.setOrderPrice(totalPrice);
|
|
add.setOrderPrice(totalPrice);
|
|
|
|
|
+ //订单0元
|
|
|
|
|
+ if(payPrice.compareTo(BigDecimal.ZERO)==0){
|
|
|
|
|
+ //完全收费
|
|
|
|
|
+ add.setOrderStatus(Order.ORDER_STATUS_PAY);
|
|
|
|
|
+ add.setPayStatus(Order.PAY_FREE);
|
|
|
|
|
+ add.setStatus(1);
|
|
|
|
|
+ }
|
|
|
this.save(add);
|
|
this.save(add);
|
|
|
|
|
+ //处理免费商品
|
|
|
|
|
+ for( OrderGoods orderGoods : freeList){
|
|
|
|
|
+ dealFreeGoods(orderGoods,add);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
Map<String, Object> result = new HashMap<>();
|
|
Map<String, Object> result = new HashMap<>();
|
|
|
result.put("oderId",add.getOrderId());
|
|
result.put("oderId",add.getOrderId());
|
|
|
result.put("orderSn",out_trade_no);
|
|
result.put("orderSn",out_trade_no);
|
|
|
UserVo userVo = iUserService.queryById(add.getUserId());
|
|
UserVo userVo = iUserService.queryById(add.getUserId());
|
|
|
// String price = "1";
|
|
// String price = "1";
|
|
|
|
|
+ Map<String, String> payResult = new HashMap<>();
|
|
|
|
|
+ //大于0元,获取微信支付信息
|
|
|
|
|
+ if(payPrice.compareTo(BigDecimal.ZERO)!=0){
|
|
|
|
|
+ payResult = iWxPayService.payment(out_trade_no,userVo.getOpenId(),body,payPrice);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
- Map<String, String> payResult = iWxPayService.payment(out_trade_no,userVo.getOpenId(),body,payPrice);
|
|
|
|
|
payResult.put("orderSn",out_trade_no);
|
|
payResult.put("orderSn",out_trade_no);
|
|
|
return payResult;
|
|
return payResult;
|
|
|
}
|
|
}
|