自动收货的存储过程

对于电商类的网站,一般都会有用户不确认收货,导致商户不能拿到货款,所以我们就要做自动收货,这个有两种方式:

1.在java代码中编写业务逻辑,然后配置到任务中定时执行

2.通过数据库的存储过程进行业务处理

这里我采用的是第二种:

-- 自动收货的存储过程
 
DROP PROCEDURE if exists autoConfirmRecive;
 DELIMITER //
  -- days多少天自动收货
 CREATE PROCEDURE  autoConfirmRecive(IN days INT)
 BEGIN
   
   DECLARE  no_more_record INT DEFAULT 0;
   DECLARE orderIdp VARCHAR(40);
   DECLARE salerIdp VARCHAR(40);
   DECLARE totalp DECIMAL(20,2);
   DECLARE usableBalance DECIMAL(20,2);
   DECLARE totalUsableBalance DECIMAL(20,2);
   DECLARE walletId VARCHAR(40);
 
    /*标识事务错误*/
   DECLARE t_error INTEGER DEFAULT 0;
   /*标识是否回滚过*/
   DECLARE isrollback INT DEFAULT 0;
   
   -- 声明一个游标
    DECLARE order_record CURSOR FOR  
       -- 查询所有的待收货订单(查询下单时间和当前的时间相差days天的数据)
      SELECT id orderId,saler_id,total FROM t_wxp_order wo WHERE wo.goods_status='2' AND datediff(CURDATE(), wo.creat_date) =days;
    DECLARE  CONTINUE HANDLER FOR NOT FOUND  SET  no_more_record = 1; /*这个是个条件处理,针对NOT FOUND的条件,当没有记录时赋值为1*/
     /* 出现错误,设置为1,只要发生异常就回滚*/
    DECLARE CONTINUE HANDLER FOR SQLEXCEPTION SET t_error=1;  

      /*开启事务*/
    START TRANSACTION;
    
    -- 打开游标
    OPEN order_record;
    WHILE no_more_record != 1 DO
        
        SET usableBalance=0;
        SET totalp=0;
        -- 累计之后的当前工厂的可用提现金额
        SET totalUsableBalance=0;
        FETCH order_record INTO orderIdp,salerIdp,totalp;
        -- 根据salerId查询工厂的钱包的可提现金额
         SELECT id,usable_balance INTO walletId,usableBalance FROM mem_wallet WHERE saler_id =salerIdp;
        -- 把当前订单的金额加到工厂的可提现金额中
         SET totalUsableBalance=usableBalance+totalp;
         -- 根据钱包id更新钱包可用提现金额
         UPDATE mem_wallet ma SET ma.usable_balance=totalUsableBalance WHERE id=walletId;
         SELECT walletId;
         -- 根据订单id把当前订单的状态(goods_status)更新为 3 (0:待发货 1:已发货 2:待收货 3:已收货 4:已评价)
         UPDATE t_wxp_order SET goods_status='3' WHERE id=orderIdp; 
         -- 执行发生错误,就回滚,否则提交事务
         IF t_error=1 THEN
             SET isrollback=1;
             ROLLBACK;
         ELSE
            COMMIT;
         END IF;
         
    END WHILE;
 END//
 DELIMITER ;

CALL autoConfirmRecive(10);

入参days可能会根据公司业务发展会有变化,所以我们就把其做成参数传入,这样我们可以把其和后台管理系统的字典进行关联,然后在job项目中编写代码吊起任务执行

posted @ 2019-04-23 09:45  浪涛飞  阅读(422)  评论(0编辑  收藏  举报