doum
12 小时以前 e68e324f91d1a4eb2d4c5f07d27ca105a308bc0c
Merge remote-tracking branch 'origin/master'
已添加7个文件
已修改38个文件
1191 ■■■■ 文件已修改
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java 67 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java 134 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/RichTextProcessor.java 28 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/InviteRecordMapper.java 15 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java 40 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/InviteRecord.java 78 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java 44 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/CollectSaveRequest.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/InviteInfoResponse.java 36 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/InviteRecordService.java 26 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java 92 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java 15 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java 63 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/InviteRecordServiceImpl.java 142 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java 4 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java 183 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java 7 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java 56 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java 5 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java 55 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java 2 ●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/pom.xml 16 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
server/dmmall_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -1,15 +1,22 @@
package com.doumee.core.utils;
import cn.binarywang.wx.miniapp.bean.WxMaCodeLineColor;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.model.Areas;
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.math.BigDecimal;
import java.net.URLDecoder;
import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
@Slf4j
public class Constants {
    public static final String[]  ALL_SPELL_LIST_FIRST = new String[]{"A", "B", "C", "D", "E", "F", "G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"};
@@ -137,6 +144,18 @@
    public static final String COFFEE_ARTICLE_BACKGROUND = "COFFEE_ARTICLE_BACKGROUND";
    public static final String TRANSFER_FILE = "TRANSFER_FILE";
    public static final String INVITE_RULE = "INVITE_RULE";
    public static final String INVITE_IMG = "INVITE_IMG";
    public static final String SHARES_FILE = "SHARES_FILE";
    public static final String INVITE_IMG_URL = "INVITE_IMG_URL";
    public interface RedisKeys {
@@ -1228,4 +1247,52 @@
            this.info = info;
        }
    }
    public static InputStream generateWxMiniImgStream(String scene, String page, boolean isUsePage) {
        //生成图片上传OSS
        Map<String,Object> body = new HashMap<>();
        // åœºæ™¯ç ï¼Œä¸Žå‰ç«¯çº¦å®šï¼Œæœ€ç»ˆæ˜¯éœ€è¦å‰ç«¯è§£æž
        body.put("scene", scene);
        // æ­£å¼ç‰ˆä¸º "release",体验版为 "trial",开发版为 "develop"。默认是正式版。
        String env_version = "release";
        body.put("env_version", env_version);
        if(isUsePage){
            body.put("page", page);
        }
        //body.put("page", "pages/index/index");
        // é€æ˜Žï¼Œæ ¹æ®ä½ çš„场景自行设置body参数
        body.put("is_hyaline", true);
        try {
            WxMaCodeLineColor codeLineColor = new WxMaCodeLineColor("0","0","0");
            byte[]  bytes =  WxMiniConfig.wxMaService.getQrcodeService().createWxaCodeUnlimitBytes
                    (scene,null,false,env_version,300,false,codeLineColor,false);
            if (bytes !=null) {
                InputStream inputStream = new ByteArrayInputStream(bytes);
              /* ByteArrayOutputStream baos = new ByteArrayOutputStream();
                    byte[] buffer = new byte[1024];
                    int len = -1;
                    while ((len = inputStream.read(buffer)) != -1) {
                        baos.write(buffer, 0, len);
                    }
                 System.out.println("data:mediatype;base64," + Base64.getEncoder().encodeToString(baos.toByteArray()));*/
                log.error("生成小程序码成功:============"+inputStream.available());
                return inputStream;
            }else{
                log.error("生成小程序码失败:============");
            }
        } catch (Exception e) {
            e.printStackTrace();
            log.error("生成小程序码失败:============"+e.getMessage());
        }
        return  null;
    }
    public static Integer getInviteCode(String inviteStr){
        if(StringUtils.isNotBlank(inviteStr)&&inviteStr.startsWith("m_")){
            return Integer.valueOf(inviteStr.replace("m_",""));
        }
        return null;
    }
}
server/dmmall_service/src/main/java/com/doumee/core/utils/GeneratePicUtil.java
@@ -1,6 +1,8 @@
package com.doumee.core.utils;
import com.google.zxing.common.BitMatrix;
import lombok.extern.slf4j.Slf4j;
import net.coobird.thumbnailator.Thumbnails;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
@@ -12,12 +14,14 @@
import javax.imageio.stream.ImageOutputStream;
import java.awt.*;
import java.awt.geom.Ellipse2D;
import java.awt.geom.RoundRectangle2D;
import java.awt.image.BufferedImage;
import java.io.*;
import java.math.BigDecimal;
import java.math.RoundingMode;
import java.net.URL;
@Slf4j
public class GeneratePicUtil {
    static String bg="https://shoeslxkj.oss-cn-beijing.aliyuncs.com/file/20230404/SysBaseBackGround/D56231512C0B4A4C9D06B02F9566B0B0.png";
@@ -268,7 +272,137 @@
        return resMatrix;
    }
    public static BufferedImage getImgIO(String imgurl) {
        try {
            return     ImageIO.read(new URL(imgurl));
        }catch (Exception e){
            log.error("海报==>拉取图片报错:"+e.getMessage());
        }return null;
    }
    private static BufferedImage getImgIO(InputStream is) {
        if(is ==null){
            log.error("=============================qrcode error å°ç¨‹åºç ä¸ºç©º");
        }else{
            log.error("=============================qrcode okay å°ç¨‹åºç æœ‰æœ‰æ•¸æ“š");
        }
        try {
            return     ImageIO.read(is);
        }catch (Exception e){
            log.error("=============================qrcode error å°ç¨‹åºç ä¸ºç©º11111111111:"+e.getMessage());
        }
        return null;
    }
    public static int th = 30;
    public static InputStream generateShareWithUserImg(BufferedImage imgurl, InputStream mpCode) throws IOException {
        int w = imgurl.getWidth();
        int h = imgurl.getHeight();
        double rate = (double)w/750d;
        //得到它的绘制环境(这张图片的笔)
        Graphics2D g2 = (Graphics2D) imgurl.getGraphics();
        g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
        //背景图片
        g2.setColor(Color.white);
        Font font =new Font("黑体", Font.PLAIN, (int)(24 * rate));
        g2.setFont(font);
        FontMetrics fontMetrics = g2.getFontMetrics(font);
        int textWidth = fontMetrics.stringWidth("扫码看更多");
        g2.drawString("扫码看更多", (int)(w -(textWidth+20*rate)),h-(int)(rate*(50-th)));
        BufferedImage img3 = getImgIO(mpCode);
        if(img3!=null){
            g2.setColor(Color.white);
            g2.fillOval((int)(w-130*rate), (int)(h-rate*150), (int)(100*rate) , (int)(100*rate));
            g2.drawImage(img3, (int)(w-130*rate), (int)(h-rate*150), (int)(100*rate) , (int)(100*rate), null);
        }
        InputStream inputStream = bufferedImageToInputStream(imgurl);
        return inputStream;
    }
    /**
     * å›¾ç‰‡è®¾ç½®åœ†è§’
     * @param srcImage
     * @return
     * @throws
     */
    public static BufferedImage setRadius(BufferedImage srcImage, int radius, int border, int padding){
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        int canvasWidth = width + padding * 2;
        int canvasHeight = height + padding * 2;
        BufferedImage image = new BufferedImage(canvasWidth, canvasHeight, BufferedImage.TYPE_INT_ARGB);
        Graphics2D gs = image.createGraphics();
        gs.setComposite(AlphaComposite.Src);
        gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gs.setColor(Color.WHITE);
        gs.fill(new RoundRectangle2D.Float(0, 0, canvasWidth, canvasHeight, radius, radius));
        gs.setComposite(AlphaComposite.SrcAtop);
        gs.drawImage(setClip(srcImage, radius), padding, padding, null);
        if(border !=0){
            gs.setColor(Color.white);
            gs.setStroke(new BasicStroke(border));
            gs.drawRoundRect(padding, padding, canvasWidth - 2 * padding, canvasHeight - 2 * padding, radius, radius);
        }
        gs.dispose();
        return image;
    }
    /**
     * å›¾ç‰‡åˆ‡åœ†è§’
     * @param srcImage
     * @param radius
     * @return
     */
    public static BufferedImage setClip(BufferedImage srcImage, int radius){
        int width = srcImage.getWidth();
        int height = srcImage.getHeight();
        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
        Graphics2D gs = image.createGraphics();
        gs.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        gs.setClip(new RoundRectangle2D.Double(0, 0, width, height, radius, radius));
        gs.drawImage(srcImage, 0, 0, null);
        gs.dispose();
        return image;
    }
    public static BufferedImage transfromToImage(String imgUrl,String suffix){
        BufferedImage originalImage = null;
        try {
            originalImage = ImageIO.read(new URL(imgUrl));
        } catch (IOException e) {
            log.error("海报==>拉取图片报错:"+e.getMessage());
            return null;
        }
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            Thumbnails.of(originalImage)
                    .scale(1)
                    .outputFormat("png".equals(suffix.toLowerCase())?"PNG":"JPEG")
                    .outputQuality(0.8)
                    .imageType(BufferedImage.TYPE_INT_RGB)
                    .toOutputStream(outputStream);
        } catch (IOException e) {
            log.error("海报==>压缩图片报错:"+e.getMessage());
            return null;
        }
        byte[] data = outputStream.toByteArray();
        // 2. åŒ…装为输入流
        ByteArrayInputStream bis = new ByteArrayInputStream(data);
        // 3. è§£ç ä¸º BufferedImage
        try {
            return ImageIO.read(bis);
        } catch (IOException e) {
            log.error("海报==>转流报错:"+e.getMessage());
            return null;
        }
    }
}
server/dmmall_service/src/main/java/com/doumee/core/utils/RichTextProcessor.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,28 @@
package com.doumee.core.utils;
import org.jsoup.Jsoup;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2026/1/20 16:58
 */
