chao 3 rokov pred
rodič
commit
9fa26fe4c0

+ 12 - 1
src/main/java/com/caimei365/order/components/ProductService.java

@@ -332,5 +332,16 @@ public class ProductService {
         log.info(note + ">>>>>>>>>>>收款项和订单关系(insert[cm_receipt_order_relation])id:" + relation.getId() + ",orderId:" + orderId);
     }
 
-
+    /**
+     * 更新用户采美豆
+     * @param beansHistory  采美豆使用记录
+     * @param userBeans     用户原有采美豆数量
+     * @param note          日志备注
+     */
+    public void updateUserBeans(UserBeansHistoryPo beansHistory, Integer userBeans, String note) {
+        // 保存 采美豆使用记录
+        baseMapper.insertBeansHistory(beansHistory);
+        baseMapper.updateUserBeans(beansHistory.getUserId(), userBeans);
+        log.info(note + ">>>>>更新用户采美豆(update[user(userBeans:"+ userBeans +")]),userId:" + beansHistory.getUserId());
+    }
 }

+ 53 - 5
src/main/java/com/caimei365/order/controller/OrderClubApi.java

@@ -1,7 +1,6 @@
 package com.caimei365.order.controller;
 
 import com.caimei365.order.model.ResponseJson;
-import com.caimei365.order.model.dto.CartDto;
 import com.caimei365.order.model.dto.OrderDto;
 import com.caimei365.order.service.OrderClubService;
 import io.swagger.annotations.Api;
