Forráskód Böngészése

Merge branch 'dev' of 113.31.163.91:quanshu/mp-server into dev

chunping 3 éve
szülő
commit
57e94abfaa

+ 22 - 5
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/ChannelOrderMgrController.java

@@ -2,18 +2,26 @@ package com.qs.mp.web.controller.api.admin;
 
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.admin.domain.param.ChannelOrderShipParam;
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.vo.ChannelOrderVO;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
 import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.core.page.TableDataInfo;
 import com.qs.mp.common.core.redis.RedisCache;
 import com.qs.mp.common.enums.ErrorCodeEnum;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
 import com.qs.mp.web.controller.common.BaseApiController;
 import io.swagger.annotations.Api;
 import io.swagger.annotations.ApiOperation;
+
+import java.util.ArrayList;
 import java.util.List;
 import lombok.AllArgsConstructor;
 import ma.glasnost.orika.MapperFacade;
@@ -37,6 +45,9 @@ public class ChannelOrderMgrController extends BaseApiController {
 
   @Autowired
   private IChannelOrderItemService channelOrderItemService;
+  
+  @Autowired
+  private IChannelOrderDetailService channelOrderDetailService;
 
   @Autowired
   private MapperFacade mapperFacade;
@@ -94,10 +105,16 @@ public class ChannelOrderMgrController extends BaseApiController {
    */
   @PostMapping("/ship")
   @ApiOperation(value = "订单发货" , notes = "在订单发货页面提交")
-  public AjaxResult ship(@RequestBody ChannelOrder order) {
-
-    return AjaxResult.success();
-  }
-
+  public AjaxResult ship(@RequestBody ChannelOrderShipParam shipParam) {
+		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		if(null != shipParam && null != shipParam.getPkgIds()
+				&& shipParam.getPkgIds().size() > 0) {
+			boolean rtn = channelOrderService.channelOrderShip(shipParam.getOrderId(), shipParam.getPkgIds());
+			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
+		}
+		return AjaxResult.error("发货失败");
+	}
 
 }

+ 24 - 3
mp-admin/src/main/java/com/qs/mp/web/controller/api/admin/UserDeliverOrderMgrController.java

@@ -3,11 +3,13 @@ package com.qs.mp.web.controller.api.admin;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
+import com.qs.mp.admin.domain.CouponTicket;
 import com.qs.mp.admin.domain.Ticket;
 import com.qs.mp.admin.domain.TicketBox;
 import com.qs.mp.admin.domain.excel.TicketExcel;
 import com.qs.mp.admin.domain.param.BathIdParam;
 import com.qs.mp.admin.domain.param.UserDeliverOrderQueryParam;
+import com.qs.mp.admin.domain.param.UserDeliverOrderShipParam;
 import com.qs.mp.channel.domain.param.OrderPayParam;
 import com.qs.mp.common.annotation.Log;
 import com.qs.mp.common.core.domain.AjaxResult;
@@ -128,9 +130,28 @@ public class UserDeliverOrderMgrController extends BaseApiController {
 	 */
 	@PostMapping("/ship")
 	@ApiOperation(value = "订单发货", notes = "在订单发货页面提交")
-	public AjaxResult ship(@RequestBody UserDeliverOrder order) {
-
-		return AjaxResult.success();
+	public AjaxResult ship(@RequestBody UserDeliverOrderShipParam shipParam) {
+		if(null == shipParam || StringUtils.isBlank(shipParam.getOrderId())) {
+			return error(ErrorCodeEnum.ERROR_CODE_1001);
+		}
+		List<UserDeliverOrderItem> itemList = new ArrayList<UserDeliverOrderItem>();
+		if(null != shipParam && null != shipParam.getItemIds()
+				&& shipParam.getItemIds().size() > 0) {
+			for(String itemId : shipParam.getItemIds() ) {
+				if(StringUtils.isNotBlank(itemId)) {
+					UserDeliverOrderItem item = new UserDeliverOrderItem();
+		        	item.setItemId(itemId);
+		        	item.setDeliveryId(shipParam.getDeliveryId());
+		        	item.setDeliveryFlowId(shipParam.getDeliveryFlowId());
+		        	itemList.add(item);
+				}
+			}
+		}
+		if(null != itemList && itemList.size() > 0) {
+			boolean rtn = userDeliverOrderService.userDeliverOrderShip(shipParam.getOrderId(), itemList);
+			return rtn ? AjaxResult.success() : AjaxResult.error("发货失败");
+		}
+		return AjaxResult.error("发货失败");
 	}
 
 	@Log(title = "导出", businessType = BusinessType.EXPORT)

+ 2 - 1
mp-common/src/main/java/com/qs/mp/common/enums/DeliverOrderStatusEnum.java

@@ -16,7 +16,8 @@ public enum DeliverOrderStatusEnum implements IEnum<Integer> {
   NOT_PAY(0, "待付款"),
   NOT_DELIVER(1, "待发货"),
   NOT_CONFIRM(2, "待收货"),
-  FINISHED(3, "已完成");
+  FINISHED(3, "已完成"),
+  PART_DELIVER(4, "部分发货");
 
   private final int value;
   private final String desc;

+ 49 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/ChannelOrderShipParam.java

@@ -0,0 +1,49 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.admin.domain.TicketPackage;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import lombok.Data;
+
+/**
+ * @describe 用户提货订单发货
+ * @auther quanshu
+ * @create 2022-03-07 20:43:44
+ */
+@ApiModel(value = "用户提货订单发货参数")
+@Data
+public class ChannelOrderShipParam {
+
+	@ApiModelProperty(value = "订单编号", required = false)
+	private String orderId;
+
+	/**
+	 * 物流公司ID
+	 */
+	@NotNull(message = "快递公司不能为空")
+	@ApiModelProperty(value = "物流公司", required = false)
+	private Long deliveryId;
+
+	/**
+	 * 物流单号ID
+	 */
+	@NotNull(message = "物流单号不能为空")
+	@ApiModelProperty(value = "物流单号", required = false)
+	private String deliveryFlowId;
+	
+	
+	@NotNull(message = "票包列表不能为空")
+	@ApiModelProperty(value = "票包ID列表", required = false)
+	private List<String> pkgIds;
+}

+ 48 - 0
mp-service/src/main/java/com/qs/mp/admin/domain/param/UserDeliverOrderShipParam.java

@@ -0,0 +1,48 @@
+package com.qs.mp.admin.domain.param;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+
+import java.util.Date;
+import java.util.List;
+
+import javax.validation.constraints.NotNull;
+
+import com.alibaba.fastjson.annotation.JSONField;
+import com.alibaba.fastjson.serializer.SerializerFeature;
+import com.baomidou.mybatisplus.annotation.TableField;
+import com.qs.mp.common.enums.DeliverOrderStatusEnum;
+import lombok.Data;
+
+/**
+ * @describe 用户提货订单发货
+ * @auther quanshu
+ * @create 2022-03-07 20:43:44
+ */
+@ApiModel(value = "用户提货订单发货参数")
+@Data
+public class UserDeliverOrderShipParam {
+
+	@ApiModelProperty(value = "订单编号", required = false)
+	private String orderId;
+
+	/**
+	 * 物流公司ID
+	 */
+	@NotNull(message = "快递公司不能为空")
+	@ApiModelProperty(value = "物流公司", required = false)
+	private Long deliveryId;
+
+	/**
+	 * 物流单号ID
+	 */
+	@NotNull(message = "物流单号不能为空")
+	@ApiModelProperty(value = "物流单号", required = false)
+	private String deliveryFlowId;
+	
+	
+	@NotNull(message = "发货商品不能为空")
+	@ApiModelProperty(value = "发货商品", required = false)
+	private List<String> itemIds;;
+
+}

+ 12 - 0
mp-service/src/main/java/com/qs/mp/channel/service/IChannelOrderService.java

@@ -1,6 +1,9 @@
 package com.qs.mp.channel.service;
 
 import com.qs.mp.channel.domain.ChannelOrder;
+
+import java.util.List;
+
 import com.baomidou.mybatisplus.extension.service.IService;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.pay.domain.PayOrder;
@@ -37,4 +40,13 @@ public interface IChannelOrderService extends IService<ChannelOrder> {
    * @param payOrder
    */
   void paySuccess(PayOrder payOrder);
+  
+	/**
+	 * 渠道订单发货
+	 * 
+	 * @param orderId
+	 * @param pkgIds
+	 * @return
+	 */
+	boolean channelOrderShip(String orderId, List<String> pkgIdList);
 }

+ 85 - 0
mp-service/src/main/java/com/qs/mp/channel/service/impl/ChannelOrderServiceImpl.java

@@ -3,26 +3,35 @@ package com.qs.mp.channel.service.impl;
 import com.alibaba.fastjson.JSONObject;
 import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
 import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
+import com.baomidou.mybatisplus.core.toolkit.StringUtils;
 import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
 import com.qs.mp.admin.domain.TicketBox;
+import com.qs.mp.admin.domain.TicketPackage;
 import com.qs.mp.admin.service.ITicketBoxService;
+import com.qs.mp.admin.service.ITicketPackageService;
 import com.qs.mp.user.domain.UserAddr;
 import com.qs.mp.channel.domain.ChannelOrder;
+import com.qs.mp.channel.domain.ChannelOrderDetail;
 import com.qs.mp.channel.domain.ChannelOrderItem;
 import com.qs.mp.channel.domain.vo.ChannelCartVO;
 import com.qs.mp.channel.domain.vo.ChannelOrderSettleVO;
 import com.qs.mp.channel.mapper.ChannelOrderMapper;
 import com.qs.mp.channel.service.IChannelCartService;
+import com.qs.mp.channel.service.IChannelOrderDetailService;
 import com.qs.mp.channel.service.IChannelOrderItemService;
 import com.qs.mp.channel.service.IChannelOrderService;
+import com.qs.mp.common.core.domain.AjaxResult;
 import com.qs.mp.common.enums.ChannelOrderStatusEnum;
 import com.qs.mp.common.enums.TicketBoxStatusEnum;
+import com.qs.mp.common.enums.TicketPkgStatusEnum;
 import com.qs.mp.common.exception.ServiceException;
 import com.qs.mp.common.utils.LogUtil;
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.system.service.id.BizIdGenerator;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.stream.Collectors;
+
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 import org.springframework.beans.factory.annotation.Autowired;
@@ -57,6 +66,12 @@ public class ChannelOrderServiceImpl extends
 
   @Autowired
   private IChannelCartService channelCartService;
+  
+  @Autowired
+  private ITicketPackageService ticketPackageService;
+  
+  @Autowired
+  private IChannelOrderDetailService channelOrderDetailervice;
 
   @Override
   @Transactional
@@ -190,4 +205,74 @@ public class ChannelOrderServiceImpl extends
       throw new ServiceException("渠道采购票组订单支付成功时,更新订单状态失败");
     }
   }
+
+	@Override
+	@Transactional
+	public boolean channelOrderShip(String orderId, List<String> pkgIdList) {
+		ChannelOrder channelOrder = getById(orderId);
+		if(null == channelOrder || StringUtils.isBlank(channelOrder.getOrderId())) {
+			throw new ServiceException("发货订单异常,发货失败");
+		}
+		
+		List<TicketPackage> ticketPkgList = new ArrayList<TicketPackage>();
+		if(null != pkgIdList && pkgIdList.size() > 0) {
+			LambdaQueryWrapper<TicketPackage> queryWrapper = new LambdaQueryWrapper<TicketPackage>();
+			queryWrapper.eq(TicketPackage::getStatus, TicketPkgStatusEnum.FOR_SALE);
+			queryWrapper.in(TicketPackage::getPkgId,  pkgIdList);
+			ticketPkgList = ticketPackageService.list(queryWrapper);
+			if(null == ticketPkgList || ticketPkgList.size() == 0
+					|| ticketPkgList.size() != pkgIdList.size()) {
+				throw new ServiceException("发货票包状态异常,发货失败");
+			}
+		}
+		List<ChannelOrderItem> orderItemList = channelOrderItemService.list(
+		        new LambdaQueryWrapper<ChannelOrderItem>()
+		            .eq(ChannelOrderItem::getOrderId, orderId));
+		// 验证发货的盲票包是否与订单中的盲票包数量一致
+		if(null == orderItemList || orderItemList.size() == 0 ) {
+			throw new ServiceException("订单明细查询异常, 发货失败");
+		}
+		List<ChannelOrderDetail> detailList = new ArrayList<ChannelOrderDetail>();
+		// 验证是否为本订单盲票
+		for(TicketPackage ticketPackage:ticketPkgList) {
+			if(null != ticketPackage && StringUtils.isNotBlank(ticketPackage.getBoxId())) {
+				long num = orderItemList.stream().filter(channelOrderItem -> channelOrderItem.getBoxId().equals(ticketPackage.getBoxId())).count();
+				if(num < 1) {
+					String msg = "票包"+ticketPackage.getStartSn()+"-" + ticketPackage.getEndSn() +"非本订单盲票";
+					throw new ServiceException(msg);
+				}
+				ChannelOrderDetail channelOrderDetail = new ChannelOrderDetail();
+				channelOrderDetail.setBoxId(ticketPackage.getBoxId());
+				channelOrderDetail.setPkgId(ticketPackage.getPkgId());
+				channelOrderDetail.setOrderId(orderId);
+				channelOrderDetail.setStartSn(ticketPackage.getStartSn());
+				channelOrderDetail.setEndSn(ticketPackage.getEndSn());
+				channelOrderDetail.setChannelId(channelOrder.getChannelId());
+				detailList.add(channelOrderDetail);
+			}
+		}
+		// 校验数量是否一致
+		for(ChannelOrderItem orderItem:orderItemList) {
+			if(null != orderItem && StringUtils.isNotBlank(orderItem.getBoxId()) ) {
+				long totalNum = ticketPkgList.stream().filter(TicketPackage -> TicketPackage.getBoxId().equals(orderItem.getBoxId())).count();
+				if(totalNum != orderItem.getOrderNum()) {
+					String msg = "票组"+orderItem.getTitle()+"盲票包" + (totalNum > orderItem.getOrderNum()?"少于":"已超出")+"订单购买的盲票包数量";
+					throw new ServiceException(msg);
+				}
+			}
+		}
+		
+		boolean res = channelOrderDetailervice.saveBatch(detailList);
+		if(res) {
+			// 修改票包已销售状态
+			LambdaUpdateWrapper<TicketPackage> updateWrapper = new LambdaUpdateWrapper<TicketPackage>();
+			updateWrapper.set(TicketPackage::getStatus, TicketPkgStatusEnum.SOLD);
+			updateWrapper.in(TicketPackage::getPkgId, pkgIdList);
+			return ticketPackageService.update(updateWrapper);
+		}
+		
+		return false;
+	}
+	  
+  
 }

+ 10 - 0
mp-service/src/main/java/com/qs/mp/user/service/IUserDeliverOrderService.java

@@ -2,6 +2,7 @@ package com.qs.mp.user.service;
 
 import com.qs.mp.pay.domain.PayOrder;
 import com.qs.mp.user.domain.UserDeliverOrder;
+import com.qs.mp.user.domain.UserDeliverOrderItem;
 
 import java.util.List;
 
@@ -64,4 +65,13 @@ public interface IUserDeliverOrderService extends IService<UserDeliverOrder> {
 	 * @return
 	 */
 	public int selectUserDeliverOrderCount(Wrapper<UserDeliverOrder> wrapper);
+	
+	
+	/**
+	 * 用户提货订单发货
+	 * @param orderId
+	 * @param itemList
+	 * @return
+	 */
+	boolean userDeliverOrderShip(String orderId, List<UserDeliverOrderItem> itemList);
 }

+ 26 - 1
mp-service/src/main/java/com/qs/mp/user/service/impl/UserDeliverOrderServiceImpl.java

@@ -47,6 +47,9 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
   @Autowired
   private BizIdGenerator bizIdGenerator;
 
+  @Autowired
+  private IUserDeliverOrderService userDeliverOrderService;
+
   @Autowired
   private IUserDeliverOrderItemService userDeliverOrderItemService;
 
@@ -145,5 +148,27 @@ public class UserDeliverOrderServiceImpl extends ServiceImpl<UserDeliverOrderMap
 	public int selectUserDeliverOrderCount(Wrapper<UserDeliverOrder> wrapper) {
 		return getBaseMapper().selectUserDeliverOrderCount(wrapper);
 	}
-  
+
+	@Override
+	@Transactional
+	public boolean userDeliverOrderShip(String orderId, List<UserDeliverOrderItem> itemList) {
+		boolean res = userDeliverOrderItemService.updateBatchById(itemList);
+		if(res) {
+			// 检测订单是否全部提货完成
+			LambdaQueryWrapper<UserDeliverOrderItem> queryWrapper = new LambdaQueryWrapper<UserDeliverOrderItem>();
+			queryWrapper.eq(UserDeliverOrderItem::getOrderId, orderId);
+			queryWrapper.isNull(UserDeliverOrderItem::getDeliveryFlowId);
+			int noShipCnt = userDeliverOrderItemService.count(queryWrapper);
+			// 部分发货是订单状态仍保留待发货状态, 全部发完的时候再修改订单状态为待收货
+			LambdaUpdateWrapper<UserDeliverOrder> updateWrapper = new LambdaUpdateWrapper<UserDeliverOrder>();
+			updateWrapper.eq(UserDeliverOrder::getOrderId, orderId);
+			if(noShipCnt == 0) {
+				updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.NOT_CONFIRM);
+			}else {
+				updateWrapper.set(UserDeliverOrder::getStatus, DeliverOrderStatusEnum.PART_DELIVER);
+			}
+			return userDeliverOrderService.update(updateWrapper);
+		}
+		return false;
+	}
 }