public class RichTextProcessor {
    /**
     * ä»ŽHTML中提取纯文本
     */
    public static String extractPlainTextFromHtml(String htmlContent) {
        if (htmlContent == null || htmlContent.isEmpty()) {
            return "";
        }
        // ç›´æŽ¥æå–文本内容,去除所有HTML标签
        return Jsoup.parse(htmlContent).text();
    }
}
server/dmmall_service/src/main/java/com/doumee/dao/business/CollectMapper.java
@@ -2,11 +2,12 @@
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Collect;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * @author æ±Ÿè¹„蹄
 * @date 2023/03/21 15:48
 */
public interface CollectMapper extends BaseMapper<Collect> {
public interface CollectMapper extends MPJJoinMapper<Collect> {
}
server/dmmall_service/src/main/java/com/doumee/dao/business/InviteRecordMapper.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,15 @@
package com.doumee.dao.business;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.doumee.dao.business.model.Integral;
import com.doumee.dao.business.model.InviteRecord;
import com.github.yulichang.base.mapper.MPJJoinMapper;
/**
 * ç”¨æˆ·é‚€è¯·è®°å½•
 * @author æ±Ÿè¹„蹄
 * @date 2026å¹´1月20日09:32:12
 */
public interface InviteRecordMapper extends MPJJoinMapper<InviteRecord> {
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/Collect.java
@@ -1,5 +1,6 @@
package com.doumee.dao.business.model;
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
@@ -8,6 +9,8 @@
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import com.fasterxml.jackson.annotation.JsonFormat;
import java.math.BigDecimal;
import java.util.Date;
/**
@@ -59,7 +62,7 @@
    @ExcelColumn(name="对象编码")
    private Integer objId;
    @ApiModelProperty(value = "对象类型 0活动探店咨询", example = "1")
    @ApiModelProperty(value = "对象类型 0活动探店咨询 1商品", example = "1")
    @ExcelColumn(name="对象类型 0活动探店咨询")
    private Integer objType;
@@ -75,4 +78,39 @@
    @ExcelColumn(name="对象关联用户编码(关联member表)")
    private Integer objMemberId;
    @ApiModelProperty(value = "商品封面图/文章列表图")
    @TableField(exist = false)
    private String imgUrl;
    @ApiModelProperty(value = "商品名称/文章名称")
    @TableField(exist = false)
    private String name;
    @ApiModelProperty(value = "商品价格")
    @TableField(exist = false)
    private BigDecimal price;
    @ApiModelProperty(value = "划线价")
    @TableField(exist = false)
    private BigDecimal linePrice;
    @ApiModelProperty(value = "文章分类名称")
    @TableField(exist = false)
    private String labelName;
    @ApiModelProperty(value = "阅读量")
    @TableField(exist = false)
    private Integer readNum;
    @ApiModelProperty(value = "文章发布时间")
    @TableField(exist = false)
    private Date releaseDate;
    @ApiModelProperty(value = "文章内容")
    @TableField(exist = false)
    private String content;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/InviteRecord.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,78 @@
package com.doumee.dao.business.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 com.doumee.core.annotation.excel.ExcelColumn;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
import java.util.Date;
/**
 * ç”¨æˆ·é‚€è¯·è®°å½•
 * @author æ±Ÿè¹„蹄
 * @date 2026å¹´1月20日09:32:12
 */
@Data
@ApiModel("用户邀请记录")
@TableName("`invite_record`")
public class InviteRecord {
    @ApiModelProperty(value = "主键", example = "1")
    @TableId(value = "id", type = IdType.AUTO)
    private Integer id;
    @ApiModelProperty(value = "创建人编码", example = "1")
    private Integer creator;
    @ApiModelProperty(value = "创建时间")
    @ExcelColumn(name="交易时间" ,index =1,width = 10)
    private Date createDate;
    @ApiModelProperty(value = "更新人编码", example = "1")
    private Integer editor;
    @ApiModelProperty(value = "更新时间")
    private Date editDate;
    @ApiModelProperty(value = "是否删除0否 1是", example = "1")
    private Integer isdeleted;
    @ApiModelProperty(value = "备注")
    private String remark;
    @ApiModelProperty(value = "邀请人主键(关联member表)", example = "1")
    private Integer inviteId;
    @ApiModelProperty(value = "被邀请人主键(关联member表)", example = "1")
    private Integer memberId;
    @ApiModelProperty(value = "被邀请人手机号")
    private String phone;
    @ApiModelProperty(value = "是否完成首单:0否 1是", example = "1")
    private Integer firstOrderStatus;
    @ApiModelProperty(value = "完成首单时间")
    private Date firstFinishDate;
    @ApiModelProperty(value = "邀请奖励积分")
    private BigDecimal rewardIntegral;
    @ApiModelProperty(value = "完成首单奖励积分")
    private BigDecimal firstRewardIntegral;
    @ApiModelProperty(value = "被邀请人头像")
    @TableField(exist = false)
    private String imgUrl;
    @ApiModelProperty(value = "被邀请人名称")
    @TableField(exist = false)
    private String memberName;
}
server/dmmall_service/src/main/java/com/doumee/dao/business/model/MemberCoupon.java
@@ -2,6 +2,9 @@
import com.baomidou.mybatisplus.annotation.TableField;
import com.doumee.core.annotation.excel.ExcelColumn;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import com.baomidou.mybatisplus.annotation.IdType;
@@ -11,6 +14,7 @@
import com.fasterxml.jackson.annotation.JsonFormat;
import java.util.Date;
import java.math.BigDecimal;
import java.util.Objects;
/**
 * ç”¨æˆ·ä¼˜æƒ åˆ¸å…³è”表
@@ -136,4 +140,44 @@
    @TableField(exist = false)
    private BigDecimal   couponPrice     ;
    public static MemberCoupon couponToBean(Coupon coupon, Member member , Date now, Integer getMethod, LoginUserInfo loginUserInfo){
        MemberCoupon insert = new MemberCoupon();
        insert.setCreateDate(now);
        insert.setEditDate(now);
        insert.setCreator(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
        insert.setEditor(Objects.nonNull(loginUserInfo)?loginUserInfo.getId():null);
        insert.setIsdeleted(Constants.ZERO);
        insert.setRemark(Constants.equalsInteger(getMethod, Constants.ZERO)?"注册赠送":Constants.equalsInteger(getMethod, Constants.ONE)?"邀请好友":"定向发放");
        insert.setMemberId(member.getId());
        insert.setShopId(coupon.getShopId());
        insert.setType(coupon.getType());
        insert.setCouponType(coupon.getType());
        insert.setLimitPrice(coupon.getLimitPrice());
        insert.setPrice(coupon.getPrice());
        if(Constants.equalsObject(coupon.getUseType(),Constants.ZERO)){
            //如果是固定时段
            insert.setStartDate(coupon.getStartDate());
            insert.setEndDate(coupon.getEndDate());
        }else{
            //固定时长 //推迟天数
            insert.setEndDate(DateUtil.addDaysToDate(now,Constants.formatIntegerNum(coupon.getValidDays())));
            insert.setStartDate(now);
        }
        insert.setGetMethod(getMethod);//注册赠送
        insert.setIntegral(coupon.getIntegral());
        insert.setStatus(Constants.ZERO);//未使用
        insert.setInfo(coupon.getInfo());
        insert.setName(coupon.getName());
        insert.setApplyIds(coupon.getApplyIds());
        insert.setApplyType(coupon.getApplyType());
        insert.setCouponId(coupon.getId());
        return  insert;
    }
}
server/dmmall_service/src/main/java/com/doumee/dao/system/dto/PlatformConfigDTO.java
@@ -32,7 +32,7 @@
    @ApiModelProperty(value = "邀请好友积分奖励数量")
    private BigDecimal shareIntegralReward;
    @ApiModelProperty(value = "注册优惠券奖励集合")
    @ApiModelProperty(value = "注册优惠券奖励集合") //[{"num":"2","couponId":6},{"num":"3","couponId":5}]
    private List<JSONObject> regCouponRewardList;
    @ApiModelProperty(value = "邀请好友优惠券奖励集合")
    private List<JSONObject> shareCouponRewardList;
server/dmmall_service/src/main/java/com/doumee/dao/web/request/CollectSaveRequest.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.doumee.dao.web.request;
import com.doumee.core.utils.Constants;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.math.BigDecimal;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/4/13 16:47
 */
@Data
@ApiModel("收藏业务保存请求类")
public class CollectSaveRequest {
    @ApiModelProperty(value = "业务主键")
    private Integer objId;
    @ApiModelProperty(value = "对象主键")
    private Integer type;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/request/WxPhoneRequest.java
@@ -35,6 +35,6 @@
    private String openid;
    @ApiModelProperty(value = "邀请码")
    private Integer recId;
    private String recId;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/InviteInfoResponse.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,36 @@
package com.doumee.dao.web.response;
import com.doumee.dao.business.model.InviteRecord;
import com.doumee.dao.business.model.Member;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
import java.util.List;
/**
 * Created by IntelliJ IDEA.
 *
 * @Author : Rk
 * @create 2023/3/23 9:25
 */
@Data
@ApiModel("邀请记录返回信息")
public class InviteInfoResponse{
    @ApiModelProperty(value = "邀请人数")
    private Integer inviteNum;
    @ApiModelProperty(value = "邀请赠送积分数量")
    private Long num;
    @ApiModelProperty(value = "邀请规则")
    private String inviteRule;
    @ApiModelProperty(value = "邀请记录")
    private List<InviteRecord> inviteRecordList;
}
server/dmmall_service/src/main/java/com/doumee/dao/web/response/goods/GoodsInfoResponse.java
@@ -85,6 +85,11 @@
    @ApiModelProperty(value = "真实库存")
    private Integer stock;
    @ApiModelProperty(value = "收藏状态:0=未收藏;1=已收藏")
    private Integer collectStatus;
//    @ApiModelProperty(value = "商品标签")
//    private List<Labels> labelsList;
server/dmmall_service/src/main/java/com/doumee/service/business/CollectService.java
@@ -4,6 +4,7 @@
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Collect;
import com.doumee.dao.web.dto.CollectDTO;
import com.doumee.dao.web.request.CollectSaveRequest;
import java.util.List;
import java.util.Map;
@@ -105,4 +106,8 @@
     * @return long
     */
    Map<Integer, CollectDTO> count(List<Integer> objIds);
    void saveCollect(CollectSaveRequest request, Integer memberId);
    List<Collect> myCollect(Integer memberId,Integer type);
}
server/dmmall_service/src/main/java/com/doumee/service/business/GoodsService.java
@@ -130,7 +130,7 @@
     * @param goodsId
     * @return
     */
    GoodsInfoResponse getGoodsInfo(Integer goodsId);
    GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId);
    /**
server/dmmall_service/src/main/java/com/doumee/service/business/InviteRecordService.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,26 @@
package com.doumee.service.business;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.dao.business.model.Integral;
import com.doumee.dao.web.dto.IntegralDTO;
import com.doumee.dao.web.dto.IntegralRecordDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.response.IntegralDataResponse;
import com.doumee.dao.web.response.InviteInfoResponse;
import java.math.BigDecimal;
import java.util.List;
/**
 * ç”¨æˆ·é‚€è¯·è®°å½•
 * @author æ±Ÿè¹„蹄
 * @date 2026å¹´1月20日09:32:12
 */
public interface InviteRecordService {
    InviteInfoResponse getInviteInfo(Integer memberId);
    String createShareImg(Integer memberId) throws Exception;
}
server/dmmall_service/src/main/java/com/doumee/service/business/MemberService.java
@@ -127,7 +127,7 @@
     * @param code
     * @return
     */
    AccountResponse wxLogin(String code,Integer recId);
    AccountResponse wxLogin(String code);
    AccountResponse wxLoginTest( Integer recId);
server/dmmall_service/src/main/java/com/doumee/service/business/impl/CollectServiceImpl.java
@@ -1,23 +1,33 @@
package com.doumee.service.business.impl;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.RichTextProcessor;
import com.doumee.core.utils.Utils;
import com.doumee.dao.business.ActivityMapper;
import com.doumee.dao.business.ArticleMapper;
import com.doumee.dao.business.CollectMapper;
import com.doumee.dao.business.model.Collect;
import com.doumee.dao.business.GoodsMapper;
import com.doumee.dao.business.model.*;
import com.doumee.dao.web.dto.CollectDTO;
import com.doumee.dao.web.request.CollectSaveRequest;
import com.doumee.service.business.CollectService;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.collections4.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.CollectionUtils;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
@@ -34,9 +44,16 @@
    @Autowired
    private CollectMapper collectMapper;
    @Autowired
    private GoodsMapper goodsMapper;
    @Autowired
    private ActivityMapper activityMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public Integer create(Collect collect,Integer memberId) {
        Collect target = new Collect();
        target.setCreateDate(new Date());
        target.setEditDate(new Date());
@@ -178,4 +195,75 @@
        }).collect(Collectors.toMap(s -> s.getObjId(), s -> s));
        return collect;
    }
    @Override
    public void saveCollect(CollectSaveRequest request, Integer memberId){
        if(collectMapper.selectCount(new QueryWrapper<Collect>().lambda()
                .eq(Collect::getMemberId,memberId)
                .eq(Collect::getObjType,request.getType())
                .eq(Collect::getObjId,request.getObjId())
        )<= Constants.ZERO){
            Collect target = new Collect();
            target.setCreateDate(new Date());
            target.setEditDate(new Date());
            target.setMemberId(memberId);
            target.setObjId(request.getObjId());
            target.setObjType(request.getType());
            collectMapper.insert(target);
        };
    }
    @Override
    public List<Collect> myCollect(Integer memberId,Integer type){
        List<Collect> collectList = new ArrayList<>();
        if(Constants.equalsInteger(type,Constants.ZERO)){
            collectList = collectMapper.selectJoinList(Collect.class,new MPJLambdaWrapper<Collect>()
                            .selectAll(Collect.class)
                            .selectAs(Goods::getName,Collect::getName)
                            .selectAs(Goods::getPrice,Collect::getPrice)
                            .selectAs(Goods::getImgurl,Collect::getImgurl)
                            .select(" ifnull(( select min(gs.PRICE) from goods_sku gs where gs.GOODS_ID = t1.id ),0) ", Collect::getLinePrice)
                            .leftJoin(Goods.class,Goods::getId,Collect::getObjId)
                    .eq(Collect::getIsdeleted,Constants.ZERO)
                    .eq(Collect::getMemberId,memberId)
                    .eq(Collect::getObjType,type)
                    .orderByDesc(Collect::getId)
            );
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(collectList)){
                String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
                collectList.forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
            }
        }else{
            collectList = collectMapper.selectJoinList(Collect.class,new MPJLambdaWrapper<Collect>()
                    .selectAll(Collect.class)
                    .selectAs(Activity::getName,Collect::getName)
                    .selectAs(Activity::getCreateDate,Collect::getReleaseDate)
                    .selectAs(Activity::getLooknum,Collect::getReadNum)
                    .selectAs(Activity::getImgurl,Collect::getImgurl)
                    .selectAs(Labels::getName,Collect::getLabelName)
                    .selectAs(Activity::getContent,Collect::getContent)
                    .leftJoin(Activity.class,Activity::getId,Collect::getObjId)
                    .leftJoin(Labels.class,Labels::getId,Activity::getLabelId)
                    .eq(Collect::getIsdeleted,Constants.ZERO)
                    .eq(Collect::getMemberId,memberId)
                    .eq(Collect::getObjType,type)
                    .orderByDesc(Collect::getId)
            );
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(collectList)){
                String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.ACTIVITY_FILE);
                collectList.forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
                collectList.stream().filter(s-> StringUtils.isNotBlank(s.getContent())).forEach(s->s.setContent(RichTextProcessor.extractPlainTextFromHtml(s.getContent())));
            }
        }
        return collectList;
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsServiceImpl.java
@@ -83,6 +83,9 @@
    @Autowired
    private MultifileService multifileService;
    @Autowired
    private CollectMapper collectMapper;
    @Autowired
    private GoodsAdminJoinMapper goodsAdminJoinMapper;
