package cc.mrbird.febs.mall.quartz; import cc.mrbird.febs.common.enumerates.FlowTypeEnum; import cc.mrbird.febs.common.enumerates.MoneyFlowTypeEnum; import cc.mrbird.febs.common.enumerates.YesOrNoOrIngEnum; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IMallMoneyFlowService; import cc.mrbird.febs.pay.model.RefundStatus; import cc.mrbird.febs.pay.util.FiuuRefundUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import java.util.List; /** * @author wzy * @date 2021-09-28 **/ @Slf4j @Component @ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true") public class ProfitJob { @Autowired private MallActivityMapper mallActivityMapper; @Autowired private MallRefundMapper mallRefundMapper; @Autowired private MallOrderInfoMapper mallOrderInfoMapper; @Autowired private MallOrderItemMapper mallOrderItemMapper; @Autowired private MallGoodsSkuMapper mallGoodsSkuMapper; @Autowired private MallGoodsMapper mallGoodsMapper; @Autowired private FiuuRefundUtil fiuuRefundUtil; @Autowired private IMallMoneyFlowService mallMoneyFlowService; /** * 一分钟运行一次 * 结束活动 */ @Scheduled(cron = "0 0/1 * * * ? ") public void stopActivity() { DateTime date = DateUtil.date(); List mallActivities = mallActivityMapper.selectList( new LambdaQueryWrapper() .eq(MallActivity::getState, YesOrNoOrIngEnum.ING.getValue()) .le(MallActivity::getEndTime, date) ); if(CollUtil.isEmpty(mallActivities)){ return; } mallActivities.forEach(mallActivity -> { mallActivity.setState(YesOrNoOrIngEnum.NO.getValue()); mallActivityMapper.updateById(mallActivity); }); } /** * 一分钟运行一次 * 开始活动 */ @Scheduled(cron = "0 0/1 * * * ? ") public void startActivity() { DateTime date = DateUtil.date(); List mallActivities = mallActivityMapper.selectList( new LambdaQueryWrapper() .eq(MallActivity::getState, YesOrNoOrIngEnum.YES.getValue()) .le(MallActivity::getStartTime, date) .ge(MallActivity::getEndTime, date) ); if(CollUtil.isEmpty(mallActivities)){ return; } mallActivities.forEach(mallActivity -> { mallActivity.setState(YesOrNoOrIngEnum.ING.getValue()); mallActivityMapper.updateById(mallActivity); }); } /** * 一分钟运行一次 * 查询退款记录,去验证是否已经退款成功 */ @Scheduled(cron = "0 0/1 * * * ? ") public void refundJob() { LambdaQueryWrapper mallOrderRefundLambdaQueryWrapper = new LambdaQueryWrapper<>(); mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getState, 3); mallOrderRefundLambdaQueryWrapper.eq(MallRefundEntity::getType, 1); List mallRefundEntities = mallRefundMapper.selectList(mallOrderRefundLambdaQueryWrapper); if(CollUtil.isEmpty(mallRefundEntities)){ return; } mallRefundEntities.forEach(mallRefundEntity -> { processRefund(mallRefundEntity); }); } private void processRefund(MallRefundEntity mallRefundEntity) { try { MallOrderInfo mallOrderInfo = mallOrderInfoMapper.selectById(mallRefundEntity.getOrderId()); MallOrderItem mallOrderItem = mallOrderItemMapper.selectById(mallRefundEntity.getItemId()); MallGoodsSku mallGoodsSku = mallGoodsSkuMapper.selectById(mallOrderItem.getSkuId()); String txnId = mallOrderInfo.getPayOrderNo(); RefundStatus status = fiuuRefundUtil.pollRefundStatus(txnId); switch (status.getStatus()) { case "success": updateOnSuccess(mallRefundEntity, mallOrderInfo, mallOrderItem, mallGoodsSku); break; case "rejected": updateOnRejected(mallRefundEntity, mallOrderItem); break; default: log.warn("未知状态:{}", status.getStatus()); } } catch (Exception e) { log.error("处理退款失败: {}", e.getMessage(), e); } } private void updateOnSuccess(MallRefundEntity mallRefundEntity, MallOrderInfo mallOrderInfo, MallOrderItem mallOrderItem, MallGoodsSku mallGoodsSku) { mallOrderItem.setState(3); mallOrderItemMapper.updateById(mallOrderItem); MallGoods mallGoods = mallGoodsMapper.selectById(mallOrderItem.getGoodsId()); mallGoods.setStock(mallGoods.getStock() + mallOrderItem.getCnt()); mallGoods.setVolume(mallGoods.getVolume() - mallOrderItem.getCnt()); mallGoodsMapper.updateById(mallGoods); mallGoodsSku.setStock(mallGoodsSku.getStock() + mallOrderItem.getCnt()); mallGoodsSku.setSkuVolume(mallGoodsSku.getSkuVolume() - mallOrderItem.getCnt()); mallGoodsSkuMapper.updateById(mallGoodsSku); mallRefundEntity.setState(1); mallRefundEntity.setUpdatedTime(DateUtil.date()); mallRefundMapper.updateById(mallRefundEntity); mallMoneyFlowService.addMoneyFlow( mallOrderInfo.getMemberId(), mallRefundEntity.getAmount(), MoneyFlowTypeEnum.WECHAT_REFUND.getValue(), mallOrderInfo.getOrderNo(), FlowTypeEnum.WECHAT.getValue(), "FIUU退款", 2); List mallOrderItemList = mallOrderItemMapper.selectListByNotInStateAndOrderId(3, mallRefundEntity.getOrderId()); if (CollUtil.isEmpty(mallOrderItemList)) { MallOrderInfo mallOrderRefund = mallOrderInfoMapper.selectById(mallRefundEntity.getOrderId()); mallOrderRefund.setStatus(6); mallOrderInfoMapper.updateById(mallOrderRefund); } } private void updateOnRejected(MallRefundEntity mallRefundEntity, MallOrderItem mallOrderItem) { mallOrderItem.setState(1); mallOrderItemMapper.updateById(mallOrderItem); mallRefundEntity.setState(2); mallRefundMapper.updateById(mallRefundEntity); } }