zoukankan      html  css  js  c++  java
  • 自动收货的存储过程

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

    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项目中编写代码吊起任务执行

  • 相关阅读:
    config Doku wiki
    [转载]【python】ipython与python的区别
    数组和指针
    C++初始化数据成员
    RSA算法原理
    C++四种cast
    百度笔试准备2
    百度笔试准备1
    百度面试准备
    C++的空类中默认产生哪些类成员函数
  • 原文地址:https://www.cnblogs.com/java-le/p/10754578.html
Copyright © 2011-2022 走看看