ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEvent.java
@@ -115,7 +115,7 @@ * 创建用户id */ @TableField("create_user_id") private Integer createUserId; private Long createUserId; /** * 创建时间 */ ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MGtOneClinkSyncingShopPageDTO.java
New file @@ -0,0 +1,16 @@ package com.ruoyi.system.api.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class MGtOneClinkSyncingShopPageDTO extends MgtPageDto { @ApiModelProperty("一键同步id") private Integer syncingId; @ApiModelProperty(value = "选择门店ids",hidden = true) private List<Long> shopIds; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/config/OneClinkSyncing.java
New file @@ -0,0 +1,123 @@ package com.ruoyi.system.api.domain.poji.config; import com.baomidou.mybatisplus.activerecord.Model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableField; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import lombok.EqualsAndHashCode; import lombok.experimental.Accessors; import java.io.Serializable; import java.util.Date; import java.util.List; /** * <p> * 一键同步表 * </p> * * @author hlg * @since 2025/6/16 */ @Data @EqualsAndHashCode(callSuper = false) @Accessors(chain = true) @TableName("t_one_clink_syncing") public class OneClinkSyncing extends Model<OneClinkSyncing> { private static final long serialVersionUID = 1L; /** * syncing id */ @TableId(value = "syncing_id", type = IdType.AUTO) private Integer syncingId; /** * 删除标记 */ @TableField("del_flag") private Integer delFlag; /** * 同步名称(标题) */ @TableField("syncing_name") private String syncingName; /** * 封面图片 */ @TableField("cover_url") private String coverUrl; /** * 详情图,多个逗号分隔 */ @TableField("details_picture") private String detailsPicture; /** * 领券1开2关 */ @TableField("platform_coupon_flag") private Integer platformCouponFlag; /** * 生日卡1开2关 */ @TableField("platform_birthday_flag") private Integer platformBirthdayFlag; /** * 店铺详情 */ @TableField("shop_detail") private String shopDetail; /** * 同步门店数 */ @TableField("shop_num") private Integer shopNum = 0; @TableField("create_time") private Date createTime; @TableField("create_user_id") private Long createUserId; @TableField("update_time") private Date updateTime; @TableField("update_user_id") private Long updateUserId; /** * 最近一次同步时间 */ @TableField("syncing_time") private Date syncingTime; /** * 最近一次同步操作人 */ @TableField("syncing_user_id") private Long syncingUserId; /** * 选择的门店ids,多个以逗号隔开 */ @TableField("shop_ids") private String shopIds; private List<Long> shopIdList; private Long userId; @Override protected Serializable pkVal() { return this.syncingId; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MgtOneClinkSyncingShopPageVo.java
New file @@ -0,0 +1,49 @@ package com.ruoyi.system.api.domain.vo; import com.ruoyi.common.core.annotation.Excel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; /** * @author jqs34 * @ClassName MgtShopPageVo * @description: TODO * @date 2023年04月21日 * @version: 1.0 */ @Data public class MgtOneClinkSyncingShopPageVo { @ApiModelProperty(value = "商户id") private Long shopId; @ApiModelProperty(value="商户编号") private String shopNumber; @ApiModelProperty(value="店铺名称") private String shopName; @ApiModelProperty(value="店铺标签") private String shopTags; @ApiModelProperty(value="来源渠道") private String shopSource; @ApiModelProperty(value="所属经销商") private String belongShopName; @ApiModelProperty(value="签约区域") private String signAreaName; @ApiModelProperty(value="合作期限") private String cooperationTime; @ApiModelProperty(value="店铺地址") private String shopAddress; @ApiModelProperty(value="店长") private String shopownerName; @ApiModelProperty(value="店长联系方式") private String shopownerPhone; @ApiModelProperty(value="店铺状态") private String shopCustomStatus; @ApiModelProperty(value="店铺活动次数") private Integer shopActivityCount; @ApiModelProperty(value="冻结状态0解冻1冻结") private Integer frozenFlag; } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java
@@ -1,7 +1,9 @@ package com.ruoyi.system.api.factory; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.api.domain.vo.ShopProportionVo; import com.ruoyi.system.api.domain.vo.*; import com.ruoyi.system.api.model.QwH5LoginVo; @@ -162,6 +164,21 @@ public List<Shop> getFranchiseeIdsBYDealerId(Long shopId) { return Collections.emptyList(); } @Override public Page<MgtOneClinkSyncingShopPageVo> getMgtShopPageVoByShopIds(MGtOneClinkSyncingShopPageDTO dto) { return null; } @Override public List<Shop> getShopListByShopName(String content) { return null; } @Override public R updateShopByOneClinkSyncing(OneClinkSyncing oneClinkSyncing) { return R.fail("一键同步商户信息失败:"+throwable.getMessage()); } }; } } ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java
@@ -1,8 +1,10 @@ package com.ruoyi.system.api.service; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.constant.ServiceNameConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.ShopProportionVo; import com.ruoyi.system.api.domain.vo.*; @@ -216,4 +218,28 @@ */ @PostMapping("/shop/getFranchiseeIdsBYDealerId") List<Shop> getFranchiseeIdsBYDealerId(@RequestBody Long shopId); /** * 根据shopIds分页查看 * @param dto * @return */ @PostMapping("/shop/getMgtShopPageVoByShopIds") Page<MgtOneClinkSyncingShopPageVo> getMgtShopPageVoByShopIds(@RequestBody MGtOneClinkSyncingShopPageDTO dto); /** * 根据shopName模糊查询门店集合 * @param content * @return */ @PostMapping("/shop/getShopListByShopName") List<Shop> getShopListByShopName(@RequestBody String content); /** * 一键同步 * @param oneClinkSyncing * @return */ @PostMapping("/shop/updateShopByOneClinkSyncing") R updateShopByOneClinkSyncing(@RequestBody OneClinkSyncing oneClinkSyncing); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java
@@ -134,7 +134,7 @@ } @RequestMapping(value = "/pageShopMgtGoods", method = RequestMethod.POST) @ApiOperation(value = "分页获取门店内商品信息",tags = "管理台商户相关接口") @ApiOperation(value = "商品信息-分页获取门店内商品信息【2.0】",tags = "管理台商户相关接口") public R<Page<PageShopMgtGoodsVO>> pageShopMgtGoods(@RequestBody PageShopMgtGoodsDTO pageShopMgtGoodsDTO) { Page<PageShopMgtGoodsVO> page = new Page<>(); page.setSize(pageShopMgtGoodsDTO.getPageSize()); @@ -144,5 +144,11 @@ return R.ok(page.setRecords(pageShopMgtGoods)); } //修改价格 转为经销商 @RequestMapping(value = "/updateGoodsPrice", method = RequestMethod.POST) @ApiOperation(value = "商品信息-修改价格【2.0】",tags = "管理台商户相关接口") public R<Void> updateGoodsPrice(@RequestBody UpdateGoodsPriceDTO updateGoodsPriceDTO) { return goodsService.updateGoodsPrice(updateGoodsPriceDTO); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLotteryEventController.java
New file @@ -0,0 +1,106 @@ package com.ruoyi.goods.controller.management; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.goods.api.domain.LotteryEvent; import com.ruoyi.goods.domain.dto.*; import com.ruoyi.goods.domain.vo.*; import com.ruoyi.goods.service.lottery.ILotteryEventService; import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsAnswersService; import com.ruoyi.goods.service.lottery.IUserLotteryEventService; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.validation.Valid; import java.util.Collections; import java.util.List; /** * @author hlg * @Date 2025/6/16 */ @RestController @Api(value = "管理后台抽奖相关接口", tags = "管理后台抽奖相关接口", description = "管理后台抽奖相关接口") @RequestMapping("/mgt/lotteryEvent") public class MgtLotteryEventController { @Resource private ILotteryEventService lotteryEventService; @Resource private IUserLotteryEventService userLotteryEventService; @Resource private IUserLotteryEventQuestionsAnswersService userLotteryEventQuestionsAnswersService; @RequestMapping(value = "/editLotteryEvent", method = RequestMethod.POST) @Log(title = "抽奖管理", businessType = BusinessType.UPDATE,operContent = "编辑抽奖活动") @ApiOperation(value = "平台添加/修改抽奖活动【2.0】") public R<ShopLotteryDrawVo> editLotteryEvent(@Valid @RequestBody MgtLotteryEventEditDTO dto) { return lotteryEventService.editLotteryEvent(dto); } @RequestMapping(value = "/pageMgtLotteryEvent", method = RequestMethod.POST) @ApiOperation(value = "分页获取抽奖列表【2.0】") public R<Page<MgtLotteryEventPageVo>> pageMgtLotteryEvent(@RequestBody MgtLotteryEventPageDto dto) { Page<MgtLotteryEventPageVo> page = new Page<>(); page.setSize(dto.getPageSize()); page.setCurrent(dto.getPageNum()); page.setOptimizeCountSql(false); List<MgtLotteryEventPageVo> mgtGoodsPageVoList = lotteryEventService.pageMgtLotteryEvent(page,dto); return R.ok(page.setRecords(mgtGoodsPageVoList)); } @RequestMapping(value = "/getLotteryEventDetailById/{id}", method = RequestMethod.POST) @ApiOperation(value = "查看抽奖活动详情【2.0】") public R<MgtLotteryEventDetailVO> getLotteryEventDetailById(@PathVariable("id") String id) { return lotteryEventService.getLotteryEventDetailById(id); } //查看-参与人信息 @RequestMapping(value = "/getLotteryEventJoinUserPageById/{id}", method = RequestMethod.POST) @ApiOperation(value = "查看抽奖活动-参与人信息【2.0】") public R<Page<ShopWinningRecordVo>> getLotteryEventJoinUserPageById(@RequestBody MgtLotteryEventJoinUserPageDTO dto) { Page<ShopWinningRecordVo> page = new Page<>(); page.setSize(dto.getPageSize()); page.setCurrent(dto.getPageNum()); List<ShopWinningRecordVo> shopWinningRecordVoList = userLotteryEventService.getShopWinningRecord(page, dto.getId()); return R.ok(page.setRecords(shopWinningRecordVoList)); } //查看-答题情况 @RequestMapping(value = "/getUserAnswersPage", method = RequestMethod.POST) @ApiOperation(value = "查看抽奖活动-答题情况【2.0】") public R<Page<MgtUserAnswersPageVO>> getUserAnswersPage(@RequestBody MgtUserAnswersPageDTO dto) { //检查是否答题类型 LotteryEvent lotteryEvent = lotteryEventService.getById(dto.getLotteryEventId()); if (null == lotteryEvent || lotteryEvent.getDelFlag()!=0 ){ return R.fail("该抽奖活动不存在"); } if ( lotteryEvent.getActivityType()!=5){ return R.fail("请选择答题抽奖类型的活动"); } Page<MgtUserAnswersPageVO> page = new Page<>(); page.setSize(dto.getPageSize()); page.setCurrent(dto.getPageNum()); List<MgtUserAnswersPageVO> shopWinningRecordVoList = userLotteryEventQuestionsAnswersService.getUserAnswersPage(page, dto.getLotteryEventId(),dto.getUserId()); return R.ok(page.setRecords(shopWinningRecordVoList)); } //删除 @RequestMapping(value = "/deleteMgtLotteryEvent/{id}", method = RequestMethod.POST) @Log(title = "抽奖管理", businessType = BusinessType.DELETE,operContent = "删除抽奖活动") @ApiOperation(value = "删除抽奖活动【2.0】") public R deleteMgtLotteryEvent(@PathVariable("id") String id) { return lotteryEventService.deleteMgtLotteryEvent(id); } //立即结束 @RequestMapping(value = "/endImmediatelyLotteryEvent/{id}", method = RequestMethod.POST) @Log(title = "抽奖管理", businessType = BusinessType.UPDATE,operContent = "立即结束") @ApiOperation(value = "立即结束【2.0】") public R endImmediatelyLotteryEvent(@PathVariable("id") String id) { return lotteryEventService.endImmediatelyLotteryEvent(id); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventEditDTO.java
New file @@ -0,0 +1,129 @@ package com.ruoyi.goods.domain.dto; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.system.api.domain.dto.MgtBaseDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import javax.validation.Valid; import javax.validation.constraints.*; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Data public class MgtLotteryEventEditDTO extends MgtBaseDto { @ApiModelProperty("活动id,不传为新增") private String id; @ApiModelProperty("抽奖名称") @NotEmpty(message = "抽奖名称不能为空") private String name; @ApiModelProperty("活动简介名称") @NotEmpty(message = "活动简介不能为空") private String activityProfile; @ApiModelProperty("开启方式(1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖)") @Min(value = 1,message = "开启方式选值错误") @Max(value = 5,message = "开启方式选值错误") @NotNull(message = "开启方式不能为空") private Integer activityType; @ApiModelProperty("可抽奖次数") @NotNull(message = "可抽奖次数不能为空") private Integer times; @ApiModelProperty("活动开始时间") @NotEmpty(message = "活动开始时间不能为空") private LocalDateTime startTime; @ApiModelProperty("活动结束时间") @NotEmpty(message = "活动结束时间不能为空") private LocalDateTime endTime; /** * 下单类型所需 */ @ApiModelProperty("下单支付金额") private BigDecimal payMoney; /** * 分享类型所需 */ @ApiModelProperty("分享抽奖间隔天数") private Integer intervalTime; /** * 答题类型所需 */ @ApiModelProperty("答题时间限制(分钟)") private Integer answeringTime; @ApiModelProperty("答题抽奖正确率%") private BigDecimal accuracy; @ApiModelProperty("抽奖题目设置") private List<MgtLotteryEventQuestionDTO> mgtLotteryQuestionDTOList; @ApiModelProperty("封面图") @NotEmpty(message = "封面图不能为空") private String coverImage; @ApiModelProperty("详情介绍") @NotEmpty(message = "详情介绍不能为空") private String activityContent; @ApiModelProperty("抽奖奖品设置") @NotEmpty(message = "抽奖奖品不能为空") @Valid private List<MgtLotteryEventPrizeDTO> mgtLotteryEventPrizeDTOList; /** * 即线下抽奖方式不能新增 */ @AssertTrue(message = "当开启方式为线下抽奖时,活动id不能为空") public boolean isIdValid() { return activityType != 6 || id != null; } /** * activityType=2时 payMoney不能为空 */ @AssertTrue(message = "当开启方式为下单时,下单支付金额不能为空") public boolean isPayMoneyValid() { return activityType != 2 || payMoney != null; } /** * activityType=3时 intervalTime不能为空 */ @AssertTrue(message = "当开启方式为下单时,分享抽奖间隔天数不能为空") public boolean isIntervalTimeValid() { return activityType != 3 || intervalTime != null; } /** * activityType=5时 answeringTime不能为空 */ @AssertTrue(message = "当活动类型为答题抽奖时,答题时间限制不能为空") public boolean isAnsweringTimeValid() { return activityType != 5 || answeringTime != null; } /** * activityType=5时 accuracy不能为空 */ @AssertTrue(message = "当活动类型为答题抽奖时,抽奖要求的正确率不能为空") public boolean isAccuracyValid() { return activityType != 5 || accuracy != null; } /** * activityType=5时 mgtLotteryQuestionDTOList不能为空 */ @AssertTrue(message = "当活动类型为答题抽奖时,问题列表不能为空") public boolean isQuestionListValid() { return activityType != 5 || (mgtLotteryQuestionDTOList != null && !mgtLotteryQuestionDTOList.isEmpty()); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventJoinUserPageDTO.java
New file @@ -0,0 +1,11 @@ package com.ruoyi.goods.domain.dto; import com.ruoyi.system.api.domain.dto.MgtPageDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class MgtLotteryEventJoinUserPageDTO extends MgtPageDto { @ApiModelProperty("活动id") private String id; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventPageDto.java
New file @@ -0,0 +1,31 @@ package com.ruoyi.goods.domain.dto; import com.ruoyi.system.api.domain.dto.MgtPageDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class MgtLotteryEventPageDto extends MgtPageDto { @ApiModelProperty("抽奖名称") private String name; @ApiModelProperty("抽奖方式(0-全部 1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖,6=线下抽奖)") private Integer activityType; @ApiModelProperty("抽奖状态:0-全部 1-未开始,2-进行中,已结束") private Integer status; @ApiModelProperty("创建对象") private String createObject; @ApiModelProperty(value = "门店ids",hidden = true) private List<Long> shopIds; @ApiModelProperty(value = "平台创建标志 0-未包含平台创建 1-包含",hidden = true) private Integer flag=1; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventPrizeDTO.java
New file @@ -0,0 +1,20 @@ package com.ruoyi.goods.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class MgtLotteryEventPrizeDTO { @ApiModelProperty("奖品类型(1=优惠券,2=平台商品,3=线下商品,4=积分)") private Integer prizeType; @ApiModelProperty("奖品id") private String objectId; @ApiModelProperty("奖品名称") private String objectName; @ApiModelProperty("奖品数量") private Integer number; @ApiModelProperty("中奖率%") private BigDecimal winRate; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventQuestionAnswersDTO.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.domain.dto; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class MgtLotteryEventQuestionAnswersDTO { /** * 选项 */ @ApiModelProperty("选项") private String answer; /** * 是否是正确答案(0=否,1=是) */ @TableField(value = "is_right") private Integer isRight; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventQuestionDTO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.goods.domain.dto; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class MgtLotteryEventQuestionDTO { /** * 题干名称 */ @ApiModelProperty("题干名称") private String name; /** * 排序 */ @ApiModelProperty("排序") private Integer sort; @ApiModelProperty("题干选项集合") private List<MgtLotteryEventQuestionAnswersDTO> answersDTOList; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtUserAnswersPageDTO.java
New file @@ -0,0 +1,15 @@ package com.ruoyi.goods.domain.dto; import com.baomidou.mybatisplus.annotation.TableField; import com.ruoyi.system.api.domain.dto.MgtPageDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class MgtUserAnswersPageDTO extends MgtPageDto { @ApiModelProperty("用户id") private Long userId; @ApiModelProperty(value = "抽奖活动id") private String lotteryEventId; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/UpdateGoodsPriceDTO.java
New file @@ -0,0 +1,19 @@ package com.ruoyi.goods.domain.dto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; @Data public class UpdateGoodsPriceDTO { @ApiModelProperty(value = "当前门店id") private Long shopId; @ApiModelProperty(value = "商品id") private Long goodsId; @ApiModelProperty(value = "商品绑定门店id") private Long bindShopId; @ApiModelProperty("修改价格") private BigDecimal goodsPrice; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventDetailVO.java
New file @@ -0,0 +1,65 @@ package com.ruoyi.goods.domain.vo; import com.ruoyi.goods.api.domain.LotteryEventPrize; import com.ruoyi.goods.domain.dto.MgtLotteryEventPrizeDTO; import com.ruoyi.goods.domain.dto.MgtLotteryEventQuestionDTO; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.math.BigDecimal; import java.time.LocalDateTime; import java.util.List; @Data public class MgtLotteryEventDetailVO { @ApiModelProperty("活动id") private String id; @ApiModelProperty("门店id") private Integer shopId; @ApiModelProperty("门店id") private String shopName; @ApiModelProperty("抽奖名称") private String name; @ApiModelProperty("活动简介名称") private String activityProfile; @ApiModelProperty("开启方式(1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖,6=线下抽奖)") private Integer activityType; @ApiModelProperty("可抽奖次数") private Integer times; @ApiModelProperty("活动开始时间") private LocalDateTime startTime; @ApiModelProperty("活动结束时间") private LocalDateTime endTime; /** * 下单类型所需 */ @ApiModelProperty("下单支付金额") private BigDecimal payMoney; /** * 分享类型所需 */ @ApiModelProperty("分享抽奖间隔天数") private Integer intervalTime; /** * 答题类型所需 */ @ApiModelProperty("答题时间限制(分钟)") private Integer answeringTime; @ApiModelProperty("答题抽奖正确率%") private BigDecimal accuracy; @ApiModelProperty("抽奖题目设置") private List<MgtLotteryEventQuestionVO> mgtLotteryQuestionVOList; @ApiModelProperty("封面图") private String coverImage; @ApiModelProperty("详情介绍") private String activityContent; @ApiModelProperty("抽奖奖品设置") private List<LotteryEventPrize> lotteryEventPrizeList; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventJoinUserPageVO.java
New file @@ -0,0 +1,24 @@ package com.ruoyi.goods.domain.vo; import com.baomidou.mybatisplus.annotations.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data public class MgtLotteryEventJoinUserPageVO { @ApiModelProperty(value = "用户昵称") private String nickName; @ApiModelProperty(value = "手机号") private String mobile; @ApiModelProperty(value = "参与时间") private LocalDateTime createTime; @ApiModelProperty(value = "奖品名称,多个以,隔开") private String objectName; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventPageVo.java
New file @@ -0,0 +1,40 @@ package com.ruoyi.goods.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.time.LocalDateTime; @Data public class MgtLotteryEventPageVo { @ApiModelProperty("活动id") private String id; @ApiModelProperty(value = "门店id",hidden = true) private Integer shopId; @ApiModelProperty("抽奖名称") private String name; @ApiModelProperty("抽奖方式(1=新注册用户,2=下单,3=分享小程序,4=普通抽奖,5=答题抽奖,6=线下抽奖)") private Integer activityType; @ApiModelProperty("抽奖时间") private String activityTime; @ApiModelProperty("创建时间") @JsonFormat(pattern = "yyyy-MM-dd HH:mm") private LocalDateTime createTime; @ApiModelProperty("创建对象") private String createObject; @ApiModelProperty("抽奖状态:1-未开始,2-进行中,已结束") private Integer status; @ApiModelProperty("立即结束标志位:0-无,1-有") private Integer flag; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventQuestionVO.java
New file @@ -0,0 +1,30 @@ package com.ruoyi.goods.domain.vo; import com.ruoyi.goods.api.domain.LotteryEventQuestionsAnswers; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class MgtLotteryEventQuestionVO { @ApiModelProperty("题干id") private String id; @ApiModelProperty(value = "抽奖活动id") private String lotteryEventId; /** * 题干名称 */ @ApiModelProperty("题干名称") private String name; /** * 排序 */ @ApiModelProperty("排序") private Integer sort; @ApiModelProperty("题干选项集合") private List<LotteryEventQuestionsAnswers> answersVOList; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtUserAnswersPageVO.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.goods.domain.vo; import com.baomidou.mybatisplus.annotation.TableField; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class MgtUserAnswersPageVO { @ApiModelProperty("排序") private Integer sort; @ApiModelProperty(value = "题干名称") private String name; @ApiModelProperty("选项") private String answer;//会有多个选项,用分号隔开 @ApiModelProperty(value = "正确答案选项") private String rightAnswer; @ApiModelProperty(value = "用户选择答案") private String userAnswer; @ApiModelProperty(value = "是否正确(0-否,1-是)") private Integer isCorrect; } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/PageShopMgtGoodsVO.java
@@ -24,6 +24,9 @@ @ApiModelProperty(value = "商品id") private String goodsId; @ApiModelProperty(value = "商品绑定门店id") private String bindShopId; @Excel(name = "商品名称", width = 30, sort = 3) @ApiModelProperty(value = "商品名称") private String goodsName; ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventMapper.java
@@ -3,7 +3,9 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.goods.api.domain.LotteryEvent; import com.ruoyi.goods.domain.dto.MgtLotteryEventPageDto; import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; import com.ruoyi.goods.domain.vo.MgtLotteryEventPageVo; import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; import org.apache.ibatis.annotations.Param; @@ -34,4 +36,6 @@ * @return */ List<ShopLotteryDrawListVo> getShopLotteryDrawList(Page<ShopLotteryDrawListVo> page, @Param("shopId") Long shopId); List<MgtLotteryEventPageVo> pageMgtLotteryEvent(Page<MgtLotteryEventPageVo> page, @Param("dto") MgtLotteryEventPageDto dto); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventMapper.java
@@ -3,6 +3,7 @@ import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.goods.api.domain.UserLotteryEvent; import com.ruoyi.goods.domain.vo.MgtLotteryEventJoinUserPageVO; import com.ruoyi.goods.domain.vo.ShopWinningRecordVo; import org.apache.ibatis.annotations.Param; ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.java
@@ -1,11 +1,17 @@ package com.ruoyi.goods.mapper.lottery; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.goods.api.domain.UserLotteryEventQuestionsAnswers; import com.ruoyi.goods.domain.vo.MgtUserAnswersPageVO; import org.apache.ibatis.annotations.Param; import java.util.List; /** * @author zhibing.pu * @Date 2025/5/19 16:06 */ public interface UserLotteryEventQuestionsAnswersMapper extends BaseMapper<UserLotteryEventQuestionsAnswers> { List<MgtUserAnswersPageVO> getUserAnswersPage(Page<MgtUserAnswersPageVO> page, @Param("lotteryEventId") String lotteryEventId, @Param("userId") Long userId); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java
@@ -1,6 +1,7 @@ package com.ruoyi.goods.service.goods; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.goods.domain.dto.*; import com.ruoyi.goods.domain.vo.*; import com.ruoyi.system.api.domain.dto.AppActivityGoodsPageDto; @@ -220,4 +221,13 @@ * @return List<PageShopMgtGoodsVO> */ List<PageShopMgtGoodsVO> pageShopMgtGoods(Page<PageShopMgtGoodsVO> page, PageShopMgtGoodsDTO pageShopMgtGoodsDTO); /** * @description 修改商品价格 * @author huliguo * @date 2025/6/13 * @param updateGoodsPriceDTO * @return */ R<Void> updateGoodsPrice(UpdateGoodsPriceDTO updateGoodsPriceDTO); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java
@@ -9,6 +9,7 @@ import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.common.security.utils.CodeFactoryUtil; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.goods.domain.dto.*; import com.ruoyi.goods.domain.pojo.goods.GoodsTotal; import com.ruoyi.goods.domain.vo.*; @@ -32,6 +33,7 @@ import com.ruoyi.system.api.domain.poji.goods.GoodsFile; import com.ruoyi.system.api.domain.poji.goods.ShopGoods; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.domain.vo.MerGoodsPriceListVo; import com.ruoyi.system.api.domain.vo.MgtSelectGoodsPageVo; import com.ruoyi.system.api.domain.vo.ShopRelUserVo; @@ -42,6 +44,7 @@ import javax.annotation.Resource; import java.math.BigDecimal; import java.nio.charset.StandardCharsets; import java.time.LocalDateTime; import java.util.*; import java.util.stream.Collectors; @@ -706,7 +709,7 @@ public List<PageShopMgtGoodsVO> pageShopMgtGoods(Page<PageShopMgtGoodsVO> page,PageShopMgtGoodsDTO pageShopMgtGoodsDTO) { //1.查找门店 Shop shop = remoteShopService.getShop(pageShopMgtGoodsDTO.getShopId()).getData(); if (null == shop || shop.getDelFlag() != 0) { if (null == shop || shop.getDelFlag() != 0 || shop.getShopStatus() == -1) { return Collections.emptyList(); } List<Shop> shops = new ArrayList<>(); @@ -749,7 +752,7 @@ //5.门店信息 list.forEach(mgtGoodsPageVo -> { // 获取门店信息 Shop shopInfo = shopMap.get(Long.valueOf(mgtGoodsPageVo.getShopId())); Shop shopInfo = shopMap.get(Long.valueOf(mgtGoodsPageVo.getBindShopId())); // 如果门店信息不为空,则设置门店信息 if (shopInfo != null) { mgtGoodsPageVo.setShopName(shopInfo.getShopName()); @@ -763,4 +766,34 @@ return list; } @Override public R<Void> updateGoodsPrice(UpdateGoodsPriceDTO updateGoodsPriceDTO) { //判断当前登录人员类型 SysUser sysUser = SecurityUtils.getSysUser(); if ("01".equals(sysUser.getUserType())){ //B端 Shop shop = remoteShopService.getShop(updateGoodsPriceDTO.getShopId()).getData(); if (null == shop || shop.getDelFlag() != 0 || shop.getShopStatus() == -1) { return R.fail("该门店不存在"); } //判断是否经销商 是否开启价格修改权限 int modifyPricePermission = shop.getModifyPricePermission()==null?0:shop.getModifyPricePermission(); if (1 != shop.getShopType() || 1 != modifyPricePermission){ return R.fail("权限不足"); } }else if (!"00".equals(sysUser.getUserType())){ //也不是平台 return R.fail("用户类型错误"); } //修改门店内商品价格 ShopGoods shopGoods = shopGoodsService.getByShopIdAndGoodsId(updateGoodsPriceDTO.getBindShopId(), String.valueOf(updateGoodsPriceDTO.getGoodsId())); if (null == shopGoods || shopGoods.getDelFlag() != 0){ return R.fail("该门店不存在该商品"); } shopGoods.setUpdateUserId(sysUser.getUserId()); shopGoods.setSalesPrice(updateGoodsPriceDTO.getGoodsPrice()); shopGoodsService.updateById(shopGoods); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java
@@ -1,25 +1,19 @@ package com.ruoyi.goods.service.impl.lottery; import cn.hutool.core.bean.BeanUtil; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.core.utils.uuid.IdUtils; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.goods.api.domain.LotteryEvent; import com.ruoyi.goods.api.domain.LotteryEventPrize; import com.ruoyi.goods.api.domain.UserLotteryEvent; import com.ruoyi.goods.api.domain.UserLotteryEventQuestions; import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; import com.ruoyi.goods.domain.vo.LotteryEventVo; import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; import com.ruoyi.goods.domain.vo.UserLotteryEventVo; import com.ruoyi.goods.api.domain.*; import com.ruoyi.goods.domain.dto.*; import com.ruoyi.goods.domain.vo.*; import com.ruoyi.goods.mapper.lottery.LotteryEventMapper; import com.ruoyi.goods.service.lottery.ILotteryEventPrizeService; import com.ruoyi.goods.service.lottery.ILotteryEventService; import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsService; import com.ruoyi.goods.service.lottery.IUserLotteryEventService; import com.ruoyi.goods.service.lottery.*; import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.domain.poji.member.MemberGiftRecord; import com.ruoyi.system.api.domain.poji.shop.Shop; @@ -29,8 +23,10 @@ import org.redisson.api.RLock; import org.redisson.api.RedissonClient; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import javax.annotation.Resources; import java.text.SimpleDateFormat; import java.time.LocalDateTime; import java.util.*; @@ -64,7 +60,12 @@ @Resource private RemoteShopService remoteShopService; @Resource private ILotteryEventQuestionsAnswersService lotteryEventQuestionsAnswersService; @Resource private ILotteryEventQuestionsService lotteryEventQuestionsService; /** * 根据id查询抽奖活动信息 @@ -251,4 +252,231 @@ public List<ShopLotteryDrawListVo> getShopLotteryDrawList(Page<ShopLotteryDrawListVo> page, Long shopId) { return this.baseMapper.getShopLotteryDrawList(page, shopId); } @Override @Transactional public R<ShopLotteryDrawVo> editLotteryEvent(MgtLotteryEventEditDTO dto) { //先检查开始-结束时间范围内,系统中是否有该活动 List<LotteryEvent> lotteryEvents = this.baseMapper.selectList(new LambdaQueryWrapper<LotteryEvent>() .eq(LotteryEvent::getDelFlag, 0)//未删除的 .eq(LotteryEvent::getActivityType, dto.getActivityType())//类型相同的 .between(LotteryEvent::getStartTime, dto.getStartTime(), dto.getEndTime())//开始时间在这个活动的(开始-结束)范围内的 .or() .between(LotteryEvent::getEndTime, dto.getStartTime(), dto.getEndTime())//结束时间在这个活动的(开始-结束)范围内的 ); if (null != lotteryEvents && !lotteryEvents.isEmpty()) { // 新增记录时直接返回错误 if (dto.getId() == null) { return R.fail("新增抽奖活动与现有抽奖活动时间范围冲突"); } // 更新记录时,检查是否与其他记录(非自身)冲突 boolean hasConflict = lotteryEvents.stream() .anyMatch(event -> !event.getId().equals(dto.getId())); if (hasConflict) { return R.fail("编辑抽奖活动与现有其他活动时间范围冲突"); } } LotteryEvent lotteryEvent = new LotteryEvent(); if (null != dto.getId()) { //编辑 lotteryEvent=this.baseMapper.selectById(dto.getId()); if (null == lotteryEvent||lotteryEvent.getDelFlag() != 0) { return R.fail("该抽奖活动已被删除"); } if (!lotteryEvent.getActivityType().equals(dto.getActivityType())) { return R.fail("编辑抽奖活动不能修改开启方式"); } if(!lotteryEvent.getName().equals(dto.getName())) { return R.fail("编辑抽奖活动不能修改抽奖名称"); } //答题类型 if (lotteryEvent.getActivityType().equals(5)){ //将之前的题干数据、答案选项数据删除 //先删除答案选项数据 lotteryEventQuestionsAnswersService.remove(new LambdaQueryWrapper<LotteryEventQuestionsAnswers>() .eq(LotteryEventQuestionsAnswers::getLotteryEventId,lotteryEvent.getId())); //再删除题干数据 lotteryEventQuestionsService.remove(new LambdaQueryWrapper<LotteryEventQuestions>() .eq(LotteryEventQuestions::getLotteryEventId,lotteryEvent.getId())); } //奖品数据删除 lotteryEventPrizeService.remove(new LambdaQueryWrapper<LotteryEventPrize>() .eq(LotteryEventPrize::getLotteryEventId,lotteryEvent.getId())); } //新增 BeanUtils.copyProperties(dto, lotteryEvent); if (dto.getId() == null) { lotteryEvent.setCreateTime(LocalDateTime.now()); lotteryEvent.setCreateUserId(dto.getUserId()); }else { lotteryEvent.setUpdateTime(LocalDateTime.now()); lotteryEvent.setUpdateUserId(dto.getUserId()); } //保存抽奖活动 this.saveOrUpdate(lotteryEvent); // 保存奖品数据 LotteryEvent finalLotteryEvent = lotteryEvent;//jdk8及之后 变量在初始化后确实没有被重新赋值,可直接引用,无需显式声明为 final List<LotteryEventPrize> prizeList = dto.getMgtLotteryEventPrizeDTOList().stream() .map(prizeDTO -> { LotteryEventPrize prize = new LotteryEventPrize(); prize.setLotteryEventId(finalLotteryEvent.getId()); prize.setPrizeType(prizeDTO.getPrizeType()); if (null != prizeDTO.getObjectId()){ prize.setObjectId(prizeDTO.getObjectId()); } prize.setObjectName(prizeDTO.getObjectName()); prize.setNumber(prizeDTO.getNumber()); prize.setWinRate(prizeDTO.getWinRate()); return prize; }) .collect(Collectors.toList()); lotteryEventPrizeService.saveBatch(prizeList); if (dto.getActivityType().equals(5)) { //保存题干数据 for (MgtLotteryEventQuestionDTO questionDTO : dto.getMgtLotteryQuestionDTOList()) { LotteryEventQuestions question = new LotteryEventQuestions(); question.setLotteryEventId(finalLotteryEvent.getId()); question.setName(questionDTO.getName()); question.setSort(questionDTO.getSort()); lotteryEventQuestionsService.save(question); //保存答案选项数据 List<LotteryEventQuestionsAnswers> answersList = questionDTO.getAnswersDTOList().stream() .map(answersDTO -> { LotteryEventQuestionsAnswers answer = new LotteryEventQuestionsAnswers(); answer.setLotteryEventId(finalLotteryEvent.getId()); answer.setLotteryEventQuestionsId(question.getId()); answer.setAnswer(answersDTO.getAnswer()); answer.setIsRight(answersDTO.getIsRight()); return answer; }).collect(Collectors.toList()); lotteryEventQuestionsAnswersService.saveBatch(answersList); } } return R.ok(); } @Override public List<MgtLotteryEventPageVo> pageMgtLotteryEvent(Page<MgtLotteryEventPageVo> page, MgtLotteryEventPageDto dto) { Map<Long,Shop> map; if (dto.getCreateObject()!=null){ //根据 条件-创建对象 模糊查找门店集合 List<Shop> shopList=remoteShopService.getShopListByShopName(dto.getCreateObject()); if (null != shopList && !shopList.isEmpty()) { List<Long> shopIds = shopList.stream().map(Shop::getShopId).collect(Collectors.toList()); dto.setShopIds(shopIds); //转为map 方便后续取商户名称 map = shopList.stream().collect(Collectors.toMap(Shop::getShopId, shop -> shop)); } else { map = new HashMap<>(); } //判断“平台创建”是否包含了 条件-创建对象 if (!"平台创建".contains(dto.getCreateObject())){ dto.setFlag(0);//未包含,只查找门店ids } } else { map = new HashMap<>(); } //获取分页信息 List<MgtLotteryEventPageVo> voList = this.baseMapper.pageMgtLotteryEvent(page, dto); //填充创建对象 voList.forEach(x->{ if (x.getActivityType()!=6){ x.setCreateObject("平台创建"); }else { //线下抽奖,获取门店名称 x.setCreateObject(map.get(Long.valueOf(x.getShopId())).getShopName()); } }); return voList; } @Override public R<MgtLotteryEventDetailVO> getLotteryEventDetailById(String id) { LotteryEvent lotteryEvent = this.getById(id); if (null == lotteryEvent) { return R.fail("该抽奖活动不存在"); } MgtLotteryEventDetailVO vo = new MgtLotteryEventDetailVO(); BeanUtils.copyProperties(lotteryEvent, vo); if (lotteryEvent.getActivityType()==6){ //线下抽奖 取商户名称 Shop data = remoteShopService.getShop(Long.valueOf(lotteryEvent.getShopId())).getData(); if (null != data){ vo.setShopName(data.getShopName()); } //题干数据 List<LotteryEventQuestions> questionsList = lotteryEventQuestionsService.getBaseMapper().selectList(new LambdaQueryWrapper<LotteryEventQuestions>().eq(LotteryEventQuestions::getLotteryEventId, lotteryEvent.getId())); List<MgtLotteryEventQuestionVO> questionsVOList = questionsList.stream().map(question -> { MgtLotteryEventQuestionVO questionVO = new MgtLotteryEventQuestionVO(); BeanUtils.copyProperties(question, questionVO); //答案选项数据 List<LotteryEventQuestionsAnswers> answersList = lotteryEventQuestionsAnswersService.getBaseMapper().selectList(new LambdaQueryWrapper<LotteryEventQuestionsAnswers>() .eq(LotteryEventQuestionsAnswers::getLotteryEventId, lotteryEvent.getId()) .eq(LotteryEventQuestionsAnswers::getLotteryEventQuestionsId, questionVO.getLotteryEventId())); questionVO.setAnswersVOList(answersList); return questionVO; }).collect(Collectors.toList()); //题干数据排序 // 自定义 Comparator 实现 Comparator<LotteryEventQuestions> sortComparator = new Comparator<LotteryEventQuestions>() { @Override public int compare(LotteryEventQuestions q1, LotteryEventQuestions q2) { return Integer.compare(q1.getSort(), q2.getSort()); } }; // 应用排序 Collections.sort(questionsList, sortComparator); vo.setMgtLotteryQuestionVOList(questionsVOList); } //奖项信息 List<LotteryEventPrize> prizeList = lotteryEventPrizeService.getBaseMapper().selectList(new LambdaQueryWrapper<LotteryEventPrize>() .eq(LotteryEventPrize::getLotteryEventId, lotteryEvent.getId())); vo.setLotteryEventPrizeList(prizeList); return R.ok(vo); } @Override public R deleteMgtLotteryEvent(String id) { LotteryEvent lotteryEvent = this.getById(id); if (null == lotteryEvent || lotteryEvent.getDelFlag()!=0) { return R.ok(); } //1.奖品数据删除 lotteryEventPrizeService.remove(new LambdaQueryWrapper<LotteryEventPrize>() .eq(LotteryEventPrize::getLotteryEventId,lotteryEvent.getId())); //2.答题类型 if (lotteryEvent.getActivityType().equals(5)){ //先删除答案选项数据 lotteryEventQuestionsAnswersService.remove(new LambdaQueryWrapper<LotteryEventQuestionsAnswers>() .eq(LotteryEventQuestionsAnswers::getLotteryEventId,lotteryEvent.getId())); //再删除题干数据 lotteryEventQuestionsService.remove(new LambdaQueryWrapper<LotteryEventQuestions>() .eq(LotteryEventQuestions::getLotteryEventId,lotteryEvent.getId())); } //3.抽奖活动删除 lotteryEvent.setDelFlag(1); this.updateById(lotteryEvent); return R.ok(); } @Override public R endImmediatelyLotteryEvent(String id) { LotteryEvent lotteryEvent = this.getById(id); if (null == lotteryEvent || lotteryEvent.getDelFlag()!=0) { return R.fail("该抽奖活动不存在"); } LocalDateTime now = LocalDateTime.now(); if (!now.isBefore(lotteryEvent.getStartTime()) && !now.isAfter(lotteryEvent.getEndTime())) { return R.fail("该抽奖活动不在活动时间范围内"); } lotteryEvent.setEndTime(now);//将结束时间设置为当前时间 lotteryEvent.setUpdateUserId(SecurityUtils.getUserId()); lotteryEvent.setUpdateTime(now); this.updateById(lotteryEvent); return R.ok(); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsAnswersServiceImpl.java
@@ -1,17 +1,22 @@ package com.ruoyi.goods.service.impl.lottery; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.goods.api.domain.LotteryEvent; import com.ruoyi.goods.api.domain.LotteryEventQuestionsAnswers; import com.ruoyi.goods.api.domain.UserLotteryEventQuestionsAnswers; import com.ruoyi.goods.domain.vo.MgtUserAnswersPageVO; import com.ruoyi.goods.mapper.lottery.UserLotteryEventQuestionsAnswersMapper; import com.ruoyi.goods.service.lottery.ILotteryEventQuestionsAnswersService; import com.ruoyi.goods.service.lottery.ILotteryEventService; import com.ruoyi.goods.service.lottery.IUserLotteryEventQuestionsAnswersService; import org.springframework.stereotype.Service; import javax.annotation.Resource; import java.math.BigDecimal; import java.util.Collections; import java.util.List; /** @@ -44,5 +49,11 @@ return BigDecimal.ZERO; } @Override public List<MgtUserAnswersPageVO> getUserAnswersPage(Page<MgtUserAnswersPageVO> page, String lotteryEventId, Long userId) { //获取分页信息 return this.getBaseMapper().getUserAnswersPage(page,lotteryEventId,userId); } } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventService.java
@@ -4,9 +4,10 @@ import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.R; import com.ruoyi.goods.api.domain.LotteryEvent; import com.ruoyi.goods.domain.vo.AppLotteryEventPageVo; import com.ruoyi.goods.domain.vo.LotteryEventVo; import com.ruoyi.goods.domain.vo.ShopLotteryDrawListVo; import com.ruoyi.goods.domain.dto.MgtLotteryEventEditDTO; import com.ruoyi.goods.domain.dto.MgtLotteryEventJoinUserPageDTO; import com.ruoyi.goods.domain.dto.MgtLotteryEventPageDto; import com.ruoyi.goods.domain.vo.*; import java.util.List; @@ -52,4 +53,40 @@ * @return */ List<ShopLotteryDrawListVo> getShopLotteryDrawList(Page<ShopLotteryDrawListVo> page, Long shopId); /** * 平台添加抽奖活动 * @param dto * @return */ R<ShopLotteryDrawVo> editLotteryEvent(MgtLotteryEventEditDTO dto); /** * 分页查询抽奖活动 * @param page * @param dto * @return */ List<MgtLotteryEventPageVo> pageMgtLotteryEvent(Page<MgtLotteryEventPageVo> page, MgtLotteryEventPageDto dto); /** * 查看抽奖活动详情 * @param id * @return */ R<MgtLotteryEventDetailVO> getLotteryEventDetailById(String id); /** * 删除抽奖活动 * @param id * @return */ R deleteMgtLotteryEvent(String id); /** * 立即结束抽奖活动 * @param id * @return */ R endImmediatelyLotteryEvent(String id); } ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsAnswersService.java
@@ -1,9 +1,12 @@ package com.ruoyi.goods.service.lottery; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.goods.api.domain.UserLotteryEventQuestionsAnswers; import com.ruoyi.goods.domain.vo.MgtUserAnswersPageVO; import java.math.BigDecimal; import java.util.List; /** * @author zhibing.pu @@ -19,4 +22,6 @@ * @return */ BigDecimal getCorrectAnswerRate(Long userId, String lotteryEventId); List<MgtUserAnswersPageVO> getUserAnswersPage(Page<MgtUserAnswersPageVO> page, String lotteryEventId, Long userId); } ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml
@@ -540,7 +540,7 @@ ELSE "下架中" END goodsStatus, tg.create_time, tsg.shop_id, tsg.shop_id bindShopId, tsg.sales_price shopPrice from t_goods tg LEFT JOIN t_goods_file tgf ON tg.goods_id = tgf.goods_id AND tgf.del_flag = 0 AND tgf.file_type = 1 ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventMapper.xml
@@ -40,4 +40,72 @@ where shop_id = #{shopId} order by create_time desc </select> <select id="pageMgtLotteryEvent" resultType="com.ruoyi.goods.domain.vo.MgtLotteryEventPageVo"> SELECT id, shop_id, name, activity_type, CONCAT(start_time,'-',end_time) activityTime, create_time, CASE WHEN NOW() < start_time THEN 1 -- 未开始 WHEN NOW() BETWEEN start_time AND end_time THEN 2 -- 进行中 ELSE 3 -- 已结束 END AS `status`, CASE WHEN NOW() BETWEEN start_time AND end_time THEN 1 ELSE 0 END AS flag FROM t_lottery_event where del_flag =0 <choose> <when test="dto.status != null and dto.status == 0"> -- 0-全部状态,不添加额外条件 </when> <when test="dto.status != null and dto.status == 1"> AND start_time > NOW() -- 1-未开始 </when> <when test="dto.status != null and dto.status == 2"> AND start_time <= NOW() AND end_time >= NOW() -- 2-进行中 </when> <when test="dto.status != null and dto.status == 3"> AND end_time < NOW() -- 3-已结束 </when> </choose> <if test="null != dto.name and ''!= dto.name "> `name` like concat('%',#{dto.name},'%') </if> <if test="null != dto.activityType and dto.activityType!=0 "> activity_type = #{dto.activityType} </if> <choose> <when test="dto.shopIds != null and dto.shopIds.size() > 0"> <choose> <when test="dto.flag != null and dto.flag == 1"> -- flag=1: 需要查询shop_id为null的记录 即平台创建的 AND (shop_id IN <foreach collection="dto.shopIds" item="shopId" open="(" separator="," close=")"> #{shopId} </foreach> OR shop_id IS NULL) </when> <otherwise> -- flag不为1: 只查询shopIds的值 AND shop_id IN <foreach collection="dto.shopIds" item="shopId" open="(" separator="," close=")"> #{shopId} </foreach> </otherwise> </choose> </when> <when test="dto.nameflag != null and dto.nameflag == 1"> -- shopIds为空但flag=1: 即查询平台创建,其他店铺没有类似的名称 AND shop_id IS NULL </when> </choose> </select> </mapper> ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.xml
New file @@ -0,0 +1,35 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.goods.mapper.lottery.UserLotteryEventQuestionsAnswersMapper"> <select id="getUserAnswersPage" resultType="com.ruoyi.goods.domain.vo.MgtUserAnswersPageVO"> SELECT q.sort AS sort, q.name AS name, GROUP_CONCAT(a.answers ORDER BY a.id SEPARATOR ';') AS answer, r.answers AS rightAnswer, ua_answer.answers AS userAnswer, -- 使用关联表获取用户选择的答案文本 ua.is_correct AS isCorrect FROM t_user_lottery_event_questions_answers ua LEFT JOIN t_lottery_event_questions q ON ua.lottery_event_question_id = q.id LEFT JOIN t_lottery_event_questions_answers a ON q.id = a.lottery_event_questions_id LEFT JOIN t_lottery_event_questions_answers r ON q.id = r.lottery_event_questions_id AND r.is_right = 1 LEFT JOIN t_lottery_event_questions_answers ua_answer ON ua.lottery_event_questions_answers_id = ua_answer.id WHERE ua.user_id = #{userId} AND ua.lottery_event_id = #{lotteryEventId} GROUP BY ua.lottery_event_question_id, q.sort, q.name, r.answers, ua.is_correct, ua_answer.answers ORDER BY q.sort ASC </select> </mapper> ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java
@@ -1,6 +1,7 @@ package com.ruoyi.shop.controller.console; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.constant.CacheConstants; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.exception.ServiceException; @@ -14,6 +15,7 @@ import com.ruoyi.shop.service.task.ShopTaskService; import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.poji.sys.SysUser; import com.ruoyi.system.api.domain.vo.*; @@ -451,8 +453,26 @@ * @param shopId * @return */ @PostMapping("/shop/getFranchiseeIdsBYDealerId") @PostMapping("/getFranchiseeIdsBYDealerId") List<Shop> getFranchiseeIdsBYDealerId(@RequestBody Long shopId){ return shopService.getFranchiseeIdsBYDealerId(shopId); } /** * 根据shopIds分页查看 * @param dto * @return */ @PostMapping("/getMgtShopPageVoByShopIds") Page<MgtOneClinkSyncingShopPageVo> getMgtShopPageVoByShopIds(@RequestBody MGtOneClinkSyncingShopPageDTO dto){ return shopService.getMgtShopPageVoByShopIds(dto); } /** * 一键同步商户信息 */ @PostMapping("/updateShopByOneClinkSyncing") R updateShopByOneClinkSyncing(@RequestBody OneClinkSyncing oneClinkSyncing){ return shopService.updateShopByOneClinkSyncing(oneClinkSyncing); } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java
@@ -22,10 +22,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.*; import javax.annotation.Resource; import javax.servlet.http.HttpServletResponse; @@ -633,4 +630,11 @@ List<Map<String, String>> bankBranchCode = bankBranchCodeService.getBankBranchCode(dto.getBankNumber()); return R.ok(bankBranchCode); } @RequestMapping(value = "/changeShopType", method = RequestMethod.GET) @ApiOperation(value = "修改商户类型(转为经销商,转为加盟商)【2.0】") public R<Void> changeShopType(@RequestParam Long shopId){ return shopService.changeShopType(shopId); } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java
@@ -4,13 +4,12 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.shop.domain.dto.*; import com.ruoyi.shop.domain.vo.*; import com.ruoyi.system.api.domain.dto.MGtOneClinkSyncingShopPageDTO; import com.ruoyi.system.api.domain.dto.MgtBasePlatformDto; import com.ruoyi.system.api.domain.dto.MgtShopIdByCodeDto; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.MgtBulletinBoardVo; import com.ruoyi.system.api.domain.vo.MgtMapIntTotalVo; import com.ruoyi.system.api.domain.vo.MgtSimpleShopVo; import com.ruoyi.system.api.domain.vo.MgtUserTaskMsgVo; import com.ruoyi.system.api.domain.vo.*; import org.apache.ibatis.annotations.Param; import java.util.List; @@ -295,4 +294,22 @@ List<Shop> listShopByCityCode(@Param("cityCodes")List<String> cityCodes); List<Shop> getFranchiseeIdsBYDealerId(@Param("shopId")Long shopId); /** * 设置加盟商的归属经销商为null * @param shopId */ void setBelongShopIdNull(@Param("shopId")Long shopId); /** * 根据shopIds获取一键同步的店铺信息 * @param page * @param scope * @return */ List<MgtOneClinkSyncingShopPageVo> getMgtShopPageVoByShopIds(Page page, @Param("list") List<Long> scope); void updateShopByOneClinkSyncing(@Param("param") OneClinkSyncing oneClinkSyncing); } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/ShopFileMapper.java
@@ -2,6 +2,9 @@ import com.ruoyi.shop.domain.pojo.task.ShopFile; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Param; import java.util.List; /** * <p> @@ -17,4 +20,6 @@ * @param shopId */ void deleteByShopId(Long shopId); void deleteBatchByShopIds(@Param("shopIds") List<Long> shopIds); } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java
@@ -26,6 +26,7 @@ import com.ruoyi.shop.domain.pojo.task.ShopFile; import com.ruoyi.shop.domain.pojo.task.ShopTask; import com.ruoyi.shop.domain.vo.*; import com.ruoyi.shop.domain.vo.MgtShopPageVo; import com.ruoyi.shop.enums.WxApplyMentStateEnum; import com.ruoyi.shop.mapper.shop.ShopMapper; import com.ruoyi.shop.service.shop.*; @@ -40,6 +41,7 @@ import com.ruoyi.system.api.constant.AppErrorConstant; import com.ruoyi.system.api.constant.SecurityConstant; import com.ruoyi.system.api.domain.dto.*; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.api.domain.poji.config.SysTag; import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.domain.poji.shop.Shop; @@ -50,6 +52,7 @@ import lombok.extern.log4j.Log4j2; import org.springframework.beans.factory.annotation.Value; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import javax.annotation.Resource; import java.math.BigDecimal; @@ -1957,4 +1960,82 @@ public List<Shop> getFranchiseeIdsBYDealerId(Long shopId) { return shopMapper.getFranchiseeIdsBYDealerId(shopId); } /** * 修改商户类型 * @param shopId * @return */ @Override public R<Void> changeShopType(Long shopId) { Shop shop = shopMapper.selectById(shopId); if(null == shop|| shop.getDelFlag() != 0){ return R.fail("商户不存在"); } //商户修改类型 1-经销商 2-加盟商 shop.setShopType(shop.getShopType()==1?2:1); if (shop.getShopType()==2){ //经销商转加盟商: 先解绑该经销商下所有加盟商 shopMapper.setBelongShopIdNull(shopId); } shop.setUpdateUserId(SecurityUtils.getUserId()); shopMapper.updateById(shop); return R.ok(); } @Override public Page<MgtOneClinkSyncingShopPageVo> getMgtShopPageVoByShopIds(MGtOneClinkSyncingShopPageDTO dto) { Page<MgtOneClinkSyncingShopPageVo> page = new Page<>(); page.setSize(dto.getPageSize()); page.setCurrent(dto.getPageNum()); List<MgtOneClinkSyncingShopPageVo> mgtShopPageVoList = shopMapper.getMgtShopPageVoByShopIds(page,dto.getShopIds()); return page.setRecords(mgtShopPageVoList); } @Override @Transactional(rollbackFor = Exception.class) public R updateShopByOneClinkSyncing(OneClinkSyncing oneClinkSyncing) { if (StringUtils.isBlank(oneClinkSyncing.getShopIds())) { return R.fail("请选择要更新的门店"); } // 1. 转换门店ID列表 List<Long> shopIdList = Arrays.stream(oneClinkSyncing.getShopIds().split(",")) .map(String::trim) .filter(StringUtils::isNotBlank) .map(Long::parseLong) .collect(Collectors.toList()); // 批量删除封面和Banner图 shopFileService.deleteBatchByShopIds(shopIdList); //批量添加封面图 List<ShopFile> coverUrlList = shopIdList.stream() .map(shopId -> new ShopFile() .setShopId(shopId) .setFileType(1) .setFileUrl(oneClinkSyncing.getCoverUrl()) .setDelFlag(0)) .collect(Collectors.toList()); shopFileService.saveBatch(coverUrlList); //批量添加banner图 List<String> bannerUrlList = Arrays.stream(oneClinkSyncing.getDetailsPicture().split(",")) .map(String::trim) .filter(StringUtils::isNotBlank) .collect(Collectors.toList()); List<ShopFile> bannerList = new ArrayList<>(); for (Long shopId : shopIdList) { for (String bannerUrl : bannerUrlList) { bannerList.add(new ShopFile() .setShopId(shopId) .setFileType(2) // Banner图 .setFileUrl(bannerUrl) .setDelFlag(0)); } } shopFileService.saveBatch(coverUrlList); //批量修改门店信息 oneClinkSyncing.setShopIdList(shopIdList); shopMapper.updateShopByOneClinkSyncing(oneClinkSyncing); return R.ok(); } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/ShopFileServiceImpl.java
@@ -45,4 +45,9 @@ shopFileMapper.deleteByShopId(shopId); } @Override public void deleteBatchByShopIds(List<Long> shopIdList) { shopFileMapper.deleteBatchByShopIds(shopIdList); } } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java
@@ -8,9 +8,12 @@ import com.ruoyi.common.core.domain.R; import com.ruoyi.shop.domain.dto.*; import com.ruoyi.shop.domain.vo.*; import com.ruoyi.shop.domain.vo.MgtShopPageVo; import com.ruoyi.system.api.domain.dto.MGtOneClinkSyncingShopPageDTO; import com.ruoyi.system.api.domain.dto.MerBaseDto; import com.ruoyi.system.api.domain.dto.MgtBasePlatformDto; import com.ruoyi.system.api.domain.dto.MgtShopIdByCodeDto; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.api.domain.poji.member.Member; import com.ruoyi.system.api.domain.poji.shop.Shop; import com.ruoyi.system.api.domain.vo.*; @@ -71,7 +74,7 @@ * @param mgtShopPageDto * @return */ List<MgtShopPageVo> pageMgtShop(Page page, MgtShopPageDto mgtShopPageDto,List<Long> scope); List<MgtShopPageVo> pageMgtShop(Page page, MgtShopPageDto mgtShopPageDto, List<Long> scope); /** * 获取商户详情 @@ -468,4 +471,22 @@ * @return */ List<Shop> getFranchiseeIdsBYDealerId(Long shopId); /** * 修改商户类型 * @param shopId * @return */ R<Void> changeShopType(Long shopId); /** * 根据ids分页获取一键同步的商户信息 * @param dto * @return */ Page<MgtOneClinkSyncingShopPageVo> getMgtShopPageVoByShopIds(MGtOneClinkSyncingShopPageDTO dto); /** * 一键同步商户信息 */ R updateShopByOneClinkSyncing(OneClinkSyncing oneClinkSyncing); } ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/ShopFileService.java
@@ -27,4 +27,10 @@ * @param shopId */ void deleteByShopId(Long shopId); /** * 通过商户ids批量删除关联 * @param shopIdList */ void deleteBatchByShopIds(List<Long> shopIdList); } ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml
@@ -1040,6 +1040,26 @@ WHERE shop_id = #{shopId} </update> <update id="setBelongShopIdNull"> UPDATE t_shop SET belong_shop_id = NULL WHERE belong_shop_id = #{shopId} and del_flag = 0 and shopstatus!=-1 and shop_type = 2 </update> <update id="updateShopByOneClinkSyncing"> UPDATE t_shop SET shop_detail = #{param.shopDetail}, platform_coupon_flag = #{param.platformCouponFlag}, platform_birthday_flag = #{param.platformBirthdayFlag}, update_user_id = #{param.userId}, update_time = NOW() WHERE shop_id IN <foreach item="id" collection="param.shopIdList" open="(" separator="," close=")"> #{id} </foreach> </update> <select id="listShopIdByCityCode" resultType="java.lang.Long"> SELECT shop_id FROM t_shop @@ -1089,5 +1109,33 @@ and belong_shop_id = #{shopId} </select> <select id="getMgtShopPageVoByShopIds" resultType="com.ruoyi.system.api.domain.vo.MgtOneClinkSyncingShopPageVo"> SELECT ts.shop_id shopId, ts.shop_number shopNumber, ts.shop_name shopName, ts.shop_tags shopTags, ts.shop_source shopSource, belong.shop_name belongShopName, ts.sign_area_name signAreaName, CONCAT(ts.cooperation_start_time,'-',ts.cooperation_end_time) cooperationTime, CONCAT(ts.shop_area_name,ts.shop_address) shopAddress, ts.shopowner_name shopownerName, ts.shopowner_phone shopownerPhone, tsm.shop_marketing_total shopActivityCount, ts.shop_custom_status shopCustomStatus, ts.frozen_flag frozenFlag FROM t_shop ts LEFT JOIN t_shop_marketing tsm ON tsm.shop_id = ts.shop_id left join t_shop belong on ts.belong_shop_id = belong.shop_id WHERE ts.del_flag = 0 <if test="list !=null and list.size()>0" > AND ts.shop_id IN <foreach collection="list" item="item" open="(" separator="," close=")"> #{item} </foreach> </if> </select> </mapper> ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/ShopFileMapper.xml
@@ -70,4 +70,10 @@ UPDATE t_shop_file SET del_flag = 1 WHERE shop_id = #{shopId} </update> <update id="deleteBatchByShopIds"> update t_shop_file set del_flag =1 where shop_id in <foreach collection="shopIds" item="shopId" open="(" separator="," close=")"> #{shopId} </foreach> </update> </mapper> ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java
@@ -1,5 +1,6 @@ package com.ruoyi.system.controller.management; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.poi.ExcelUtil; @@ -7,6 +8,7 @@ import com.ruoyi.common.log.annotation.Log; import com.ruoyi.common.log.enums.BusinessType; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.dto.MGtOneClinkSyncingShopPageDTO; import com.ruoyi.system.api.domain.dto.MgtBaseGetDto; import com.ruoyi.system.api.domain.dto.MgtClassNumDto; import com.ruoyi.system.api.domain.dto.MgtPageDto; @@ -81,6 +83,9 @@ @Resource private BottomNavService bottomNavService; @Resource private OneClinkSyncingService oneClinkSyncingService; @RequestMapping(value = "/getCustomConfig", method = RequestMethod.POST) @@ -159,7 +164,7 @@ @RequestMapping(value = "/editBanner", method = RequestMethod.POST) @Log(title = "banner管理", businessType = BusinessType.UPDATE,operContent = "修改banner") @ApiOperation(value = "修改banner") @ApiOperation(value = "修改banner【2.0】") public R editBanner(@RequestBody MgtBannerEditDto mgtBannerEditDto) { Long userId = SecurityUtils.getUserId(); mgtBannerEditDto.setUserId(userId); @@ -180,7 +185,7 @@ } @RequestMapping(value = "/getBanner", method = RequestMethod.POST) @ApiOperation(value = "获取banner编辑信息") @ApiOperation(value = "获取banner编辑信息【2.0】") public R<MgtBannerGetVo> getBanner(@RequestBody MgtBaseGetDto mgtBaseGetDto) { Long userId = SecurityUtils.getUserId(); mgtBaseGetDto.setUserId(userId); @@ -212,7 +217,7 @@ @RequestMapping(value = "/editPop", method = RequestMethod.POST) @Log(title = "弹窗管理", businessType = BusinessType.UPDATE,operContent = "修改弹窗广告") @ApiOperation(value = "修改弹窗广告") @ApiOperation(value = "修改弹窗广告【2.0】") public R editPop(@RequestBody MgtPopEditDto mgtPopEditDto) { Long userId = SecurityUtils.getUserId(); mgtPopEditDto.setUserId(userId); @@ -221,7 +226,7 @@ } @RequestMapping(value = "/getPop", method = RequestMethod.POST) @ApiOperation(value = "获取弹窗编辑信息") @ApiOperation(value = "获取弹窗编辑信息【2.0】") public R<MgtPopGetVo> getPop(@RequestBody MgtBaseGetDto mgtBaseGetDto) { Long userId = SecurityUtils.getUserId(); mgtBaseGetDto.setUserId(userId); @@ -240,13 +245,13 @@ } @RequestMapping(value = "/getBottomNav", method = RequestMethod.GET) @ApiOperation(value = "获取底部导航栏配置数据") @ApiOperation(value = "获取底部导航栏配置数据【2.0】") public R<List<BottomNav>> getBottomNav() { List<BottomNav> list = bottomNavService.getAllBottomNav(); return R.ok(list); } @RequestMapping(value = "/editBottomNav", method = RequestMethod.PUT) @ApiOperation(value = "获取底部导航栏配置数据") @ApiOperation(value = "获取底部导航栏配置数据【2.0】") public R<Void> editBottomNav(@RequestBody BottomNavDto bottomNavDto) { return bottomNavService.editBottomNav(bottomNavDto); } @@ -265,7 +270,7 @@ @RequestMapping(value = "/editQuickEntry", method = RequestMethod.POST) @Log(title = "快速入口管理", businessType = BusinessType.UPDATE,operContent = "修改快速入口") @ApiOperation(value = "修改快速入口") @ApiOperation(value = "修改快速入口【2.0】") public R editQuickEntry(@RequestBody MgtQuickEntryEditDto mgtQuickEntryEditDto) { Long userId = SecurityUtils.getUserId(); mgtQuickEntryEditDto.setUserId(userId); @@ -274,7 +279,7 @@ } @RequestMapping(value = "/getQuickEntry", method = RequestMethod.POST) @ApiOperation(value = "获取快速入口编辑信息") @ApiOperation(value = "获取快速入口编辑信息【2.0】") public R<MgtQuickEntryGetVo> getQuickEntry(@RequestBody MgtBaseGetDto mgtBaseGetDto) { Long userId = SecurityUtils.getUserId(); mgtBaseGetDto.setUserId(userId); @@ -630,5 +635,39 @@ return R.ok(bulletinBoard); } @RequestMapping(value = "/pageOneClinkSyncing", method = RequestMethod.POST) @ApiOperation(value = "分页获取一键同步【2.0】") public R<IPage<MgtOneClinkSyncPageVO>> pageOneClinkSyncing(@RequestBody MgtOneClinkSyncingPageDTO mgtPageDto) { return R.ok(oneClinkSyncingService.pageOneClinkSyncing(mgtPageDto)); } @RequestMapping(value = "/editOneClinkSyncing", method = RequestMethod.POST) @Log(title = "一键同步管理", businessType = BusinessType.UPDATE,operContent = "修改一键同步") @ApiOperation(value = "修改一键同步【2.0】") public R editOneClinkSyncing(@RequestBody MgtOneClinkSyncingEditDto dto) { Long userId = SecurityUtils.getUserId(); dto.setUserId(userId); return oneClinkSyncingService.editOneClinkSyncing(dto); } @RequestMapping(value = "/getOneClinkSyncing", method = RequestMethod.POST) @ApiOperation(value = "获取一键同步信息(查看详情)【2.0】") public R<MgtOneClinkSyncingVO> getOneClinkSyncing(@RequestBody MGtOneClinkSyncingShopPageDTO dto ) { return oneClinkSyncingService.getOneClinkSyncing(dto); } @RequestMapping(value = "/deleteOneClinkSyncing", method = RequestMethod.GET) @Log(title = "一键同步管理", businessType = BusinessType.DELETE,operContent = "删除一键同步") @ApiOperation(value = "删除一键同步【2.0】") public R deleteOneClinkSyncing(@RequestParam("syncingId") Integer syncingId ) { return oneClinkSyncingService.deleteOneClinkSyncing(syncingId); } @RequestMapping(value = "/executeOneClinkSyncing", method = RequestMethod.GET) @Log(title = "一键同步管理", businessType = BusinessType.UPDATE,operContent = "执行一键同步") @ApiOperation(value = "执行一键同步【2.0】") public R executeOneClinkSyncing(@RequestParam("syncingId") Integer syncingId ) { return oneClinkSyncingService.executeOneClinkSyncing(syncingId); } } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtOneClinkSyncingEditDto.java
New file @@ -0,0 +1,45 @@ package com.ruoyi.system.domain.dto; import com.ruoyi.system.api.domain.dto.AppBaseDto; import com.ruoyi.system.api.domain.dto.MgtBaseDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * @author hlg * @ClassName MgtOneClinkSyncingDto * @date 2025/6/16 */ @Data public class MgtOneClinkSyncingEditDto extends MgtBaseDto { @ApiModelProperty(value = "syncingId 新增不传") private Integer syncingId; @ApiModelProperty(value = "标题") private String syncingName; @ApiModelProperty(value = "封面图url") private String coverUrl; @ApiModelProperty(value = "详情图,多个逗号分隔") private String detailsPicture; @ApiModelProperty(value = "领券1开2关") private Integer platformCouponFlag; @ApiModelProperty(value = "生日卡1开2关") private Integer platformBirthdayFlag; @ApiModelProperty(value = "选择门店数") private Integer shopNum; @ApiModelProperty(value = "选择的门店ids,多个以逗号隔开") private String shopIds; @ApiModelProperty(value = "店铺详情") private String shopDetail; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtOneClinkSyncingPageDTO.java
New file @@ -0,0 +1,22 @@ package com.ruoyi.system.domain.dto; import com.ruoyi.system.api.domain.dto.MgtPageDto; import io.swagger.annotations.ApiModelProperty; import lombok.Data; @Data public class MgtOneClinkSyncingPageDTO { @ApiModelProperty("页码") private Integer pageNum=0; @ApiModelProperty("分页大小") private Integer pageSize=10; @ApiModelProperty(value = "同步标题") private String syncingName; @ApiModelProperty(value = "操作同步时间范围-开始时间") private String syncingStartTime; @ApiModelProperty(value = "操作同步时间范围-结束时间") private String syncingEndTime; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java
@@ -91,11 +91,6 @@ @TableField("jump_type") private Integer jumpType; /** * 小程序APPID */ @TableField("appid") private String appid; @Override protected Serializable pkVal() { ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtOneClinkSyncPageVO.java
New file @@ -0,0 +1,26 @@ package com.ruoyi.system.domain.vo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; @Data public class MgtOneClinkSyncPageVO { @ApiModelProperty(value = "同步id") private Integer syncingId; @ApiModelProperty(value = "标题") private String syncingName; @ApiModelProperty(value = "封面图url") private String coverUrl; @ApiModelProperty(value = "详情图,多个逗号分隔") private String detailsPicture; @ApiModelProperty(value = "领券1开2关") private Integer platformCouponFlag; @ApiModelProperty(value = "生日卡1开2关") private Integer platformBirthdayFlag; @ApiModelProperty(value = "同步门店数") private Integer shopNum; @ApiModelProperty(value = "最近一次同步时间") private Date syncingTime; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtOneClinkSyncingVO.java
New file @@ -0,0 +1,38 @@ package com.ruoyi.system.domain.vo; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.system.api.domain.vo.MgtOneClinkSyncingShopPageVo; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.List; @Data public class MgtOneClinkSyncingVO { @ApiModelProperty("syncing id") private Integer syncingId; @ApiModelProperty("同步名称(标题)") private String syncingName; @ApiModelProperty("封面图片") private String coverUrl; @ApiModelProperty("详情图,多个逗号分隔") private String detailsPicture; @ApiModelProperty("领券1开2关") private String platformCouponFlag; @ApiModelProperty("生日卡1开2关") private String platformBirthdayFlag; @ApiModelProperty("店铺详情") private String shopDetail; @ApiModelProperty("商户列表") private Page<MgtOneClinkSyncingShopPageVo> page; } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/OneClinkSyncingMapper.java
New file @@ -0,0 +1,29 @@ package com.ruoyi.system.mapper.config; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.ruoyi.system.domain.dto.MgtOneClinkSyncingPageDTO; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.domain.vo.MgtOneClinkSyncPageVO; import org.apache.ibatis.annotations.Mapper; import org.apache.ibatis.annotations.Param; /** * <p> * 一键同步 Mapper 接口 * </p> * * @author hlg * @since 2025-06-16 */ @Mapper public interface OneClinkSyncingMapper extends BaseMapper<OneClinkSyncing> { /** * 分页查询一键同步 * @param page * @param mgtPageDto * @return */ IPage<MgtOneClinkSyncPageVO> pageOneClinkSyncing(@Param("page") IPage<MgtOneClinkSyncPageVO> page, @Param("dto") MgtOneClinkSyncingPageDTO mgtPageDto); } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/OneClinkSyncingService.java
New file @@ -0,0 +1,46 @@ package com.ruoyi.system.service.config; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.common.core.domain.R; import com.ruoyi.system.api.domain.dto.MGtOneClinkSyncingShopPageDTO; import com.ruoyi.system.domain.dto.MgtOneClinkSyncingEditDto; import com.ruoyi.system.domain.dto.MgtOneClinkSyncingPageDTO; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.domain.vo.MgtOneClinkSyncPageVO; import com.ruoyi.system.domain.vo.MgtOneClinkSyncingVO; /** * <p> * 一键同步 服务类 * </p> * * @author jqs * @since 2023-04-25 */ public interface OneClinkSyncingService extends IService<OneClinkSyncing> { /** * @description 获取一键同步分页 * @author hlg * @date 2025/6/16 10:35 * @param mgtPageDto * @return MgtOneClinkSyncPageVO */ IPage<MgtOneClinkSyncPageVO> pageOneClinkSyncing(MgtOneClinkSyncingPageDTO mgtPageDto); /** * 修改一键同步 * @param dto */ R editOneClinkSyncing(MgtOneClinkSyncingEditDto dto); /** * 获取详情 * @param dto */ R<MgtOneClinkSyncingVO> getOneClinkSyncing(MGtOneClinkSyncingShopPageDTO dto); R deleteOneClinkSyncing(Integer syncingId); R executeOneClinkSyncing(Integer syncingId); } ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/OneClinkSyncingServiceImpl.java
New file @@ -0,0 +1,134 @@ package com.ruoyi.system.service.impl.config; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.core.utils.bean.BeanUtils; import com.ruoyi.common.security.utils.SecurityUtils; import com.ruoyi.system.api.domain.dto.MGtOneClinkSyncingShopPageDTO; import com.ruoyi.system.api.domain.vo.MgtOneClinkSyncingShopPageVo; import com.ruoyi.system.api.service.RemoteShopService; import com.ruoyi.system.domain.dto.MgtOneClinkSyncingEditDto; import com.ruoyi.system.domain.dto.MgtOneClinkSyncingPageDTO; import com.ruoyi.system.api.domain.poji.config.OneClinkSyncing; import com.ruoyi.system.domain.vo.MgtOneClinkSyncPageVO; import com.ruoyi.system.domain.vo.MgtOneClinkSyncingVO; import com.ruoyi.system.mapper.config.OneClinkSyncingMapper; import com.ruoyi.system.service.config.OneClinkSyncingService; import org.springframework.stereotype.Service; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.stream.Collectors; /** * <p> * 广告 服务实现类 * </p> * * @author jqs * @since 2023-04-25 */ @Service public class OneClinkSyncingServiceImpl extends ServiceImpl<OneClinkSyncingMapper, OneClinkSyncing> implements OneClinkSyncingService { private final RemoteShopService remoteShopService; public OneClinkSyncingServiceImpl(RemoteShopService remoteShopService) { this.remoteShopService = remoteShopService; } @Override public IPage<MgtOneClinkSyncPageVO> pageOneClinkSyncing(MgtOneClinkSyncingPageDTO mgtPageDto) { //分页查询 IPage<MgtOneClinkSyncPageVO> page = new Page<>(mgtPageDto.getPageNum(),mgtPageDto.getPageSize()); return this.baseMapper.pageOneClinkSyncing(page,mgtPageDto); } @Override public R editOneClinkSyncing(MgtOneClinkSyncingEditDto dto) { OneClinkSyncing oneClinkSyncing = new OneClinkSyncing(); if (null != dto.getSyncingId()){ oneClinkSyncing = this.getById(dto.getSyncingId()); if(oneClinkSyncing.getDelFlag() != 0 ){ return R.fail("该一键同步不存在"); } oneClinkSyncing.setUpdateTime(new Date()); oneClinkSyncing.setUpdateUserId(dto.getUserId()); }else { oneClinkSyncing.setCreateUserId(dto.getUserId()); oneClinkSyncing.setCreateTime(new Date()); } oneClinkSyncing.setSyncingName(dto.getSyncingName()); oneClinkSyncing.setCoverUrl(dto.getCoverUrl()); oneClinkSyncing.setDetailsPicture(dto.getDetailsPicture()); oneClinkSyncing.setPlatformBirthdayFlag(dto.getPlatformBirthdayFlag()); oneClinkSyncing.setPlatformCouponFlag(dto.getPlatformCouponFlag()); oneClinkSyncing.setShopNum(dto.getShopNum()); oneClinkSyncing.setShopIds(dto.getShopIds()); oneClinkSyncing.setShopDetail(dto.getShopDetail()); this.saveOrUpdate(oneClinkSyncing); return R.ok(); } @Override public R<MgtOneClinkSyncingVO> getOneClinkSyncing(MGtOneClinkSyncingShopPageDTO dto) { MgtOneClinkSyncingVO vo = new MgtOneClinkSyncingVO(); OneClinkSyncing oneClinkSyncing = this.getById(dto.getSyncingId()); if (null == oneClinkSyncing|| oneClinkSyncing.getDelFlag() != 0){ return R.fail("该一键同步不存在"); } BeanUtils.copyProperties(oneClinkSyncing, vo); if (oneClinkSyncing.getShopIds() == null || oneClinkSyncing.getShopIds().trim().isEmpty()) { return R.ok(vo); // 返回空列表 } List<Long> shopIds = Arrays.stream(oneClinkSyncing.getShopIds().split(",")) .map(String::trim) // 去除空格 .filter(s -> !s.isEmpty()) // 过滤空字符串 .map(Long::parseLong) // 转换为Long .collect(Collectors.toList()); dto.setShopIds(shopIds); //查找这几家店铺信息 Page<MgtOneClinkSyncingShopPageVo> mgtShopPageVoByShopIds = remoteShopService.getMgtShopPageVoByShopIds(dto); vo.setPage(mgtShopPageVoByShopIds); return R.ok(vo); } @Override public R deleteOneClinkSyncing(Integer syncingId) { //删除 OneClinkSyncing oneClinkSyncing = this.getById(syncingId); if (null == oneClinkSyncing || oneClinkSyncing.getDelFlag()==0){ return R.ok(); } oneClinkSyncing.setDelFlag(1); oneClinkSyncing.setUpdateTime(new Date()); oneClinkSyncing.setUpdateUserId(SecurityUtils.getUserId()); this.updateById(oneClinkSyncing); return R.ok(); } @Override public R executeOneClinkSyncing(Integer syncingId) { //根据oneClinkSyncing,修改门店信息 OneClinkSyncing oneClinkSyncing = this.getById(syncingId); if (null == oneClinkSyncing || oneClinkSyncing.getDelFlag()==0){ return R.fail("该一键同步不存在"); } if (oneClinkSyncing.getShopIds() == null || oneClinkSyncing.getShopIds().trim().isEmpty()) { return R.fail("请先选择门户"); } R r = remoteShopService.updateShopByOneClinkSyncing(oneClinkSyncing); oneClinkSyncing.setSyncingTime(new Date()); oneClinkSyncing.setSyncingUserId(SecurityUtils.getUserId()); this.updateById(oneClinkSyncing); return R.ok(); } } ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/OneClinkSyncingMapper.xml
New file @@ -0,0 +1,21 @@ <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace="com.ruoyi.system.mapper.config.OneClinkSyncingMapper"> <select id="pageOneClinkSyncing" resultType="com.ruoyi.system.domain.vo.MgtOneClinkSyncPageVO"> select syncing_id, syncing_name, cover_url, details_picture, platform_coupon_flag, platform_birthday_flag, shop_num, syncing_time from t_one_clink_syncing where del_flag=0 </select> </mapper>