package com.matrix.system.shopXcx.api.action;
|
|
import com.matrix.biz.bean.BizUser;
|
import com.matrix.component.redis.RedisUserLoginUtils;
|
import com.matrix.component.tools.WxUtils;
|
import com.matrix.component.wechat.externalInterface.protocol.paramProtocol.BrandWCPayRequestData;
|
import com.matrix.component.wechat.externalInterface.weixinUtil.WeixinServiceUtil;
|
import com.matrix.core.constance.SystemErrorCode;
|
import com.matrix.core.exception.GlobleException;
|
import com.matrix.core.pojo.AjaxResult;
|
import com.matrix.core.tools.StringUtils;
|
import com.matrix.system.common.constance.AppConstance;
|
import com.matrix.system.constance.Dictionary;
|
import com.matrix.system.hive.bean.ShoppingGoods;
|
import com.matrix.system.hive.dao.ShoppingGoodsDao;
|
import com.matrix.system.shopXcx.api.pojo.AddShopOrderPOJO;
|
import com.matrix.system.shopXcx.api.pojo.CreateOrderDto;
|
import com.matrix.system.shopXcx.api.pojo.OrderInfoQueryPOJO;
|
import com.matrix.system.shopXcx.api.service.ShoppingCartService;
|
import com.matrix.system.shopXcx.api.service.WXShopOrderService;
|
import com.matrix.system.shopXcx.api.service.WxShopCouponService;
|
import com.matrix.system.shopXcx.api.tools.WxShopCouponUtil;
|
import com.matrix.system.shopXcx.api.tools.WxShopOrderUtil;
|
import com.matrix.system.shopXcx.api.vo.CouponReceiveInfoVO;
|
import com.matrix.system.shopXcx.api.vo.ShopCartVo;
|
import com.matrix.system.shopXcx.bean.*;
|
import com.matrix.system.shopXcx.dao.*;
|
import com.matrix.system.shopXcx.dto.DiscountExplain;
|
import org.apache.commons.collections.CollectionUtils;
|
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Value;
|
import org.springframework.stereotype.Controller;
|
import org.springframework.web.bind.annotation.*;
|
|
import java.math.BigDecimal;
|
import java.util.ArrayList;
|
import java.util.Arrays;
|
import java.util.List;
|
|
|
/**
|
* @author jyy
|
* @description 订单控制器
|
* @date 2019-06-10 10:58
|
*/
|
@Controller
|
@RequestMapping(value = "wxapi/shopOrder")
|
public class WXShopOrderAction {
|
|
@Autowired
|
private WXShopOrderService shopOrderService;
|
|
@Autowired
|
WxShopCouponService wxShopCouponService;
|
|
@Autowired
|
private ShopReceiveAddressDao shopReceiveAddressDao;
|
|
@Autowired
|
ShoppingCartService shoppingCartService;
|
|
@Autowired
|
private ShopCouponDao shopCouponDao;
|
@Autowired
|
private WxShopCouponUtil wxShopCouponUtil;
|
|
@Autowired
|
private RedisUserLoginUtils redisUserLoginUtils;
|
|
@Autowired
|
ShopCouponRecordDao shopCouponRecordDao;
|
|
@Autowired
|
ShopSkuDao shopSkuDao;
|
|
@Autowired
|
ShopProductDao shopProductDao;
|
@Autowired
|
private WxShopOrderUtil wxShopOrderUtil;
|
|
@Autowired
|
private ShopOrderDetailsDao shopOrderDetailsDao;
|
|
@Autowired
|
ShopOrderDao shopOrderDao;
|
|
/**
|
* 计算购物车订单价格
|
*
|
* @param addShopOrderPOJO
|
* @return
|
* @throws Exception
|
*/
|
@PostMapping(value = "/calculationCartOrder")
|
public
|
@ResponseBody
|
AjaxResult calculationCartOrder(@RequestBody AddShopOrderPOJO addShopOrderPOJO) throws Exception {
|
BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class); //计算购物车中物品的优惠信息
|
|
List<ShopCartVo> cartList = shoppingCartService.findUserCartList(addShopOrderPOJO.getShopId(),ShopShoppingCart.CAR_TYPE_MICRO);
|
|
|
//取出购物车中选中的产品
|
List<ShopShoppingCart> buyCart = new ArrayList<>();
|
|
//取出购物车中没有参加店铺活动的产品,和参加了店铺活动但是活动没有达到标准的产品,用来计算是否可以使用优惠券
|
List<ShopShoppingCart> notCouponuyCart = new ArrayList<>();
|
for (ShopCartVo shopCartVo : cartList) {
|
for (ShopShoppingCart shopShoppingCart : shopCartVo.getCartList()) {
|
if (shopShoppingCart.getIsSelected() == 1) {
|
buyCart.add(shopShoppingCart);
|
if (shopCartVo.getCoupon() == null || !shopCartVo.isSatisfactionCoupon()) {
|
notCouponuyCart.add(shopShoppingCart);
|
}
|
}
|
}
|
}
|
//获取当前购物车产品可用的优惠券
|
List<CouponReceiveInfoVO> usefulCoupon = wxShopCouponService.getCartVoCouponList(bizUser.getCompanyId(),notCouponuyCart);
|
|
//获取用户使用的优惠券
|
CouponReceiveInfoVO shopCoupon = new CouponReceiveInfoVO();
|
if (addShopOrderPOJO.getCouponReceiveId() == null) {
|
//如果用户没有选择优惠券则默认选优惠金额最高的
|
//计算使用优惠券后的价格
|
if (CollectionUtils.isNotEmpty(usefulCoupon)) {
|
//根据优惠券ID用户ID查询优惠券信息
|
shopCoupon = usefulCoupon.get(0);
|
}
|
} else if (addShopOrderPOJO.getCouponReceiveId() != 1) {
|
//用户选择了优惠券
|
shopCoupon = shopCouponRecordDao.selectMyCouponByReceiveId(addShopOrderPOJO.getCouponReceiveId());
|
} else {
|
//用户不使用优惠券
|
}
|
|
|
//计算收货地址:
|
|
ShopReceiveAddress shopReceiveAddress = null;
|
if (addShopOrderPOJO.getReceiveAddrId() == null) {
|
//如果没有传收货地址则默认收货地址
|
shopReceiveAddress = shopReceiveAddressDao.selectDefaultAddress(bizUser.getOpenId());
|
if (shopReceiveAddress != null) {
|
addShopOrderPOJO.setReceiveAddrId(shopReceiveAddress.getAddrId());
|
}
|
} else {
|
shopReceiveAddress = shopReceiveAddressDao.selectById(addShopOrderPOJO.getReceiveAddrId());
|
addShopOrderPOJO.setReceiveAddrId(shopReceiveAddress.getAddrId());
|
|
}
|
|
|
//得到订单计价说明
|
DiscountExplain discountExplain = shopOrderService.buildDiscountExplain(cartList, shopCoupon.getReceiveId(), bizUser.getCompanyId());
|
|
AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, buyCart, buyCart.size());
|
//结算金额信息
|
result.putInMap("discountExplain", discountExplain);
|
|
|
//用户优惠券
|
result.putInMap("usefulCoupon", usefulCoupon);
|
//用户选中的优惠券
|
result.putInMap("shopCoupon", shopCoupon);
|
|
|
//默认地址
|
String deliverySelect = "立即配送";
|
if (shopReceiveAddress != null) {
|
if (StringUtils.isNotBlank(shopReceiveAddress.getSchool())) {
|
deliverySelect = "立即配送";
|
} else {
|
deliverySelect = "物流配送";
|
}
|
}
|
result.putInMap("defaultAddress", shopReceiveAddress);
|
//配送方式
|
result.putInMap("deliverySelect", deliverySelect);
|
|
|
result.setRows(buyCart);
|
return result;
|
}
|
|
|
@Autowired
|
ShoppingGoodsDao shoppingGoodsDao;
|
|
/**
|
* 新增订单
|
*
|
* @param addShopOrderPOJO
|
* @return
|
*/
|
@PostMapping(value = "/addShopOrder")
|
public
|
@ResponseBody
|
AjaxResult addShopOrder(@RequestBody AddShopOrderPOJO addShopOrderPOJO) throws Exception {
|
return shopOrderService.createShopOrder(addShopOrderPOJO);
|
}
|
|
|
/**
|
* 新增订单
|
* 本方法抛弃,不再使用,本方法是单单个产品购买
|
* 在多产品的时候不适合
|
* @return
|
*/
|
@Deprecated
|
@PostMapping(value = "/addShopOrder2")
|
public
|
@ResponseBody
|
AjaxResult addShopOrder2(@RequestBody CreateOrderDto createOrderDto) throws Exception {
|
|
|
//校验收货地址
|
ShopReceiveAddress shopReceiveAddress = shopReceiveAddressDao.selectById(createOrderDto.getReceiveAddrId());
|
if (shopReceiveAddress == null) {
|
return new AjaxResult(AjaxResult.STATUS_FAIL, "请选择正确的收获地址");
|
}
|
|
|
BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
|
ShopSku shopSku = shopSkuDao.selectById(createOrderDto.getSkuId());
|
ShopProduct shopProduct = shopProductDao.selectById(createOrderDto.getProductId());
|
String stokCode = shopSku.getStockCode();
|
|
ShopOrder shopOrder = new ShopOrder();
|
//查询绑定的产品是否为家居产品
|
if (StringUtils.isNotBlank(stokCode)) {
|
ShoppingGoods shoppingGoods = shoppingGoodsDao.selectById(Long.parseLong(stokCode));
|
if (shoppingGoods != null) {
|
//根据购买的产品设置订单类型
|
if (Dictionary.SHOPPING_GOODS_TYPE_JJCP.equals(shoppingGoods.getGoodType())) {
|
shopOrder.setOrderType(ShopOrder.ORDER_TYPE_GOODS);
|
} else {
|
shopOrder.setOrderType(ShopOrder.ORDER_TYPE_SERVICE);
|
}
|
} else {
|
shopOrder.setOrderType(ShopOrder.ORDER_TYPE_GOODS);
|
}
|
}
|
|
List<ShopOrderDetails> details = new ArrayList<>();
|
Integer cartCount = 0;
|
ShopOrderDetails shopOrderDetails = new ShopOrderDetails();
|
shopOrderDetails.setCreateBy(AppConstance.SYSTEM_USER);
|
shopOrderDetails.setUpdateBy(AppConstance.SYSTEM_USER);
|
shopOrderDetails.setpId(createOrderDto.getProductId());
|
shopOrderDetails.setsId(createOrderDto.getSkuId());
|
shopOrderDetails.setPrice(shopSku.getPrice());
|
shopOrderDetails.setCount(createOrderDto.getNumber());
|
shopOrderDetails.setsTitle(shopProduct.getTitle() + shopSku.getName());
|
shopOrderDetails.setDiscountAmount(BigDecimal.ZERO);
|
shopOrderDetails.setTotalPrice(shopOrderDetails.getPrice().multiply(BigDecimal.valueOf(shopOrderDetails.getCount())));
|
details.add(shopOrderDetails);
|
cartCount += shopOrderDetails.getCount();
|
|
|
//TODO 更新库存和销量[考虑和erp库存联动]
|
wxShopOrderUtil.updateProductAndSkuInfo(details);
|
|
//用户openId
|
shopOrder.setUserId(bizUser.getOpenId());
|
shopOrder.setCreateBy("微信小程序生成");
|
shopOrder.setUpdateBy("微信小程序生成");
|
shopOrder.setCommodityPrice(shopOrderDetails.getTotalPrice());
|
shopOrder.setPurchaseQuantity(cartCount);
|
//购买方式
|
shopOrder.setShippingMethod("物流配送");
|
//生成订单号
|
shopOrder.setOrderNo(WxUtils.getOrderNum());
|
//设置支付状态
|
shopOrder.setPayStatus(ShopOrder.ORDER_STATUS_WAIT_PAY);
|
//设置订单状态
|
shopOrder.setOrderStatus(ShopOrder.ORDER_STATUS_WAIT_SEND);
|
|
//设置退款费用(注:下次优化从数据字典表获取)
|
shopOrder.setRefundCharge(BigDecimal.ZERO);
|
//客户电话
|
shopOrder.setUserTel(shopReceiveAddress.getAddrTelephone());
|
//客户姓名
|
shopOrder.setUserName(shopReceiveAddress.getAddrLiaisonman());
|
//备注
|
shopOrder.setRemarks(createOrderDto.getRemarks());
|
//删除标识
|
shopOrder.setDelFlag(AppConstance.DATA_USEABLE);
|
//微信订单号
|
shopOrder.setWxOrderNo("");
|
//微信支付结果
|
shopOrder.setPayResult(ShopOrder.ORDER_WX_STATUS_WAIT_PAY);
|
//如果没有提交购买方式或配送方式不是物流
|
//获取邮费
|
shopOrder.setOrderMoney(shopOrderDetails.getTotalPrice());
|
shopOrder.setStoreId(createOrderDto.getShopId());
|
|
shopOrderDao.insert(shopOrder);
|
|
wxShopOrderUtil.insertSendPackageInfo(shopOrder, "物流配送", shopReceiveAddress);
|
|
//给订单详情表添加订单ID
|
shopOrderDetails.setOrderId(shopOrder.getId());
|
|
shopOrderDetailsDao.insert(shopOrderDetails);
|
|
|
BrandWCPayRequestData payData = startPayment(shopOrder);
|
AjaxResult result = new AjaxResult(AjaxResult.STATUS_SUCCESS, Arrays.asList(payData));
|
result.putInMap("orderId", shopOrder.getId());
|
|
return result;
|
|
|
}
|
|
@Value("${wx_pay_debug_onoff}")
|
private boolean isDebug;
|
@Autowired
|
private WeixinServiceUtil weixinServiceUtil;
|
|
/**
|
* 开始付款
|
*
|
* @param shopOrder
|
* @return
|
* @throws Exception
|
*/
|
public BrandWCPayRequestData startPayment(ShopOrder shopOrder) throws Exception {
|
BigDecimal unit = new BigDecimal("100");
|
BigDecimal money = new BigDecimal(shopOrder.getOrderMoney().toString());
|
BrandWCPayRequestData payData;
|
String productNames = wxShopOrderUtil.getProductNames(shopOrder.getUserId(), shopOrder.getId());
|
if (isDebug) {
|
payData = weixinServiceUtil.createOrder("[测试]" + productNames, shopOrder.getOrderNo(),
|
1, shopOrder.getUserId(), String.valueOf(shopOrder.getId()));
|
} else {
|
payData = weixinServiceUtil.createOrder(productNames, shopOrder.getOrderNo(),
|
unit.multiply(money).intValue(), shopOrder.getUserId(), String.valueOf(shopOrder.getId()));
|
}
|
ShopOrder updateParam = new ShopOrder();
|
updateParam.setId(shopOrder.getId());
|
updateParam.setWxOrderNo(payData.getPrepay_id());
|
shopOrderDao.updateByModel(updateParam);
|
return payData;
|
}
|
|
|
/**
|
* 订单结算
|
*
|
* @param orderId 订单ID
|
* @return
|
*/
|
@GetMapping(value = "orderSettlement/{orderId}")
|
public
|
@ResponseBody
|
AjaxResult orderSettlement(@PathVariable("orderId") int orderId) {
|
try {
|
return shopOrderService.orderSettlement(orderId);
|
} catch (Exception e) {
|
throw new GlobleException(SystemErrorCode.DATA_ADD_FAIL);
|
}
|
}
|
|
/**
|
* 查询订单支付结果
|
*
|
* @param orderId
|
* @return
|
* @throws InterruptedException
|
* @author JIANGYOUYAO
|
* @email 935090232@qq.com
|
* @date 2018年9月8日
|
*/
|
@GetMapping(value = "/findOrderPayStatus/{orderId}")
|
public
|
@ResponseBody
|
AjaxResult findOrderPayStatus(@PathVariable Integer orderId) throws InterruptedException {
|
AjaxResult ajaxResult = shopOrderService.findOrderPayStatus(orderId);
|
return ajaxResult;
|
}
|
|
/**
|
* 获取我的订单信息
|
*
|
* @return
|
*/
|
@PostMapping(value = "getMyOrderInfo")
|
@ResponseBody
|
public AjaxResult getMyOrderInfo(@RequestBody OrderInfoQueryPOJO orderInfoQueryPOJO) {
|
AjaxResult ajaxResult = shopOrderService.getMyOrderInfo(orderInfoQueryPOJO);
|
return ajaxResult;
|
}
|
|
/**
|
* 通过订单ID获取订单信息
|
*
|
* @return
|
*/
|
@GetMapping(value = "getOrderInfoById/{orderId}")
|
@ResponseBody
|
public AjaxResult getOrderInfoById(@PathVariable Integer orderId) {
|
AjaxResult ajaxResult = shopOrderService.getOrderInfoById(orderId);
|
return ajaxResult;
|
}
|
|
/**
|
* 取消订单
|
*
|
* @param
|
* @return
|
*/
|
@GetMapping(value = "cancelOrderWhenWaitPay/{orderId}")
|
@ResponseBody
|
public AjaxResult cancelOrderWhenWaitPay(@PathVariable("orderId") Integer orderId) {
|
return shopOrderService.cancelOrderWhenWaitPay(orderId);
|
}
|
|
/**
|
* 删除订单
|
*
|
* @param
|
* @return
|
*/
|
@GetMapping(value = "delOrder/{orderId}")
|
@ResponseBody
|
public AjaxResult delOrderById(@PathVariable("orderId") Integer orderId) {
|
return shopOrderService.delOrderById(orderId);
|
}
|
|
/**
|
* 确认收货
|
*
|
* @param
|
* @return
|
*/
|
@GetMapping(value = "confirmPackageById/{orderId}")
|
@ResponseBody
|
public AjaxResult confirmPackageById(@PathVariable("orderId") Integer orderId) {
|
return shopOrderService.confirmPackageById(orderId);
|
}
|
|
|
@GetMapping(value = "/getOrderStatusCount")
|
@ResponseBody
|
public AjaxResult getOrderStatusCount() {
|
BizUser bizUser = redisUserLoginUtils.getLoginUser(BizUser.class);
|
AjaxResult result = AjaxResult.buildSuccessInstance(
|
shopOrderDao.selectOrderStatusCount(bizUser.getOpenId()));
|
return result;
|
}
|
|
}
|