huliguo
14 小时以前 60e726c81966b042db4f7b108d06bd36109794de
抽奖管理、一键同步
26个文件已添加
28个文件已修改
1933 ■■■■■ 已修改文件
ruoyi-api/ruoyi-api-goods/src/main/java/com/ruoyi/goods/api/domain/LotteryEvent.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/dto/MGtOneClinkSyncingShopPageDTO.java 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/poji/config/OneClinkSyncing.java 123 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/domain/vo/MgtOneClinkSyncingShopPageVo.java 49 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/factory/RemoteShopFallbackFactory.java 17 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-api/ruoyi-api-system/src/main/java/com/ruoyi/system/api/service/RemoteShopService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtGoodsController.java 10 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/controller/management/MgtLotteryEventController.java 106 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventEditDTO.java 129 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventJoinUserPageDTO.java 11 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventPageDto.java 31 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventPrizeDTO.java 20 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventQuestionAnswersDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtLotteryEventQuestionDTO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/MgtUserAnswersPageDTO.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/dto/UpdateGoodsPriceDTO.java 19 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventDetailVO.java 65 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventJoinUserPageVO.java 24 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventPageVo.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtLotteryEventQuestionVO.java 30 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/MgtUserAnswersPageVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/domain/vo/PageShopMgtGoodsVO.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/LotteryEventMapper.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventMapper.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/goods/GoodsService.java 10 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/goods/GoodsServiceImpl.java 37 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/LotteryEventServiceImpl.java 252 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/impl/lottery/UserLotteryEventQuestionsAnswersServiceImpl.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/ILotteryEventService.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/java/com/ruoyi/goods/service/lottery/IUserLotteryEventQuestionsAnswersService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/goods/GoodsMapper.xml 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/LotteryEventMapper.xml 68 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-goods/src/main/resources/mapper/lottery/UserLotteryEventQuestionsAnswersMapper.xml 35 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/console/ShopController.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/controller/management/MgtShopController.java 12 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/shop/ShopMapper.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/mapper/task/ShopFileMapper.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/shop/ShopServiceImpl.java 81 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/impl/task/ShopFileServiceImpl.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/shop/ShopService.java 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/java/com/ruoyi/shop/service/task/ShopFileService.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/shop/ShopMapper.xml 48 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-shop/src/main/resources/mapper/task/ShopFileMapper.xml 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/controller/management/MgtConfigController.java 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtOneClinkSyncingEditDto.java 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/dto/MgtOneClinkSyncingPageDTO.java 22 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/pojo/config/Pop.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtOneClinkSyncPageVO.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/domain/vo/MgtOneClinkSyncingVO.java 38 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/mapper/config/OneClinkSyncingMapper.java 29 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/config/OneClinkSyncingService.java 46 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/java/com/ruoyi/system/service/impl/config/OneClinkSyncingServiceImpl.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
ruoyi-modules/ruoyi-system/src/main/resources/mapper/config/OneClinkSyncingMapper.xml 21 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
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.*;
@@ -65,6 +61,11 @@
    @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() &lt; 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 &gt; NOW()  -- 1-未开始
            </when>
            <when test="dto.status != null and dto.status == 2">
                AND start_time &lt;= NOW() AND end_time &gt;= NOW()  -- 2-进行中
            </when>
            <when test="dto.status != null and dto.status == 3">
                AND end_time &lt; 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.*;
@@ -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>