@@ -865,7 +868,6 @@
        if (!CollectionUtils.isEmpty(page.getRecords())){
            String preFixPath = systemDictDataBiz.getPreFixPath(Constants.RESOURCE_PATH, Constants.GOODS_FILE);
            page.getRecords().forEach(s->s.setImgurl(preFixPath+s.getImgurl()));
        }
        return page;
    }
@@ -935,8 +937,7 @@
    @Override
    public GoodsInfoResponse getGoodsInfo(Integer goodsId) {
    public GoodsInfoResponse getGoodsInfo(Integer goodsId,Integer memberId) {
        String fullUrl = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                systemDictDataBiz.queryByCode(Constants.OSS,Constants.GOODS_FILE).getCode();
        GoodsInfoResponse goodsResponse = goodsMapper.getGoodsInfo(goodsId);
@@ -958,6 +959,14 @@
                                                                                            Constants.GOODS_FILE);
        List<MultiFileDTO> multiFileDTOS = objAllFileUrl.get(Constants.MultiFile.PLATFORM_GOOD_ROTATION.getKey());
        goodsResponse.setGoodBannerMultiFiles(multiFileDTOS);
        goodsResponse.setCollectStatus(Constants.ZERO);
        if(Objects.nonNull(memberId)){
            goodsResponse.setCollectStatus(collectMapper.selectCount(new QueryWrapper<Collect>().lambda()
                    .eq(Collect::getMemberId,memberId)
                    .eq(Collect::getObjId,goodsId)
                    .eq(Collect::getObjType,Constants.ONE)
            )>Constants.ZERO?Constants.ONE:Constants.ZERO);
        }
        return goodsResponse;
    }
