|
@@ -0,0 +1,330 @@
|
|
|
+package cn.rankin.cmsweb.service.trade.order;
|
|
|
+
|
|
|
+import cn.rankin.cmsweb.code.CmsWebAPICode;
|
|
|
+import cn.rankin.cmsweb.service.product.GoodsService;
|
|
|
+import cn.rankin.cmsweb.service.user.CampusService;
|
|
|
+import cn.rankin.cmsweb.service.user.MerchantService;
|
|
|
+import cn.rankin.cmsweb.service.user.TerminalUserService;
|
|
|
+import cn.rankin.common.utils.api.model.APIResult;
|
|
|
+import cn.rankin.common.utils.api.model.BaseCode;
|
|
|
+import cn.rankin.common.utils.api.page.Page;
|
|
|
+import cn.rankin.common.utils.enums.LedgerTypeEnum;
|
|
|
+import cn.rankin.common.utils.enums.OrderStatusEnum;
|
|
|
+import cn.rankin.common.utils.enums.ProductTypeEnum;
|
|
|
+import cn.rankin.common.utils.util.BeanUtil;
|
|
|
+import cn.rankin.data.api.cms.OrderSearchWebDTO;
|
|
|
+import cn.rankin.data.api.product.vo.GoodsVo;
|
|
|
+import cn.rankin.data.api.trade.dto.UserOrderDTO;
|
|
|
+import cn.rankin.data.api.trade.dto.OrderGoodsDTO;
|
|
|
+import cn.rankin.data.api.trade.entity.OrderGoods;
|
|
|
+import cn.rankin.data.api.trade.entity.UserOrder;
|
|
|
+import cn.rankin.data.api.trade.vo.UserOrderVo;
|
|
|
+import cn.rankin.data.api.user.dto.CampusSearchDTO;
|
|
|
+import cn.rankin.data.api.user.dto.MerchantPayDTO;
|
|
|
+import cn.rankin.data.api.user.vo.CampusVo;
|
|
|
+import cn.rankin.data.api.user.vo.TerminalUserVo;
|
|
|
+import lombok.extern.slf4j.Slf4j;
|
|
|
+import org.springframework.beans.factory.annotation.Autowired;
|
|
|
+import org.springframework.stereotype.Service;
|
|
|
+import org.springframework.util.CollectionUtils;
|
|
|
+import org.springframework.util.StringUtils;
|
|
|
+
|
|
|
+import java.math.BigDecimal;
|
|
|
+import java.util.ArrayList;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+import static cn.rankin.cmsweb.utils.DTOConverter.convert;
|
|
|
+
|
|
|
+@Slf4j
|
|
|
+@Service
|
|
|
+public class OrderService {
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private OrderServiceFeign orderServiceFeign;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private GoodsService goodsService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private TerminalUserService terminalUserService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private CampusService campusService;
|
|
|
+
|
|
|
+ @Autowired
|
|
|
+ private MerchantService merchantService;
|
|
|
+
|
|
|
+ public APIResult<Boolean> pay(String orderId) {
|
|
|
+ APIResult<UserOrder> userOrderAPIResult = orderServiceFeign.getOrder(orderId);
|
|
|
+ UserOrder userOrder = userOrderAPIResult.getData();
|
|
|
+ if (userOrder == null || !userOrderAPIResult.getSuccess()) {
|
|
|
+ log.error("查询订单错误, orderId={}, {}", orderId, userOrderAPIResult.getMessage());
|
|
|
+ return APIResult.error(new BaseCode(userOrderAPIResult.getCode(), userOrderAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ String uid = userOrder.getUid();
|
|
|
+ APIResult<TerminalUserVo> userVoAPIResult = terminalUserService.getUser(uid);
|
|
|
+ TerminalUserVo userVo = userVoAPIResult.getData();
|
|
|
+ if (!userVoAPIResult.getSuccess() || userVo == null) {
|
|
|
+ log.error("查询用户错误, orderId={}, {}", orderId, userVoAPIResult.getMessage());
|
|
|
+ return APIResult.error(new BaseCode(userVoAPIResult.getCode(), userVoAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 开始扣款
|
|
|
+ String merchantId = userVo.getMerchantId();
|
|
|
+ MerchantPayDTO payDTO = new MerchantPayDTO();
|
|
|
+ payDTO.setQuantity(userOrder.getFinalPrice());
|
|
|
+ payDTO.setType(LedgerTypeEnum.COURSE);
|
|
|
+ payDTO.setReceiptId(userOrder.getId());
|
|
|
+
|
|
|
+ APIResult<Boolean> merchantPayAPIResult = merchantService.pay(merchantId, payDTO);
|
|
|
+ if (!merchantPayAPIResult.getSuccess()) {
|
|
|
+ log.error("扣款失败, orderId={}, {}", orderId, merchantPayAPIResult.getMessage());
|
|
|
+ return APIResult.error(new BaseCode(merchantPayAPIResult.getCode(), merchantPayAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 更新订单状态
|
|
|
+ APIResult<Boolean> orderAPIResult = orderServiceFeign.pay(orderId, OrderStatusEnum.PAYOK);
|
|
|
+ if (!orderAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ // 生成交易商品快照, 还要插入鉴权记录, 放入循环任务中进行
|
|
|
+
|
|
|
+ return APIResult.ok();
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<Boolean> cancel(String orderId) {
|
|
|
+ return orderServiceFeign.cancel(orderId);
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<UserOrderVo> create(UserOrderDTO userOrderDTO) {
|
|
|
+ String uid = userOrderDTO.getUid();
|
|
|
+ APIResult<TerminalUserVo> userVoAPIResult = terminalUserService.getUser(uid);
|
|
|
+ if (!userVoAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("用户不存在"));
|
|
|
+ }
|
|
|
+
|
|
|
+ TerminalUserVo terminalUserVo = userVoAPIResult.getData();
|
|
|
+
|
|
|
+ List<OrderGoodsDTO> orderGoodsDTOList = userOrderDTO.getGoods();
|
|
|
+ if (CollectionUtils.isEmpty(orderGoodsDTOList)) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("商品为空"));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> goodsIdList = new ArrayList<>();
|
|
|
+ Map<String, Integer> goodsCountMap = new HashMap<>();
|
|
|
+ orderGoodsDTOList.forEach(goods -> {
|
|
|
+ String goodsId = goods.getGoodsId();
|
|
|
+ goodsIdList.add(goodsId);
|
|
|
+ goodsCountMap.put(goodsId, goods.getQuantity());
|
|
|
+ });
|
|
|
+
|
|
|
+ APIResult<List<GoodsVo>> goodsVoAPIResult = goodsService.findByIds(goodsIdList);
|
|
|
+ if (!goodsVoAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("查询商品错误"));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<GoodsVo> goodsVoList = goodsVoAPIResult.getData();
|
|
|
+ if (goodsVoList.size() != orderGoodsDTOList.size()) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("包含不可售卖的商品"));
|
|
|
+ }
|
|
|
+
|
|
|
+ BigDecimal totalPrice = BigDecimal.ZERO;
|
|
|
+ List<OrderGoodsDTO> finalGoodsList = new ArrayList<>();
|
|
|
+ for (GoodsVo goodsVo : goodsVoList) {
|
|
|
+ String goodsMerchantId = goodsVo.getMerchantId();
|
|
|
+ if (!terminalUserVo.getMerchantId().equals(goodsMerchantId)) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("不可以购买其他渠道商品"));
|
|
|
+ }
|
|
|
+ if (goodsVo.getType().equals(ProductTypeEnum.PACKAGE)) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("包含课程包"));
|
|
|
+ }
|
|
|
+ String goodsId = goodsVo.getId();
|
|
|
+ Integer count = goodsCountMap.get(goodsId);
|
|
|
+ OrderGoodsDTO orderGoodsDTO = new OrderGoodsDTO();
|
|
|
+ orderGoodsDTO.setGoodsId(goodsId);
|
|
|
+ orderGoodsDTO.setPid(goodsVo.getPid());
|
|
|
+ orderGoodsDTO.setType(goodsVo.getType());
|
|
|
+ orderGoodsDTO.setQuantity(count);
|
|
|
+ finalGoodsList.add(orderGoodsDTO);
|
|
|
+ totalPrice = totalPrice.add(goodsVo.getMerchantPrice().multiply(new BigDecimal(count)));
|
|
|
+ }
|
|
|
+ userOrderDTO.setFinalPrice(totalPrice.subtract(userOrderDTO.getAdjustPrice()));
|
|
|
+ userOrderDTO.setOriginPrice(totalPrice);
|
|
|
+ userOrderDTO.setGoods(finalGoodsList);
|
|
|
+
|
|
|
+ APIResult userOrderAPIResult = orderServiceFeign.create(userOrderDTO);
|
|
|
+ return userOrderAPIResult;
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<UserOrderVo> getOrder(String orderId) {
|
|
|
+ APIResult<UserOrder> userOrderVoAPIResult = orderServiceFeign.getOrder(orderId);
|
|
|
+ if (!userOrderVoAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(new BaseCode(userOrderVoAPIResult.getCode(), userOrderVoAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ UserOrder userOrder = userOrderVoAPIResult.getData();
|
|
|
+ UserOrderVo userOrderVo = convert(userOrder);
|
|
|
+ List<OrderGoods> orderGoodsList = userOrder.getGoods();
|
|
|
+ if (CollectionUtils.isEmpty(orderGoodsList)) {
|
|
|
+ return APIResult.ok(userOrderVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> goodsIdList = new ArrayList<>();
|
|
|
+ orderGoodsList.forEach(orderGoods -> goodsIdList.add(orderGoods.getGoodsId()));
|
|
|
+ APIResult<List<GoodsVo>> goodsAPIResult = goodsService.findByIds(goodsIdList);
|
|
|
+ if (!goodsAPIResult.getSuccess()) {
|
|
|
+ log.error("goods api error: {}", goodsAPIResult.getMessage());
|
|
|
+ }
|
|
|
+ userOrderVo.setGoods(goodsAPIResult.getData());
|
|
|
+ return APIResult.ok(userOrderVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ public APIResult<Page<UserOrderVo>> search(OrderSearchWebDTO searchWebDTO) {
|
|
|
+ String userCode = searchWebDTO.getUserCode();
|
|
|
+ String campusCode = searchWebDTO.getCampusCode();
|
|
|
+ String campusName = searchWebDTO.getCampusName();
|
|
|
+
|
|
|
+ List<String> uids = new ArrayList<>();
|
|
|
+
|
|
|
+ // 用户及校区的Map
|
|
|
+ Map<String, TerminalUserVo> userVoMap = new HashMap<>();
|
|
|
+ Map<String, CampusVo> campusVoMap = new HashMap<>();
|
|
|
+
|
|
|
+ if (!StringUtils.isEmpty(userCode)) {
|
|
|
+ // 按用户查询
|
|
|
+ Map<String, Object> searchDTO = new HashMap<>();
|
|
|
+ searchDTO.put("code", userCode);
|
|
|
+ APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByCondition(searchDTO);
|
|
|
+ if (!userAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(new BaseCode(userAPIResult.getCode(), userAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<TerminalUserVo> userVoList = userAPIResult.getData();
|
|
|
+ if (CollectionUtils.isEmpty(userVoList)) {
|
|
|
+ return APIResult.ok(new Page<>());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> campusIdList = new ArrayList<>();
|
|
|
+ // 记录数据,查到数据后要set回去
|
|
|
+ userVoList.forEach(userVo -> {
|
|
|
+ uids.add(userVo.getId());
|
|
|
+ campusIdList.add(userVo.getCampusId());
|
|
|
+ userVoMap.put(userVo.getId(), userVo);
|
|
|
+ });
|
|
|
+
|
|
|
+ APIResult<Map<String, CampusVo>> campusAPIResult = campusService.findByIds(campusIdList);
|
|
|
+ if (campusAPIResult.getSuccess()) {
|
|
|
+ campusVoMap = campusAPIResult.getData();
|
|
|
+ }
|
|
|
+ } else if (!StringUtils.isEmpty(campusCode) || !StringUtils.isEmpty(campusName)) {
|
|
|
+ // 按校区查询
|
|
|
+ CampusSearchDTO campusSearchDTO = new CampusSearchDTO();
|
|
|
+ campusSearchDTO.setCode(campusCode);
|
|
|
+ campusSearchDTO.setName(campusName);
|
|
|
+ APIResult<List<CampusVo>> campusAPIResult = campusService.findByCondition(BeanUtil.convertToMap(campusSearchDTO));
|
|
|
+ if (!campusAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(new BaseCode(campusAPIResult.getCode(), campusAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+ List<CampusVo> campusVoList = campusAPIResult.getData();
|
|
|
+ if (CollectionUtils.isEmpty(campusVoList)) {
|
|
|
+ return APIResult.ok(new Page<>());
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> campusIdList = new ArrayList<>();
|
|
|
+ for (CampusVo campusVo : campusVoList) {
|
|
|
+ campusIdList.add(campusVo.getId());
|
|
|
+ campusVoMap.put(campusVo.getId(), campusVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByCampusIds(campusIdList);
|
|
|
+ if (!userAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(new BaseCode(userAPIResult.getCode(), userAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+ List<TerminalUserVo> userVoList = userAPIResult.getData();
|
|
|
+ for (TerminalUserVo userVo : userVoList) {
|
|
|
+ uids.add(userVo.getId());
|
|
|
+ userVoMap.put(userVo.getId(), userVo);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ Map<String, Object> searchParams = new HashMap<>();
|
|
|
+ searchParams.put("pageNo", searchWebDTO.getPageNo());
|
|
|
+ searchParams.put("pageSize", searchWebDTO.getPageSize());
|
|
|
+ searchParams.put("beginTime", searchWebDTO.getBeginTime());
|
|
|
+ searchParams.put("endTime", searchWebDTO.getEndTime());
|
|
|
+ searchParams.put("status", searchWebDTO.getStatus());
|
|
|
+ searchParams.put("uid", uids);
|
|
|
+
|
|
|
+ APIResult<Page<UserOrder>> orderAPIResult = orderServiceFeign.search(searchParams);
|
|
|
+ if (!orderAPIResult.getSuccess()) {
|
|
|
+ log.error("order query error: {}", orderAPIResult.getMessage());
|
|
|
+ return APIResult.error(new BaseCode(orderAPIResult.getCode(), orderAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ Page<UserOrder> userOrderPage = orderAPIResult.getData();
|
|
|
+ Page<UserOrderVo> page = new Page<>(userOrderPage.getTotalSize(), userOrderPage.getPageNo(), userOrderPage.getPageSize());
|
|
|
+
|
|
|
+ List<UserOrder> userOrderList = orderAPIResult.getData().getList();
|
|
|
+ List<UserOrderVo> userOrderVoList = new ArrayList<>();
|
|
|
+ if (CollectionUtils.isEmpty(userOrderList)) {
|
|
|
+ return APIResult.ok(page);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (uids.isEmpty() && !CollectionUtils.isEmpty(userOrderList)) {
|
|
|
+ userOrderList.forEach(userOrderVo -> uids.add(userOrderVo.getUid()));
|
|
|
+ APIResult<List<TerminalUserVo>> userAPIResult = terminalUserService.findByIds(uids);
|
|
|
+ if (!userAPIResult.getSuccess()) {
|
|
|
+ return APIResult.error(new BaseCode(userAPIResult.getCode(), userAPIResult.getMessage()));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<TerminalUserVo> userVoList = userAPIResult.getData();
|
|
|
+ if (CollectionUtils.isEmpty(userVoList)) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("用户信息查询错误"));
|
|
|
+ }
|
|
|
+
|
|
|
+ List<String> campusIdList = new ArrayList<>();
|
|
|
+ // 记录数据,查到数据后要set回去
|
|
|
+ for (TerminalUserVo userVo : userVoList) {
|
|
|
+ campusIdList.add(userVo.getCampusId());
|
|
|
+ userVoMap.put(userVo.getId(), userVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ if (CollectionUtils.isEmpty(campusIdList)) {
|
|
|
+ return APIResult.error(CmsWebAPICode.error("查询校区信息错误"));
|
|
|
+ }
|
|
|
+ APIResult<Map<String, CampusVo>> campusAPIResult = campusService.findByIds(campusIdList);
|
|
|
+ if (campusAPIResult.getSuccess()) {
|
|
|
+ campusVoMap = campusAPIResult.getData();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ for (UserOrder userOrder : userOrderList) {
|
|
|
+ UserOrderVo userOrderVo = convert(userOrder);
|
|
|
+ String uid = userOrderVo.getUid();
|
|
|
+
|
|
|
+ TerminalUserVo terminalUserVo = userVoMap.get(uid);
|
|
|
+ if (terminalUserVo == null) {
|
|
|
+ log.error("用户不存在: {}", uid);
|
|
|
+ continue;
|
|
|
+ }
|
|
|
+ userOrderVo.setMerchantId(terminalUserVo.getMerchantId());
|
|
|
+ userOrderVo.setMerchantName(terminalUserVo.getMerchantName());
|
|
|
+ userOrderVo.setUserCode(terminalUserVo.getCode());
|
|
|
+ userOrderVo.setClassroomName(terminalUserVo.getName());
|
|
|
+
|
|
|
+ String campusId = terminalUserVo.getCampusId();
|
|
|
+ CampusVo campusVo = campusVoMap.get(campusId);
|
|
|
+ userOrderVo.setProvinceCode(campusVo.getProvinceCode());
|
|
|
+ userOrderVo.setCityName(campusVo.getCityName());
|
|
|
+
|
|
|
+ userOrderVoList.add(userOrderVo);
|
|
|
+ }
|
|
|
+
|
|
|
+ page.setList(userOrderVoList);
|
|
|
+ return APIResult.ok(page);
|
|
|
+ }
|
|
|
+}
|