首先配置一个定时任务,0 35 13 * * *代表每天的下午13:25分到class="com.qianmo.qmyj.cache.impl.AutoTransImpl"执行定时任务
1 <!--开启任务注解扫描--> 2 <task:annotation-driven/> 3 <bean id="autoTransTask" class="com.qianmo.qmyj.cache.impl.AutoTransImpl"/> 4 <task:scheduled-tasks> 5 <!--此计划任务用于用户不给好评,从工人点击完工(7日后)自动 5星好评 并且 转账--> 6 <task:scheduled ref="autoTransTask" method="executeAutoTrans" cron="0 35 13 * * *"/> 7 </task:scheduled-tasks> 8 9 <!-- 启用spring事务处理(同一个service中有一条数据库操作失败,之前的方法全部回滚) --> 10 <tx:annotation-driven transaction-manager="transactionManager"/>
/* * Package com.qianmo.qmyj.cache * FileName: AutoTransImpl * Author: anpei * Date: 2017/5/7 2:44 */ package com.qianmo.qmyj.cache.impl; import com.qianmo.qmyj.bean.dto.Evaluation; import com.qianmo.qmyj.bean.dto.OrderInfo; import com.qianmo.qmyj.bean.dto.UserInfo; import com.qianmo.qmyj.cache.AutoTrans; import com.qianmo.qmyj.common.Constants; import com.qianmo.qmyj.common.Constants.autoTrans; import com.qianmo.qmyj.common.Constants.orderFinishStat; import com.qianmo.qmyj.common.Constants.orderStat; import com.qianmo.qmyj.dao.EvaluationDao; import com.qianmo.qmyj.dao.OrderInfoDao; import com.qianmo.qmyj.dao.UserInfoDao; import com.qianmo.qmyj.framework.ForMartUtil; import com.qianmo.qmyj.framework.util.DataVerifyUtil; import com.qianmo.qmyj.framework.util.QMDateUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Propagation; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.util.List; /** * FileName: AutoTransImpl * Author: anpei * Date: 2017/5/7 * Description: 自动转账以及好评(7日) */ @Component("autoTrans") public class AutoTransImpl implements AutoTrans { private Logger logger = LoggerFactory.getLogger(getClass()); @Resource private OrderInfoDao orderInfoDao; @Resource private UserInfoDao userInfoDao; @Resource private EvaluationDao evaluationDao; @Override @Transactional(propagation = Propagation.REQUIRES_NEW) public int executeAutoTrans() { logger.info("---------------->处理自动转账五星好评业务处理开始:" + QMDateUtil.getYYYY_MM_DD_HH_MM_SS_CN() + "<------------"); long startTime = System.currentTimeMillis(); /*搜索订单状态:已完成;支付状态:已支付;并且订单好评转账时间字段为null,的所有订单 String orderType,String txnType,*/ List<OrderInfo> oderInfoList = orderInfoDao.getOrderInfoByOrderStatOrderFinishStat(Constants.orderTypes.wechat,Constants.txnType.PAY,orderStat.SUCCESS, orderFinishStat.FINISHED_ORDERS); int count = autoTrans.ZERO_COMMIT; if (DataVerifyUtil.isEmptyList(oderInfoList)) { logger.info("---->没有检测出需要自动转账五星好评的订单,共处理【" + count + "】笔。本次定时任务结束" + QMDateUtil.getYYYY_MM_DD_HH_MM_SS_CN() + "<-----"); return count; } logger.info("-------------->列表不为空,说明有初步符合条件的订单<-------------"); String targetWorkerId = "";//接单工人id String transAmt = "";//订单交易金额 String currentBal = "";//现有余额 String executedBal = "";//增加以后的余额 UserInfo userInfo; Evaluation evaluation = new Evaluation(); for (OrderInfo orderInfo : oderInfoList) { if (Integer.parseInt(QMDateUtil.getYYYYMMDD())>Integer.parseInt(orderInfo.getAutoTransDateTime().substring(autoTrans.SUB_PREFIX, autoTrans.SUB_SUFFIX)) /*(orderInfo.getAutoTransDateTime().substring(autoTrans.SUB_PREFIX, autoTrans.SUB_SUFFIX)).compareTo(QMDateUtil.getYYYYMMDD()) == 0*/) { /*这些订单的自动转账好评日期已经等于7天*/ targetWorkerId = orderInfo.getUserId();//接单工人id transAmt = orderInfo.getOrderTxnAmt();//订单交易金额 userInfo = userInfoDao.getCustomerInfoById(targetWorkerId); currentBal = userInfo.getAcctBal();//现有余额 executedBal = ForMartUtil.forMart(Double.parseDouble(transAmt) + Double.parseDouble(currentBal));//增加以后的余额 userInfo.setAcctBal(executedBal);//赋予新的余额值 //一开始的总星级 int allStar = Integer.parseInt(userInfo.getAllStar()); int s = Integer.parseInt(userInfo.getAvgStart());//一开始的平均星级 int sumOrder = Constants.score.zero;//单数 默认为0 if (s == Constants.score.zero || allStar == Constants.score.zero){//如果是第一单,则单数为0 sumOrder = Constants.score.zero; }else{ //否则计算 sumOrder = allStar / s * Constants.evaluation.sumtype; } //平均星级等于 总星级/ 单数 * 6 allStar = allStar + Integer.parseInt(Constants.evaluation.totalRank);//总星级 int avgStart = allStar / ((sumOrder+Constants.score.one)*Constants.evaluation.sumtype); userInfo.setAllStar(String.valueOf(allStar));//总星级 userInfo.setAvgStart(String.valueOf(avgStart));//平均星级 // TODO: Rust 2017/5/9 仅作测试,后期要删 // logger.info("transAmt:" + transAmt); // logger.info("currentBal:" + currentBal); // logger.info("executeBal:" + executedBal); /*处理五星好评*/ evaluation.setEvaluationDateTime(QMDateUtil.getYYYYMMDDHHMMSS()); evaluation.setTotalStartCount(Constants.evaluation.totalRank); evaluation.setStarsCarefully(Constants.evaluation.star); evaluation.setStarsClothAttire(Constants.evaluation.star); evaluation.setStarsEmpCard(Constants.evaluation.star); evaluation.setStarsOnTime(Constants.evaluation.star); evaluation.setStarsPoliteness(Constants.evaluation.star); evaluation.setStarsQualified(Constants.evaluation.star); evaluation.setEvaluationContent("此用户暂无评价"); evaluation.setEvaluationRank("好评"); evaluation.setUserId(targetWorkerId); if (1 > evaluationDao.InsertEvaluation(evaluation)) { logger.error("-------------->将信息插入评论表失败,处理自动五星好评失败<---------"); return count; } logger.info("-------------->将信息插入评论表成功,处理自动五星好评成功<---------"); logger.info("-------------->对原订单表进行更新操作,orderFinishStat<-----------"); orderInfo.setOrderFinishStat(Constants.orderFinishStat.ALREADY_PAY); if (1 > orderInfoDao.updateOrderinfoStatus(orderInfo)) { logger.error("---------------->更新订单完成状态为 03:已到账,失败!<------------"); return count; } logger.info("--------------->开始执行余额增加操作<-------------"); if (1 > userInfoDao.updateCustomerInfo(userInfo)) { logger.error("------------------>数据库更新用户余额字段 【FAIL】<--------------"); return count; } logger.info("------------------>数据库更新用户余额字段 【SUCCESS】<-----------------"); ++count; } } logger.info("--------------->所有符合自动转账五星好评的订单处理完毕<-----------"); long endTime = System.currentTimeMillis(); logger.info("----------->定时任务结束!本次共执行[" + count + "]笔更新操作,耗时(" + (endTime - startTime + "ms)<------------")); return count; } }
时间: 2024-10-06 17:29:37