server/dmmall_service/src/main/java/com/doumee/service/business/impl/GoodsorderServiceImpl.java
@@ -85,6 +85,12 @@
    private ShopGoodsRelationMapper shopGoodsRelationMapper;
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private CouponMapper couponMapper;
    @Autowired
    private MemberCouponJoinMapper memberCouponJoinMapper;
    @Autowired
    private InviteRecordMapper inviteRecordMapper;
    @Autowired
    private GoodsorderDetailMapper goodsorderDetailMapper;
@@ -1682,11 +1688,66 @@
        //根据订单类型进行积分赠送
        //下单确认收货 ï¼Œèµ é€ç»é”€å•†ç§¯åˆ†
        this.orderAddShopIntegral(goodsorder);
        //下单完成 æ ¹æ®ä¿¡æ¯ç¡®è®¤æ˜¯å¦éœ€è¦èµ é€é‚€è¯·è€…优惠券
        this.orderDoneRewardInviteCoupon(goodsorder);
        //消费者确认收货
        this.orderAddMemberIntegral(goodsorder);
        //经销商 ç»“算金额
        this.orderAddShopCash(goodsorder);
    }
    /**
     * è®¢å•确认收货,赠送邀请者优惠券
     * @param
     */
    public void orderDoneRewardInviteCoupon(Goodsorder goodsorder){
        PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
        if (platformConfigDTO.getShareCouponRewardStatus().equals(Constants.ONE)) {
            return;
        }
        Member member = memberMapper.selectById(goodsorder.getMemberId());
        if(Objects.isNull(member)||member.getIsdeleted().equals(Constants.ONE)){
            return;
        }
        InviteRecord inviteRecord = inviteRecordMapper.selectOne(new QueryWrapper<InviteRecord>().lambda()
                .eq(InviteRecord::getMemberId,member.getId())
                .eq(InviteRecord::getIsdeleted,Constants.ZERO)
                .eq(InviteRecord::getFirstOrderStatus,Constants.ZERO)
                .last("limit 1")
        );
        if(Objects.isNull(inviteRecord)){
            return;
        }
        Member inviteMember = memberMapper.selectById(inviteRecord.getInviteId());
        if(Objects.isNull(inviteMember)||inviteMember.getIsdeleted().equals(Constants.ONE)){
            return;
        }
        List<JSONObject> shareCouponRewardList = platformConfigDTO.getShareCouponRewardList();
        //[{"num":"2","couponId":6},{"num":"3","couponId":5}]
        if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(shareCouponRewardList)){
            List<MemberCoupon> memberCouponList = new ArrayList<>();
            for (JSONObject jsonObject:shareCouponRewardList) {
                Integer couponId = jsonObject.getInteger("couponId");
                Integer num = jsonObject.getInteger("num");
                Coupon coupon =  couponMapper.selectById(couponId);
                if(Objects.isNull(coupon)||Constants.equalsInteger(coupon.getIsdeleted(),Constants.ONE)&&num>Constants.ZERO){
                    continue;
                }
                MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,inviteMember,new Date(),Constants.ONE,null);
                for (int i = 0; i < num; i++) {
                    memberCouponList.add(memberCoupon);
                }
            }
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
                memberCouponJoinMapper.insert(memberCouponList);
            }
        }
    }
    /**
     * è®¢å•核销
@@ -1721,6 +1782,8 @@
        if(Constants.equalsInteger(goodsorder.getPayMethod(),Constants.ZERO)){
            //赠送消费者积分
            this.orderAddMemberIntegral(goodsorder);
            //下单完成 æ ¹æ®ä¿¡æ¯ç¡®è®¤æ˜¯å¦éœ€è¦èµ é€é‚€è¯·è€…优惠券
            this.orderDoneRewardInviteCoupon(goodsorder);
            //经销商 æ·»åŠ èµ é€ç§¯åˆ†
            this.orderAddShopIntegral(goodsorder);
            //经销商 ç»“算金额
server/dmmall_service/src/main/java/com/doumee/service/business/impl/InviteRecordServiceImpl.java
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,142 @@
package com.doumee.service.business.impl;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.biz.system.SystemDictDataBiz;
import com.doumee.core.constants.ResponseStatus;
import com.doumee.core.exception.BusinessException;
import com.doumee.core.model.LoginUserInfo;
import com.doumee.core.model.PageData;
import com.doumee.core.model.PageWrap;
import com.doumee.core.utils.Constants;
import com.doumee.core.utils.DateUtil;
import com.doumee.core.utils.GeneratePicUtil;
import com.doumee.core.utils.Utils;
import com.doumee.core.utils.aliyun.ALiYunUtil;
import com.doumee.core.wx.WxMiniConfig;
import com.doumee.dao.business.IntegralMapper;
import com.doumee.dao.business.InviteRecordMapper;
import com.doumee.dao.business.MemberMapper;
import com.doumee.dao.business.ShopMapper;
import com.doumee.dao.business.join.IntegralJoinMapper;
import com.doumee.dao.business.model.Integral;
import com.doumee.dao.business.model.InviteRecord;
import com.doumee.dao.business.model.Member;
import com.doumee.dao.business.model.Shop;
import com.doumee.dao.web.dto.IntegralDTO;
import com.doumee.dao.web.dto.IntegralRecordDTO;
import com.doumee.dao.web.request.DealIntegralRequest;
import com.doumee.dao.web.response.IntegralDataResponse;
import com.doumee.dao.web.response.InviteInfoResponse;
import com.doumee.service.business.IntegralService;
import com.doumee.service.business.InviteRecordService;
import com.github.xiaoymin.knife4j.core.util.CollectionUtils;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import org.apache.commons.lang3.StringUtils;
import org.apache.http.util.TextUtils;
import org.apache.shiro.SecurityUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.stream.Collectors;
/**
 * ç”¨æˆ·é‚€è¯·è®°å½•
 * @author æ±Ÿè¹„蹄
 * @date 2026å¹´1月20日09:32:12
 */
