package com.ishop.merchant.controller; import com.iplatform.base.Constants; import com.iplatform.core.SimpleVariable; import com.ishop.merchant.BaseController; import com.ishop.merchant.NotifyConstants; import com.ishop.merchant.OrderConstants; import com.ishop.merchant.pojo.OrderParam; import com.ishop.merchant.util.VoUtils; import com.ishop.model.po.EbExpress; import com.ishop.model.po.EbMerchantOrder; import com.ishop.model.po.EbOrder; import com.ishop.model.po.EbOrderDetail; import com.ishop.model.po.EbOrderInvoice; import com.ishop.model.po.EbOrderInvoiceDetail; import com.ishop.model.request.MarkOrderRequest; import com.ishop.model.request.OrderSendRequest; import com.ishop.model.vo.OrderCountVo; import com.ishop.model.vo.OrderInvoiceVo; import com.ishop.model.vo.PlatformOrderDetailVo; import com.ishop.model.vo.PlatformOrderVo; import com.walker.db.page.GenericPager; import com.walker.db.page.ListPageContext; import com.walker.infrastructure.arguments.Variable; import com.walker.infrastructure.time.TimeRange; import com.walker.infrastructure.time.TimeRangeUtils; import com.walker.infrastructure.utils.DateUtils; import com.walker.infrastructure.utils.NumberGenerator; import com.walker.infrastructure.utils.StringUtils; import com.walker.web.ResponseValue; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; @RestController @RequestMapping("/merchant/order") public class MerchantOrderController extends BaseController { @RequestMapping(value = "/send", method = RequestMethod.POST) public ResponseValue send(@RequestBody OrderSendRequest request){ if(request == null){ return ResponseValue.error(Constants.ERROR_ARGUMENT); } if(StringUtils.isEmpty(request.getOrderNo()) || StringUtils.isEmpty(request.getExpressNumber()) || StringUtils.isEmpty(request.getExpressCode())){ return ResponseValue.error("快递信息不完整"); } if (request.getDeliveryType().equals(OrderConstants.ORDER_DELIVERY_TYPE_EXPRESS)) { if (request.getExpressRecordType() == null) { return ResponseValue.error("请选择发货记录类型"); } String error = validateExpressSend(request); if(error != null){ return ResponseValue.error(error); } } int merId = this.getCurrentUser().getMer_id().intValue(); EbOrder order = this.getOrderService().queryOrder(request.getOrderNo()); if (order.getIsUserDel().intValue() == 1 || order.getIsMerchantDel().intValue() == 1) { return ResponseValue.error("订单已删除"); } // if (order.getLevel().intValue() != OrderConstants.ORDER_LEVEL_MERCHANT) { // throw new CrmebException("订单等级异常,不是商户订单"); // } if (order.getStatus().intValue() != OrderConstants.ORDER_STATUS_WAIT_SHIPPING && order.getStatus().intValue() != OrderConstants.ORDER_STATUS_PART_SHIPPING) { return ResponseValue.error("订单不处于待发货状态"); } EbMerchantOrder merchantOrder = this.getOrderService().queryMerchantOrderOne(request.getOrderNo()); if (merchantOrder.getShippingType().intValue() != OrderConstants.ORDER_SHIPPING_TYPE_EXPRESS) { return ResponseValue.error("订单非发货类型订单"); } // 正常发货,非拆单 if (!request.getIsSplit()) { if (request.getDeliveryType().equals(OrderConstants.ORDER_DELIVERY_TYPE_FICTITIOUS)) { // return virtual(order.getOrderNo()); throw new UnsupportedOperationException("未实现虚拟发货"); } if (request.getDeliveryType().equals(OrderConstants.ORDER_DELIVERY_TYPE_EXPRESS)) { return sendExpress(request, order, merchantOrder); } } // 拆单发货,暂不实现,2023-08-20 return ResponseValue.error("还未实现拆单发货"); } private ResponseValue sendExpress(OrderSendRequest request, EbOrder order, EbMerchantOrder merchantOrder){ EbExpress express = this.getExpressCache().get(request.getExpressCode()); if(express == null){ return ResponseValue.error("快递公司不存在"); } List orderDetailList = this.getOrderService().queryOrderDetailList(request.getOrderNo()); List orderInvoiceDetailList = new ArrayList<>(); List orderDetailUpdateList = new ArrayList<>(); for(EbOrderDetail od : orderDetailList){ if (od.getPayNum() > od.getDeliveryNum()) { EbOrderInvoiceDetail invoiceDetail = VoUtils.acquireOrderInvoiceDetail(od); invoiceDetail.setNum(od.getPayNum() - od.getDeliveryNum()); orderInvoiceDetailList.add(invoiceDetail); od.setDeliveryNum(od.getPayNum()); orderDetailUpdateList.add(od); } } if(StringUtils.isEmptyList(orderInvoiceDetailList)){ return ResponseValue.error("订单没有需要发货的商品"); } String trackingNumber = request.getExpressNumber(); // 电子面单,暂未集成,2023-08-21 // if (request.getExpressRecordType().equals(2)) { // 电子面单 // List productNameList = orderInvoiceDetailList.stream().map(OrderInvoiceDetail::getProductName).collect(Collectors.toList()); // String cargo = String.join(",", productNameList); // trackingNumber = expressDump(request, merchantOrder, express, cargo); // } // 生成发货单 EbOrderInvoice orderInvoice = new EbOrderInvoice(); orderInvoice.setId(NumberGenerator.getLongSequenceNumber()); orderInvoice.setMerId(order.getMerId()); orderInvoice.setOrderNo(order.getOrderNo()); orderInvoice.setUid(order.getUid()); orderInvoice.setExpressCode(express.getCode()); orderInvoice.setExpressName(express.getName()); orderInvoice.setTrackingNumber(trackingNumber); orderInvoice.setTotalNum(orderInvoiceDetailList.stream().mapToInt(EbOrderInvoiceDetail::getNum).sum()); orderInvoice.setCreateTime(DateUtils.getDateTimeNumber()); orderInvoice.setUpdateTime(orderInvoice.getCreateTime()); for(EbOrderInvoiceDetail e : orderInvoiceDetailList){ e.setInvoiceId(orderInvoice.getId()); } // 这里不用设置,创建时已经默认快递:express方式 // merchantOrder.setDeliveryType(OrderConstants.ORDER_DELIVERY_TYPE_EXPRESS); EbOrder updateOrder = new EbOrder(order.getId()); updateOrder.setStatus(OrderConstants.ORDER_STATUS_WAIT_RECEIPT); // 通知的消息 String message = OrderConstants.ORDER_LOG_MESSAGE_EXPRESS.replace("{deliveryName}", express.getName()).replace("{deliveryCode}", trackingNumber); this.getOrderService().execSendExpress(orderInvoice, orderInvoiceDetailList, orderDetailUpdateList, updateOrder); // 异步发送通知 List variableList = new ArrayList(8); // variableList.add(new SimpleVariable("first", "订单发货提醒")); // variableList.add(new SimpleVariable("keyword1", order.getOrderNo())); // variableList.add(new SimpleVariable("keyword2", orderInvoice.getExpressName())); // variableList.add(new SimpleVariable("keyword3", orderInvoice.getExpressCode())); // variableList.add(new SimpleVariable("remark", "欢迎再次光临")); variableList.add(new SimpleVariable("character_string2", order.getOrderNo())); variableList.add(new SimpleVariable("thing13", orderInvoice.getExpressName())); variableList.add(new SimpleVariable("character_string14", trackingNumber)); variableList.add(new SimpleVariable("thing22", this.getMerchantCache().get(merchantOrder.getMerId()).getName())); this.pushNotificationWithTemplate(NotifyConstants.DELIVER_GOODS_MARK, variableList, order.getUid()); return ResponseValue.success(); } /** * 校验快递发货参数 * @param request 发货参数 */ private String validateExpressSend(OrderSendRequest request) { if (StringUtils.isEmpty(request.getExpressCode())) return "请选择快递公司"; if (request.getExpressRecordType().equals("1")) { if (StringUtils.isEmpty(request.getExpressNumber())){ return "请填写快递单号"; } } else { // 电子面单,需要填写 if (StringUtils.isEmpty(request.getExpressTempId())) return "请选择电子面单"; if (StringUtils.isEmpty(request.getToName())) return "请填写寄件人姓名"; if (StringUtils.isEmpty(request.getToTel())) return "请填写寄件人电话"; if (StringUtils.isEmpty(request.getToAddr())) return "请填写寄件人地址"; } return null; } /** * 订单细节详情列表(发货使用) * @return * @date 2023-08-21 */ @RequestMapping(value = "/detail/list", method = RequestMethod.GET) public ResponseValue getDetailList(String orderNo){ if(StringUtils.isEmpty(orderNo)){ return ResponseValue.error(Constants.ERROR_ARGUMENT); } return ResponseValue.success(this.getOrderService().queryShipmentList(orderNo)); } /** * 商户备注订单 * @param request * @return */ @RequestMapping(value = "/mark", method = RequestMethod.POST) public ResponseValue mark(@RequestBody MarkOrderRequest request){ if(request == null || StringUtils.isEmpty(request.getOrderNo()) || StringUtils.isEmpty(request.getRemark())){ return ResponseValue.error("请输入订单备注"); } EbMerchantOrder merchantOrder = this.getOrderService().queryMerchantOrderOne(request.getOrderNo()); if(merchantOrder == null){ return ResponseValue.error("商户订单不存在"); } EbMerchantOrder updateOrder = new EbMerchantOrder(merchantOrder.getId()); updateOrder.setMerchantRemark(request.getRemark()); this.getOrderService().update(updateOrder); return ResponseValue.success(); } /** * 获取订单发货单列表 * @return * @date 2023-08-18 */ @RequestMapping(value = "/invoice/list", method = RequestMethod.GET) public ResponseValue getInvoiceList(String orderNo){ if(StringUtils.isEmpty(orderNo)){ return ResponseValue.error("订单编号不存在"); } List list = this.acquireOrderInvoiceList(orderNo); return ResponseValue.success(list); } @RequestMapping(value = "/info", method = RequestMethod.GET) public ResponseValue info(String orderNo){ if(StringUtils.isEmpty(orderNo)){ return ResponseValue.error("订单编号不存在"); } EbOrder order = this.getOrderService().queryOrder(orderNo); if(order == null){ return ResponseValue.error("订单不存在"); } int merId = this.getCurrentUser().getMer_id().intValue(); if (order.getIsMerchantDel().intValue() == 1 || order.getMerId().intValue() != merId) { return ResponseValue.error("未找到对应订单信息"); } PlatformOrderDetailVo vo = this.acquireCommonOrderDetail(order, orderNo); return ResponseValue.success(vo); } @RequestMapping(value = "/delete", method = RequestMethod.POST) public ResponseValue delete(String orderNo){ if(StringUtils.isEmpty(orderNo)){ return ResponseValue.error(Constants.ERROR_ARGUMENT); } int merId = this.getCurrentUser().getMer_id().intValue(); EbOrder order = this.getOrderService().queryPlatformOrder(orderNo, merId); if(order == null){ return ResponseValue.error("订单不存在"); } if(order.getIsUserDel().intValue() != 1){ return ResponseValue.error("用户还未删除订单"); } EbOrder updateOrder = new EbOrder(order.getId()); updateOrder.setIsMerchantDel(1); this.getOrderService().update(updateOrder); return ResponseValue.success(); } /** * 平台端获取订单各状态数量 * @return */ @RequestMapping(value = "/status/num", method = RequestMethod.GET) public ResponseValue getOrderStatusNum(String dateLimit){ OrderCountVo vo = new OrderCountVo(); return ResponseValue.success(vo); } @RequestMapping(value = "/list", method = RequestMethod.GET) public ResponseValue list(OrderParam param){ int merId = this.getCurrentUser().getMer_id().intValue(); GenericPager pager = null; if(param == null){ pager = this.getOrderService().queryPagePlatformOrderList(merId, null, null, null, null); } else { TimeRange timeRange = StringUtils.isEmpty(param.getDateLimit())? null : TimeRangeUtils.getDateLimit(param.getDateLimit()); pager = this.getOrderService().queryPagePlatformOrderList(merId, param.getOrderNo(), param.getType(), timeRange, param.getStatus()); } List data = pager.getDatas(); if(StringUtils.isEmptyList(data)){ return ResponseValue.success(pager); } List list = this.acquireCommonOrderList(data); return ResponseValue.success(ListPageContext.createGenericPager(list, pager.getPageIndex(), (int)pager.getTotalRows())); } }