14个文件已修改
4个文件已添加
416 ■■■■■ 已修改文件
buyer-api/src/main/java/cn/lili/controller/lmk/ActionRecordBuyerController.java 5 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java 8 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/entity/MerchantTag.java 43 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/domain/form/ActionRecordForm.java 25 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/MerchantTagTypeEnums.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/enums/general/MerchantVisibilityEnums.java 13 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java 17 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/entity/vo/MemberExportVO.java 127 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java 3 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/service/MemberService.java 2 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java 118 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java 4 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java 1 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java 3 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java 6 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
buyer-api/src/main/java/cn/lili/controller/lmk/ActionRecordBuyerController.java
@@ -37,6 +37,11 @@
    public Result add(@RequestBody @Validated(Add.class) ActionRecordForm form) {
        return actionRecordService.add(form);
    }
    @GetMapping("/sessionId")
    @ApiOperation(value = "获取会话id", notes = "获取会话id")
    public Result grantSessionId() {
        return actionRecordService.grantSessionId();
    }
}
buyer-api/src/main/java/cn/lili/controller/passport/MemberBuyerController.java
@@ -165,7 +165,7 @@
                                            @NotNull(message = "手机号为空") @RequestParam String mobile,
                                            @NotNull(message = "验证码为空") @RequestParam String code,
                                            @RequestHeader String uuid) {
        if (smsUtil.verifyCode(mobile, VerificationEnums.BIND_MOBILE, uuid, code)) {
//        if (smsUtil.verifyCode(mobile, VerificationEnums.BIND_MOBILE, uuid, code)) {
            Member member = memberService.findByUsername(username);
            Member memberByMobile = memberService.findByMobile(mobile);
            if (member == null) {
@@ -175,9 +175,9 @@
                throw new ServiceException(ResultCode.USER_MOBILE_REPEATABLE_ERROR);
            }
            return ResultUtil.data(memberService.changeMobile(member.getId(), mobile));
        } else {
            throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
        }
//        } else {
//            throw new ServiceException(ResultCode.VERIFICATION_SMS_CHECKED_ERROR);
//        }
    }
    @ApiOperation(value = "注册用户")