@Service
public class InviteRecordServiceImpl implements InviteRecordService {
    @Autowired
    private InviteRecordMapper inviteRecordMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Override
    public InviteInfoResponse getInviteInfo(Integer memberId){
        InviteInfoResponse inviteInfoResponse = new InviteInfoResponse();
        inviteInfoResponse.setInviteNum(Constants.ZERO);
        inviteInfoResponse.setNum(0l);
        inviteInfoResponse.setInviteRule(systemDictDataBiz.queryByCode(Constants.ORDER_SET,Constants.INVITE_RULE).getCode());
        List<InviteRecord> inviteRecordList = inviteRecordMapper.selectJoinList(InviteRecord.class,
                new MPJLambdaWrapper<InviteRecord>()
                        .selectAll(InviteRecord.class)
                        .selectAs(Member::getNickname,InviteRecord::getMemberName)
                        .selectAs(Member::getImgurl,InviteRecord::getImgUrl)
                        .leftJoin(Member.class,Member::getId,InviteRecord::getMemberId)
                        .eq(InviteRecord::getIsdeleted,Constants.ZERO)
                        .eq(InviteRecord::getMemberId,memberId)
                        .orderByDesc(InviteRecord::getId)
        );
        if (CollectionUtils.isNotEmpty(inviteRecordList)) {
            inviteInfoResponse.setInviteRecordList(inviteRecordList);
            inviteInfoResponse.setInviteNum(inviteRecordList.size());
            BigDecimal num = BigDecimal.ZERO;
            String path  = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                            systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode();
            for (InviteRecord inviteRecord:inviteRecordList) {
                if(StringUtils.isNotBlank(inviteRecord.getImgUrl())){
                    inviteRecord.setImgUrl(path + inviteRecord.getImgUrl());
                }
                num = num.add(inviteRecord.getRewardIntegral()).add(inviteRecord.getFirstRewardIntegral());
            }
            inviteInfoResponse.setNum(num.longValue());
        }
        return inviteInfoResponse;
    }
    @Override
    public String createShareImg(Integer memberId) throws Exception {
        String imgUrl = systemDictDataBiz.queryByCode(Constants.ORDER_SET,Constants.INVITE_IMG_URL).getCode();
        BufferedImage img1  = GeneratePicUtil.transfromToImage(imgUrl,imgUrl.substring(imgUrl.lastIndexOf(".") + 1));
        if (img1 == null) {
            return imgUrl;
        }
        String url = null;
        String scene = "m_" + memberId;
        //内容分享海报图片
        InputStream mpCode = Constants.generateWxMiniImgStream(
                scene,
                "",
                false);//小程序
        InputStream inputStream = GeneratePicUtil.generateShareWithUserImg(
                img1
                , mpCode);
        ALiYunUtil obs = new ALiYunUtil(
        systemDictDataBiz.queryByCode(Constants.OSS,Constants.ENDPOINT).getCode()
                ,systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_ID).getCode(), systemDictDataBiz.queryByCode(Constants.OSS,Constants.ACCESS_KEY).getCode());
        String shareFolder = systemDictDataBiz.queryByCode(Constants.RESOURCE_PATH, Constants.SHARES_FILE).getCode();
        String key = DateUtil.getNowShortDate() + "/" + UUID.randomUUID().toString() + ".jpg";
        String fileName = shareFolder + key;
        if (obs.uploadOnlineObject(inputStream,systemDictDataBiz.queryByCode(Constants.OSS, Constants.BUCKETNAME).getCode(), key,null)) {
            url = systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode() + fileName;
        }
        return url;
    }
}
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberCouponServiceImpl.java
@@ -87,7 +87,7 @@
            for(Member member : memberList){
                for (int i = 0; i < Constants.formatLongNum(param.getNum()); i++) {
                    //挨个送
                    addList.add(initMemberCouponByParam(coupon,member,loginUserInfo,now));
                    addList.add(MemberCoupon.couponToBean(coupon,member,now,Constants.TWO,loginUserInfo));
                }
            }
            index++;
