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<String, Object> 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<ActivitySign> deleteWrapper = new UpdateWrapper<>(activitySign);
|
activitySignMapper.delete(deleteWrapper);
|
}
|
|
@Override
|
public void deleteByIdInBatch(List<Integer> ids) {
|
if (CollectionUtils.isEmpty(ids)) {
|
return;
|
}
|
activitySignMapper.deleteBatchIds(ids);
|
}
|
|
@Override
|
public void updateById(ActivitySign activitySign) {
|
activitySignMapper.updateById(activitySign);
|
}
|
|
@Override
|
public void updateByIdInBatch(List<ActivitySign> 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<ActivitySign> wrapper = new QueryWrapper<>(activitySign);
|
return activitySignMapper.selectOne(wrapper);
|
}
|
|
@Override
|
public List<ActivitySign> findList(ActivitySign activitySign) {
|
QueryWrapper<ActivitySign> wrapper = new QueryWrapper<>(activitySign);
|
return activitySignMapper.selectList(wrapper);
|
}
|
|
@Override
|
public PageData<ActivitySign> findPage(PageWrap<ActivitySign> pageWrap) {
|
IPage<ActivitySign> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity());
|
|
MPJLambdaWrapper<ActivitySign> 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<ActivitySign> 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<ActivitySign> 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<ActivitySign> 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<ActivitySign> 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<ActivitySign>()
|
.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<ActivitySign>()
|
.in("STATUS", Constants.ZERO,Constants.ONE)
|
)>=activity.getLimitnum()){
|
throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"本次活动参与人数已满!");
|
};
|
//查询是否已参与活动
|
if(activitySignMapper.selectCount(new QueryWrapper<ActivitySign>()
|
.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<ActivitySign> activitySignList = activitySignMapper.selectList(
|
// new QueryWrapper<ActivitySign>()
|
// .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<ActivitySign>()
|
.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"));
|
}
|
|
}
|