@@ -22,7 +21,9 @@ import org.springframework.web.bind.annotation.RestController;
 @RequiredArgsConstructor
 @RequestMapping("/order/club")
 public class OrderClubApi {
+
     private final OrderClubService orderClubService;
+    private final String ID_EMPTY = "订单Id不能为空!";
 
     /**
      * 机构确认订单
@@ -31,15 +32,62 @@ public class OrderClubApi {
      *                orderId      订单ID
      * }
      */
-    @ApiOperation("更新购物车(旧:/order/affirmOrder)")
+    @ApiOperation("机构确认订单(旧:/order/affirmOrder)")
     @PostMapping("/confirm")
-    public ResponseJson<Void> orderClubService(OrderDto orderDto){
+    public ResponseJson<Void> confirmOrder(OrderDto orderDto){
         if (null == orderDto.getOrderId()) {
-            return ResponseJson.error("订单Id不能为空!", null);
+            return ResponseJson.error(ID_EMPTY, null);
         }
-        return orderClubService.orderClubService(orderDto.getOrderId());
+        return orderClubService.confirmMainOrder(orderDto.getOrderId());
     }
 
+    /**
+     * 机构取消订单
+     *
+     * @param orderDto {
+     *                orderId      订单ID
+     *                note         备注(订单取消原因)
+     * }
+     */
+    @ApiOperation("机构取消订单(旧:/order/cancel)")
+    @PostMapping("/cancel")
+    public ResponseJson<Void> cancelOrder(OrderDto orderDto){
+        if (null == orderDto.getOrderId()) {
+            return ResponseJson.error(ID_EMPTY, null);
+        }
+        return orderClubService.cancelMainOrder(orderDto.getOrderId(), orderDto.getRemark());
+    }
 
+    /**
+     * 机构删除订单
+     *
+     * @param orderDto {
+     *                orderId      订单ID
+     * }
+     */
+    @ApiOperation("机构删除订单(旧:/order/delete)")
+    @PostMapping("/delete")
+    public ResponseJson<Void> deleteOrder(OrderDto orderDto){
+        if (null == orderDto.getOrderId()) {
+            return ResponseJson.error(ID_EMPTY, null);
+        }
+        return orderClubService.deleteMainOrder(orderDto.getOrderId());
+    }
+
+    /**
+     * 机构确认收货
+     *
+     * @param orderDto {
+     *                orderId      订单ID
+     * }
+     */
+    @ApiOperation("机构确认收货(旧:/order/affirm)")
+    @PostMapping("/receive")
+    public ResponseJson<Void> receiveGoods(OrderDto orderDto){
+        if (null == orderDto.getOrderId()) {
+            return ResponseJson.error(ID_EMPTY, null);
+        }
+        return orderClubService.receiveGoods(orderDto.getOrderId());
+    }
 
 }

+ 21 - 5
src/main/java/com/caimei365/order/mapper/BaseMapper.java

@@ -1,9 +1,6 @@
 package com.caimei365.order.mapper;
 
-import com.caimei365.order.model.po.DiscernReceiptPo;
-import com.caimei365.order.model.po.OrderReceiptRelationPo;
-import com.caimei365.order.model.po.PurchaseHistoryPo;
-import com.caimei365.order.model.po.PurchasePricePo;
+import com.caimei365.order.model.po.*;
 import com.caimei365.order.model.vo.*;
 import org.apache.ibatis.annotations.Mapper;
 import org.apache.ibatis.annotations.Param;
@@ -32,6 +29,10 @@ public interface BaseMapper {
      * 根据用户Id查询公司名
      */
     String getUserNameByUserId(Integer userId);
+    /**
+     * 根据用户Id查询手机号
+     */
+    String getBindMobileByUserId(Integer userId);
     /**
      * 根据商品ID查询阶梯价列表
      */
@@ -65,11 +66,16 @@ public interface BaseMapper {
      * @param userId 用户Id
      */
     InvoiceVo getUserInvoice(Integer userId);
+    /**
+     * 根据用户Id获取用户余额
+     * @param userId 用户Id
+     */
+    Double getUserMoney(Integer userId);
     /**
      * 可用余额
      * @param userId 用户Id
      */
-    Double getUserAbleUserMoney(Integer userId);
+    Double getAbleUserMoney(Integer userId);
     /**
      * 可用采美豆
      * @param userId 用户Id
@@ -129,4 +135,14 @@ public interface BaseMapper {
      * 保存 收款项和订单关系
      */
     void insertOrderReceiptRelation(OrderReceiptRelationPo relation);
+    /**
+     * 保存 采美豆使用记录
+     */
+    void insertBeansHistory(UserBeansHistoryPo beansHistory);
+    /**
+     * 更新用户剩余采美豆数量
+     * @param userBeans 采美豆数量
+     * @param userId 机构用户Id
+     */
+    void updateUserBeans(Integer userId, int userBeans);
 }

+ 62 - 5
src/main/java/com/caimei365/order/mapper/OrderClubMapper.java

@@ -1,8 +1,10 @@
 package com.caimei365.order.mapper;
 
+import com.caimei365.order.model.po.BalanceRecordPo;
 import com.caimei365.order.model.po.OrderPo;
 import com.caimei365.order.model.po.OrderProductPo;
 import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
 
 import java.util.List;
 
@@ -28,20 +30,75 @@ public interface OrderClubMapper {
      * 设置二手仪器已售
      * @param productId 商品Id
      */
-    void updateSecondStatus(Integer productId);
+    void updateSecondStatus(Integer productId, Integer sold);
     /**
-     * 根据用户Id获取用户余额
+     * 根据用户Id更新用户余额
      * @param userId 用户Id
      */
-    Double getUserMoneyByUserId(Integer userId);
+    void updateUserMoneyByUserId(double userMoney, Integer userId);
     /**
-     * 根据用户Id更新用户余额
+     * 根据用户Id更新用户可用余额
      * @param userId 用户Id
      */
-    void updateUserMoneyByUserId(double updateMoney, Integer userId);
+    void updateAbleUserMoneyByUserId(double ableUserMoney, Integer userId);
     /**
      * 更新订单状态
      * @param order 主订单
      */
     void updateOrderStatus(OrderPo order);
+    /**
+     * 取消 余额收支记录
+     * @param balanceRecord
+     */
+    void cancelBalanceRecord(BalanceRecordPo balanceRecord);
+    /**
+     * 取消 订单
+     * @param order
+     */
+    void cancelMainOrder(OrderPo order);
+    /**
+     * 逻辑删除主订单
+     * @param order
+     */
+    void deleteMainOrder(OrderPo order);
+    /**
+     * 逻辑删除子订单
+     * @param shopOrderIds 子订单Ids
+     */
+    void deleteShopOrder(@Param("shopOrderIds") List<String> shopOrderIds);
+    /**
+     * 获取收款记录Id列表
+     * @param orderId 订单Id
+     */
+    List<String> getOrderReceiptIds(Integer orderId);
+    /**
+     * 逻辑删除订单与收款记录关系表
+     * @param orderId 订单Id
+     */
+    void deleteOrderReceiptRelation(Integer orderId);
+    /**
+     * 逻辑删除收款记录表
+     * @param receiptIds 收款记录Ids
+     */
+    void deleteDiscernReceipt(@Param("receiptIds") List<String> receiptIds);
+    /**
+     * 获取付款记录Id列表
+     * @param shopOrderIds 子订单Ids
+     */
+    List<String> getPayShopIds(@Param("shopOrderIds") List<String> shopOrderIds);
+    /**
+     * 逻辑删除订单与付款记录关系表
+     * @param shopOrderIds 子订单Ids
+     */
+    void deletePayShopRecord(@Param("shopOrderIds") List<String> shopOrderIds);
+    /**
+     * 逻辑删除付款记录表
+     * @param payIds 付款记录Ids
+     */
+    void deletePayShop(@Param("payIds") List<String> payIds);
+    /**
+     * 更新物流状态
+     * @param orderId 订单Id
+     */
+    void updateLogisticsBatch(Integer orderId);
 }

+ 0 - 10
src/main/java/com/caimei365/order/mapper/SubmitMapper.java

@@ -101,14 +101,4 @@ public interface SubmitMapper {
      * 保存余额到余额收支记录
      */
     void insertBalanceRecord(BalanceRecordPo balanceRecord);
-    /**
-     * 保存 采美豆使用记录
-     */
-    void insertBeansHistory(UserBeansHistoryPo beansHistory);
-    /**
-     * 更新用户剩余采美豆数量
-     * @param userBeans 采美豆数量
-     * @param userId 机构用户Id
-     */
-    void updateUserBeans(Integer userId, int userBeans);
 }

+ 5 - 0
src/main/java/com/caimei365/order/model/dto/OrderDto.java

@@ -17,4 +17,9 @@ public class OrderDto {
      */
     @ApiModelProperty("订单Id")
     private Integer orderId;
+    /**
+     * 备注(订单取消原因)
+     */
+    @ApiModelProperty("备注(订单取消原因)")
+    private String remark;
 }

+ 1 - 1
src/main/java/com/caimei365/order/model/po/DiscernReceiptPo.java

@@ -23,7 +23,7 @@ public class DiscernReceiptPo implements Serializable {
      */
     private Integer payWay;
     /**
-     * 付款类型:1建设银行7297、2广发银行0115、3中信银行7172、4中信银行0897、5中信银行0897-财付通、6中信银行0897-支付宝、7线上-支付宝、8线上-微信支付、9线上-快钱支付、10口头返佣、11广发银行5461
+     * 付款类型:1建设银行7297、2广发银行0115、3中信银行7172、4中信银行0897、5中信银行0897-财付通、6中信银行0897-支付宝、7线上-支付宝、8线上-微信支付、9线上-快钱支付、10口头返佣、11广发银行5461、12PC-B2B网银、13PC-微信支付、14PC-支付宝、15小程序-微信支付、16余额抵扣、17PC-B2C网银
      */
     private Integer payType;
     /**

+ 12 - 0
src/main/java/com/caimei365/order/model/po/OrderPo.java

@@ -186,4 +186,16 @@ public class OrderPo implements Serializable {
      * 子订单ID
      */
     private String shopOrderIds;
+    /**
+     * 订单取消原因
+     */
+    private String closeReason;
+    /**
+     * 订单取消时间
+     */
+    private String closeTime;
+    /**
+     * 订单备注
+     */
+    private String note;
 }

+ 17 - 1
src/main/java/com/caimei365/order/service/OrderClubService.java

@@ -13,5 +13,21 @@ public interface OrderClubService {
      * 机构确认订单
      * @param orderId 订单Id
      */
-    ResponseJson<Void> orderClubService(Integer orderId);
+    ResponseJson<Void> confirmMainOrder(Integer orderId);
+    /**
+     * 机构取消订单
+     * @param orderId 订单Id
+     * @param note    备注(订单取消原因)
+     */
+    ResponseJson<Void> cancelMainOrder(Integer orderId, String remark);
+    /**
+     * 机构删除订单
+     * @param orderId 订单Id
+     */
+    ResponseJson<Void> deleteMainOrder(Integer orderId);
+    /**
+     * 机构确认收货
+     * @param orderId 订单Id
+     */
+    ResponseJson<Void> receiveGoods(Integer orderId);
 }

+ 1 - 1
src/main/java/com/caimei365/order/service/impl/CartClubServiceImpl.java

@@ -694,7 +694,7 @@ public class CartClubServiceImpl implements CartClubService {
         // 发票信息
         InvoiceVo invoice = baseMapper.getUserInvoice(userId);
         // 可用余额
-        Double availableMoney = baseMapper.getUserAbleUserMoney(userId);
+        Double availableMoney = baseMapper.getAbleUserMoney(userId);
         // 可用采美豆
         Integer userBeans = baseMapper.getUserBeans(userId);
         // 包装返回数据

+ 2 - 2
src/main/java/com/caimei365/order/service/impl/CartSellerServiceImpl.java

@@ -553,7 +553,7 @@ public class CartSellerServiceImpl implements CartSellerService {
         // 发票信息
         InvoiceVo invoice = baseMapper.getUserInvoice(clubUserId);
         // 可用余额
-        Double availableMoney = baseMapper.getUserAbleUserMoney(clubUserId);
+        Double availableMoney = baseMapper.getAbleUserMoney(clubUserId);
         // 可用采美豆
         Integer userBeans = baseMapper.getUserBeans(clubUserId);
         // 包装返回数据
@@ -602,7 +602,7 @@ public class CartSellerServiceImpl implements CartSellerService {
         // 发票信息
         InvoiceVo invoice = baseMapper.getUserInvoice(clubUserId);
         // 可用余额
-        Double availableMoney = baseMapper.getUserAbleUserMoney(clubUserId);
+        Double availableMoney = baseMapper.getAbleUserMoney(clubUserId);
         // 可用采美豆
         Integer userBeans = baseMapper.getUserBeans(clubUserId);
         // 包装返回数据

+ 199 - 6
src/main/java/com/caimei365/order/service/impl/OrderClubServiceImpl.java

@@ -1,17 +1,25 @@
 package com.caimei365.order.service.impl;
 
 import com.caimei365.order.components.ProductService;
+import com.caimei365.order.mapper.BaseMapper;
 import com.caimei365.order.mapper.OrderClubMapper;
 import com.caimei365.order.model.ResponseJson;
+import com.caimei365.order.model.po.BalanceRecordPo;
 import com.caimei365.order.model.po.OrderPo;
 import com.caimei365.order.model.po.OrderProductPo;
+import com.caimei365.order.model.po.UserBeansHistoryPo;
+import com.caimei365.order.service.MessagePushService;
 import com.caimei365.order.service.OrderClubService;
 import com.caimei365.order.utils.MathUtil;
 import lombok.extern.slf4j.Slf4j;
+import org.apache.commons.lang.StringUtils;
+import org.springframework.beans.factory.annotation.Value;
 import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
 
 import javax.annotation.Resource;
 import java.text.SimpleDateFormat;
+import java.util.Arrays;
 import java.util.Date;
 import java.util.List;
 
@@ -24,17 +32,24 @@ import java.util.List;
 @Slf4j
 @Service
 public class OrderClubServiceImpl implements OrderClubService {
+    @Resource
+    private BaseMapper baseMapper;
     @Resource
     private OrderClubMapper orderClubMapper;
     @Resource
     private ProductService productService;
+    @Resource
+    private MessagePushService messagePushService;
+    @Value("${caimei.wwwDomain}")
+    private String domain;
+
     /**
      * 机构确认订单
      *
      * @param orderId 订单Id
      */
     @Override
-    public ResponseJson<Void> orderClubService(Integer orderId) {
+    public ResponseJson<Void> confirmMainOrder(Integer orderId) {
         OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
         if (null == order || 0 != order.getStatus()) {
             // 非待确认订单
@@ -54,16 +69,15 @@ public class OrderClubServiceImpl implements OrderClubService {
             productService.savePurchasePrice(order, product, secondFlag, note);
             // 二手商品确认商品如果是二手仪器则需要把该二手商品置为已售
             if (secondFlag) {
-                orderClubMapper.updateSecondStatus(product.getProductId());
+                orderClubMapper.updateSecondStatus(product.getProductId(), 1);
             }
         });
-
         if (null != order.getBalancePayFee() && MathUtil.compare(order.getBalancePayFee(), 0) > 0) {
-            double userMoney = orderClubMapper.getUserMoneyByUserId(orderId);
+            double userMoney = baseMapper.getUserMoney(order.getUserId());
             double updateMoney = MathUtil.sub(userMoney, order.getBalancePayFee()).doubleValue();
             // 扣除用户余额
-            orderClubMapper.updateUserMoneyByUserId(updateMoney, orderId);
-            log.info(note + ">>>>>>>>>>>更新用户余额(update[user])userId:" + orderId + ",orderId:" + order.getOrderId());
+            orderClubMapper.updateUserMoneyByUserId(updateMoney, order.getUserId());
+            log.info(note + ">>>>>>>>>>>更新用户余额(update[user(userMoney)])userId:" + order.getUserId() + ",orderId:" + orderId);
             // 保存余额到收款记录
             productService.saveDiscernReceipt(order.getBalancePayFee(), orderId, note);
         }
@@ -86,4 +100,183 @@ public class OrderClubServiceImpl implements OrderClubService {
 
         return ResponseJson.success("确认订单成功!", null);
     }
+
+    /**
+     * 机构取消订单
+     *
+     * @param orderId   订单Id
+     * @param remark    备注(订单取消原因)
+     */
+    @Transactional
+    @Override
+    public ResponseJson<Void> cancelMainOrder(Integer orderId, String remark) {
+        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
+        boolean cancelFlag = (null != order && (0 == order.getStatus() || 11 == order.getStatus()));
+        if (!cancelFlag) {
+            // 非待确认(或待收待发)订单
+            return ResponseJson.error("订单异常!", null);
+        }
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        String note = "【取消订单】";
+        // 余额退回原账户
+        if (null != order.getBalancePayFee() && MathUtil.compare(order.getBalancePayFee(), 0) > 0) {
+            double ableUserMoney = baseMapper.getAbleUserMoney(order.getUserId());
+            double updateMoney = MathUtil.add(ableUserMoney, order.getBalancePayFee()).doubleValue();
+            // 退回用户可用余额
+            orderClubMapper.updateUserMoneyByUserId(updateMoney, order.getUserId());
+            log.info(note + ">>>>>>>>>>>可用余额退回原账户(update[user(ableUserMoney)])userId:" + order.getUserId() + ",orderId:" + orderId);
+            // 取消收支记录
+            BalanceRecordPo balanceRecord = new BalanceRecordPo();
+            balanceRecord.setUserId(order.getUserId());
+            balanceRecord.setOrderId(orderId);
+            balanceRecord.setRemark("取消订单,余额记录无效");
+            balanceRecord.setDelFlag(1);
+            // 取消 余额收支记录
+            orderClubMapper.cancelBalanceRecord(balanceRecord);
+            log.info(note +">>>>>>>>>>>>取消余额收支记录(update[cm_user_balance_record])orderId:" + orderId);
+        }
+        order.setStatus(6);
+        if (StringUtils.isBlank(remark)) {
+            remark = "协销或用户主动取消订单";
+        }
+        order.setCloseReason(remark);
+        order.setCloseTime(curDateStr);
+        // 取消 订单
+        orderClubMapper.cancelMainOrder(order);
+        //二手订单取消订单, 二手商品标记未售
+        if (1 == order.getSecondHandOrderFlag()) {
+            List<OrderProductPo> orderProducts = orderClubMapper.getOrderProductList(orderId);
+            orderProducts.forEach(product -> {
+                // 是否二手商品
+                boolean secondFlag = false;
+                if (null != product.getProductCategory() && 2 == product.getProductCategory()) {
+                    secondFlag = true;
+                }
+                // 二手仪器标记未售
+                if (secondFlag) {
+                    orderClubMapper.updateSecondStatus(product.getProductId(), 0);
+                }
+            });
+        }
+        // 退回 采美豆
+        if (null != order.getUserBeans() && order.getUserBeans() > 0) {
+            UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
+            beansHistory.setUserId(order.getUserId());
+            beansHistory.setOrderId(orderId);
+            beansHistory.setBeansType(9);
+            beansHistory.setType(1);
+            beansHistory.setNum(order.getUserBeans());
+            beansHistory.setPushStatus(0);
+            beansHistory.setAddTime(date);
+            beansHistory.setDelFlag(0);
+            // 用户采美豆
+            Integer userBeans = baseMapper.getUserBeans(order.getUserId());
+            // 更新用户剩余采美豆数量
+            int beans = userBeans + beansHistory.getNum();
+            productService.updateUserBeans(beansHistory, beans, note);
+        }
+        //取消订单短信推送
+        String bindMobile = baseMapper.getBindMobileByUserId(order.getUserId());
+        if (StringUtils.isNotBlank(bindMobile)) {
+            String shortLink = messagePushService.getShortLink(8, 11, domain + "/user/order/detail.html?orderId=" + orderId);
+            String content = "您已成功取消订单(订单编号:" + order.getOrderNo() + "),订单金额¥" + order.getPayTotalFee() + "。您可关注采美公众号或者访问采美微信小程序和网站查看订单。" +
+                    "平台公众号:微信搜索“采美365网”; 微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
+            boolean sendSms = messagePushService.getSendSms(11, bindMobile, content);
+            if (!sendSms) {
+                log.info("取消订单推送失败,orderId>>>>" + orderId);
+            }
+        }
+
+        return ResponseJson.success("取消订单成功!", null);
+    }
+
+    /**
+     * 机构删除订单
+     *
+     * @param orderId 订单Id
+     */
+    @Override
+    public ResponseJson<Void> deleteMainOrder(Integer orderId) {
+        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
+        if (null == order || 6 != order.getStatus()) {
+            // 非已关闭订单
+            return ResponseJson.error("订单异常!", null);
+        }
+        // 逻辑删除主订单
+        order.setDelFlag(1);
+        order.setNote("用户发起删除订单");
+        orderClubMapper.deleteMainOrder(order);
+        log.info("【删除订单】>>>>>>>>>逻辑删除主订单(update[cm_order])orderId:" + orderId);
+        // 逻辑删除子订单
+        String[] shopOrderIdArr = order.getShopOrderIds().split(",");
+        List<String> shopOrderIds = Arrays.asList(shopOrderIdArr);
+        orderClubMapper.deleteShopOrder(shopOrderIds);
+        log.info("【删除订单】>>>>>>>>>逻辑删除子订单(update[cm_shop_order])shopOrderIds:" + order.getShopOrderIds());
+        // 逻辑删除收款记录
+        List<String> receiptIds = orderClubMapper.getOrderReceiptIds(orderId);
+        if (!receiptIds.isEmpty()) {
+            orderClubMapper.deleteOrderReceiptRelation(orderId);
+            orderClubMapper.deleteDiscernReceipt(receiptIds);
+            log.info("【删除订单】>>>>>>>>>逻辑删除收款记录(update[cm_discern_receipt])orderId:" + orderId);
+        }
+        // 逻辑删除付款记录
+        List<String> payIds = orderClubMapper.getPayShopIds(shopOrderIds);
+        if (!payIds.isEmpty()) {
+            orderClubMapper.deletePayShopRecord(shopOrderIds);
+            orderClubMapper.deletePayShop(payIds);
+            log.info("【删除订单】>>>>>>>>>逻辑删除付款记录(update[cm_pay_shop])shopOrderIds:" + order.getShopOrderIds());
+        }
+
+        return ResponseJson.success("删除订单成功!", null);
+    }
+
+    /**
+     * 机构确认收货
+     *
+     * @param orderId 订单Id
+     */
+    @Override
+    public ResponseJson<Void> receiveGoods(Integer orderId) {
+        OrderPo order = orderClubMapper.getMainOrderByOrderId(orderId);
+        if (null == order) {
+            // 非已关闭订单
+            return ResponseJson.error("订单不存在!", null);
+        }
+        if (33 == order.getStatus() && 3 == order.getPayStatus()) {
+            // 已付款供应商,订单完成
+            order.setStatus(5);
+        } else if (33 == order.getStatus()) {
+            // 交易完成
+            order.setStatus(4);
+        } else {
+            return ResponseJson.error("订单异常!", null);
+        }
+        Date date = new Date();
+        String curDateStr = (new SimpleDateFormat("yyyy-MM-dd HH:mm:ss")).format(date);
+        String note = "【确认收货】";
+        order.setUpdateDate(curDateStr);
+        // 更新订单状态
+        orderClubMapper.updateOrderStatus(order);
+        // 更新物流状态
+        orderClubMapper.updateLogisticsBatch(orderId);
+
+        // 主动确认收货,赠送100采美豆
+        UserBeansHistoryPo beansHistory = new UserBeansHistoryPo();
+        beansHistory.setUserId(order.getUserId());
+        beansHistory.setOrderId(orderId);
+        beansHistory.setBeansType(7);
+        beansHistory.setType(1);
+        beansHistory.setNum(100);
+        beansHistory.setPushStatus(0);
+        beansHistory.setAddTime(date);
+        beansHistory.setDelFlag(0);
+        // 用户采美豆
+        Integer userBeans = baseMapper.getUserBeans(order.getUserId());
+        // 更新用户剩余采美豆数量
+        int beans = userBeans + beansHistory.getNum();
+        productService.updateUserBeans(beansHistory, beans, note);
+
+        return ResponseJson.success("确认收货成功!", null);
+    }
 }

+ 5 - 8
src/main/java/com/caimei365/order/service/impl/SubmitServiceImpl.java

@@ -1180,12 +1180,9 @@ public class SubmitServiceImpl implements SubmitService {
             beansHistory.setPushStatus(0);
             beansHistory.setAddTime(date);
             beansHistory.setDelFlag(0);
-            // 保存 采美豆使用记录
-            submitMapper.insertBeansHistory(beansHistory);
             // 更新用户剩余采美豆数量
-            int beans = orderParamBo.getUserBeans() - orderParamBo.getOffsetBeans();
-            submitMapper.updateUserBeans(orderParamBo.getUserId(), beans);
-            log.info("【提交订单】>>>>>更新用户余额,抵扣后剩余:[userBeans:" + beans + "]");
+            int beans = orderParamBo.getUserBeans() - beansHistory.getNum();
+            productService.updateUserBeans(beansHistory, beans,"【提交订单】");
         }
 
         /*
@@ -1206,15 +1203,15 @@ public class SubmitServiceImpl implements SubmitService {
         /*
          * 下单推送
          */
-        if (StringUtils.isNotBlank(address.getMobile())) {
-            String shortLink = messagePushService.getShortLink(8, 3, domain + "/user/mainOrder/detail.html?orderId=" + mainOrder.getOrderId());
+        if (StringUtils.isNotBlank(orderParamBo.getBindMobile())) {
+            String shortLink = messagePushService.getShortLink(8, 3, domain + "/user/order/detail.html?orderId=" + mainOrder.getOrderId());
             String name = orderProductList.get(0).getName();
             if (name.length() > 10) {
                 name = name.substring(0, 10);
             }
             String content = "您已成功下单“" + name + "...”等" + mainOrder.getProductCount() + "件商品,订单编号:" + mainOrder.getOrderNo() + ",订单等待支付,支付完成后采美将尽快安排发货。" +
                     "您可关注采美公众号或者访问采美微信小程序和网站查看并支付订单。平台公众号:微信搜索“采美365网”; 微信小程序:微信搜索“采美采购商城”;网址:www.caimei365.com/t/" + shortLink;
-            boolean sendSms = messagePushService.getSendSms(3, address.getMobile(), content);
+            boolean sendSms = messagePushService.getSendSms(3, orderParamBo.getBindMobile(), content);
             if (!sendSms) {
                 log.info("下单推送失败,orderId>>>>" + mainOrder.getOrderId());
             }

+ 15 - 1
src/main/resources/mapper/BaseMapper.xml

@@ -139,7 +139,10 @@
         WHERE userId = #{userId}
         LIMIT 1
     </select>
-    <select id="getUserAbleUserMoney" resultType="java.lang.Double">
+    <select id="getUserMoney" resultType="java.lang.Double">
+        SELECT userMoney FROM user WHERE userID = #{userId}
+    </select>
+    <select id="getAbleUserMoney" resultType="java.lang.Double">
         SELECT ableUserMoney FROM user WHERE userID = #{userId}
     </select>
     <select id="getUserBeans" resultType="java.lang.Integer">
@@ -181,6 +184,9 @@
         FROM repeat_purchase_price
         WHERE userId = #{userId} AND productId = #{productId} AND delFlag='0'
     </select>
+    <select id="getBindMobileByUserId" resultType="java.lang.String">
+        SELECT bindMobile FROM user WHERE userID = #{userId}
+    </select>
     <insert id="insertDiscernReceipt" keyColumn="id" keyProperty="id" parameterType="com.caimei365.order.model.po.DiscernReceiptPo" useGeneratedKeys="true">
         INSERT INTO cm_discern_receipt (payWay, payType, receiptType, receiptStatus, receiptAmount, confirmType,
         receiptDate, confirmDate, reviewDate, updateDate, delFlag)
@@ -191,6 +197,14 @@
         INSERT INTO cm_receipt_order_relation (relationType, receiptId, associateAmount, orderId, delFlag)
         VALUES (#{relationType}, #{receiptId}, #{associateAmount}, #{orderId}, #{delFlag})
     </insert>
+    <insert id="insertBeansHistory" parameterType="com.caimei365.order.model.po.UserBeansHistoryPo">
+        INSERT INTO user_beans_history (userId, type, beansType, orderId, num, pushStatus, addTime, delFlag)
+        VALUES (#{userId}, #{type}, #{beansType}, #{orderId}, #{num}, #{pushStatus}, #{addTime}, #{delFlag})
+    </insert>
+    <update id="updateUserBeans">
+        UPDATE USER SET userBeans = #{userBeans}
+        WHERE userID = #{userId}
+    </update>
     <!--    <select id="getAddressDetailById" resultType="com.caimei365.order.model.vo.AddressVo">-->
 <!--        SELECT-->
 <!--            a.addressID AS addressId,-->

+ 92 - 9
src/main/resources/mapper/OrderClubMapper.xml

@@ -2,20 +2,89 @@
 <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
 <mapper namespace="com.caimei365.order.mapper.OrderClubMapper">
     <update id="updateSecondStatus">
-        UPDATE cm_second_hand_detail SET sold = 1
+        UPDATE cm_second_hand_detail SET sold = #{sold}
         WHERE productID = #{productID} AND secondHandType=1
     </update>
     <update id="updateUserMoneyByUserId">
         UPDATE USER SET userMoney = #{userMoney}
         WHERE userID = #{userId}
     </update>
+    <update id="updateAbleUserMoneyByUserId">
+        UPDATE USER SET ableUserMoney = #{ableUserMoney}
+        WHERE userID = #{userId}
+    </update>
     <update id="updateOrderStatus">
+        UPDATE cm_order SET
+        status = #{status}
+        <if test="receiptStatus != null and receiptStatus != ''">
+            ,receiptStatus = #{receiptStatus}
+        </if>
+        <if test="payStatus != null and payStatus != ''">
+            ,payStatus = #{payStatus}
+        </if>
+        <if test="confirmFlag != null and confirmFlag != ''">
+            ,confirmFlag = #{confirmFlag}
+        </if>
+        <if test="confirmTime != null and confirmTime != ''">
+            ,confirmTime = #{confirmTime}
+        </if>
+        ,updateDate = #{updateDate}
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="cancelBalanceRecord">
+        UPDATE cm_user_balance_record SET
+        remark = #{remark},
+        delFlag = #{delFlag}
+        WHERE userId = #{userId} AND orderId = #{orderId}
+    </update>
+    <update id="cancelMainOrder">
         UPDATE cm_order SET
         status = #{status},
-        receiptStatus = #{receiptStatus},
-        confirmFlag = #{confirmFlag},
-        confirmTime = #{confirmTime},
-        updateDate = #{updateDate}
+        closeReason = #{closeReason},
+        closeTime = #{closeTime}
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="deleteMainOrder">
+        UPDATE cm_order SET
+        status = #{status},
+        note = #{note}
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="deleteShopOrder">
+        UPDATE cm_shop_order SET delFlag=1
+        WHERE shopOrderID IN
+        <foreach collection="shopOrderIds" open="(" separator="," close=")" item="shopOrderId">
+            #{shopOrderId}
+        </foreach>
+    </update>
+    <update id="deleteOrderReceiptRelation">
+        UPDATE cm_receipt_order_relation SET delFlag=1
+        WHERE orderID = #{orderId}
+    </update>
+    <update id="deleteDiscernReceipt">
+        UPDATE cm_discern_receipt SET delFlag=1
+        WHERE id IN
+        <foreach collection="receiptIds" open="(" separator="," close=")" item="receiptId">
+            #{receiptId}
+        </foreach>
+    </update>
+    <update id="deletePayShopRecord">
+        UPDATE cm_pay_shop_record SET delFlag = 1
+        WHERE shopOrderID IN
+        <foreach collection="shopOrderIds" open="(" separator="," close=")" item="shopOrderId">
+            #{shopOrderId}
+        </foreach>
+    </update>
+    <update id="deletePayShop">
+        UPDATE cm_pay_shop SET delFlag = 1
+        WHERE id = IN
+        <foreach collection="payIds" open="(" separator="," close=")" item="payId">
+            #{payId}
+        </foreach>
+    </update>
+    <update id="updateLogisticsBatch">
+        UPDATE cm_logistics_batch
+        SET status = 1, updateDate = NOW(), receiptTime = NOW()
         WHERE orderID = #{orderId}
     </update>
     <select id="getMainOrderByOrderId" resultType="com.caimei365.order.model.po.OrderPo">
@@ -112,9 +181,23 @@
         LEFT JOIN product p ON p.productID = cop.productID
         WHERE cop.orderID = #{orderID}
     </select>
-    <select id="getUserMoneyByUserId" resultType="java.lang.Double">
-        SELECT
-        userMoney FROM user
-        WHERE userID = #{userId}
+    <select id="getOrderReceiptIds" resultType="java.lang.String">
+        SELECT c.id
+        FROM cm_discern_receipt c
+        LEFT JOIN cm_receipt_order_relation r ON r.receiptID = c.id
+        WHERE r.orderID = #{orderID}
+        AND r.relationType = '2'
+        AND r.delFlag = '0'
+        AND c.delFlag = '0'
+        AND c.receiptStatus = '3'
+        AND c.payType != '16'
+    </select>
+    <select id="getPayShopIds" resultType="java.lang.String">
+        SELECT payShopID FROM cm_pay_shop_record
+        WHERE delFlag = 0
+        AND shopOrderID  IN
+        <foreach collection="shopOrderIds" open="(" separator="," close=")" item="shopOrderId">
+            #{shopOrderId}
+        </foreach>
     </select>
 </mapper>

+ 0 - 8
src/main/resources/mapper/SubmitMapper.xml

@@ -67,18 +67,10 @@
         INSERT INTO cm_user_balance_record (userId, type, balanceType, addDate, amount, orderId, remark, delFlag)
         VALUES (#{userId}, #{type}, #{balanceType}, #{addDate}, #{amount}, #{orderId}, #{remark}, #{delFlag})
     </insert>
-    <insert id="insertBeansHistory" parameterType="com.caimei365.order.model.po.UserBeansHistoryPo">
-        INSERT INTO user_beans_history (userId, type, beansType, orderId, num, pushStatus, addTime, delFlag)
-        VALUES (#{userId}, #{type}, #{beansType}, #{orderId}, #{num}, #{pushStatus}, #{addTime}, #{delFlag})
-    </insert>
     <update id="updateUserMoney">
         UPDATE USER SET userMoney = #{userMoney}, ableUserMoney = #{ableUserMoney}
         WHERE userID = #{userId}
     </update>
-    <update id="updateUserBeans">
-        UPDATE USER SET userBeans = #{userBeans}
-        WHERE userID = #{userId}
-    </update>
     <delete id="deleteOrderInvoiceByOrderId">
         DELETE FROM bp_order_invoice WHERE orderId = #{orderId}
     </delete>