@@ -99,6 +99,7 @@
        return "操作成功,成功人员数量:"+memberList.size()+",共发放优惠券数量:"+addList.size();
    }
/*
    private MemberCoupon initMemberCouponByParam(Coupon coupon, Member member, LoginUserInfo loginUserInfo ,Date now) {
        MemberCoupon insert = new MemberCoupon();
@@ -134,6 +135,7 @@
        insert.setCouponId(coupon.getId());
        return  insert;
    }
*/
    private Coupon getCouponFromListById(Integer id, List<Coupon> couponList) {
        for(Coupon c : couponList){
server/dmmall_service/src/main/java/com/doumee/service/business/impl/MemberServiceImpl.java
@@ -27,6 +27,7 @@
import com.doumee.dao.business.model.*;
import com.doumee.dao.system.SystemUserMapper;
import com.doumee.dao.system.dto.MemberRechargeDTO;
import com.doumee.dao.system.dto.PlatformConfigDTO;
import com.doumee.dao.web.dto.MemberOwnDTO;
import com.doumee.dao.web.dto.shop.Position;
import com.doumee.dao.system.model.SystemUser;
@@ -42,6 +43,7 @@
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.doumee.service.system.SystemDictDataService;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import io.swagger.models.auth.In;
import io.swagger.util.Yaml;
@@ -79,6 +81,10 @@
    @Autowired
    private MemberMapper memberMapper;
    @Autowired
    private CouponMapper couponMapper;
    @Autowired
    private MemberCouponJoinMapper memberCouponJoinMapper;
    @Autowired
    private IntegralMapper integralMapper;
    @Autowired
    private ShopMapper shopMapper;
@@ -93,12 +99,18 @@
    @Autowired
    private MemberJoinMapper memberJoinMapper;
    @Autowired
    private InviteRecordMapper inviteRecordMapper;
    @Autowired
    private SystemUserMapper systemUserMapper;
    @Autowired
    private SystemDictDataBiz systemDictDataBiz;
    @Autowired
    private SystemDictDataService systemDictDataService;
    @Autowired
    private UploadFileService uploadFileService;
@@ -287,7 +299,7 @@
    @Override
    public AccountResponse wxLogin(String code,Integer recId){
    public AccountResponse wxLogin(String code){
        try {
            //获取微信敏感数据
            WxMaJscode2SessionResult session = WxMiniConfig.wxMaService.getUserService().getSessionInfo(code);
@@ -304,9 +316,6 @@
            AccountResponse accountResponse = new AccountResponse();
            accountResponse.setSessionKey(session.getSessionKey());
            if(Objects.nonNull(member)){
                if(Objects.isNull(member.getRecId())){
                    member.setRecId(recId);
                }
                memberMapper.updateById(member);
                member.setImgFullUrl(systemDictDataBiz.queryByCode(Constants.OSS,Constants.RESOURCE_PATH).getCode()+
                        systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
@@ -333,80 +342,6 @@
        return accountResponse;
    }
    /**
     * æ ¹æ®openid获取是否绑定了商户
     * @param openid
     * @param memberId
     * @return
     */
    public AccountResponse shopOpenidLogin(String openid, Integer memberId){
        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getOpenId, openid)
                .eq(Shop::getIsdeleted,Constants.ZERO)
                .last("limit 1")
        );
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setOpenid(openid);
        if(Objects.nonNull(shop)){
            if(Objects.isNull(memberId)
             && ( Objects.isNull(shop.getMemberId())
                    || !Constants.equalsInteger(shop.getMemberId(),memberId))){
                shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                        .set(Shop::getMemberId,memberId)
                        .eq(Shop::getId,shop.getId())
                );
            }
            JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
            String token = JwtTokenUtil.generateToken(payLoad);
            accountResponse.setToken(token);
        }
        return accountResponse;
    }
    /**
     * å•†æˆ·è´¦å·å¯†ç ç™»å½•
     * @param userName
     * @param password
     * @param openid
     * @param memberId
     * @return
     */
    public AccountResponse shopPasswordLogin(String userName,String password,String openid,String memberId){
        if(StringUtils.isBlank(userName)
             || StringUtils.isBlank(password)){
            throw new BusinessException(ResponseStatus.NOT_ALLOWED.getCode(),"用户名或密码不能为空");
        }
        Shop shop = shopMapper.selectOne(new QueryWrapper<Shop>().lambda().eq(Shop::getUsername, userName)
                .eq(Shop::getIsdeleted,Constants.ZERO)
                .last("limit 1")
        );
        if(shop==null){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        //加密密码
        String pwd = Utils.Secure.encryptPassword(password, shop.getSalt());
        if(!pwd.equals(shop.getPassword())){
            throw new BusinessException(ResponseStatus.ACCOUNT_INCORRECT);
        }
        //创建token
        JwtPayLoad payLoad = new JwtPayLoad(Constants.SHOP_PREFIX+shop.getId());
        String token = JwtTokenUtil.generateToken(payLoad);
        AccountResponse accountResponse = new AccountResponse();
        accountResponse.setToken(token);
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .set(Shop::getOpenId,openid)
                .set(Shop::getMemberId,memberId)
                .eq(Shop::getId,shop.getId())
        );
        shopMapper.update(null,new UpdateWrapper<Shop>().lambda()
                .set(Shop::getOpenId,null)
                .eq(Shop::getOpenId,openid)
                .ne(Shop::getId,shop.getId())
        );
        return accountResponse;
    }
    @Override
    public AccountResponse wxPhone(WxPhoneRequest wxPhoneRequest){
        try {
@@ -428,7 +363,9 @@
                member.setIsdeleted(Constants.ZERO);
                member.setType(Constants.ZERO);
                member.setOrigin(Constants.ZERO);
                member.setRecId(wxPhoneRequest.getRecId());
                if(!this.checkIsCreateInvite(phone)){
                    member.setRecId(Constants.getInviteCode(wxPhoneRequest.getRecId()));
                }
                member.setOpenId(wxPhoneRequest.getOpenid());
            }
            member.setPhone(phone);
@@ -437,6 +374,11 @@
                    systemDictDataBiz.queryByCode(Constants.OSS,Constants.MEMBER_FILE).getCode()+member.getImgurl());
            if(Objects.isNull(member.getId())){
                memberMapper.insert(member);
                PlatformConfigDTO platformConfigDTO = systemDictDataService.getPlatformConfigDTO();
                this.createRegionReward(member,platformConfigDTO);
                //创建邀请记录
                this.createInviteRecord(member,platformConfigDTO);
                member.setSharingCode(this.createShareCode(member.getId()));
                memberMapper.updateById(member);
            }else{
@@ -458,6 +400,89 @@
    }
    /**
     * å‘放注册奖励信息
     * @param member
     * @param platformConfigDTO
     */
    public void createRegionReward(Member member,PlatformConfigDTO platformConfigDTO){
        //查询用户是否注销过
        if(memberMapper.selectCount(new QueryWrapper<Member>().lambda()
                .eq(Member::getIsdeleted,Constants.ONE)
                .eq(Member::getPhone,member.getPhone())
        )>Constants.ZERO){
            return;
        }
        //开启注册送积分
        if(Constants.equalsInteger(platformConfigDTO.getRegIntegralRewardStatus(),Constants.ZERO)){
            DealIntegralRequest dealIntegralRequest = new DealIntegralRequest();
            dealIntegralRequest.setIntegralNum(platformConfigDTO.getRegIntegralReward());
            dealIntegralRequest.setDealType(Constants.ZERO);
            dealIntegralRequest.setMemberId(member.getId());
            dealIntegralRequest.setIntegralObjType(Constants.IntegralObjType.REGISTER);
            integralService.dealIntegral(dealIntegralRequest);
        }
        //开启注册送优惠券
        if(Constants.equalsInteger(platformConfigDTO.getRegCouponRewardStatus(),Constants.ZERO)){
            List<JSONObject> regCouponRewardList = platformConfigDTO.getRegCouponRewardList();
            //[{"num":"2","couponId":6},{"num":"3","couponId":5}]
            if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(regCouponRewardList)){
                List<MemberCoupon> memberCouponList = new ArrayList<>();
                for (JSONObject jsonObject:regCouponRewardList) {
                    Integer couponId = jsonObject.getInteger("couponId");
                    Integer num = jsonObject.getInteger("num");
                    Coupon coupon =  couponMapper.selectById(couponId);
                    if(Objects.isNull(coupon)||Constants.equalsInteger(coupon.getIsdeleted(),Constants.ONE)&&num>Constants.ZERO){
                        continue;
                    }
                    MemberCoupon memberCoupon = MemberCoupon.couponToBean(coupon,member,new Date(),Constants.ZERO,null);
                    for (int i = 0; i < num; i++) {
                        memberCouponList.add(memberCoupon);
                    }
                }
                if(com.github.xiaoymin.knife4j.core.util.CollectionUtils.isNotEmpty(memberCouponList)){
                    memberCouponJoinMapper.insert(memberCouponList);
                }
            }
        }
    }
    /**
     * åˆ›å»ºé‚€è¯·è®°å½•
     * @param member
     */
    public void createInviteRecord(Member member,PlatformConfigDTO platformConfigDTO){
        if(Objects.isNull(member.getRecId())){
            return;
        }
        InviteRecord inviteRecord = new InviteRecord();
        inviteRecord.setCreateDate(new Date());
        inviteRecord.setIsdeleted(Constants.ZERO);
        inviteRecord.setInviteId(member.getRecId());
        inviteRecord.setMemberId(member.getId());
        inviteRecord.setPhone(member.getPhone());
        inviteRecord.setRewardIntegral(Objects.nonNull(platformConfigDTO)&&Constants.equalsInteger(platformConfigDTO.getShareIntegralRewardStatus(),Constants.ZERO)?
                platformConfigDTO.getShareIntegralReward():BigDecimal.ZERO);
        inviteRecord.setFirstOrderStatus(Constants.ZERO);
        inviteRecordMapper.insert(inviteRecord);
    }
    /**
     * æŸ¥è¯¢æ˜¯å¦åˆ›å»ºè¿‡é‚€è¯·
     * @param mobile
     * @return
     */
    public Boolean checkIsCreateInvite(String mobile){
        return inviteRecordMapper.selectCount(new QueryWrapper<InviteRecord>()
                .lambda()
                .eq(InviteRecord::getPhone,mobile)
        )>Constants.ZERO?true:false;
    }
    public String createShareCode(Integer memberId){
        //生成分享码
server/dmmall_web/src/main/java/com/doumee/api/web/AccountApi.java
@@ -40,11 +40,10 @@
    @ApiOperation(value = "小程序登陆方式", notes = "小程序端")
    @GetMapping("/wxLogin")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "微信code", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "recId", value = "分享码", required = false)
            @ApiImplicitParam(paramType = "query", dataType = "String", name = "code", value = "微信code", required = true)
    })
    public ApiResponse<AccountResponse> wxLogin(@RequestParam String code, Integer recId) {
        return  ApiResponse.success(memberService.wxLogin(code,recId));
    public ApiResponse<AccountResponse> wxLogin(@RequestParam String code) {
        return  ApiResponse.success(memberService.wxLogin(code));
    }
    @LoginRequired
server/dmmall_web/src/main/java/com/doumee/api/web/ActivityApi.java
@@ -25,7 +25,7 @@
 */
@Api(tags = "活动业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/activity")
@Slf4j
public class ActivityApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/ApiController.java
@@ -145,6 +145,9 @@
    @Autowired
    public FundService fundService;
    @Autowired
    public InviteRecordService inviteRecordService;
    /**
     * å¾—到request对象
server/dmmall_web/src/main/java/com/doumee/api/web/ArticleApi.java
@@ -23,7 +23,7 @@
 * @create 2023/3/23 17:33
 */
@Api(tags = "咖啡百科")
@RestController
//@RestController
@RequestMapping("/web/article")
@Slf4j
public class ArticleApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/CardApi.java
@@ -14,7 +14,7 @@
 */
@Api(tags = "充值卡信息")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/card")
@LoginRequired
@Slf4j
server/dmmall_web/src/main/java/com/doumee/api/web/CoffeeBeanTaskApi.java
@@ -20,7 +20,7 @@
 */
@Api(tags = "咖豆任务业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/coffeeBeanTask")
@Slf4j
@LoginRequired
server/dmmall_web/src/main/java/com/doumee/api/web/CollectApi.java
@@ -4,13 +4,16 @@
import com.doumee.core.annotation.pr.PreventRepeat;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Collect;
import com.doumee.dao.web.request.CollectSaveRequest;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
/**
@@ -20,13 +23,48 @@
@Api(tags = "用户收藏信息表")
@RestController
@RequestMapping("/web/collect")
@LoginRequired
public class CollectApi extends ApiController{
    @LoginRequired
    @PreventRepeat
    @ApiOperation("新建")
    @PostMapping("/create")
    public ApiResponse create(@RequestBody Collect collect) {
        return ApiResponse.success(collectService.create(collect,getMemberId()));
    @ApiOperation("创建收藏")
    @PostMapping("/saveCollect")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse saveCollect(@RequestBody CollectSaveRequest request) {
        collectService.saveCollect(request,getMemberId());
        return ApiResponse.success("操作成功");
    }
    @LoginRequired
    @ApiOperation("取消收藏")
    @GetMapping("/cancel/batch")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse deleteByIdInBatch(@RequestParam String ids) {
        String [] idArray = ids.split(",");
        List<Integer> idList = new ArrayList<>();
        for (String id : idArray) {
            idList.add(Integer.valueOf(id));
        }
        collectService.deleteByIdInBatch(idList);
        return ApiResponse.success(null);
    }
    @LoginRequired
    @ApiOperation("我的收藏")
    @GetMapping("/myCollectList")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
    })
    public ApiResponse myCollectList(@RequestParam Integer type) {
        return ApiResponse.success(collectService.myCollect(getMemberId(),type));
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/CouponApi.java
@@ -16,12 +16,9 @@
import org.springframework.web.bind.annotation.RestController;
@Api(tags = "优惠券业务")
@RestController
//@RestController
@RequestMapping("/web/coupon")
public class CouponApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/CreationApplyApi.java
@@ -16,7 +16,7 @@
 * @date 2023/03/21 15:48
 */
@Api(tags = "创作中心申业务")
@RestController
//@RestController
@RequestMapping("/web/creationApply")
public class CreationApplyApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/LabelsApi.java
@@ -21,7 +21,7 @@
 */
@Api(tags = "标签信息表业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/labels")
@Slf4j
public class LabelsApi  extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/MemberApi.java
@@ -22,7 +22,7 @@
@Api(tags = "用户member业务")
@Trace(exclude = true)
@LoginRequired
@RestController
//@RestController
@RequestMapping("/web/member")
@Slf4j
public class MemberApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/NoticeApi.java
@@ -16,7 +16,7 @@
@Api(tags = "消息通知信业务")
@Trace(exclude = true)
@LoginRequired
@RestController
//@RestController
@RequestMapping("/web/notice")
@Slf4j
public class NoticeApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/SharesApi.java
@@ -1,15 +1,20 @@
package com.doumee.api.web;
import com.doumee.config.annotation.LoginRequired;
import com.doumee.core.annotation.trace.Trace;
import com.doumee.core.model.ApiResponse;
import com.doumee.dao.business.model.Shares;
import com.doumee.dao.web.request.WxPhoneRequest;
import com.doumee.dao.web.response.AccountResponse;
import com.doumee.dao.web.response.InviteInfoResponse;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import io.swagger.v3.oas.annotations.parameters.RequestBody;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
@Api(tags = "用户分享业务")
@Trace(exclude = true)
@@ -19,16 +24,38 @@
public class SharesApi extends ApiController{
    /**
     * åˆ›å»º
     *
     * @param shares å®žä½“对象
     * @return Integer
     */
    @ApiOperation(value = "用户创建分享", notes = "小程序端")
    @GetMapping("/getMemberDTO")
    public ApiResponse<Integer> create(@RequestBody Shares shares){
        return ApiResponse.success(sharesService.create(shares,getMemberId()));
//    /**
//     * åˆ›å»º
//     *
//     * @param shares å®žä½“对象
//     * @return Integer
//     */
//    @ApiOperation(value = "用户创建分享", notes = "小程序端")
//    @GetMapping("/getMemberDTO")
//    public ApiResponse<Integer> create(@RequestBody Shares shares){
//        return ApiResponse.success(sharesService.create(shares,getMemberId()));
//    }
    @LoginRequired
    @ApiOperation(value = "获取邀请信息", notes = "小程序端")
    @GetMapping("/getInviteInfo")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse<InviteInfoResponse> getInviteInfo() {
        return  ApiResponse.success(inviteRecordService.getInviteInfo(getMemberId()));
    }
    @LoginRequired
    @ApiOperation(value = "生成邀请海报", notes = "小程序端")
    @GetMapping("/getShareImg")
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true)
    })
    public ApiResponse<String> getShareImg()  throws Exception{
        return  ApiResponse.success(inviteRecordService.createShareImg(getMemberId()));
    }
}
server/dmmall_web/src/main/java/com/doumee/api/web/ShopCommentApi.java
@@ -16,7 +16,7 @@
@Api(tags = "商家评论管理业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/shopComment")
@Slf4j
public class ShopCommentApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/ShopFollowApi.java
@@ -17,7 +17,7 @@
@Api(tags = "店铺关注业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/shopFollow")
@Slf4j
public class ShopFollowApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/ShopMenuApi.java
@@ -15,7 +15,7 @@
@Api(tags = "店铺菜品业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/shopMenu")
@Slf4j
public class ShopMenuApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/ShopNewsApi.java
@@ -16,7 +16,7 @@
@Api(tags = "商家新鲜事")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/shopNew")
@Slf4j
public class ShopNewsApi extends ApiController {
server/dmmall_web/src/main/java/com/doumee/api/web/SignupApi.java
@@ -16,7 +16,7 @@
@Api(tags = "签到业务")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/signup")
@Slf4j
@LoginRequired
server/dmmall_web/src/main/java/com/doumee/api/web/ZanApi.java
@@ -18,7 +18,7 @@
 * @date 2023/03/21 15:48
 */
@Api(tags = "用户点赞信息表")
@RestController
//@RestController
@RequestMapping("/web/zan")
public class ZanApi extends ApiController{
server/dmmall_web/src/main/java/com/doumee/api/web/mall/AftersaleApi.java
@@ -26,7 +26,7 @@
 */
@Api(tags = "商品售后")
@Trace(exclude = true)
@RestController
//@RestController
@RequestMapping("/web/aftersale")
public class AftersaleApi extends ApiController {
    @Autowired
server/dmmall_web/src/main/java/com/doumee/api/web/mall/GoodsApi.java
@@ -44,9 +44,10 @@
    @ApiImplicitParams({
            @ApiImplicitParam(paramType = "header", dataType = "String", name = "token", value = "用户token值", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "goodsId", value = "商品主键", required = true),
            @ApiImplicitParam(paramType = "query", dataType = "Integer", name = "memberId", value = "用户主键", required = true),
    })
    public ApiResponse<GoodsInfoResponse> goodsInfo(@RequestParam Integer goodsId) {
        GoodsInfoResponse goodsInfoResponse = goodsService.getGoodsInfo(goodsId);
    public ApiResponse<GoodsInfoResponse> goodsInfo(@RequestParam Integer goodsId,Integer memberId) {
        GoodsInfoResponse goodsInfoResponse = goodsService.getGoodsInfo(goodsId,memberId);
        return ApiResponse.success("查询成功",goodsInfoResponse);
    }
server/pom.xml
@@ -40,7 +40,7 @@
    <!-- hutool å·¥å…·ç›¸å…³-->
    <hutool.version>5.5.8</hutool.version>
    <!-- å¾®ä¿¡å°ç¨‹åº -->
    <weixin-java-miniapp.version>4.1.0</weixin-java-miniapp.version>
    <weixin-java-miniapp.version>4.7.8-20251023.110018</weixin-java-miniapp.version>
    <!-- å¾®ä¿¡æ”¯ä»˜ -->
    <weixin-java-pay.version>4.1.0</weixin-java-pay.version>
    <!-- é˜¿é‡Œäº‘OSS存储 -->
@@ -270,6 +270,20 @@
      <artifactId>rocketmq-client-java</artifactId>
      <version>5.0.4</version>
    </dependency>
    <!--图片压缩-->
    <dependency>
      <groupId>net.coobird</groupId>
      <artifactId>thumbnailator</artifactId>
      <version>0.4.20</version>
    </dependency>
    <dependency>
      <groupId>org.jsoup</groupId>
      <artifactId>jsoup</artifactId>
      <version>1.15.3</version>
    </dependency>
    <!--<dependency>
      <groupId>com.aliyun.openservices</groupId>
      <artifactId>ons-client</artifactId>