对于电商类的网站,一般都会有用户不确认收货,导致商户不能拿到货款,所以我们就要做自动收货,这个有两种方式:
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项目中编写代码吊起任务执行