在做公司的一个项目的时候,有一个模块是团购。有这样的需求,参与团购人数到达团购人数时则团购成功,否则当活动时间结束后团购失败。这里涉及到团购失败后的退款问题。我也是第一次做这样的需求,一开始并不知道如何下手。后来想到利用定时器去解决。因为订单是关联活动的id的,这样活动id不会变。在定时任务执行是查询活动的id相关联的订单进行退款操作。
贴代码
//发布定时任务让超时拼团状态修改为失败
Timetask tt=new Timetask();//查询条件
tt.setSpellgroupid(id);
Timetask t=timetaskService.get(tt);
if(t==null){//如果没有任务就创建,有无需操作
final Timer time=new Timer();
Date endDate = spellGroup.getEnddate();
TimerTask timertask=new TimerTask() {
@Override
public void run() {
SgSponsor bySponsor=new SgSponsor();
bySponsor.setSpellgroupid(id);
bySponsor.setSpellstatus(0);
List<SgSponsor> findlist = sgSponsorService.findList(bySponsor);
for(SgSponsor b:findlist){
b.setSpellstatus(2);//修改为拼团失败
sgSponsorService.save(b);
String[] split = b.getOrderids().split(",");
try {
for(String s:split){
ByGoodsOrder byGoodsOrder = byGoodsOrderService.get(s);
//退款操作
String transaction_id=byGoodsOrder.getTransactionId();
String out_refund_no=byGoodsOrder.getOrderNum();
int total_fee=(int) (byGoodsOrder.getPayMoney()*100);
int refund_fee=(int) (byGoodsOrder.getPayMoney()*100);
Refund.spellgroupRefund(transaction_id, out_refund_no, total_fee, refund_fee);
byGoodsOrder.setOrderstatus("4");//拼团失败
byGoodsOrder.setOrderTime(new Date());
byGoodsOrderService.save(byGoodsOrder);
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
time.cancel();
}
};
Timetaskutil.timeTask(timertask, endDate,time);
//插入信息到任务标识表
Timetask ttask=new Timetask(UUID.randomUUID().toString().replace("-", ""), id);
timetaskService.insert(ttask);
}
逻辑上是用户进活动详情
去查询数据库的定时任务表有没有该活动的数据(实际上就是一个标志)
如果没有的话就创建一条相关数据库记录
Timetask ttask=new Timetask(UUID.randomUUID().toString().replace("-", ""), id);
timetaskService.insert(ttask);
并且创建定时任务