package com.doumee.service.business.impl; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.*; import com.doumee.core.wx.WxMiniConfig; import com.doumee.dao.business.ActivityMapper; import com.doumee.dao.business.ActivitySignJoinMapper; import com.doumee.dao.business.ActivitySignMapper; import com.doumee.dao.business.MemberMapper; import com.doumee.dao.business.model.Activity; import com.doumee.dao.business.model.ActivitySign; import com.doumee.dao.business.model.Goodsorder; import com.doumee.dao.business.model.Member; import com.doumee.dao.web.request.ActivitySignRequest; import com.doumee.dao.web.response.ActivitySignResponse; import com.doumee.service.business.ActivitySignService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.doumee.service.business.SmsrecordService; import com.github.binarywang.wxpay.bean.request.BaseWxPayRequest; import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest; import com.github.binarywang.wxpay.exception.WxPayException; import com.github.yulichang.wrapper.MPJLambdaWrapper; import org.apache.commons.lang3.StringUtils; import org.apache.shiro.SecurityUtils; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.math.BigDecimal; import java.util.Date; import java.util.List; import java.util.Objects; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 活动报名信息表Service实现 * @author 江蹄蹄 * @date 2023/03/21 15:48 */ @Service public class ActivitySignServiceImpl implements ActivitySignService { @Autowired private RedisTemplate redisTemplate; @Autowired private ActivitySignMapper activitySignMapper; @Autowired private ActivityMapper activityMapper; @Autowired private MemberMapper memberMapper; @Autowired private ActivitySignJoinMapper activitySignJoinMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private SmsrecordService smsrecordService; private static Logger log = LoggerFactory.getLogger(ActivitySignServiceImpl.class); @Override public Integer create(ActivitySign activitySign) { activitySignMapper.insert(activitySign); return activitySign.getId(); } @Override public void deleteById(Integer id) { activitySignMapper.deleteById(id); } @Override public void delete(ActivitySign activitySign) { UpdateWrapper deleteWrapper = new UpdateWrapper<>(activitySign); activitySignMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List ids) { if (CollectionUtils.isEmpty(ids)) { return; } activitySignMapper.deleteBatchIds(ids); } @Override public void updateById(ActivitySign activitySign) { activitySignMapper.updateById(activitySign); } @Override public void updateByIdInBatch(List activitySigns) { if (CollectionUtils.isEmpty(activitySigns)) { return; } for (ActivitySign activitySign: activitySigns) { this.updateById(activitySign); } } @Override public ActivitySign findById(Integer id) { return activitySignMapper.selectById(id); } @Override public ActivitySign findOne(ActivitySign activitySign) { QueryWrapper wrapper = new QueryWrapper<>(activitySign); return activitySignMapper.selectOne(wrapper); } @Override public List findList(ActivitySign activitySign) { QueryWrapper wrapper = new QueryWrapper<>(activitySign); return activitySignMapper.selectList(wrapper); } @Override public PageData findPage(PageWrap pageWrap) { IPage page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); queryWrapper.selectAll(ActivitySign.class); queryWrapper.selectAs(Activity::getName, ActivitySign::getActivityName); queryWrapper.selectAs(Member::getNickname, ActivitySign::getMemberNickName); queryWrapper.selectAs(Member::getImgurl, ActivitySign::getMemberImgUrl); queryWrapper.leftJoin(Activity.class, Activity::getId, ActivitySign::getActivityId); queryWrapper.leftJoin(Member.class,Member::getId,ActivitySign::getMemberId); queryWrapper.eq(ActivitySign::getIsdeleted, Constants.ZERO); queryWrapper.like(StringUtils.isNotBlank(pageWrap.getModel().getMemberNickName()),Member::getNickname,pageWrap.getModel().getMemberNickName()); queryWrapper.eq(pageWrap.getModel().getStatus()!=null,ActivitySign::getStatus,pageWrap.getModel().getStatus()); queryWrapper.ge(pageWrap.getModel().getStartTime()!=null,Activity::getCreateDate,Utils.Date.getStart(pageWrap.getModel().getCreateDate()) ); queryWrapper.le(pageWrap.getModel().getEndTime()!=null,Activity::getCreateDate,Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); queryWrapper.orderByDesc(ActivitySign::getCreateDate); IPage result = activitySignJoinMapper.selectJoinPage(page, ActivitySign.class, queryWrapper); String path = systemDictDataBiz.queryByCode(Constants.OSS, Constants.RESOURCE_PATH).getCode() + systemDictDataBiz.queryByCode(Constants.OSS, Constants.ACTIVITY_FILE).getCode(); if(Objects.nonNull(result)){ result.getRecords().stream().forEach(s -> { if(StringUtils.isNotBlank(s.getMemberImgUrl())){ s.setMemberImgUrl(path+s.getMemberImgUrl()); } }); } return PageData.from(result); } @Override public void activityCancel(ActivitySign activitySign) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAs(Activity::getStarttime,ActivitySign::getStartTime); queryWrapper.leftJoin(Activity.class,Activity::getId,ActivitySign::getActivityId); queryWrapper.eq(ActivitySign::getId,activitySign.getActivityId()); ActivitySign query=activitySignJoinMapper.selectJoinOne(ActivitySign.class,queryWrapper); if(Objects.isNull(query)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), ResponseStatus.DATA_EMPTY.getMessage()); } if(!query.getStartTime().before(new Date())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "活动已开始不允许取消"); } activitySign.setCancelInfo(Constants.ActivitySignupStatus.CANCEL.getNoteinfo()); activitySign.setCancelDate(new Date()); activitySign.setStatus(Constants.ActivitySignupStatus.CANCEL.getKey()); activitySign.setEditor(user.getId()); activitySign.setEditDate(new Date()); activitySignMapper.updateById(activitySign); } @Override public void activityBack(ActivitySign activitySign) { LoginUserInfo user = (LoginUserInfo) SecurityUtils.getSubject().getPrincipal(); MPJLambdaWrapper queryWrapper = new MPJLambdaWrapper<>(); queryWrapper.selectAs(Activity::getStarttime,ActivitySign::getStartTime); queryWrapper.leftJoin(Activity.class,Activity::getId,ActivitySign::getActivityId); queryWrapper.eq(ActivitySign::getId,activitySign.getActivityId()); ActivitySign query=activitySignJoinMapper.selectJoinOne(ActivitySign.class,queryWrapper); if(Objects.isNull(query)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(), ResponseStatus.DATA_EMPTY.getMessage()); } if(!query.getStartTime().before(new Date())){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "活动已开始不允许退款"); } if((Constants.equalsInteger(query.getStatus(),Constants.ONE)&&Constants.equalsInteger(query.getPayStatus(),Constants.TWO)&&StringUtils.isNotBlank(query.getPayOrderId()))){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(), "未支付不允许退款"); } activitySign.setCancelInfo(Constants.ActivitySignupStatus.CANCEL.getNoteinfo()); activitySign.setCancelDate(new Date()); activitySign.setStatus(Constants.ActivitySignupStatus.CANCEL.getKey()); activitySign.setEditor(user.getId()); activitySign.setEditDate(new Date()); activitySignMapper.updateById(activitySign); log.info("---------------------------------开始调用退款接口---------------------------------"); /** ---------------------------------开始调用退款接口---------------------------------*/ } @Override public long count(ActivitySign activitySign) { QueryWrapper wrapper = new QueryWrapper<>(activitySign); return activitySignMapper.selectCount(wrapper); } /****************************************移动端接口开始********************************************************************/ @Override public ActivitySignResponse signActivity(ActivitySignRequest activitySignRequest){ ActivitySignResponse activitySignResponse = new ActivitySignResponse(); //活动信息 Activity activity = activityMapper.selectById(activitySignRequest.getActivityId()); if(Objects.isNull(activity)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"未查询到活动数据"); } if(!(activity.getType()==Constants.ONE||activity.getType()!=Constants.ZERO)){ throw new BusinessException(ResponseStatus.DATA_EMPTY.getCode(),"非平台与商家类活动数据,请检查参与信息"); } //用户信息 Member member = memberMapper.selectById(activitySignRequest.getMemberId()); if(!member.getPhone().equals(activitySignRequest.getPhone())){ if(StringUtils.isBlank(activitySignRequest.getVerificationCode())){ //短信验证 smsrecordService.verifyCode(activitySignRequest.getMemberId(),activitySignRequest.getPhone(),activitySignRequest.getVerificationCode()); } } //查询是否已到报名时间 if(activitySignMapper.selectCount(new QueryWrapper() .eq("ACTIVITY_ID",activity.getId()) .apply(" now() between SIGN_STARTTIME AND SIGN_ENDTIME ") )<=Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"报名未开始或报名已结束!"); }; //查询参与人数 if(activitySignMapper.selectCount(new QueryWrapper() .in("STATUS", Constants.ZERO,Constants.ONE) )>=activity.getLimitnum()){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"本次活动参与人数已满!"); }; //查询是否已参与活动 if(activitySignMapper.selectCount(new QueryWrapper() .eq("MEMBER_ID", activitySignRequest.getMemberId()) .in("STATUS", Constants.ZERO,Constants.ONE) )>Constants.ZERO){ throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"您已参与该活动,请勿重复报名"); }; //开始生成报名数据 ActivitySign activitySign = new ActivitySign(); activitySign.setCreateDate(new Date()); activitySign.setCreator(activitySignRequest.getMemberId()); activitySign.setMemberId(activitySignRequest.getMemberId()); activitySign.setIsdeleted(Constants.ZERO); activitySign.setActivityId(activity.getId()); activitySign.setRealname(activitySignRequest.getRealName()); activitySign.setPhone(activitySignRequest.getPhone()); activitySign.setCompany(activitySignRequest.getCompanyName()); //活动需要支付金额 且 支付金额 大于 0 if(!Objects.isNull(activity.getPrice())&&activity.getPrice().compareTo(BigDecimal.ZERO)>Constants.ZERO){ activitySign.setPayOrderId(ID.nextGUID()); activitySign.setStatus(Constants.ZERO); activitySign.setPayMethod(Constants.ZERO); //调起微信支付 Object response = null; try { WxPayUnifiedOrderRequest request = new WxPayUnifiedOrderRequest(); request.setOpenid(member.getOpenId()); request.setBody("活动报名"); request.setAttach("ActivitySign"); request.setOutTradeNo(activitySign.getPayOrderId()); request.setTotalFee(BaseWxPayRequest.yuanToFen(activity.getPrice().toString())); request.setTimeStart(DateUtil.DateToString(new Date(), "yyyyMMddHHmmss")); response = WxMiniConfig.wxAppPayService.createOrder(request); } catch (WxPayException e) { throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"付款失败"); } activitySignResponse.setActivityType(Constants.ONE); activitySignResponse.setResponse(response); }else{ activitySignResponse.setActivityType(Constants.ZERO); activitySign.setStatus(Constants.ONE); activitySignMapper.insert(activitySign); } activitySignResponse.setActivitySignId(activitySign.getId()); return activitySignResponse; } @Override public void autoCancelSign(){ // //查询订单数据 // List activitySignList = activitySignMapper.selectList( // new QueryWrapper() // .eq("STATUS",Constants.ZERO) // .apply(" now() >= SUBDATE(CREATE_DATE,interval - 15 minute) ") // ); // // for (ActivitySign activitySign:activitySignList) { // activitySign.setStatus(Constants.TWO); // activitySign.setCancelDate(new Date()); // activitySign.setCancelInfo("系统自动取消"); // activitySignMapper.updateById(activitySign); // } activitySignMapper.update(null,new UpdateWrapper() .set("CANCEL_INFO","超时未支付,系统自动取消") .set("STATUS",Constants.ActivitySignupStatus.CANCEL) .set("CANCEL_DATE",new Date()) .eq("STATUS",Constants.ActivitySignupStatus.APPLY_ING) .apply(" now() >= SUBDATE(CREATE_DATE,interval - 15 minute) ") ); } public synchronized Long getNextInCode(){ String prefix = DateUtil.getDate(new Date(),"yyyyMMdd") ; Integer countNum = RedisUtil.getObject(redisTemplate, Constants.RedisKeys.ACTIVITY_SIGN_KEY,Integer.class); countNum = Constants.formatIntegerNum(countNum)+1; //更新缓存 RedisUtil.addObject(redisTemplate,Constants.RedisKeys.ACTIVITY_SIGN_KEY,countNum); String nextIndex =Long.toString( countNum); return Long.parseLong(prefix + StringUtils.leftPad(nextIndex,4,"0")); } }