9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
9 days ago | Administrator | ![]() |
src/main/java/cc/mrbird/febs/common/configure/RabbitConfigure.java
@@ -170,4 +170,20 @@ return BindingBuilder.bind(vipLevelUpQueue()).to(vipLevelUp()).with(RabbitQueueEnum.VIP_LEVEL_UP.getRoute()); } @Bean public DirectExchange activityOrderCheckExchange() { return new DirectExchange(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange()); } @Bean public Queue activityOrderCheckQueue() { return new Queue(QueueConstants.ACTIVITY_ORDER_ITEM_CHECK); } @Bean public Binding activityOrderCheckBind() { return BindingBuilder.bind(activityOrderCheckQueue()).to(activityOrderCheckExchange()).with(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getRoute()); } } src/main/java/cc/mrbird/febs/common/configure/WebMvcConfigure.java
@@ -34,5 +34,6 @@ registration.excludePathPatterns("/api/xcxPay/fapiaoCallBack"); registration.excludePathPatterns("/api/happyCategory/allCategory"); registration.excludePathPatterns("/api/happyCategory/indexCategory"); registration.excludePathPatterns("/api/happyActivity/activityList"); } } src/main/java/cc/mrbird/febs/common/enumerates/StateUpDownEnum.java
@@ -27,6 +27,14 @@ VOTE_OPTION_STATE_AUDIT_REFUSE(2), /** * 订单状态 1-待支付 2-待使用 3-已使用 4-售后 */ ORDER_STATE_WAIT_PAY(1), ORDER_STATE_WAIT_USE(2), ORDER_STATE_USED(3), ORDER_STATE_AFTER_SALE(4), /** * 支付状态 0-待支付 1-支付成功 2-支付失败 */ PAY_STATE_NOT_PAY(0), @@ -61,10 +69,12 @@ ACTIVITY_STATE_ENROLLING(1), ACTIVITY_STATE_END(2), /** * 是否允许报名 0-不允许 1-允许 * 状态 0-未开启 1-已开启 * 是否推荐到首页 0-不推荐 1-推荐 * 删除标识 0-未删除 1-已删除 * 使用状态 0-待使用 1-已使用 * 是否是核销员 0-否 1-是 */ DOWN(0), UP(1); src/main/java/cc/mrbird/febs/mall/controller/CommonController.java
@@ -189,6 +189,37 @@ return new FebsResponse().success().data(dic); } @ApiOperation(value = "base64FileUpload上传") @PostMapping(value = "/base64FileUpload") public Map<String,Object> base64FileUpload(@RequestBody @Validated MultipartFile file) throws IOException { if (file == null || file.isEmpty()) { return new FebsResponse().message("上传文件为空").fail(); } try { byte[] fileBytes = file.getBytes(); String base64Str = java.util.Base64.getEncoder().encodeToString(fileBytes); String imageSuffix = "." + file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1); String imageNames = System.currentTimeMillis() + IdUtil.simpleUUID() + imageSuffix; String imageName = "hc/" + imageNames; OssUtils.uploadFileWithBase64(base64Str, imageName); String bucket_name = "https://excoin.oss-cn-hangzhou.aliyuncs.com"; String url = bucket_name + "/" + imageName; Map<String,Object> map = new HashMap<String,Object>(); Map<String,Object> map2 = new HashMap<String,Object>(); map2.put("src",url);//图片url map2.put("title",imageNames);//图片名称,这个会显示在输入框里 map.put("code",0);//0表示成功,1失败 map.put("msg","上传成功");//提示消息 map.put("data",map2); return map; } catch (IOException e) { log.error("上传失败: {}", e.getMessage()); return new FebsResponse().message("上传失败").fail(); } } @ApiOperation(value = "base64上传") @PostMapping(value = "/base64Upload") public FebsResponse base64Upload(@RequestBody @Validated Base64UploadDto base64UploadDto) { src/main/java/cc/mrbird/febs/mall/controller/activity/AdminVotesActivityCategoryController.java
@@ -6,9 +6,7 @@ import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.common.utils.RedisUtils; import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto; import cc.mrbird.febs.mall.dto.activity.AdminActivityOptionAddDto; import cc.mrbird.febs.mall.dto.activity.AdminCategoryAddDto; import cc.mrbird.febs.mall.dto.activity.AdminCategoryUpdateDto; import cc.mrbird.febs.mall.dto.activity.*; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.entity.HappyActivityOption; import cc.mrbird.febs.mall.service.IAdminHappyActivityService; @@ -142,12 +140,21 @@ } /** * 获取全部活动 * 获取全部投票活动 * @return */ @GetMapping(value = "/allActivities") public FebsResponse allActivities() { return new FebsResponse().success().data(adminHappyActivityService.allActivities()); } /** * 获取全部众筹活动 * @return */ @GetMapping(value = "/allOrderActivities") public FebsResponse allOrderActivities() { return new FebsResponse().success().data(adminHappyActivityService.allOrderActivities()); } /** @@ -205,4 +212,35 @@ return new FebsResponse().success().data(data); } /** * 订单 * @return */ @GetMapping("activityOrderList") public FebsResponse activityOrderList(AdminHappyActivityOrderDto dto, QueryRequest request) { Map<String, Object> data = getDataTable(adminHappyActivityService.activityOrderList(dto, request)); return new FebsResponse().success().data(data); } /** * 订单-手动核销 */ @PostMapping("checkOrder") @ControllerEndpoint(operation = "订单-手动核销", exceptionMessage = "操作失败") public FebsResponse checkOrder(@RequestBody AdminHappyActivityCheckOrderDto dto) { return adminHappyActivityService.checkOrder(dto); } /** * 订单-删除 */ @GetMapping("activityOrderDel/{id}") @ControllerEndpoint(operation = "订单-删除", exceptionMessage = "操作失败") public FebsResponse activityOrderDel(@NotNull(message = "{required}") @PathVariable Long id) { return adminHappyActivityService.activityOrderDel(id); } } src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityController.java
@@ -4,8 +4,10 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.vo.*; import cc.mrbird.febs.mall.vo.activity.ApiVoteActivityHotVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; @@ -57,10 +59,30 @@ @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityOptionListVo.class) }) @GetMapping(value = "/voteOptionInPage") @PostMapping(value = "/voteOptionInPage") public FebsResponse voteOptionInPage(@RequestBody @Validated ApiVoteOptionInPageDto dto) { return happyActivityService.voteOptionInPage(dto); } @ApiOperation(value = "投票活动-排行榜", notes = "投票活动-排行榜") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityOptionListVo.class) }) @PostMapping(value = "/voteOptionRecordInPage") public FebsResponse voteOptionRecordInPage(@RequestBody @Validated ApiVoteOptionRecordInPageDto dto) { return happyActivityService.voteOptionRecordInPage(dto); } @ApiOperation(value = "投票活动-活动热度", notes = "投票活动-活动热度") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiVoteActivityHotVo.class) }) @GetMapping(value = "/voteActivityHot/{id}") public FebsResponse voteActivityHot(@PathVariable("id") Long id) { return happyActivityService.voteActivityHot(id); } @ApiOperation(value = "投票活动-选项详情", notes = "投票活动-选项详情") @@ -91,4 +113,11 @@ return happyActivityService.voteRecordInPage(dto); } @ApiOperation(value = "投票活动-报名", notes = "投票活动-报名") @PostMapping(value = "/operateRegister") public FebsResponse operateRegister(@RequestBody @Validated ApiOperateRegisterActivityDto dto) { return happyActivityService.operateRegister(dto); } } src/main/java/cc/mrbird/febs/mall/controller/activity/ApiHappyActivityOrderController.java
@@ -3,8 +3,13 @@ import cc.mrbird.febs.common.annotation.Limit; import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto; import cc.mrbird.febs.mall.dto.activity.ApiCheckOrderDto; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.vo.*; import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderInfoVo; import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderListVo; import cc.mrbird.febs.mall.vo.activity.ApiCheckOrderVo; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiResponse; @@ -82,4 +87,41 @@ return happyActivityService.payOrder(dto); } @ApiOperation(value = "我的报名-列表", notes = "我的报名-列表") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityOrderListVo.class) }) @PostMapping(value = "/orderList") public FebsResponse orderList(@RequestBody ApiActivityOrderListDto dto) { return happyActivityService.orderList(dto); } @ApiOperation(value = "我的报名-详情", notes = "我的报名-详情") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiActivityOrderInfoVo.class) }) @GetMapping(value = "/orderInfo/{id}") public FebsResponse orderInfo(@PathVariable("id") Long id) { return happyActivityService.orderInfo(id); } @ApiOperation(value = "我的报名-删除", notes = "我的报名-删除") @GetMapping(value = "/orderDelete/{id}") public FebsResponse orderDelete(@PathVariable("id") Long id) { return happyActivityService.orderDelete(id); } @ApiOperation(value = "核销门票", notes = "核销门票") @ApiResponses({ @ApiResponse(code = 200, message = "success", response = ApiCheckOrderVo.class) }) @PostMapping(value = "/checkOrder") public FebsResponse checkOrder(@RequestBody @Validated ApiCheckOrderDto dto) { return happyActivityService.checkOrder(dto); } } src/main/java/cc/mrbird/febs/mall/controller/activity/ViewHappyActivityController.java
@@ -138,4 +138,13 @@ redisUtils.set("voteRecord", id, -1); return FebsUtil.view("modules/votesActivity/voteRecord"); } /** * 活动-订单列表 */ @GetMapping("orderList") @RequiresPermissions("orderList:view") public String orderList() { return FebsUtil.view("modules/votesActivity/orderList"); } } src/main/java/cc/mrbird/febs/mall/dto/ApiActivityDto.java
@@ -14,7 +14,4 @@ @ApiModelProperty(value = "ID") private Long id; @NotNull(message = "活动类型不能为空") @ApiModelProperty(value = "活动类型 1-普通活动 2-众筹活动 3-投票活动") private Integer type; } src/main/java/cc/mrbird/febs/mall/dto/activity/AdminHappyActivityCheckOrderDto.java
New file @@ -0,0 +1,11 @@ package cc.mrbird.febs.mall.dto.activity; import lombok.Data; import java.util.List; @Data public class AdminHappyActivityCheckOrderDto { private List<Long> ids; } src/main/java/cc/mrbird/febs/mall/dto/activity/AdminHappyActivityOrderDto.java
New file @@ -0,0 +1,10 @@ package cc.mrbird.febs.mall.dto.activity; import lombok.Data; @Data public class AdminHappyActivityOrderDto { private String name; private Integer state; private Long activityId; } src/main/java/cc/mrbird/febs/mall/dto/activity/ApiActivityOrderListDto.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.mall.dto.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data @ApiModel(value = "ApiActivityOrderListDto", description = "订单列表参数接收类") public class ApiActivityOrderListDto { @ApiModelProperty(value = "一页数量", example = "10") private Integer pageSize; @ApiModelProperty(value = "第几页", example = "1") private Integer pageNum; @ApiModelProperty(value = "订单状态", example = "订单状态 1-待支付 2-待使用 3-已使用 4-售后") private Integer state; } src/main/java/cc/mrbird/febs/mall/dto/activity/ApiCheckOrderDto.java
New file @@ -0,0 +1,18 @@ package cc.mrbird.febs.mall.dto.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotBlank; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiCheckOrderDto", description = "参数") public class ApiCheckOrderDto { @NotBlank(message = "票号不能为空") @ApiModelProperty(value = "票号(手动输入,或者扫码)", example = "1") private String orderItemCode; } src/main/java/cc/mrbird/febs/mall/dto/activity/ApiVoteOptionInPageDto.java
@@ -21,4 +21,7 @@ @NotNull(message = "活动ID不能为空") @ApiModelProperty(value = "活动ID") private Long activityId; @ApiModelProperty(value = "搜索条件") private String query; } src/main/java/cc/mrbird/febs/mall/dto/activity/ApiVoteOptionRecordInPageDto.java
New file @@ -0,0 +1,28 @@ package cc.mrbird.febs.mall.dto.activity; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.constraints.NotNull; @Data @ApiModel(value = "ApiVoteOptionRecordInPageDto", description = "参数") public class ApiVoteOptionRecordInPageDto { @NotNull(message = "页码不能为空") @ApiModelProperty(value = "页码", example = "1") private Integer pageNow; @NotNull(message = "每页数量不能为空") @ApiModelProperty(value = "每页数量", example = "10") private Integer pageSize; @NotNull(message = "活动ID不能为空") @ApiModelProperty(value = "活动ID") private Long activityId; @ApiModelProperty(value = "搜索条件") private String query; } src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrder.java
@@ -1,6 +1,7 @@ package cc.mrbird.febs.mall.entity; import cc.mrbird.febs.common.entity.BaseEntity; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableName; import com.fasterxml.jackson.annotation.JsonFormat; import lombok.Data; @@ -25,6 +26,7 @@ `order_no` varchar(32) DEFAULT NULL COMMENT '订单号', `pay_order_no` text COMMENT '支付订单号', `wx_order_no` varchar(100) DEFAULT NULL COMMENT '微信订单编号', `state` int(11) DEFAULT '1' COMMENT '订单状态 1-待支付 2-待使用 3-已使用 4-售后', */ @@ -40,4 +42,12 @@ private String orderNo; private String payOrderNo; private String wxOrderNo; private Integer state; @TableField(exist = false) private String name;// @TableField(exist = false) private String activityName;// } src/main/java/cc/mrbird/febs/mall/entity/HappyActivityOrderItem.java
@@ -21,7 +21,7 @@ `phone` varchar(100) DEFAULT NULL COMMENT '电话', `address` varchar(500) DEFAULT NULL COMMENT '地址', `state` int(11) DEFAULT '0' COMMENT '使用状态 0-待使用 1-已使用', `transfer_item_id` bigint(20) DEFAULT NULL COMMENT '转赠来源ID(接收转赠之后,更新成新增的订单子表ID)', `transfer_item_id` bigint(20) DEFAULT NULL COMMENT '核销人员memberId', `transfer_state` int(11) DEFAULT '0' COMMENT '是否转赠 0-未转赠 1-已转赠', `DELETE_FLAG` int(11) DEFAULT '0' COMMENT '删除标识 0-未删除 1-已删除', */ src/main/java/cc/mrbird/febs/mall/entity/MallMember.java
@@ -183,4 +183,6 @@ private Date vipLevelTime; //是否是医生 0-否 1-是 private Integer doctorState; //是否是核销员 0-否 1-是 private Integer checkOrder; } src/main/java/cc/mrbird/febs/mall/mapper/HappyActivityMapper.java
@@ -1,8 +1,11 @@ package cc.mrbird.febs.mall.mapper; import cc.mrbird.febs.mall.dto.activity.AdminHappyActivityOrderDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.dto.ApiActivityInfoDto; import cc.mrbird.febs.mall.entity.HappyActivityOrder; import cc.mrbird.febs.mall.vo.ApiActivityInfoVo; import cc.mrbird.febs.mall.dto.ApiVoteRecordInPageDto; import cc.mrbird.febs.mall.vo.ApiActivityOptionListVo; @@ -20,4 +23,8 @@ void updateHappyActivityOptionLikeCnt(@Param("id")Long sourceOptionId); Page<ApiActivityOptionListVo> getVoteOptionInPage(Page<ApiActivityOptionListVo> page, @Param("record")ApiVoteOptionInPageDto dto); Page<HappyActivityOrder> selectOrderInPage(Page<HappyActivityOrder> page, @Param("record")AdminHappyActivityOrderDto dto); Page<ApiActivityOptionListVo> getVoteOptionRecordInPage(Page<ApiActivityOptionListVo> page, ApiVoteOptionRecordInPageDto dto); } src/main/java/cc/mrbird/febs/mall/quartz/ProfitJob.java
@@ -7,6 +7,7 @@ import cc.mrbird.febs.mall.entity.MallMoneyFlow; import cc.mrbird.febs.mall.mapper.MallMemberMapper; import cc.mrbird.febs.mall.mapper.MallMoneyFlowMapper; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.service.IApiMallMemberService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.service.IMemberProfitService; @@ -15,6 +16,7 @@ import cn.hutool.core.date.DateTime; import cn.hutool.core.date.DateUtil; import cn.hutool.core.util.StrUtil; 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; @@ -22,58 +24,38 @@ import org.springframework.stereotype.Component; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; import java.math.RoundingMode; import java.util.Date; import java.util.List; /** * @author wzy * @date 2021-09-28 **/ @Slf4j @Component @ConditionalOnProperty(prefix = "system", name = "job", havingValue = "true") public class ProfitJob { @Autowired private IMemberProfitService memberProfitService; @Resource private HappyActivityService happyActivityService; // /** // * 代理分红 // */ // @Scheduled(cron = "0 30 0 * * ?") // public void profitJob() { // memberProfitService.agentProfit(null); // } // // @Scheduled(cron = "0 30 1 * * ?") // public void storeAndDirectorJob() { // memberProfitService.storeAndDirectorProfit(null); // } // // /** // * 感恩奖 // */ // @Scheduled(cron = "0 0 1 * * ?") // public void thankfulJob() { // memberProfitService.thankfulProfit(null); // } // // // /** // * 静态分红 // */ // @Scheduled(cron = "0 0 0 * * ?") // public void staticProfitJob() { // memberProfitService.staticProfit(null); // } // // /** // * 排名奖 每月1号 // */ // @Scheduled(cron = "0 30 0 1 * ?") // public void rankJob() { // memberProfitService.rankProfit(); // } /** * 活动时间结束更新 * 一分钟运行一次 */ @Scheduled(cron = "0 0/1 * * * ? ") public void activityEnd() { happyActivityService.activityEnd(); } /** * 活动时间开始更新 * 一分钟运行一次 */ @Scheduled(cron = "0 0/1 * * * ? ") public void activityStart() { happyActivityService.activityStart(); } } src/main/java/cc/mrbird/febs/mall/service/HappyActivityService.java
@@ -2,7 +2,10 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto; import cc.mrbird.febs.mall.dto.activity.ApiCheckOrderDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.dto.ApiOperateDoDto; import cc.mrbird.febs.mall.dto.ApiOperateVoteDto; @@ -16,6 +19,10 @@ FebsResponse activityInfo(ApiActivityDto dto); FebsResponse voteOptionInPage(ApiVoteOptionInPageDto dto); FebsResponse voteOptionRecordInPage(ApiVoteOptionRecordInPageDto dto); FebsResponse voteActivityHot(Long id); FebsResponse voteOption(Long id); @@ -48,4 +55,18 @@ void addLikeCnt(Long sourceOptionId); void substructJoinCnt(Long activityId,Integer cnt); FebsResponse orderList(ApiActivityOrderListDto dto); FebsResponse orderInfo(Long id); FebsResponse orderDelete(Long id); void activityEnd(); void activityStart(); FebsResponse checkOrder(ApiCheckOrderDto dto); void checkActivityItem(Long orderId); } src/main/java/cc/mrbird/febs/mall/service/IAdminHappyActivityService.java
@@ -3,13 +3,8 @@ import cc.mrbird.febs.common.entity.FebsResponse; import cc.mrbird.febs.common.entity.QueryRequest; import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto; import cc.mrbird.febs.mall.dto.activity.AdminActivityOptionAddDto; import cc.mrbird.febs.mall.dto.activity.AdminCategoryAddDto; import cc.mrbird.febs.mall.dto.activity.AdminCategoryUpdateDto; import cc.mrbird.febs.mall.entity.HappyActivity; import cc.mrbird.febs.mall.entity.HappyActivityCategory; import cc.mrbird.febs.mall.entity.HappyActivityOption; import cc.mrbird.febs.mall.entity.HappyFollow; import cc.mrbird.febs.mall.dto.activity.*; import cc.mrbird.febs.mall.entity.*; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; @@ -46,6 +41,8 @@ List<HappyActivity> allActivities(); List<HappyActivity> allOrderActivities(); FebsResponse addOption(AdminActivityOptionAddDto dto); FebsResponse optionUpdate(HappyActivityOption dto); @@ -53,4 +50,10 @@ FebsResponse optionDelete(Long id); IPage<HappyFollow> getFollowVoteInPage(HappyActivityOption voteRecord, QueryRequest request); IPage<HappyActivityOrder> activityOrderList(AdminHappyActivityOrderDto dto, QueryRequest request); FebsResponse checkOrder(AdminHappyActivityCheckOrderDto dto); FebsResponse activityOrderDel(Long id); } src/main/java/cc/mrbird/febs/mall/service/impl/AdminHappyActivityServiceImpl.java
@@ -5,9 +5,7 @@ import cc.mrbird.febs.common.enumerates.StateUpDownEnum; import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.mall.dto.AdminHappyActivityCategoryDto; import cc.mrbird.febs.mall.dto.activity.AdminActivityOptionAddDto; import cc.mrbird.febs.mall.dto.activity.AdminCategoryAddDto; import cc.mrbird.febs.mall.dto.activity.AdminCategoryUpdateDto; import cc.mrbird.febs.mall.dto.activity.*; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.IAdminHappyActivityService; @@ -38,6 +36,8 @@ private final HappyActivityCategoryMapper happyActivityCategoryMapper; private final HappyActivityOptionMapper happyActivityOptionMapper; private final HappyActivityOrderMapper happyActivityOrderMapper; private final HappyActivityOrderItemMapper happyActivityOrderItemMapper; private final HappyFollowMapper happyFollowMapper; private final MallMemberMapper mallMemberMapper; @@ -264,6 +264,17 @@ } @Override public List<HappyActivity> allOrderActivities() { List<HappyActivity> happyActivities = this.baseMapper.selectList( new LambdaQueryWrapper<HappyActivity>() .select(HappyActivity::getId, HappyActivity::getName) .eq(HappyActivity::getType, StateUpDownEnum.ACTIVITY_TYPE_CROWDFUNDING.getCode()) .eq(HappyActivity::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) ); return happyActivities; } @Override public FebsResponse addOption(AdminActivityOptionAddDto dto) { @@ -271,7 +282,7 @@ return new FebsResponse().fail().message("请选择投票活动"); } List<HappyActivityOption> happyActivityOptions = happyActivityOptionMapper.selectList( Integer optionCnt = happyActivityOptionMapper.selectCount( new LambdaQueryWrapper<HappyActivityOption>() .eq(HappyActivityOption::getActivityId, dto.getActivityId()) .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) @@ -280,7 +291,7 @@ HappyActivityOption happyActivityOption = new HappyActivityOption(); BeanUtil.copyProperties(dto, happyActivityOption); happyActivityOption.setOrderCnt(CollUtil.isEmpty(happyActivityOptions) ? 1 : happyActivityOptions.size() + 1); happyActivityOption.setOrderCnt(optionCnt + 1); happyActivityOptionMapper.insert(happyActivityOption); return new FebsResponse().success().message("操作成功"); } @@ -343,4 +354,50 @@ } return adminIPage; } @Override public IPage<HappyActivityOrder> activityOrderList(AdminHappyActivityOrderDto dto, QueryRequest request) { Page<HappyActivityOrder> page = new Page<>(request.getPageNum(), request.getPageSize()); Page<HappyActivityOrder> adminOptionVoIPage = this.baseMapper.selectOrderInPage(page, dto); return adminOptionVoIPage; } @Override public FebsResponse checkOrder(AdminHappyActivityCheckOrderDto dto) { List<Long> ids = dto.getIds(); if (CollUtil.isEmpty(ids)){ return new FebsResponse().fail().message("请选择需要核销的订单"); } for(Long id : ids){ HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id); happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_USED.getCode()); happyActivityOrderMapper.updateById(happyActivityOrder); List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList( new LambdaQueryWrapper<HappyActivityOrderItem>() .eq(HappyActivityOrderItem::getOrderId, id) ); if(CollUtil.isNotEmpty(happyActivityOrderItems)){ happyActivityOrderItems.forEach(happyActivityOrderItem -> { happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode()); happyActivityOrderItemMapper.updateById(happyActivityOrderItem); }); } } return new FebsResponse().success().message("操作成功"); } @Override public FebsResponse activityOrderDel(Long id) { HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id); if(ObjectUtil.isNotEmpty(happyActivityOrder)){ happyActivityOrder.setDeleteFlag(StateUpDownEnum.UP.getCode()); happyActivityOrderMapper.updateById(happyActivityOrder); } return new FebsResponse().success().message("操作成功"); } } src/main/java/cc/mrbird/febs/mall/service/impl/HappyActivityServiceImpl.java
@@ -7,15 +7,23 @@ import cc.mrbird.febs.common.utils.MallUtils; import cc.mrbird.febs.common.utils.ShareCodeUtil; import cc.mrbird.febs.mall.dto.*; import cc.mrbird.febs.mall.dto.activity.ApiActivityOrderListDto; import cc.mrbird.febs.mall.dto.activity.ApiCheckOrderDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionInPageDto; import cc.mrbird.febs.mall.dto.activity.ApiVoteOptionRecordInPageDto; import cc.mrbird.febs.mall.entity.*; import cc.mrbird.febs.mall.mapper.*; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.service.IApiMallMemberWalletService; import cc.mrbird.febs.mall.vo.*; import cc.mrbird.febs.mall.dto.ApiOperateDoDto; import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderInfoVo; import cc.mrbird.febs.mall.vo.activity.ApiActivityOrderListVo; import cc.mrbird.febs.mall.vo.activity.ApiCheckOrderVo; import cc.mrbird.febs.mall.vo.activity.ApiVoteActivityHotVo; import cc.mrbird.febs.pay.model.BrandWCPayRequestData; import cc.mrbird.febs.pay.service.IXcxPayService; import cc.mrbird.febs.rabbit.producter.AgentProducer; import cn.hutool.core.bean.BeanUtil; import cn.hutool.core.collection.CollUtil; import cn.hutool.core.date.DateTime; @@ -25,6 +33,7 @@ import cn.hutool.crypto.SecureUtil; import cn.hutool.json.JSONUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import lombok.RequiredArgsConstructor; @@ -35,6 +44,7 @@ import java.math.BigDecimal; import java.math.RoundingMode; import java.util.*; import java.util.function.Function; import java.util.stream.Collectors; @Slf4j @@ -51,6 +61,8 @@ private final HappyActivityOrderItemMapper happyActivityOrderItemMapper; private final IXcxPayService iXcxPayService; private final IApiMallMemberWalletService iApiMallMemberWalletService; private final HappyActivityCategoryMapper happyActivityCategoryMapper; private final AgentProducer agentProducer; @Override public FebsResponse activityList(ApiActivityInfoDto dto) { @@ -124,7 +136,6 @@ HappyActivity happyActivity = this.baseMapper.selectOne( new LambdaQueryWrapper<HappyActivity>() .eq(HappyActivity::getId, dto.getId()) .eq(HappyActivity::getType, dto.getType()) .eq(HappyActivity::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .ne(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode()) ); @@ -139,6 +150,14 @@ // 创建分页对象,传入当前页和每页大小 Page<ApiActivityOptionListVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); Page<ApiActivityOptionListVo> voteRecordInPage = this.baseMapper.getVoteOptionInPage(page, dto); return new FebsResponse().success().data(voteRecordInPage); } @Override public FebsResponse voteOptionRecordInPage(ApiVoteOptionRecordInPageDto dto) { // 创建分页对象,传入当前页和每页大小 Page<ApiActivityOptionListVo> page = new Page<>(dto.getPageNow(), dto.getPageSize()); Page<ApiActivityOptionListVo> voteRecordInPage = this.baseMapper.getVoteOptionRecordInPage(page, dto); return new FebsResponse().success().data(voteRecordInPage); } @@ -225,6 +244,12 @@ if(StateUpDownEnum.ACTIVITY_TYPE_VOTE.getCode() != happyActivity.getType()){ throw new FebsException("当前活动无法投票"); } if (StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode() == happyActivity.getState()) { throw new FebsException("活动尚未开始"); } if (StateUpDownEnum.ACTIVITY_STATE_END.getCode() == happyActivity.getState()) { throw new FebsException("活动已结束"); } HappyActivityOption happyActivityOption = happyActivityOptionMapper.selectById(sourceOptionId); if (null == happyActivityOption) { @@ -284,12 +309,54 @@ @Override public FebsResponse operateRegister(ApiOperateRegisterActivityDto dto) { Long memberId = LoginUserUtil.getLoginUser().getId(); return null; HappyActivity happyActivity = this.baseMapper.selectById(dto.getActivityId()); if (StateUpDownEnum.ACTIVITY_STATE_END.getCode() == happyActivity.getState()) { throw new FebsException("活动已结束"); } if (StateUpDownEnum.DOWN.getCode() == happyActivity.getAddState()) { throw new FebsException("活动尚未开启报名"); } //判断用户是否重复报名 Integer registerCnt = happyActivityOptionMapper.selectCount( new LambdaQueryWrapper<HappyActivityOption>() .eq(HappyActivityOption::getMemberId, memberId) .eq(HappyActivityOption::getActivityId, dto.getActivityId()) .ne(HappyActivityOption::getState, StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_REFUSE.getCode()) .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) ); if (registerCnt > 0) { throw new FebsException("您已经报名过了"); } Integer optionCnt = happyActivityOptionMapper.selectCount( new LambdaQueryWrapper<HappyActivityOption>() .eq(HappyActivityOption::getActivityId, dto.getActivityId()) .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) ); HappyActivityOption happyActivityOption = new HappyActivityOption(); BeanUtil.copyProperties(dto, happyActivityOption); happyActivityOption.setOrderCnt(optionCnt + 1); happyActivityOption.setMemberId(memberId); happyActivityOption.setOptionName(dto.getRealName()); happyActivityOptionMapper.insert(happyActivityOption); return new FebsResponse().success().message("报名成功"); } @Override public FebsResponse addConnect(ApiOperateRegisterUserDto dto) { Long memberId = LoginUserUtil.getLoginUser().getId(); List<HappyActivityConnect> happyActivityConnects = happyActivityConnectMapper.selectList( new LambdaQueryWrapper<HappyActivityConnect>() .eq(HappyActivityConnect::getMemberId, memberId) .eq(HappyActivityConnect::getName, dto.getName()) ); if(CollUtil.isNotEmpty(happyActivityConnects)){ throw new FebsException("已经添加过该联系人"); } HappyActivityConnect happyActivityConnect = new HappyActivityConnect(); happyActivityConnect.setMemberId(memberId); @@ -446,7 +513,7 @@ BrandWCPayRequestData brandWCPayRequestData = iXcxPayService.startPaymentActivity(happyActivityOrder); wxResultStr = JSONUtil.toJsonStr(brandWCPayRequestData); payResultStr = brandWCPayRequestData.getPrepay_id(); updateOrderState(happyActivityOrder, payType, StateUpDownEnum.PAY_STATE_NOT_PAY.getCode()); updateOrderState(happyActivityOrder, payType, StateUpDownEnum.PAY_STATE_NOT_PAY.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_PAY.getCode()); } else if (StateUpDownEnum.PAY_METHOD_BALANCE.getCode() == payType || StateUpDownEnum.PAY_METHOD_INTEGRAL.getCode() == payType) { // 处理余额或积分支付逻辑,验证交易密码并完成支付 @@ -492,22 +559,25 @@ } } // 处理未支付订单 // 处理无需支付订单 private void processNoPayOrder(HappyActivityOrder order, Long orderId) { updateOrderState(order, StateUpDownEnum.PAY_METHOD_NO_PAY.getCode(), StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode()); updateOrderState(order, StateUpDownEnum.PAY_METHOD_NO_PAY.getCode(), StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode()); generateOrderItemCodes(orderId); } // 处理已支付订单 // 处理余额和积分支付的订单 private void processPaidOrder(HappyActivityOrder order, Long orderId, Integer payType) { updateOrderState(order, payType, StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode()); updateOrderState(order, payType, StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode(),StateUpDownEnum.ORDER_STATE_WAIT_USE.getCode()); generateOrderItemCodes(orderId); } // 更新订单状态 private void updateOrderState(HappyActivityOrder order, Integer payType, Integer payState) { private void updateOrderState(HappyActivityOrder order, Integer payType, Integer payState, Integer state) { order.setPayState(payState); order.setPayType(payType); order.setState(state); if (payState == StateUpDownEnum.PAY_STATE_PAY_SUCCESS.getCode()) { order.setPayTime(new Date()); } @@ -551,6 +621,265 @@ return happyActivityOrder.getOrderNo(); } @Override public FebsResponse orderList(ApiActivityOrderListDto dto) { // 获取当前登录用户的ID Long memberId = LoginUserUtil.getLoginUser().getId(); ArrayList<ApiActivityOrderListVo> apiActivityOrderListVos = new ArrayList<>(); LambdaQueryWrapper<HappyActivityOrder> happyActivityOrderLambdaQueryWrapper = new LambdaQueryWrapper<>(); happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getMemberId, memberId); if(ObjectUtil.isNotEmpty(dto.getState())){ happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getState, dto.getState()); } happyActivityOrderLambdaQueryWrapper.eq(HappyActivityOrder::getDeleteFlag, StateUpDownEnum.DOWN.getCode()); happyActivityOrderLambdaQueryWrapper.orderByDesc(HappyActivityOrder::getCreatedTime); Page<HappyActivityOrder> page = new Page<>(dto.getPageNum(), dto.getPageSize()); Page<HappyActivityOrder> voteActivityPage = happyActivityOrderMapper.selectPage(page, happyActivityOrderLambdaQueryWrapper); List<HappyActivityOrder> records = voteActivityPage.getRecords(); if(CollUtil.isNotEmpty(records)){ Set<Long> activityIds = records.stream().map(HappyActivityOrder::getActivityId).collect(Collectors.toSet()); List<HappyActivity> happyActivities = this.baseMapper.selectList( new LambdaQueryWrapper<HappyActivity>() .select( HappyActivity::getCategoryId, HappyActivity::getName, HappyActivity::getStartTime, HappyActivity::getEndTime, HappyActivity::getAddress) .in(HappyActivity::getId, activityIds) ); Map<Long, HappyActivity> activityMap = happyActivities.stream().collect(Collectors.toMap(HappyActivity::getId, Function.identity())); Set<Long> categoryIds = happyActivities.stream().map(HappyActivity::getCategoryId).collect(Collectors.toSet()); //stream流操作categoryIds得到一个Map<categoryId,HappyActivityCategory>的map对象 List<HappyActivityCategory> happyActivityCategories = happyActivityCategoryMapper.selectList( new LambdaQueryWrapper<HappyActivityCategory>() .select( HappyActivityCategory::getId, HappyActivityCategory::getName) .in(HappyActivityCategory::getId,categoryIds) ); Map<Long, HappyActivityCategory> categoryMap = happyActivityCategories.stream().collect(Collectors.toMap(HappyActivityCategory::getId, Function.identity())); for(HappyActivityOrder happyActivityOrder : records){ ApiActivityOrderListVo apiActivityOrderListVo = new ApiActivityOrderListVo(); BeanUtil.copyProperties(happyActivityOrder, apiActivityOrderListVo); apiActivityOrderListVo.setActivityName(activityMap.get(happyActivityOrder.getActivityId()).getName()); apiActivityOrderListVo.setStartTime(activityMap.get(happyActivityOrder.getActivityId()).getStartTime()); apiActivityOrderListVo.setEndTime(activityMap.get(happyActivityOrder.getActivityId()).getEndTime()); apiActivityOrderListVo.setAddress(activityMap.get(happyActivityOrder.getActivityId()).getAddress()); apiActivityOrderListVo.setCategoryName(categoryMap.get(activityMap.get(happyActivityOrder.getActivityId()).getCategoryId()).getName()); apiActivityOrderListVos.add(apiActivityOrderListVo); } } return new FebsResponse().success().data(apiActivityOrderListVos); } @Override public FebsResponse orderInfo(Long id) { // 获取当前登录用户的ID Long memberId = LoginUserUtil.getLoginUser().getId(); ArrayList<ApiActivityOrderInfoVo> apiActivityOrderInfoVos = new ArrayList<>(); HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(id); HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrder.getActivityId()); List<HappyActivityOrderItem> happyActivityOrderItems = happyActivityOrderItemMapper.selectList( new LambdaQueryWrapper<HappyActivityOrderItem>() .eq(HappyActivityOrderItem::getOrderId, happyActivityOrder.getActivityId()) .eq(HappyActivityOrderItem::getMemberId, memberId) ); if(CollUtil.isNotEmpty(happyActivityOrderItems)){ for(HappyActivityOrderItem happyActivityOrderItem : happyActivityOrderItems){ ApiActivityOrderInfoVo apiActivityOrderInfoVo = new ApiActivityOrderInfoVo(); BeanUtil.copyProperties(happyActivityOrderItem, apiActivityOrderInfoVo); apiActivityOrderInfoVo.setOrderState(happyActivityOrder.getState()); apiActivityOrderInfoVo.setActivityName(happyActivity.getName()); apiActivityOrderInfoVo.setActivityStartTime(happyActivity.getStartTime()); apiActivityOrderInfoVo.setActivityEndTime(happyActivity.getEndTime()); apiActivityOrderInfoVo.setActivityAddress(happyActivity.getAddress()); apiActivityOrderInfoVos.add(apiActivityOrderInfoVo); } } return new FebsResponse().success().data(apiActivityOrderInfoVos); } @Override public FebsResponse orderDelete(Long id) { // 获取当前登录用户的ID Long memberId = LoginUserUtil.getLoginUser().getId(); List<HappyActivityOrder> happyActivityOrders = happyActivityOrderMapper.selectList( new LambdaQueryWrapper<HappyActivityOrder>() .eq(HappyActivityOrder::getId, id) .eq(HappyActivityOrder::getMemberId, memberId) ); if(CollUtil.isNotEmpty(happyActivityOrders)){ happyActivityOrders.forEach(happyActivityOrder -> { happyActivityOrder.setDeleteFlag(StateUpDownEnum.UP.getCode()); happyActivityOrderMapper.updateById(happyActivityOrder); }); } return new FebsResponse().success(); } @Override public void activityEnd() { Date date = new Date(); List<HappyActivity> happyActivities = this.baseMapper.selectList( new LambdaQueryWrapper<HappyActivity>() .eq(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_ENROLLING.getCode()) .le(HappyActivity::getEndTime, date) ); if(CollUtil.isEmpty(happyActivities)){ return; } happyActivities.forEach(happyActivity -> { happyActivity.setState(StateUpDownEnum.ACTIVITY_STATE_END.getCode()); this.baseMapper.updateById(happyActivity); }); } /** * 当活动即将开始时自动更新活动状态 * 此方法旨在查询所有即将开始的活动,并将它们的状态更新为报名进行中 */ @Override public void activityStart() { // 获取当前日期和时间 DateTime date = DateUtil.date(); // 查询所有状态为未开始且当前时间在活动开始时间结束时间之间的活动 List<HappyActivity> happyActivities = this.baseMapper.selectList( new LambdaQueryWrapper<HappyActivity>() .eq(HappyActivity::getState, StateUpDownEnum.ACTIVITY_STATE_NOT_START.getCode()) .le(HappyActivity::getStartTime, date) .ge(HappyActivity::getEndTime, date) ); // 如果没有找到任何符合条件的活动,则直接返回 if(CollUtil.isEmpty(happyActivities)){ return; } // 遍历每个符合条件的活动,将其状态更新为报名进行中,并保存更新 happyActivities.forEach(happyActivity -> { happyActivity.setState(StateUpDownEnum.ACTIVITY_STATE_ENROLLING.getCode()); this.baseMapper.updateById(happyActivity); }); } @Override public FebsResponse checkOrder(ApiCheckOrderDto dto) { // 获取当前登录用户的ID Long memberId = LoginUserUtil.getLoginUser().getId(); MallMember mallMember = mallMemberMapper.selectById(memberId); if(StateUpDownEnum.UP.getCode() != mallMember.getCheckOrder()){ throw new FebsException("您不是核销员!"); } String orderItemCode = dto.getOrderItemCode(); HappyActivityOrderItem happyActivityOrderItem = happyActivityOrderItemMapper.selectOne( new LambdaQueryWrapper<HappyActivityOrderItem>() .eq(HappyActivityOrderItem::getCode, orderItemCode) .eq(HappyActivityOrderItem::getState, StateUpDownEnum.DOWN.getCode()) .last("limit 1") ); if(happyActivityOrderItem != null){ happyActivityOrderItem.setState(StateUpDownEnum.UP.getCode()); happyActivityOrderItem.setTransferItemId(memberId); happyActivityOrderItemMapper.updateById(happyActivityOrderItem); agentProducer.sendCheckActivityItem(happyActivityOrderItem.getOrderId()); HappyActivity happyActivity = this.baseMapper.selectById(happyActivityOrderItem.getActivityId()); ApiCheckOrderVo apiCheckOrderVo = new ApiCheckOrderVo(); apiCheckOrderVo.setActivityName(happyActivity.getName()); apiCheckOrderVo.setActivityStartTime(happyActivity.getStartTime()); apiCheckOrderVo.setActivityEndTime(happyActivity.getEndTime()); apiCheckOrderVo.setActivityAddress(happyActivity.getAddress()); apiCheckOrderVo.setCode(happyActivityOrderItem.getCode()); apiCheckOrderVo.setName(happyActivityOrderItem.getName()); apiCheckOrderVo.setPhone(happyActivityOrderItem.getPhone()); apiCheckOrderVo.setPrice(happyActivityOrderItem.getPrice()); return new FebsResponse().success().data(apiCheckOrderVo); } return new FebsResponse().fail().message("核销失败!"); } /** * 检查活动订单项的状态 * 当指定订单的所有活动订单项都不处于"未使用"状态时,将订单状态更新为"已使用" * * @param orderId 订单ID,用于查询活动订单项和订单信息 */ @Override public void checkActivityItem(Long orderId) { // 查询指定订单ID的活动订单项数量,且状态为"未使用" Integer integer = happyActivityOrderItemMapper.selectCount( new LambdaQueryWrapper<HappyActivityOrderItem>() .eq(HappyActivityOrderItem::getOrderId, orderId) .eq(HappyActivityOrderItem::getState, StateUpDownEnum.DOWN.getCode()) ); // 如果没有找到任何未使用的活动订单项 if(0 == integer){ // 根据订单ID查询订单信息 HappyActivityOrder happyActivityOrder = happyActivityOrderMapper.selectById(orderId); if(happyActivityOrder == null){ return; } // 更新订单状态为"已使用" happyActivityOrder.setState(StateUpDownEnum.ORDER_STATE_USED.getCode()); // 保存更新后的订单信息 happyActivityOrderMapper.updateById(happyActivityOrder); } // 结束方法执行 return; } @Override public FebsResponse voteActivityHot(Long id) { ApiVoteActivityHotVo apiVoteActivityHotVo = new ApiVoteActivityHotVo(); Integer optionCnt = happyActivityOptionMapper.selectCount( new LambdaQueryWrapper<HappyActivityOption>() .eq(HappyActivityOption::getActivityId, id) .eq(HappyActivityOption::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) .eq(HappyActivityOption::getState, StateUpDownEnum.VOTE_OPTION_STATE_AUDIT_SUCCESS.getCode()) ); apiVoteActivityHotVo.setOptionCnt(optionCnt); Integer followVoteCnt = happyFollowMapper.selectCount( new LambdaQueryWrapper<HappyFollow>() .eq(HappyFollow::getSourceType, StateUpDownEnum.SOURCE_TYPE_ACTIVITY.getCode()) .eq(HappyFollow::getSourceId, id) .eq(HappyFollow::getType, StateUpDownEnum.VOTE.getCode()) .eq(HappyFollow::getDeleteFlag, StateUpDownEnum.DOWN.getCode()) ); apiVoteActivityHotVo.setFollowVoteCnt(followVoteCnt); return new FebsResponse().success().data(apiVoteActivityHotVo); } public static void main(String[] args) { Date date = new Date(); src/main/java/cc/mrbird/febs/mall/vo/ApiActivityInfoVo.java
@@ -24,6 +24,12 @@ @ApiModelProperty(value = "名称") private String name; @ApiModelProperty(value = "地点") private String address; @ApiModelProperty(value = "活动类型 1-普通活动 2-众筹活动 3-投票活动") private Integer type; @ApiModelProperty(value = "状态 0-未开始 1-报名中(进行中) 2-已结束") private Integer state; src/main/java/cc/mrbird/febs/mall/vo/MallMemberVo.java
@@ -102,4 +102,7 @@ @ApiModelProperty(value = "是否是医生") private Integer doctorState; @ApiModelProperty(value = "是否是核销员 0-否 1-是") private Integer checkOrder; } src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderInfoVo.java
New file @@ -0,0 +1,53 @@ package cc.mrbird.febs.mall.vo.activity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @ApiModel(value = "ApiActivityOrderInfoVo", description = "参数") public class ApiActivityOrderInfoVo { @ApiModelProperty(value = "活动名称") private String activityName; @ApiModelProperty(value = "活动开始时间(有效期)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date activityStartTime; @ApiModelProperty(value = "活动结束时间(有效期)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date activityEndTime; @ApiModelProperty(value = "活动地点") private String activityAddress; @ApiModelProperty(value = "票号") private String code; @ApiModelProperty(value = "报名人姓名") private String name; @ApiModelProperty(value = "报名人电话") private String phone; @ApiModelProperty(value = "票据状态 0-待使用 1-已使用") private Integer state; @ApiModelProperty(value = "实付金额") private BigDecimal price; @ApiModelProperty(value = "订单状态 1-待支付 2-待使用 3-已使用 4-售后") private Integer orderState; } src/main/java/cc/mrbird/febs/mall/vo/activity/ApiActivityOrderListVo.java
New file @@ -0,0 +1,50 @@ package cc.mrbird.febs.mall.vo.activity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @ApiModel(value = "ApiActivityOrderListVo", description = "参数") public class ApiActivityOrderListVo { private Long id; @ApiModelProperty(value = "订单号") private String orderNo; @ApiModelProperty(value = "单价") private BigDecimal price; @ApiModelProperty(value = "数量") private Integer numCnt; @ApiModelProperty(value = "支付总金额") private BigDecimal amount; @ApiModelProperty(value = "支付状态 0-待支付 1-支付成功 2-支付失败") private Integer payState; @ApiModelProperty(value = "支付方式 1-余额支付 2-微信支付 3-积分支付 0-无需支付(免费)") private Integer payType; @ApiModelProperty(value = "支付时间") private Date payTime; @ApiModelProperty(value = "订单状态 1-待支付 2-待使用 3-已使用 4-售后") private Integer state; @ApiModelProperty(value = "活动名称") private String activityName; @ApiModelProperty(value = "活动开始时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date startTime; @ApiModelProperty(value = "活动结束时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date endTime; @ApiModelProperty(value = "活动地点") private String address; @ApiModelProperty(value = "活动类别") private String categoryName; } src/main/java/cc/mrbird/febs/mall/vo/activity/ApiCheckOrderVo.java
New file @@ -0,0 +1,41 @@ package cc.mrbird.febs.mall.vo.activity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.util.Date; @Data @ApiModel(value = "ApiCheckOrderVo", description = "参数") public class ApiCheckOrderVo { @ApiModelProperty(value = "活动名称") private String activityName; @ApiModelProperty(value = "活动开始时间(有效期)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date activityStartTime; @ApiModelProperty(value = "活动结束时间(有效期)") @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") private Date activityEndTime; @ApiModelProperty(value = "活动地点") private String activityAddress; @ApiModelProperty(value = "票号") private String code; @ApiModelProperty(value = "报名人姓名") private String name; @ApiModelProperty(value = "报名人电话") private String phone; @ApiModelProperty(value = "实付金额") private BigDecimal price; } src/main/java/cc/mrbird/febs/mall/vo/activity/ApiVoteActivityHotVo.java
New file @@ -0,0 +1,20 @@ package cc.mrbird.febs.mall.vo.activity; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data @ApiModel(value = "ApiVoteActivityHotVo", description = "参数") public class ApiVoteActivityHotVo { @ApiModelProperty(value = "参与选手数量") private Integer optionCnt; @ApiModelProperty(value = "累计总票数") private Integer followVoteCnt; } src/main/java/cc/mrbird/febs/rabbit/constants/QueueConstants.java
@@ -5,6 +5,7 @@ * @date 2021-09-25 **/ public class QueueConstants { public static final String ACTIVITY_ORDER_ITEM_CHECK = "queue_activity_order_item_check"; public static final String QUEUE_DEFAULT = "queue_default_qay"; public static final String AGENT_AUTO_LEVEL_UP = "queue_agent_auto_level_up_qay"; src/main/java/cc/mrbird/febs/rabbit/consumer/AgentConsumer.java
@@ -1,5 +1,6 @@ package cc.mrbird.febs.rabbit.consumer; import cc.mrbird.febs.mall.service.HappyActivityService; import cc.mrbird.febs.mall.service.IAgentService; import cc.mrbird.febs.mall.service.IApiMallOrderInfoService; import cc.mrbird.febs.mall.service.IMemberProfitService; @@ -29,6 +30,8 @@ private IAgentService agentService; @Autowired private IMemberProfitService memberProfitService; @Autowired private HappyActivityService happyActivityService; @RabbitListener(queues = QueueConstants.QUEUE_DEFAULT) public void agentReturn(Message message, Channel channel) { @@ -106,4 +109,14 @@ log.error("会员升级消息异常", e); } } @RabbitListener(queues = QueueConstants.ACTIVITY_ORDER_ITEM_CHECK) public void checkActivityItem(Long orderId) { log.info("收到核销活动门票:{}", orderId); try { happyActivityService.checkActivityItem(orderId); } catch (Exception e) { log.error("核销活动门票异常", e); } } } src/main/java/cc/mrbird/febs/rabbit/enumerates/RabbitQueueEnum.java
@@ -6,6 +6,9 @@ @Getter public enum RabbitQueueEnum { ACTIVITY_ORDER_ITEM_CHECK("exchange_activity_order_item_check", "route_key_activity_order_item_check", QueueConstants.ACTIVITY_ORDER_ITEM_CHECK), DEFAULT("exchange_default_qay", "route_key_default_qay", "queue_default_qay"), ORDER_CANCEL_DELAY_TTL("exchange_order_delay_ttl_qay", "route_key_order_delay_ttl_qay", "queue_order_delay_ttl_qay"), src/main/java/cc/mrbird/febs/rabbit/producter/AgentProducer.java
@@ -97,4 +97,11 @@ CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.VIP_LEVEL_UP.getExchange(), RabbitQueueEnum.VIP_LEVEL_UP.getRoute(), orderId, correlationData); } public void sendCheckActivityItem(Long orderId) { log.info("核销活动门票:{}", orderId); CorrelationData correlationData = new CorrelationData(UUID.randomUUID().toString()); rabbitTemplate.convertAndSend(RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getExchange(), RabbitQueueEnum.ACTIVITY_ORDER_ITEM_CHECK.getRoute(), orderId, correlationData); } } src/main/resources/application-dev.yml
@@ -40,7 +40,7 @@ # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: 10000 # 连接超时时间(毫秒) timeout: 5000 timeout: 500000 rabbitmq: host: 120.27.238.55 port: 5672 src/main/resources/application-test.yml
@@ -40,7 +40,7 @@ # 连接池最大阻塞等待时间(使用负值表示没有限制) max-wait: 10000 # 连接超时时间(毫秒) timeout: 5000 timeout: 5000000 rabbitmq: host: 120.27.238.55 port: 5672 @@ -70,8 +70,8 @@ # wecharpaySecret: CSxc168888CSxc168888CSxc168888xc xcx: wechar_login_url: https://api.weixin.qq.com/sns/jscode2session?appid=%s&secret=%s&js_code=%s&grant_type=authorization_code xcx_appid: wxad2fdb2fcad10fb21 xcx_secret: 9bb58d655bff419feec3a6d948ca8b8d1 xcx_appid: wxe8454293f5c4c143 xcx_secret: 33c3ad513344cf6c16904e5d528b70ea debug: true wecharPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback wecharActivityPaynotifyUrl: http://blnka.csxuncong.com/api/xcxPay/wxpayCallback src/main/resources/mapper/modules/HappyActivityOptionMapper.xml
@@ -5,8 +5,10 @@ <select id="selectActivityPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityInfoVo"> select a.id, a.address, a.index_img, a.code, a.type, a.name, a.state, a.join_cnt, @@ -54,11 +56,72 @@ a.image as image, a.likes_cnt as likesCnt from happy_activity_option a where a.state = 1 and a.activity_id = #{record.activityId} and a.DELETE_FLAG = 1 <where> and a.state = 1 and a.activity_id = #{record.activityId} and a.DELETE_FLAG = 0 <if test="record != null"> <if test="record.query != null and record.query != ''"> and ( a.name like CONCAT('%', CONCAT(#{record.query}, '%')) or a.order_cnt = #{record.query} ) </if> </if> </where> order by a.order_cnt asc </select> <select id="selectOrderInPage" resultType="cc.mrbird.febs.mall.entity.HappyActivityOrder"> select a.*, b.name as name, c.name as activityName from happy_activity_order a left join mall_member b on a.member_id = b.id left join happy_activity c on a.activity_id = c.id <where> and a.DELETE_FLAG = 0 <if test="record != null"> <if test="record.name != null and record.name != ''"> and b.name like CONCAT('%', CONCAT(#{record.name}, '%')) </if> <if test="record.state != null"> and a.state=#{record.state} </if> <if test="record.activityId != null"> and a.activity_id=#{record.activityId} </if> </if> </where> order by a.id desc </select> <select id="getVoteOptionRecordInPage" resultType="cc.mrbird.febs.mall.vo.ApiActivityOptionListVo"> select a.id as id, a.option_name as optionName, a.image as image, a.likes_cnt as likesCnt from happy_activity_option a <where> and a.state = 1 and a.activity_id = #{record.activityId} and a.DELETE_FLAG = 0 <if test="record != null"> <if test="record.query != null and record.query != ''"> and ( a.name like CONCAT('%', CONCAT(#{record.query}, '%')) or a.order_cnt = #{record.query} ) </if> </if> </where> order by a.likes_cnt desc </select> </mapper> src/main/resources/templates/febs/views/modules/votesActivity/list.html
@@ -61,8 +61,6 @@ <script type="text/html" id="activityStateSwitch"> {{# if(d.state === 1) { }} <input type="checkbox" value={{d.id}} lay-text="开启|关闭" checked lay-skin="switch" lay-filter="activityStateSwitch"> {{# } else if(d.state === 2) { }} <span class="layui-badge febs-bg-red">已结束</span> {{# } else { }} <input type="checkbox" value={{d.id}} lay-text="开启|关闭" lay-skin="switch" lay-filter="activityStateSwitch"> {{# } }} src/main/resources/templates/febs/views/modules/votesActivity/orderList.html
New file @@ -0,0 +1,263 @@ <div class="layui-fluid layui-anim febs-anim" id="febs-activity-order" lay-title="活动订单管理"> <div class="layui-row febs-container"> <div class="layui-col-md12"> <div class="layui-card"> <div class="layui-card-body febs-table-full"> <form class="layui-form layui-table-form" lay-filter="activity-order-table-form"> <div class="layui-row"> <div class="layui-col-md10"> <div class="layui-form-item"> <div class="layui-inline"> <label class="layui-form-label layui-form-label-sm">名称</label> <div class="layui-input-inline"> <input type="text" placeholder="名称" name="name" autocomplete="off" class="layui-input"> </div> </div> <div class="layui-inline"> <label class="layui-form-label layui-form-label-sm">状态</label> <div class="layui-input-inline"> <select name="status"> <option value="">请选择</option> <option value="1">待支付</option> <option value="2">待使用</option> <option value="3">已使用</option> <option value="4">售后</option> </select> </div> </div> <div class="layui-inline"> <label class="layui-form-label layui-form-label-sm">活动</label> <div class="layui-input-inline"> <select name="activityId" class="activity-type"> <option value="">请选择</option> </select> </div> </div> </div> </div> <div class="layui-col-md2 layui-col-sm12 layui-col-xs12 table-action-area"> <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-blue-plain table-action" id="query"> <i class="layui-icon"></i> </div> <div class="layui-btn layui-btn-sm layui-btn-primary febs-button-green-plain table-action" id="reset"> <i class="layui-icon"></i> </div> </div> </div> </form> <table lay-filter="orderActivityTable" lay-data="{id: 'orderActivityTable'}"></table> </div> </div> </div> </div> </div> <!-- 表格操作栏 start --> <script type="text/html" id="user-option"> <span shiro:lacksPermission="list:view,add:add,votesActivityUpdate:update"> <span class="layui-badge-dot febs-bg-orange"></span> 无权限 </span> <a lay-event="edit" shiro:hasPermission="votesActivityUpdate:update"><i class="layui-icon febs-edit-area febs-blue"></i></a> </script> <script type="text/html" id="orderActivityToolbar"> <div class="layui-btn-container"> <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="orderActivity:update" lay-event="checkOrder">手动核销</button> </div> </script> <script type="text/html" id="orderActivityOption"> <!-- <button class="layui-btn layui-btn-normal layui-btn-sm" type="button" shiro:hasPermission="orderActivity:info" lay-event="orderActivity">详情</button>--> <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="orderActivity:info" lay-event="orderActivityDel">删除</button> <!-- <button class="layui-btn layui-btn-danger layui-btn-sm" type="button" shiro:hasPermission="orderActivity:returnOrder" lay-event="returnOrder">售后退款</button>--> </script> <script type="text/html" id="orderStateOption"> {{# var state = { 1: {title: '待支付', color: 'blue'}, 2: {title: '待使用', color: 'orange'}, 3: {title: '已使用', color: 'green'}, 4: {title: '售后', color: 'red'}, }[d.state]; }} <span class="layui-badge febs-bg-{{state.color}}">{{ state.title }}</span> </script> <script type="text/html" id="payStateOption"> {{# var payState = { 0: {title: '待支付', color: 'blue'}, 1: {title: '成功', color: 'green'}, 2: {title: '失败', color: 'red'}, }[d.payState]; }} <span class="layui-badge febs-bg-{{payState.color}}">{{ payState.title }}</span> </script> <script type="text/html" id="payTypeOption"> {{# var payType = { 1: {title: '余额', color: 'blue'}, 2: {title: '微信', color: 'green'}, 3: {title: '积分', color: 'orange'}, 4: {title: '免费', color: 'red'}, }[d.payType]; }} <span class="layui-badge febs-bg-{{payType.color}}">{{ payType.title }}</span> </script> <style> .layui-form-onswitch { background-color: #5FB878 !important; } </style> <!-- 表格操作栏 end --> <script data-th-inline="none" type="text/javascript"> // 引入组件并初始化 layui.use([ 'jquery', 'form', 'table', 'febs'], function () { var $ = layui.jquery, febs = layui.febs, form = layui.form, table = layui.table, $view = $('#febs-activity-order'), $query = $view.find('#query'), $reset = $view.find('#reset'), $searchForm = $view.find('form'), sortObject = {field: 'phone', type: null}, tableIns; form.render(); //(下拉框) $.get(ctx + 'admin/happyActivity/allOrderActivities', function (res) { var data = res.data; for (let k in data) { $(".activity-type").append("<option value='" + data[k].id + "'>" + data[k].name + "</option>"); } layui.use('form', function () { var form = layui.form; form.render(); }); }); // 表格初始化 initorderActivityTable(); // 初始化表格操作栏各个按钮功能 table.on('tool(orderActivityTable)', function (obj) { var data = obj.data, layEvent = obj.event; if (layEvent === 'orderActivityDel') { febs.modal.confirm('删除', '确认删除?', function () { orderActivityDel(data.id); }); } if (layEvent === 'groupInfo') { febs.modal.open('编辑','modules/votesActivity/groupInfo/' + data.id, { btn: ['提交', '取消'], area: ['100%', '100%'], yes: function (index, layero) { $('#febs-group-info').find('#submit').trigger('click'); }, btn2: function () { layer.closeAll(); } }); } }); function orderActivityDel(id) { febs.get(ctx + 'admin/happyActivity/activityOrderDel/' + id, null, function (data) { febs.alert.success(data.message); $query.click(); }); } // 初始化表格操作栏各个按钮功能 table.on('toolbar(orderActivityTable)', function (obj) { console.log("触发事件:", obj.event); // 调试信息 let event = obj.event; let id = obj.config.id; let checkStatus = table.checkStatus(id); if(event === 'checkOrder'){ let data = checkStatus.data; let ids = []; for(let i = 0;i < data.length;i++){ if(data[i].state != 2){ febs.alert.warn('请选择待使用的订单'); return; }else{ ids.push(data[i].id); } } console.log(ids); if(ids == null || ids == ""){ febs.alert.warn('请选择需要核销的订单'); return; } $.ajax({ 'url':ctx + 'admin/happyActivity/checkOrder', 'type':'post', 'dataType':'json', 'headers' : {'Content-Type' : 'application/json;charset=utf-8'}, //接口json格式 'traditional': true,//ajax传递数组必须添加属性 'data':ids, 'success':function (data) { if(data.code==200){ febs.alert.success('操作成功'); $query.click(); }else{ febs.alert.warn(data.message); } }, 'error':function () { febs.alert.warn('服务器繁忙'); } }) } }); function initorderActivityTable() { tableIns = febs.table.init({ elem: $view.find('table'), id: 'orderActivityTable', url: ctx + 'admin/happyActivity/activityOrderList', toolbar:"#orderActivityToolbar", defaultToolbar:[], cols: [[ {type: 'numbers', title: '', width: 80}, {title: '操作', toolbar: '#orderActivityOption', minWidth: 200, align: 'center'}, {field: 'name', title: '名称', minWidth: 100,align:'center'}, {field: 'orderNo', title: '订单编号', minWidth: 100,align:'center'}, {field: 'activityName', title: '活动名称', minWidth: 100,align:'center'}, {field: 'price', title: '单价', minWidth: 100,align:'center'}, {field: 'numCnt', title: '数量', minWidth: 100,align:'center'}, {field: 'amount', title: '总价', minWidth: 100,align:'center'}, {title: '订单状态', templet: '#orderStateOption', minWidth: 100,align:'center'}, {title: '支付状态', templet: '#payStateOption', minWidth: 100,align:'center'}, {title: '支付方式', templet: '#payTypeOption', minWidth: 100,align:'center'}, {field: 'createdTime', title: '创建时间', minWidth: 150,align:'left'} ]] }); } // 查询按钮 $query.on('click', function () { var params = $.extend(getQueryParams(), {field: sortObject.field, order: sortObject.type}); tableIns.reload({where: params, page: {curr: 1}}); }); // 刷新按钮 $reset.on('click', function () { $searchForm[0].reset(); sortObject.type = 'null'; tableIns.reload({where: getQueryParams(), page: {curr: 1}, initSort: sortObject}); }); // 获取查询参数 function getQueryParams() { return { name: $searchForm.find('input[name="name"]').val().trim(), state: $searchForm.find("select[name='state']").val(), activityId: $searchForm.find("select[name='activityId']").val(), }; } }) </script>