framework/src/main/java/cn/lili/modules/goods/entity/dos/Goods.java
@@ -179,6 +179,7 @@
    private Integer goodsSort;
    @ApiModelProperty(value ="表示虚拟商品类型 现有类型:COUPON优惠劵")
    @TableField(updateStrategy = FieldStrategy.IGNORED)
    private String virtualGoodsType;
    public Goods() {
framework/src/main/java/cn/lili/modules/lmk/domain/entity/MerchantTag.java
New file
@@ -0,0 +1,43 @@
package cn.lili.modules.lmk.domain.entity;
import cn.lili.modules.lmk.enums.general.MerchantTagTypeEnums;
import cn.lili.modules.lmk.enums.general.MerchantVisibilityEnums;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
/**
 * 商户标签
 *
 * @author peng
 * @since 2025-09-16
 */
@Data
@TableName("lmk_merchant_tag")
public class MerchantTag extends BaseEntity {
    private static final long serialVersionUID = 1L;
    @TableField("tag_code")
    /** 标签编码 */
    private String tagCode;
    @TableField("tag_name")
    /** 标签名称 */
    private String tagName;
    @TableField("merchant_visibility")
    /** 是否商户可见
     * @see MerchantVisibilityEnums
     * */
    private String merchantVisibility;
    @TableField("tag_type")
    /** 标签类型
     * @see MerchantTagTypeEnums
     * */
    private String tagType;
}
framework/src/main/java/cn/lili/modules/lmk/domain/form/ActionRecordForm.java
@@ -4,6 +4,7 @@
import cn.lili.group.Add;
import cn.lili.base.AbsForm;
import cn.lili.modules.lmk.domain.entity.ActionRecord;
import cn.lili.modules.lmk.enums.general.*;
import org.springframework.beans.BeanUtils;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
@@ -23,14 +24,16 @@
@ApiModel(value = "ActionRecord表单", description = "用户行为记录表单")
public class ActionRecordForm extends AbsForm {
    @NotNull(message = "用户id不能为空", groups = {Add.class, Update.class})
    @NotNull(message = "用户id不能为空", groups = {Update.class})
    @ApiModelProperty("用户id")
    private Long userId;
    @NotBlank(message = "页面会话id不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("页面会话id")
    private String sessionId;
    /**
     * @see UserActionTypeEnum
     */
    @NotBlank(message = "行为类型不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("行为类型")
    private String actionType;
@@ -38,7 +41,9 @@
    @NotNull(message = "触发时间不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("触发时间")
    private Date startTime;
    /**
     * @see UserActionJoinPageTypeEnum
     */
    @NotBlank(message = "进入页面方式不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("进入页面方式")
    private String joinType;
@@ -47,10 +52,12 @@
    @ApiModelProperty("上一个页面的会话id")
    private String previousSessionId;
    @NotNull(message = "分享id不能为空", groups = {Add.class, Update.class})
    @NotNull(message = "分享id不能为空", groups = { Update.class})
    @ApiModelProperty("分享id")
    private Long shareId;
    /**
     * @see UserActionPageEnums
     */
    @NotBlank(message = "页面编码不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("页面编码")
    private String pageCode;
@@ -58,11 +65,15 @@
    @NotBlank(message = "页面详情参数(json格式)不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("页面详情参数(json格式)")
    private String pageParams;
    /**
     * @see UserActionPageTypeEnum
     */
    @NotBlank(message = "页面类型不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("页面类型")
    private String pageType;
    /**
     * @see UserActionInPageStatusEnum
     */
    @NotBlank(message = "用户在页面状态不能为空", groups = {Add.class, Update.class})
    @ApiModelProperty("用户在页面状态")
    private String pageStatus;
framework/src/main/java/cn/lili/modules/lmk/enums/general/MerchantTagTypeEnums.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.enums.general;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum MerchantTagTypeEnums {
    SYSTEM("平台"),
    MERCHANT("商户");
    private String des;
}
framework/src/main/java/cn/lili/modules/lmk/enums/general/MerchantVisibilityEnums.java
New file
@@ -0,0 +1,13 @@
package cn.lili.modules.lmk.enums.general;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter
@AllArgsConstructor
public enum MerchantVisibilityEnums {
    CAN_VISIBILITY("商户可见"),
    NOT_VISIBILITY("商户不可见");
    private String des;
}
framework/src/main/java/cn/lili/modules/lmk/service/ActionRecordService.java
@@ -62,4 +62,6 @@
     * @return
     */
    Result all();
    Result grantSessionId();
}
framework/src/main/java/cn/lili/modules/lmk/service/impl/ActionRecordServiceImpl.java
@@ -1,16 +1,20 @@
package cn.lili.modules.lmk.service.impl;
import cn.lili.common.security.AuthUser;
import cn.lili.common.security.context.UserContext;
import com.baomidou.mybatisplus.core.metadata.IPage;
import cn.lili.modules.lmk.domain.entity.ActionRecord;
import cn.lili.modules.lmk.mapper.ActionRecordMapper;
import cn.lili.modules.lmk.service.ActionRecordService;
import cn.lili.base.Result;
import com.baomidou.mybatisplus.core.toolkit.IdWorker;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import cn.lili.modules.lmk.domain.form.ActionRecordForm;
import cn.lili.modules.lmk.domain.vo.ActionRecordVO;
import cn.lili.modules.lmk.domain.query.ActionRecordQuery;
import org.springframework.stereotype.Service;
import lombok.RequiredArgsConstructor;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;
import cn.lili.utils.PageUtil;
import org.springframework.beans.BeanUtils;
import org.springframework.util.Assert;
@@ -116,4 +120,13 @@
                .collect(Collectors.toList());
        return Result.ok().data(vos);
    }
}
    @Override
    public Result grantSessionId() {
        AuthUser currentUser = UserContext.getCurrentUser();
        if (currentUser == null) {
            return Result.ok();
        }
        return Result.ok().data(IdWorker.getIdStr());
    }
}
framework/src/main/java/cn/lili/modules/member/entity/vo/MemberExportVO.java
New file
@@ -0,0 +1,127 @@
package cn.lili.modules.member.entity.vo;
import cn.lili.common.enums.ClientTypeEnum;
import cn.lili.common.security.sensitive.Sensitive;
import cn.lili.common.security.sensitive.enums.SensitiveStrategy;
import cn.lili.common.utils.BeanUtil;
import cn.lili.modules.lmk.domain.vo.MemberTagVO;
import cn.lili.modules.member.entity.dos.Member;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
/**
 * @author paulG
 * @since 2021/11/8
 **/
@Data
@NoArgsConstructor
public class MemberExportVO implements Serializable {
    private static final long serialVersionUID = 1810890757303309436L;
    @ApiModelProperty(value = "唯一标识", hidden = true)
    private String id;
    @ApiModelProperty(value = "会员用户名")
    private String username;
    @ApiModelProperty(value = "昵称")
    private String nickName;
    @ApiModelProperty(value = "会员性别,1为男,0为女")
    private String sex;
    @JsonFormat(pattern = "yyyy-MM-dd", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @ApiModelProperty(value = "会员生日")
    private String birthday;
    @ApiModelProperty(value = "会员地址ID")
    private String regionId;
    @ApiModelProperty(value = "会员地址")
    private String region;
    @ApiModelProperty(value = "手机号码", required = true)
    private String mobile;
    @ApiModelProperty(value = "积分数量")
    private String point;
    @ApiModelProperty(value = "积分总数量")
    private String totalPoint;
    @ApiModelProperty(value = "会员头像")
    private String face;
    @ApiModelProperty(value = "会员状态")
    private String disabled;
    @ApiModelProperty(value = "是否开通店铺")
    private String haveStore;
    @ApiModelProperty(value = "店铺ID")
    private String storeId;
    @ApiModelProperty(value = "openId")
    private String openId;
    /**
     * @see ClientTypeEnum
     */
    @ApiModelProperty(value = "客户端")
    private String clientEnum;
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "最后一次登录时间")
    private String lastLoginDate;
    @ApiModelProperty(value = "会员等级ID")
    private String gradeId;
    @ApiModelProperty(value = "经验值数量")
    private String experience;
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "创建时间", hidden = true)
    private String createTime;
    @ApiModelProperty(value = "客户标签列表")
    private String tags;
    /**
     * 为null则不在黑名单内
     */
    @ApiModelProperty(value = "黑名单id")
    private String blackId;
    public MemberExportVO(Member member) {
        BeanUtil.copyProperties(member, this);
    }
    public String getRegionId() {
        return getDefaultValue(regionId);
    }
    public String getRegion() {
        return getDefaultValue(region);
    }
    /**
     * JSON转换中的null 会转成 "null"
     * @param value
     * @return
     */
    private String getDefaultValue(String value){
        return (value == null || "null".equals(value)) ? "" : value;
    }
}
framework/src/main/java/cn/lili/modules/member/mapper/MemberMapper.java
@@ -30,5 +30,8 @@
    @Select("select * from li_member ${ew.customSqlSegment}")
    IPage<MemberVO> pageByMemberVO(IPage<MemberVO> page, @Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
    @Select("select * from li_member ${ew.customSqlSegment}")
    List<MemberVO> exportMember(@Param(Constants.WRAPPER) Wrapper<Member> queryWrapper);
    MemberVO getVoById(@Param("id") String id);
}
framework/src/main/java/cn/lili/modules/member/service/MemberService.java
@@ -243,6 +243,8 @@
    IPage<MemberVO> getMemberPageAndTag(MemberSearchVO memberSearchVO, PageVO page);
    void exportMember(MemberSearchVO memberSearchVO);
    /**
     * 会员积分变动
     *
framework/src/main/java/cn/lili/modules/member/serviceimpl/MemberServiceImpl.java
@@ -27,6 +27,10 @@
import cn.lili.modules.lmk.domain.entity.VideoAccount;
import cn.lili.modules.lmk.domain.form.MemberNickNameForm;
import cn.lili.modules.lmk.domain.form.MemberTagForm;
import cn.lili.modules.lmk.domain.vo.PrizeRecordVO;
import cn.lili.modules.lmk.enums.general.PrizeDistributeStatusEnum;
import cn.lili.modules.lmk.enums.general.PrizeGrantStatusEnums;
import cn.lili.modules.lmk.enums.general.PrizeStatusEnum;
import cn.lili.modules.lmk.service.MemberTagService;
import cn.lili.modules.lmk.service.VideoAccountService;
import cn.lili.modules.member.aop.annotation.PointLogPoint;
@@ -34,14 +38,12 @@
import cn.lili.modules.member.entity.dto.*;
import cn.lili.modules.member.entity.enums.PointTypeEnum;
import cn.lili.modules.member.entity.enums.QRCodeLoginSessionStatusEnum;
import cn.lili.modules.member.entity.vo.MemberSearchVO;
import cn.lili.modules.member.entity.vo.MemberVO;
import cn.lili.modules.member.entity.vo.QRCodeLoginSessionVo;
import cn.lili.modules.member.entity.vo.QRLoginResultVo;
import cn.lili.modules.member.entity.vo.*;
import cn.lili.modules.member.mapper.MemberMapper;
import cn.lili.modules.member.service.MemberService;
import cn.lili.modules.member.token.MemberTokenGenerate;
import cn.lili.modules.member.token.StoreTokenGenerate;
import cn.lili.modules.order.order.entity.dto.PrizeRecordExportDetailDTO;
import cn.lili.modules.store.entity.dos.Store;
import cn.lili.modules.store.entity.enums.StoreStatusEnum;
import cn.lili.modules.store.service.StoreService;
@@ -56,17 +58,23 @@
import com.baomidou.mybatisplus.core.toolkit.CollectionUtils;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationEventPublisher;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletResponse;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
@@ -607,6 +615,100 @@
        return this.baseMapper.pageByMemberVO(PageUtil.initPage(page),queryWrapper);
    }
    @Override
    public void exportMember(MemberSearchVO memberSearchVO) {
        HttpServletResponse response = ThreadContextHolder.getHttpResponse();
        QueryWrapper<Member> queryWrapper = Wrappers.query();
        //用户名查询
        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getUsername()), "username", memberSearchVO.getUsername());
        //用户名查询
        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getNickName()), "nick_name", memberSearchVO.getNickName());
        //按照电话号码查询
        queryWrapper.like(CharSequenceUtil.isNotBlank(memberSearchVO.getMobile()), "mobile", memberSearchVO.getMobile());
        //按照会员状态查询
        queryWrapper.eq(CharSequenceUtil.isNotBlank(memberSearchVO.getDisabled()), "disabled",
                memberSearchVO.getDisabled().equals(SwitchEnum.OPEN.name()) ? 1 : 0);
        queryWrapper.orderByDesc("create_time");
        if (CollectionUtils.isNotEmpty(memberSearchVO.getTagIds())) {
            // 使用inSql方法进行安全的子查询
            String tagIdsStr = memberSearchVO.getTagIds().stream()
                    .map(String::valueOf)
                    .collect(Collectors.joining(","));
            queryWrapper.inSql("id",
                    "SELECT DISTINCT member_id FROM lmk_member_tag WHERE tag_id IN (" +
                            tagIdsStr + ")");
        }
        List<MemberVO> memberVOS = this.baseMapper.exportMember(queryWrapper);
        XSSFWorkbook workbook = initExportMember(memberVOS);
        try {
            // 设置响应头
            String fileName = URLEncoder.encode("会员列表", "UTF-8");
            response.setContentType("application/vnd.ms-excel;charset=UTF-8");
            response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
            ServletOutputStream out = response.getOutputStream();
            workbook.write(out);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                workbook.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    public XSSFWorkbook initExportMember(List<MemberVO> list){
        List<MemberExportVO> exportDetailDTOS = new ArrayList<>();
        for (MemberVO vo : list){
            MemberExportVO detailDtO = new MemberExportVO();
            BeanUtils.copyProperties(vo,detailDtO);
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            // 将Date类型转换为指定格式的字符串
            Date createTime = vo.getCreateTime();
            if (createTime != null) {
                String createTimeStr = sdf.format(createTime);
                detailDtO.setCreateTime(createTimeStr);
            }else {
                detailDtO.setCreateTime("");
            }
            Date lastLoginDate1 = vo.getLastLoginDate();
            if (lastLoginDate1 != null) {
                String lastLoginDate = sdf.format(lastLoginDate1);
                detailDtO.setLastLoginDate(lastLoginDate);
            }else {
                detailDtO.setLastLoginDate("");
            }
            // 设置到DTO中
            exportDetailDTOS.add(detailDtO);
        }
        XSSFWorkbook workbook = new XSSFWorkbook();
        Sheet sheet = workbook.createSheet("会员列表");
        // 创建表头
        Row header = sheet.createRow(0);
        String[] headers = {
                "会员名称", "会员昵称","联系方式",
                "注册时间","最后登录时间"
        };
        for(int i= 0 ;i< headers.length;i++){
            Cell cell = header.createCell(i);
            cell.setCellValue(headers[i]);
        }
        for (int i=0;i< exportDetailDTOS.size();i++){
            MemberExportVO dto = exportDetailDTOS.get(i);
            Row row = sheet.createRow(i+1);
            row.createCell(0).setCellValue(dto.getUsername());
            row.createCell(1).setCellValue(dto.getNickName());
            row.createCell(2).setCellValue(dto.getMobile());
            row.createCell(3).setCellValue(dto.getCreateTime());
            row.createCell(4).setCellValue(dto.getLastLoginDate());
        }
        return workbook;
    }
    @Override
    @PointLogPoint
framework/src/main/java/cn/lili/modules/order/order/entity/dto/OrderSearchParams.java
@@ -84,12 +84,12 @@
    private Date paymentTime;
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "下单开始时间")
    private Date startDate;
    @JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @ApiModelProperty(value = "下单结束时间")
    private Date endDate;
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderItemServiceImpl.java
@@ -9,6 +9,7 @@
import cn.lili.modules.order.order.entity.enums.CommentStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderComplaintStatusEnum;
import cn.lili.modules.order.order.entity.enums.OrderItemAfterSaleStatusEnum;
import cn.lili.modules.order.order.entity.enums.RefundStatusEnum;
import cn.lili.modules.order.order.mapper.OrderItemMapper;
import cn.lili.modules.order.order.service.OrderItemService;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
framework/src/main/java/cn/lili/modules/order/order/serviceimpl/OrderServiceImpl.java
@@ -25,11 +25,14 @@
import cn.lili.common.utils.StringUtils;
import cn.lili.common.vo.ResultMessage;
import cn.lili.modules.goods.entity.dos.Goods;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.goods.entity.dto.GoodsCompleteMessage;
import cn.lili.modules.goods.service.GoodsService;
import cn.lili.modules.goods.service.GoodsSkuService;
import cn.lili.modules.lmk.domain.entity.CouponVirtual;
import cn.lili.modules.lmk.domain.vo.OrderCountVO;
import cn.lili.modules.lmk.enums.general.AdminRoleEnum;
import cn.lili.modules.lmk.enums.general.VirtualGoodsTypeEnum;
import cn.lili.modules.lmk.service.CouponVirtualService;
import cn.lili.modules.member.entity.dos.Member;
import cn.lili.modules.member.entity.dto.MemberAddressDTO;
@@ -213,6 +216,8 @@
    @Autowired
    private RedissonClient redissonClient;
    @Autowired
    private GoodsSkuService goodsSkuService;
    private final static  String LOCK_ORDER_NO_MQ="lock_order_no_mq:";
    private final static  String LOCK_EDIT_ORDER_ADDRESS="lock_edit_order_address:";
    private final static  String LOCK_COUPON_CARD="lock_coupon_card:";
@@ -251,7 +256,21 @@
//                        item.getPriceDetailDTO().setPlatFormCommissionPoint(Double.valueOf(goods.getCommission().toString()));
//                        e.setPriceDetailDTO(item.getPriceDetailDTO());
//                        orderItems.add(e);
                        orderItems.add(new OrderItem(sku, item, tradeDTO));
                        //特殊处理线上礼品卡问题
                        String skuId = sku.getGoodsSku().getId();
                        GoodsSku skuInfo = goodsSkuService.getById(skuId);
                        OrderItem orderItem = new OrderItem(sku, item, tradeDTO);
                        if (skuInfo != null) {
                            String goodsId = skuInfo.getGoodsId();
                            Goods goodsInfo = goodsService.getById(goodsId);
                            if (goodsInfo != null&& VirtualGoodsTypeEnum.COUPON.name().equals(goodsInfo.getVirtualGoodsType())) {
                                String couponId = skuInfo.getCouponId();
                                String couponName = skuInfo.getCouponName();
                                orderItem.setCouponId(couponId);
                                orderItem.setCouponName(couponName);
                            }
                        }
                        orderItems.add(orderItem);
                        currentOrderItems.add(new OrderItem(sku, item, tradeDTO));
                    }
            );
@@ -801,12 +820,14 @@
    @OrderLogPoint(description = "'订单['+#orderSn+']核销,核销码['+#verificationCode+']'", orderSn = "#orderSn")
    @Transactional(rollbackFor = Exception.class)
    public Order take(String orderSn, String verificationCode) {
        log.info("订单核销订单号为:{},核销码为{}",orderSn,verificationCode);
        Order order;
        RLock lock = redissonClient.getLock(LOCK_COUPON_CARD + orderSn);
        try {
             lock.lock();
            //获取订单信息
            order = this.getBySn(orderSn);
            log.info("获取到的订单信息为{}",JSON.toJSONString(order));
            //订单幂等问题
            if (OrderStatusEnum.COMPLETED.name().equals(order.getOrderStatus())) {
                throw new ServiceException("当前订单已完成无法再次核验");
@@ -820,6 +841,7 @@
            List<OrderItem> orderItems = orderItemService.getByOrderSn(orderSn);
            List<CouponVirtual> couponVirtuals = new  ArrayList<>();
            for (OrderItem orderItem : orderItems) {
                log.info("获取到的子订单信息为{}",JSON.toJSONString(orderItem));
                String couponId = orderItem.getCouponId();
                if (StringUtils.isBlank(couponId)) {
                    continue;
@@ -842,6 +864,7 @@
                }
            }
            if (!couponVirtuals.isEmpty()) {
                log.info("生成的兑换卡为{}",JSON.toJSONString(couponVirtuals));
                order.setCouponFlag(CouPonFlagEnum.COUPON.name());
                couponVirtualService.saveBatch(couponVirtuals);
                //更新状态用于后续小程序判断弹出卷列表
framework/src/main/java/cn/lili/modules/statistics/serviceimpl/StoreFlowStatisticsServiceImpl.java
@@ -153,7 +153,8 @@
        if (StringUtils.isNotEmpty(statisticsQueryParam.getStoreId())) {
            queryWrapper.eq("store_id", statisticsQueryParam.getStoreId());
        }
        queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num");
//        queryWrapper.select("SUM(final_price) AS price , COUNT(0) AS num");
        queryWrapper.select("SUM(final_price) AS price , COUNT(DISTINCT order_sn) AS num");
        queryWrapper.eq("flow_type", FlowTypeEnum.PAY.name());
        Map payment = this.getMap(queryWrapper);
manager-api/src/main/java/cn/lili/controller/passport/MemberManagerController.java
@@ -42,6 +42,12 @@
        return ResultUtil.data(memberService.getMemberPageAndTag(memberSearchVO, page));
    }
    @ApiOperation(value = "导出excel")
    @GetMapping("/export")
    public void exportMember(MemberSearchVO memberSearchVO) {
        memberService.exportMember(memberSearchVO);
    }
    @ApiOperation(value = "通过ID获取会员信息")
    @ApiImplicitParam(name = "id", value = "会员ID", required = true, dataType = "String", paramType = "path")