后端代码提交

This commit is contained in:
zzp
2025-06-24 16:36:16 +08:00
parent 5d67138089
commit f2bfe095e5
643 changed files with 21444 additions and 0 deletions

View File

@@ -0,0 +1,17 @@
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.acticitystyle.ActivityStyle;
/**
* <p>
* 活动样式 Mapper 接口
* </p>
*
* @author dazongzi
* @since 2023-01-05
*/
public interface ActivityStyleDao extends BaseMapper<ActivityStyle> {
}

View File

@@ -0,0 +1,16 @@
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.exception.ExceptionLog;
/**
* <p>
* 异常信息表 Mapper 接口
* </p>
*
* @author HZW
* @since 2023-02-27
*/
public interface ExceptionLogDao extends BaseMapper<ExceptionLog> {
}

View File

@@ -0,0 +1,20 @@
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.wechat.WechatProgramMyTemp;
/**
* 小程序我的模板 Mapper 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface WechatProgramMyTempDao extends BaseMapper<WechatProgramMyTemp> {
}

View File

@@ -0,0 +1,20 @@
package com.zbkj.service.dao;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.wechat.WechatProgramPublicTemp;
/**
* Mapper 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface WechatProgramPublicTempDao extends BaseMapper<WechatProgramPublicTemp> {
}

View File

@@ -0,0 +1,17 @@
package com.zbkj.service.dao.page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.page.PageCategory;
/**
* <p>
* 页面链接分类 Mapper 接口
* </p>
*
* @author dazongzi
* @since 2023-05-16
*/
public interface PageCategoryDao extends BaseMapper<PageCategory> {
}

View File

@@ -0,0 +1,16 @@
package com.zbkj.service.dao.page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.page.PageDiy;
/**
* <p>
* DIY数据表 Mapper 接口
* </p>
*
* @author dazongzi
* @since 2023-05-16
*/
public interface PageDiyDao extends BaseMapper<PageDiy> {
}

View File

@@ -0,0 +1,17 @@
package com.zbkj.service.dao.page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.zbkj.common.model.page.PageLink;
/**
* <p>
* 页面链接 Mapper 接口
* </p>
*
* @author dazongzi
* @since 2023-05-16
*/
public interface PageLinkDao extends BaseMapper<PageLink> {
}

View File

@@ -0,0 +1,174 @@
package com.zbkj.service.exception;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.common.model.exception.ExceptionLog;
import com.zbkj.common.result.CommonResult;
import com.zbkj.service.service.ExceptionLogService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.http.HttpStatus;
import org.springframework.jdbc.BadSqlGrammarException;
import org.springframework.jdbc.UncategorizedSQLException;
import org.springframework.validation.BindException;
import org.springframework.validation.BindingResult;
import org.springframework.web.HttpMediaTypeNotSupportedException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.MissingServletRequestParameterException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.util.Objects;
/**
* 全局参数、异常拦截
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
// private static String REQUESTBODY = "requestBodyMessage";
@Autowired
private ExceptionLogService exceptionLogService;
/**
* 拦截表单参数校验
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler({BindException.class})
public CommonResult bindException(HttpServletRequest request, BindException e) {
doLog(request, e);
BindingResult bindingResult = e.getBindingResult();
return CommonResult.failed(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
/**
* 拦截JSON参数校验
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(MethodArgumentNotValidException.class)
public CommonResult bindException(HttpServletRequest request, MethodArgumentNotValidException e) {
doLog(request, e);
BindingResult bindingResult = e.getBindingResult();
return CommonResult.failed(Objects.requireNonNull(bindingResult.getFieldError()).getDefaultMessage());
}
/**
* 拦截参数类型不正确
*
* @param e
* @return
*/
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(HttpMediaTypeNotSupportedException.class)
public CommonResult bindException(HttpServletRequest request, HttpMediaTypeNotSupportedException e) {
doLog(request, e);
return CommonResult.failed().setMessage(Objects.requireNonNull(e.getMessage()));
}
/**
* 错误SQL语句异常
*/
@ExceptionHandler(BadSqlGrammarException.class)
public CommonResult handleBadSqlGrammarException(HttpServletRequest request, BadSqlGrammarException e) {
doLog(request, e);
return CommonResult.failed().setMessage("服务器数据异常,请联系管理员");
}
/**
* 拦截表示违反数据库的完整性约束导致的异常
*/
@ExceptionHandler(DataIntegrityViolationException.class)
public CommonResult handleDataIntegrityViolationException(HttpServletRequest request, DataIntegrityViolationException e) {
doLog(request, e);
return CommonResult.failed().setMessage( "服务器数据异常,请联系管理员");
}
/**
* 拦截违反数据库的非完整性约束导致的异常,可能也会拦截一些也包括 SQL 语句错误、连接问题、权限问题等各种数据库异常
*/
@ExceptionHandler(UncategorizedSQLException.class)
public CommonResult handleUncategorizedSqlException(HttpServletRequest request, UncategorizedSQLException e) {
doLog(request, e);
return CommonResult.failed().setMessage("服务器数据异常,请联系管理员");
}
//声明要捕获的异常
@ResponseStatus(HttpStatus.OK)
@ExceptionHandler(Exception.class)
@ResponseBody
public <T> CommonResult<?> defaultExceptionHandler(HttpServletRequest request, Exception e) {
doLog(request, e);
e.printStackTrace();
if (e instanceof CrmebException) {
return CommonResult.failed().setMessage(Objects.requireNonNull(e.getMessage()));
}
if (e instanceof MissingServletRequestParameterException) {
return CommonResult.failed().setMessage(Objects.requireNonNull(e.getMessage()));
}
//未知错误
return CommonResult.failed().setMessage(e.getMessage());
}
/**
* 打印日志
*/
private void doLog(HttpServletRequest request, Exception e) {
log.error("捕获到异常:", e);
// 加入数据库日志记录
StringWriter sw = new StringWriter();
e.printStackTrace(new PrintWriter(sw, true));
// 异常的详情
String expDetail = sw.toString();
try {
sw.close();
} catch (IOException ioException) {
log.error("异常日志关闭异常详情Writer异常");
}
// 异常的url
String expUrl = request.getRequestURI();
// 异常的参数 暂时不记录入参
// Object body = request.getAttribute(REQUESTBODY);
// String expParams = ObjectUtil.isNotNull(body) ? body.toString() : "";
// 异常的类型
String expType = e.getClass().getName();
// 异常的类名
StackTraceElement stackTraceElement = e.getStackTrace()[0];
String expController = stackTraceElement.getClassName();
// 异常的方法名
String expMethod = stackTraceElement.getMethodName();
ExceptionLog exceptionLog = new ExceptionLog();
exceptionLog.setExpUrl(expUrl);
// exceptionLog.setExpParams(expParams);
exceptionLog.setExpParams("");
exceptionLog.setExpType(expType);
exceptionLog.setExpController(expController);
exceptionLog.setExpMethod(expMethod);
exceptionLog.setExpDetail(expDetail);
exceptionLogService.save(exceptionLog);
}
}

View File

@@ -0,0 +1,58 @@
package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.model.acticitystyle.ActivityStyle;
import com.zbkj.common.model.product.StoreProduct;
import com.zbkj.common.request.ActivityStyleSearchRequest;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.ActivityStyleResponse;
import java.util.List;
/**
* @author dazongzi
* @description ActivityStyleService 接口
* @date 2023-01-05
*/
public interface ActivityStyleService extends IService<ActivityStyle> {
/**
* 分页查询活动样式
* @param request 查询条件
* @param pageParamRequest 分页对行
* @return 查询结果
*/
PageInfo<ActivityStyleResponse> getList(ActivityStyleSearchRequest request, PageParamRequest pageParamRequest);
/**
* 更新
* @param id id
* @param status 活动样式 状态
* @return 更新状态结果
*/
boolean updateStatus(Integer id, boolean status);
/**
* 根据服务器时间查询正在进行和即将开始的活动边框配置 并缓存在redis中
* 缓存时常5分钟
* @param type 0边框 1背景
* @return 正在进行和未开始的活动边框配置数据
*/
List<ActivityStyle> getListBeforeBeginTime(boolean type);
/**
* 填补活动边框 用于商品列表
* @param productList 待添加商品数据
* @return
*/
List<StoreProduct> makeActivityBorderStyle(List<StoreProduct> productList);
/**
* 填补活动背景 用于商品详情
* @param product 待添加活动背景的商品
* @return 已经添加活动背景的商品
*/
String makeActivityBackgroundStyle(StoreProduct product);
}

View File

@@ -0,0 +1,20 @@
package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.common.model.exception.ExceptionLog;
/**
* ExceptionLogService 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface ExceptionLogService extends IService<ExceptionLog> {
}

View File

@@ -0,0 +1,37 @@
package com.zbkj.service.service;
/**
* 京东云 Service
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface JdCloudService {
/**
* 文件上传
* @param fileName 文件名称
* @param localFilePath 本地文件地址
* @param bucket 存储桶名称
*/
void uploadFile(String fileName, String localFilePath, String bucket);
/**
* 创建新的存储空间
*/
void createBucket(String bucketName);
/**
* 获取文件URL
* @param bucket 存储桶名称
* @param fileName 文件名称
*/
String getUrl(String bucket, String fileName);
}

View File

@@ -0,0 +1,76 @@
package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.common.model.page.PageDiy;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.request.page.PageDiyEditNameRequest;
import com.zbkj.common.response.page.PageDiyResponse;
import java.util.List;
/**
* @author dazongzi
* @description PageDiyService 接口
* @date 2023-05-16
*/
public interface PageDiyService extends IService<PageDiy> {
/**
* 列表
* @author dazongzi
* @since 2023-05-16
* @return List<PageDiy>
*/
List<PageDiy> getList(String name,PageParamRequest pageParamRequest);
/**
* 保存diy
* @param pageDiy
*/
PageDiy savePageDiy(PageDiy pageDiy);
/**
* 更新diy
* @param pageDiy
*/
Boolean editPageDiy(PageDiy pageDiy);
/**
* 编辑diy名称
* @param pageDiyEditNameRequest 待编辑名称对象
*/
Boolean editPageDiyName(PageDiyEditNameRequest pageDiyEditNameRequest);
/**
* 设置DIY首页模版
* @param diyId 被设置为首页的diy模版id
* @return 设置结果
*/
Boolean setDiyPageHome(Integer diyId);
/**
* 获取DIY首页模版Id
* @param isLoadValue 是否加载value详情数据
* @return 首页模版ID
*/
PageDiy getDiyPageHome(Boolean isLoadValue);
/** 针对Front
* 根据id加载diy模版配置
* @param id 对应的模版id
* 描述:
* id=0加载商城首页的也就是setDiyPageHome后的数据平台端会默认设置已经有首页的数据也会预制
* id>1时加载对应的模版即可
*/
PageDiyResponse getDiyPageByPageIdForFront(Integer id);
/** 针对Admin
* 根据id加载diy模版配置
* @param id 对应的模版id
* 描述:
* id=0加载商城首页的也就是setDiyPageHome后的数据平台端会默认设置已经有首页的数据也会预制
* id>1时加载对应的模版即可
*/
PageDiy getDiyPageByPageIdForAdmin(Integer id);
}

View File

@@ -0,0 +1,88 @@
package com.zbkj.service.service;
import com.alibaba.fastjson.JSONObject;
import com.zbkj.common.response.pagelayout.PageLayoutBottomNavigationResponse;
import com.zbkj.common.vo.MyRecord;
import java.util.HashMap;
/**
* 页面布局接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface PageLayoutService {
/**
* 页面首页
* @return 首页信息
*/
HashMap<String, Object> index();
/**
* 首页保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean save(JSONObject jsonObject);
/**
* 页面首页banner保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean indexBannerSave(JSONObject jsonObject);
/**
* 页面首页menu保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean indexMenuSave(JSONObject jsonObject);
/**
* 页面首页新闻保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean indexNewsSave(JSONObject jsonObject);
/**
* 页面用户中心banner保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean userBannerSave(JSONObject jsonObject);
/**
* 页面用户中心导航保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean userMenuSave(JSONObject jsonObject);
/**
* 页面用户中心商品table保存
* @param jsonObject 数据
* @return Boolean
*/
Boolean indexTableSave(JSONObject jsonObject);
/**
* 获取页面底部导航信息
*/
PageLayoutBottomNavigationResponse getBottomNavigation();
/**
* 页面底部导航信息保存
* @return 保存结果
*/
Boolean bottomNavigationSave(JSONObject jsonObject);
}

View File

@@ -0,0 +1,66 @@
package com.zbkj.service.service;
import com.alibaba.fastjson.JSONObject;
import com.zbkj.common.vo.QrCodeVo;
import java.util.Map;
/**
* QrCodeService 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2023 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface QrCodeService {
/**
* 获取二维码
*
* @return QrCodeVo
*/
QrCodeVo getWecahtQrCode(JSONObject data);
/**
* 远程图片转base64
*
* @param url 图片链接地址
* @return QrCodeVo
*/
QrCodeVo urlToBase64(String url);
/**
* 将字符串 转base64
* @param text 字符串
* @param width 宽
* @param height 高
* @return QrCodeVo
*/
QrCodeVo strToBase64(String text, Integer width, Integer height);
/**
* 获取二维码
* @return CommonResult
*/
Map<String, Object> get(JSONObject data);
/**
* 远程图片转base64
* @param url 图片链接地址
*/
Map<String, Object> base64(String url);
/**
* 将字符串 转base64
* @param text 字符串
* @param width 宽
* @param height 高
*/
Map<String, Object> base64String(String text,int width, int height);
}

View File

@@ -0,0 +1,32 @@
package com.zbkj.service.service;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import javax.servlet.http.HttpServletRequest;
/**
* 类的详细说明
*
* @author Han
* @version 1.0.0
* @Date 2025/6/12
*/
public interface SafetyService {
/**
* 获取行为验证码
*/
ResponseModel getSafetyCode(CaptchaVO data, HttpServletRequest request);
/**
* 验证行为验证码
*/
ResponseModel checkSafetyCode(CaptchaVO data, HttpServletRequest request);
/**
* 行为验证码二次校验
*/
ResponseModel verifySafetyCode(CaptchaVO data);
}

View File

@@ -0,0 +1,41 @@
package com.zbkj.service.service;
import com.zbkj.common.response.*;
import java.util.List;
/**
* UserStatisticsService 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface UserStatisticsService {
/**
* 用户概览数据
* @param dateLimit 时间参数
* @return UserOverviewResponse
*/
UserOverviewResponse getOverview(String dateLimit);
/**
* 获取用户渠道数据
* @return List
*/
List<UserChannelDataResponse> getChannelData();
/**
* 用户概览数据列表(导出使用)
* @param dateLimit 时间参数
* @return UserOverviewResponse
*/
List<UserOverviewDateResponse> getOverviewList(String dateLimit);
}

View File

@@ -0,0 +1,29 @@
package com.zbkj.service.service;
import com.baomidou.mybatisplus.extension.service.IService;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.model.wechat.WechatProgramMyTemp;
import com.zbkj.common.request.WechatProgramMyTempSearchRequest;
import java.util.HashMap;
import java.util.List;
/**
* WechatProgramMyTempService 接口
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
public interface WechatProgramMyTempService extends IService<WechatProgramMyTemp> {
List<WechatProgramMyTemp> getList(WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest);
void push(int myTempId, HashMap<String, String> map, Integer userId);
}

View File

@@ -0,0 +1,420 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.zbkj.common.config.CrmebConfig;
import com.zbkj.common.constants.DateConstants;
import com.zbkj.common.constants.ProductConstants;
import com.zbkj.common.model.acticitystyle.ActivityStyle;
import com.zbkj.common.model.product.StoreProduct;
import com.zbkj.common.page.CommonPage;
import com.zbkj.common.request.ActivityStyleSearchRequest;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.response.ActivityStyleResponse;
import com.zbkj.common.utils.CrmebDateUtil;
import com.zbkj.common.utils.CrmebUtil;
import com.zbkj.common.utils.RedisUtil;
import com.zbkj.service.dao.ActivityStyleDao;
import com.zbkj.service.service.ActivityStyleService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* 活动样式
*
* @author dazongzi
* @description ActivityStyleServiceImpl 接口实现
* @date 2023-01-05
*/
@Service
public class ActivityStyleServiceImpl extends ServiceImpl<ActivityStyleDao, ActivityStyle> implements ActivityStyleService {
private static final Logger logger = LoggerFactory.getLogger(ActivityStyleService.class);
@Resource
private ActivityStyleDao dao;
@Autowired
private RedisUtil redisUtil;
@Autowired
private CrmebConfig crmebConfig;
/**
* 列表
*
* @param request 请求参数
* @param pageParamRequest 分页类参数
* @return List<ActivityStyle>
* @author dazongzi
* @since 2023-01-05
*/
@Override
public PageInfo<ActivityStyleResponse> getList(ActivityStyleSearchRequest request, PageParamRequest pageParamRequest) {
Page<ActivityStyle> stylePage = PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
Date currentDate = CrmebDateUtil.nowDateTime();
//带 ActivityStyle 类的多条件查询
LambdaQueryWrapper<ActivityStyle> lambdaQueryWrapper = Wrappers.lambdaQuery();
// type 类型不能为空 bean中已经限制
lambdaQueryWrapper.eq(ActivityStyle::getType, request.getType());
if (ObjectUtil.isNotEmpty(request.getId()) && request.getId() > 0) {
lambdaQueryWrapper.eq(ActivityStyle::getId, request.getId());
}
if (ObjectUtil.isNotEmpty(request.getName())) {
lambdaQueryWrapper.like(ActivityStyle::getName, URLUtil.decode(request.getName()));
}
if (ObjectUtil.isNotEmpty(request.getStatus())) {
lambdaQueryWrapper.eq(ActivityStyle::getStatus, request.getStatus());
}
if (ObjectUtil.isNotEmpty(request.getMethod())) {
lambdaQueryWrapper.eq(ActivityStyle::getMethod, request.getMethod());
}
// 时间区间
if (ObjectUtil.isNotEmpty(request.getStarttime()) && ObjectUtil.isNotEmpty(request.getEndtime())) {
// lambdaQueryWrapper.ge(ActivityStyle::getStarttime, request.getStarttime()).le(ActivityStyle::getEndtime, request.getEndtime());
lambdaQueryWrapper.between(ActivityStyle::getCreatetime, request.getStarttime(), request.getEndtime());
}
// * -1 已结束 结束时间小于当前时间
// * 1 进行中 结束时间大于当前时间 && 开始时间小于等于当前时间
// * 0 未开始 开始时间大于当前时间
if (ObjectUtil.isNotEmpty(request.getRunningStatus())) {
switch (request.getRunningStatus()) {
case -1:
lambdaQueryWrapper.lt(ActivityStyle::getEndtime, currentDate);
break;
case 0:
lambdaQueryWrapper.gt(ActivityStyle::getStarttime, currentDate);
break;
case 1:
lambdaQueryWrapper.ge(ActivityStyle::getEndtime, currentDate).le(ActivityStyle::getStarttime, currentDate);
break;
}
}
lambdaQueryWrapper.orderByDesc(ActivityStyle::getCreatetime);
List<ActivityStyle> activityStyles = dao.selectList(lambdaQueryWrapper);
// 添加活动状态
List<ActivityStyleResponse> activityStyleResponses = new ArrayList<>();
for (ActivityStyle activityStyle : activityStyles) {
ActivityStyleResponse activityStyleResponse = new ActivityStyleResponse();
BeanUtils.copyProperties(activityStyle, activityStyleResponse);
activityStyleResponse.setRunningStatus(activityStyle.getStarttime(), activityStyle.getEndtime(), currentDate);
activityStyleResponses.add(activityStyleResponse);
}
return CommonPage.copyPageInfo(stylePage, activityStyleResponses);
}
/**
* 更新
*
* @param id id
* @param status 活动样式 状态
* @return 更新状态结果
*/
@Override
public boolean updateStatus(Integer id, boolean status) {
ActivityStyle activityStyle = new ActivityStyle();
activityStyle.setId(id);
activityStyle.setStatus(status);
activityStyle.setUpdatetime(DateUtil.date());
return updateById(activityStyle);
}
/**
* 根据服务器时间查询正在进行和即将开始的活动边框配置 并缓存在redis中
* 缓存时常5分钟
*
* @param type 0边框 1背景
* @return 正在进行和未开始的活动边框配置数据
*/
@Override
public List<ActivityStyle> getListBeforeBeginTime(boolean type) {
if (!type && redisUtil.exists(ProductConstants.PRODUCT_ACTIVITY_STYLE_BORDER)) {
Object o = redisUtil.get(ProductConstants.PRODUCT_ACTIVITY_STYLE_BORDER);
String s = JSON.toJSONString(o);
logger.info("已经存在的缓存活动边框:${}", s);
return JSON.parseArray(s, ActivityStyle.class);
}
if (type && redisUtil.exists(ProductConstants.PRODUCT_ACTIVITY_STYLE_BACKGROUND)) {
Object o = redisUtil.get(ProductConstants.PRODUCT_ACTIVITY_STYLE_BACKGROUND);
String s = JSON.toJSONString(o);
logger.info("已经存在的缓存活动背景:${}", s);
return JSON.parseArray(s, ActivityStyle.class);
}
LambdaQueryWrapper<ActivityStyle> lambdaQueryWrapper = Wrappers.lambdaQuery();
lambdaQueryWrapper.eq(ActivityStyle::getType, type);
lambdaQueryWrapper.eq(ActivityStyle::getStatus, Boolean.TRUE);
lambdaQueryWrapper.le(ActivityStyle::getStarttime, CrmebDateUtil.nowDateTime(DateConstants.DATE_FORMAT));
lambdaQueryWrapper.ge(ActivityStyle::getEndtime, CrmebDateUtil.nowDateTime(DateConstants.DATE_FORMAT));
List<ActivityStyle> activityStyles = dao.selectList(lambdaQueryWrapper);
if (activityStyles.size() == 0) {
return new ArrayList<>();
}
if (!type) {
redisUtil.set(ProductConstants.PRODUCT_ACTIVITY_STYLE_BORDER, activityStyles,
Long.parseLong(crmebConfig.getActivityStyleCachedTime().toString()), TimeUnit.SECONDS);
logger.info("新增缓存活动边框:${}", JSON.toJSONString(activityStyles));
} else {
redisUtil.set(ProductConstants.PRODUCT_ACTIVITY_STYLE_BACKGROUND, activityStyles,
Long.parseLong(crmebConfig.getActivityStyleCachedTime().toString()), TimeUnit.SECONDS);
logger.info("新增缓存活动背景:${}", JSON.toJSONString(activityStyles));
}
return activityStyles;
}
/**
* 填补活动边框
* method 0=商品参与类型 1=指定商品参与2=指定品牌参与3=指定商品分类参与, 4=指定商户产品
*
* @param productList 待添加商品数据
* @return 添加边框之后的商品数据
*/
@Override
public List<StoreProduct> makeActivityBorderStyle(List<StoreProduct> productList) {
List<ActivityStyle> listBeforeBeginTime = getListBeforeBeginTime(Boolean.FALSE);
if (ObjectUtil.isNotNull(listBeforeBeginTime) && listBeforeBeginTime.size() > 0) {
// 根据现有生效配置 权限最大 0=全部商品参与 过滤重复配置 并且根据更新时间倒序,仅仅第一条生效
List<ActivityStyle> activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 0).collect(Collectors.toList());
// 如果是全部生效其他逻辑都会失效
if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) {
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
// 全部商品生效规则下只有最后更新的生效
ActivityStyle activityStyleCurrentAll = activityStyleAllBeforeCompare.get(0);
productList.forEach(product -> product.setActivityStyle(activityStyleCurrentAll.getStyle()));
} else {
makeActivityBorderStyleNonGlobal(productList, listBeforeBeginTime);
}
}
return productList;
}
/**
* 填补活动边框非全局
* method 1=指定商品参与2=指定品牌参与3=指定商品分类参与, 4=指定商户产品
*
* @param productList 待添加商品数据
* @return 添加边框之后的商品数据
*/
private void makeActivityBorderStyleNonGlobal(List<StoreProduct> productList, List<ActivityStyle> listBeforeBeginTime) {
// 过滤指定商品逻辑 1=指定商品参与
List<ActivityStyle> activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 1).collect(Collectors.toList());
if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) {
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
if (activityStyle.getProducts().length() == 0) {
break;
}
String[] activityBorderStyleProducts = StrUtil.split(activityStyle.getProducts(), ",");
productList.forEach(product -> {
for (String activityBorderStyleProduct : activityBorderStyleProducts) {
if (activityBorderStyleProduct.equals(product.getId().toString())) {
product.setActivityStyle(activityStyle.getStyle());
}
}
});
}
}
// 判断是否还有剩余商品没有指定活动边框
long productSurplusNum = productList.stream().filter(e -> StrUtil.isBlank(e.getActivityStyle())).count();
if (productSurplusNum <= 0L) {
return;
}
// 根据品牌过滤 2=指定品牌参与 TODO 预留
// activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 2).collect(Collectors.toList());
// if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) {
// sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
// for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
// if (activityStyle.getProducts().length() == 0) {
// break;
// }
// String[] activityBorderStyleBands = StrUtil.split(activityStyle.getProducts(), ",");
// productList.forEach(product -> {
// if (StrUtil.isBlank(product.getActivityStyle())) {
// for (String activityBorderStyleBand : activityBorderStyleBands) {
// if (ObjectUtil.isNotEmpty(product.getBrandId()) && product.getBrandId() > 0 && activityBorderStyleBand.equals(product.getBrandId().toString())) {
// product.setActivityStyle(activityStyle.getStyle());
// }
// }
// }
// });
// }
// }
productSurplusNum = productList.stream().filter(e -> StrUtil.isBlank(e.getActivityStyle())).count();
if (productSurplusNum <= 0L) {
return;
}
// 根据分类过滤 3=指定商品分类参与
activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 3).collect(Collectors.toList());
if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) {
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
if (activityStyle.getProducts().length() == 0) {
break;
}
String[] platCategoryIds = StrUtil.split(activityStyle.getProducts(), ",");
productList.forEach(product -> {
if (StrUtil.isBlank(product.getActivityStyle())) {
for (String pcid : platCategoryIds) {
if (ObjectUtil.isNotEmpty(product.getCateId())) {
List<Integer> proCateIdList = CrmebUtil.stringToArray(product.getCateId());
if (proCateIdList.contains(Integer.valueOf(pcid))) {
product.setActivityStyle(activityStyle.getStyle());
}
}
}
}
});
}
}
productSurplusNum = productList.stream().filter(e -> StrUtil.isBlank(e.getActivityStyle())).count();
if (productSurplusNum <= 0L) {
return;
}
// 根据山谷过滤 4=包含的商户所有商品参与
activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 4).collect(Collectors.toList());
if (CollUtil.isNotEmpty(activityStyleAllBeforeCompare)) {
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
if (activityStyle.getProducts().length() == 0) {
break;
}
String[] merIds = StrUtil.split(activityStyle.getProducts(), ",");
productList.forEach(product -> {
if (StrUtil.isBlank(product.getActivityStyle())) {
for (String merid : merIds) {
if (merid.equals(product.getMerId().toString())) {
product.setActivityStyle(activityStyle.getStyle());
}
}
}
});
}
}
}
/**
* 填补活动背景 用于商品详情
*
* @param product 待添加活动背景的商品
* @return 已经添加活动背景的商品
*/
@Override
public String makeActivityBackgroundStyle(StoreProduct product) {
List<ActivityStyle> listBeforeBeginTime = getListBeforeBeginTime(Boolean.TRUE);
// 根据现有生效配置 权限最大 0=全部商品参与 过滤重复配置 并且根据更新时间倒序,仅仅第一条生效
List<ActivityStyle> activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 0).collect(Collectors.toList());
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
// 如果是全部生效其他逻辑都会失效
if (activityStyleAllBeforeCompare.size() > 0) {
// 全部商品生效规则下只有最后更新的生效
ActivityStyle activityStyleCurrentAll = activityStyleAllBeforeCompare.get(0);
// product.setActivityStyle(activityStyleCurrentAll.getStyle());
return activityStyleCurrentAll.getStyle();
} else {
// 过滤指定商品逻辑 1=指定商品参与
activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 1).collect(Collectors.toList());
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
if (activityStyle.getProducts().length() == 0) {
break;
}
String[] activityBorderStyleProducts = StrUtil.split(activityStyle.getProducts(), ",");
for (String activityBorderStyleProduct : activityBorderStyleProducts) {
if (activityBorderStyleProduct.equals(product.getId().toString())) {
// product.setActivityStyle(activityStyle.getStyle());
return activityStyle.getStyle();
}
}
}
// // 根据品牌过滤 2=指定品牌参与 TODO 预留
// activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 2).collect(Collectors.toList());
// sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
// for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
// if (activityStyle.getProducts().length() == 0) {
// break;
// }
// String[] activityBorderStyleBands = StrUtil.split(activityStyle.getProducts(), ",");
// for (String activityBorderStyleBand : activityBorderStyleBands) {
// if (ObjectUtil.isNotEmpty(product.getBrandId()) && activityBorderStyleBand.equals(product.getBrandId().toString())) {
//// product.setActivityStyle(activityStyle.getStyle());
// return activityStyle.getStyle();
// }
// }
// }
// 根据分类过滤 3=指定商品分类参与
activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 3).collect(Collectors.toList());
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
if (activityStyle.getProducts().length() == 0) {
break;
}
String[] platCategoryIds = StrUtil.split(activityStyle.getProducts(), ",");
for (String pcid : platCategoryIds) {
if (pcid.equals(product.getCateId().toString())) {
// product.setActivityStyle(activityStyle.getStyle());
return activityStyle.getStyle();
}
}
}
// 根据山谷过滤 4=包含的商户所有商品参与
activityStyleAllBeforeCompare = listBeforeBeginTime.stream().filter(activityStyle -> activityStyle.getMethod() == 4).collect(Collectors.toList());
sortByActivityStyleByUpdateTime(activityStyleAllBeforeCompare);
for (ActivityStyle activityStyle : activityStyleAllBeforeCompare) {
if (activityStyle.getProducts().length() == 0) {
break;
}
String[] merIds = StrUtil.split(activityStyle.getProducts(), ",");
for (String merid : merIds) {
if (merid.equals(product.getMerId().toString())) {
// product.setActivityStyle(activityStyle.getStyle());
return activityStyle.getStyle();
}
}
}
}
return null;
}
/**
* 根据更新时间倒序排序活动数据
*
* @param toSortActivityStyleByUpdateTime 待排序活动对象集合
*/
private void sortByActivityStyleByUpdateTime(List<ActivityStyle> toSortActivityStyleByUpdateTime) {
Collections.sort(toSortActivityStyleByUpdateTime, new Comparator<ActivityStyle>() {
@Override
public int compare(ActivityStyle o1, ActivityStyle o2) {
return CrmebDateUtil.compareDate(
CrmebDateUtil.dateToStr(o2.getUpdatetime(), DateConstants.DATE_FORMAT),
CrmebDateUtil.dateToStr(o1.getUpdatetime(), DateConstants.DATE_FORMAT), DateConstants.DATE_FORMAT);
}
});
}
}

View File

@@ -0,0 +1,30 @@
package com.zbkj.service.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zbkj.common.model.exception.ExceptionLog;
import com.zbkj.service.dao.ExceptionLogDao;
import com.zbkj.service.service.ExceptionLogService;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
/**
* ExceptionLogServiceImpl 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class ExceptionLogServiceImpl extends ServiceImpl<ExceptionLogDao, ExceptionLog> implements ExceptionLogService {
@Resource
private ExceptionLogDao dao;
}

View File

@@ -0,0 +1,141 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.util.StrUtil;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.ClientConfiguration;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSCredentialsProvider;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3Client;
import com.amazonaws.services.s3.model.PutObjectResult;
import com.zbkj.common.constants.SysConfigConstants;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.service.service.JdCloudService;
import com.zbkj.service.service.SystemConfigService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.File;
import java.net.URL;
/**
* JdCloudServiceImpl 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Slf4j
@Service
public class JdCloudServiceImpl implements JdCloudService {
@Autowired
private SystemConfigService systemConfigService;
/**
* 文件上传
* @param fileName 文件名称
* @param localFilePath 本地文件地址
* @param bucket 存储桶名称
*/
@Override
public void uploadFile(String fileName, String localFilePath, String bucket) {
File file = new File(localFilePath);
if(!file.exists()){
log.error("京东云存储上传文件不存在fileName = {} localFilePath = {}", fileName, localFilePath);
return;
}
AmazonS3 s3 = getAmazonS3Client();
try {
if (!s3.doesBucketExistV2(bucket)) {
s3.createBucket(bucket);
}
PutObjectResult putObjectResult = s3.putObject(bucket, fileName, file);
log.info("京东云存储上传文件结束:{}", putObjectResult.getETag());
} catch (Exception e) {
log.error("upload JD OSS file error : ", e);
throw new CrmebException(e.getMessage());
} finally {
s3.shutdown();
}
}
/**
* 创建新的存储空间
*/
@Override
public void createBucket(String bucketName) {
if (StrUtil.isBlank(bucketName)) {
return;
}
AmazonS3 s3 = getAmazonS3Client();
try {
s3.createBucket(bucketName);
log.info("create JD OSS bucket {} ", bucketName);
} catch (AmazonServiceException e) {
log.error("create JD OSS bucket err : ", e);
throw new CrmebException("京东云存储创建存储空间失败:" + e.getMessage());
} finally {
s3.shutdown();
}
}
/**
* 获取文件URL
* eg: https://crmeb-ceshi.s3.cn-north-1.jdcloud-oss.com/w5.webp
* @param bucket 存储桶名称
* @param fileName 文件名称
*/
@Override
public String getUrl(String bucket, String fileName) {
AmazonS3 s3 = getAmazonS3Client();
String urlPath = "";
try {
URL url = s3.getUrl(bucket, "w5.webp");
urlPath = url.toString();
} catch (Exception e) {
log.error("get JD OSS file url err : ", e);
throw new CrmebException("京东云获取文件地址失败:" + e.getMessage());
} finally {
s3.shutdown();
}
return urlPath;
}
private AmazonS3 getAmazonS3Client() {
String endpoint = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_CLOUD_ENDPOINT);
String accessKey = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_ACCESS_KEY);
String secretKey = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_SECRET_KEY);
String signingRegion = systemConfigService.getValueByKeyException(SysConfigConstants.CONFIG_JD_CLOUD_SIGNING_REGION);
ClientConfiguration config = new ClientConfiguration();
AwsClientBuilder.EndpointConfiguration endpointConfig =
new AwsClientBuilder.EndpointConfiguration(endpoint, signingRegion);
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKey,secretKey);
AWSCredentialsProvider awsCredentialsProvider = new AWSStaticCredentialsProvider(awsCredentials);
AmazonS3 s3 = AmazonS3Client.builder()
.withEndpointConfiguration(endpointConfig)
.withClientConfiguration(config)
.withCredentials(awsCredentialsProvider)
.disableChunkedEncoding()
.build();
return s3;
}
}

View File

@@ -0,0 +1,334 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import com.alibaba.fastjson.JSON;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.github.pagehelper.PageHelper;
import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
import com.zbkj.common.constants.SysConfigConstants;
import com.zbkj.common.constants.UploadConstants;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.common.model.page.PageDiy;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.request.page.PageDiyEditNameRequest;
import com.zbkj.common.response.page.PageDiyResponse;
import com.zbkj.common.result.CommonResultCode;
import com.zbkj.common.result.SystemConfigResultCode;
import com.zbkj.service.dao.page.PageDiyDao;
import com.zbkj.service.service.PageDiyService;
import com.zbkj.service.service.SystemConfigService;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.List;
import java.util.stream.Collectors;
/**
* @author dazongzi
* @description PageDiyServiceImpl 接口实现
* @date 2023-05-16
*/
@Service
public class PageDiyServiceImpl extends ServiceImpl<PageDiyDao, PageDiy> implements PageDiyService {
private static final Logger logger = LoggerFactory.getLogger(PageDiyServiceImpl.class);
@Resource
private PageDiyDao dao;
@Autowired
private SystemConfigService systemConfigService;
/**
* 列表
*
* @return List<PageDiy>
* @author dazongzi
* @since 2023-05-16
*/
@Override
public List<PageDiy> getList(String name, PageParamRequest pageParamRequest) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
LambdaQueryWrapper<PageDiy> lambdaQueryWrapper = Wrappers.lambdaQuery();
// 列表查询时忽略掉value字段以免影响查询速度
lambdaQueryWrapper.select(PageDiy.class, i -> !i.getColumn().equals("value"));
if (StrUtil.isNotBlank(name)) {
lambdaQueryWrapper.like(PageDiy::getName, URLUtil.decode(name));
}
lambdaQueryWrapper.eq(PageDiy::getMerId, 0);
lambdaQueryWrapper.eq(PageDiy::getIsDel, 0);
lambdaQueryWrapper.orderByDesc(PageDiy::getIsDefault, PageDiy::getAddTime);
List<PageDiy> pageDiys = dao.selectList(lambdaQueryWrapper);
return pageDiys;
}
/**
* 保存diy
*
* @param pageDiy diy数据
*/
@Override
public PageDiy savePageDiy(PageDiy pageDiy) {
String adminApiPath = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_API_URL);
if (StrUtil.isBlank(adminApiPath)) {
throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "应用设置中 微信小程序数据配置 或者 支付回调地址以及网站地址 配置不全");
}
// 检查diy模版名称唯一
checkPageDiyNameUnique(pageDiy.getName(), null);
DocumentContext jsonContext = JsonPath.parse(pageDiy.getValue());
// 通配符去掉关键子 再存储
jsonContext.delete("$..*[?(@ == '"+ adminApiPath +"')]");
pageDiy.setValue(jsonContext.jsonString());
save(pageDiy);
return pageDiy;
}
/**
* 更新diy
*
* @param pageDiy
*/
@Override
public Boolean editPageDiy(PageDiy pageDiy) {
String adminApiPath = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_KEY_API_URL);
if (StrUtil.isBlank(adminApiPath)) {
throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "应用设置中 微信小程序数据配置 或者 支付回调地址以及网站地址 配置不全");
}
// 检查diy模版名称唯一
checkPageDiyNameUnique(pageDiy.getName(), pageDiy.getId());
// DocumentContext jsonContext = JsonPath.parse(pageDiy.getValue());
// // 通配符去掉关键子 再存储
// jsonContext.delete("$..*[?(@ == '"+ adminApiPath +"')]");
// pageDiy.setValue(jsonContext.jsonString());
pageDiy.setUpdateTime(DateUtil.date());
return dao.updateById(pageDiy)>0;
}
/**
* 编辑diy名称
*@param pageDiyEditNameRequest 待编辑名称对象
*/
@Override
public Boolean editPageDiyName(PageDiyEditNameRequest pageDiyEditNameRequest) {
// 检查diy模版名称唯一
checkPageDiyNameUnique(pageDiyEditNameRequest.getName(), pageDiyEditNameRequest.getId());
PageDiy pageDiyForUpdate = new PageDiy();
pageDiyForUpdate.setId(pageDiyEditNameRequest.getId());
pageDiyForUpdate.setName(pageDiyEditNameRequest.getName());
pageDiyForUpdate.setUpdateTime(DateUtil.date());
return dao.updateById(pageDiyForUpdate) > 0;
}
/**
* 设置DIY首页模版
* isDefault =1 是平台首页 2=商户 diy后期商户再处理
*
* @param diyId 被设置为首页的diy模版id
* @return 设置结果
*/
@Override
public Boolean setDiyPageHome(Integer diyId) {
PageDiy pageDiy = dao.selectById(diyId);
if(ObjectUtil.isNull(pageDiy)) throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "当前DIY模版不存在");
// 取消现有的首页设置,如果存在的话
LambdaQueryWrapper<PageDiy> queryWaiteResetDefaultTemp = Wrappers.lambdaQuery();
queryWaiteResetDefaultTemp.eq(PageDiy::getIsDefault, 1);
List<PageDiy> currentWaitResetPageHome = dao.selectList(queryWaiteResetDefaultTemp);
List<PageDiy> currentTempByReset = currentWaitResetPageHome.stream().map(homeTemp -> homeTemp.setIsDefault(0)).collect(Collectors.toList());
saveOrUpdateBatch(currentTempByReset);
// 设置当前diy数据为商城首页
pageDiy.setIsDefault(1);
pageDiy.setUpdateTime(DateUtil.date());
return dao.updateById(pageDiy) > 0;
}
/**
* 获取DIY首页模版Id
*@param isLoadValue 是否加载value详情数据
* @return 首页模版ID
*/
@Override
public PageDiy getDiyPageHome(Boolean isLoadValue) {
LambdaQueryWrapper<PageDiy> queryWrapper = Wrappers.lambdaQuery();
queryWrapper.eq(PageDiy::getIsDefault, 1);
if(Boolean.FALSE == isLoadValue){
queryWrapper.select(PageDiy.class, i -> !i.getColumn().equals("value"));
}
List<PageDiy> currentWaitResetPageHome = dao.selectList(queryWrapper);
if(ObjectUtil.isNull(currentWaitResetPageHome) || currentWaitResetPageHome.size() != 1){
throw new CrmebException("首页模版设置不正确!");
}
PageDiy pageDiy = currentWaitResetPageHome.get(0);
if(Boolean.TRUE == isLoadValue){
// String modifiedJsonString = getModifiedJsonString(pageDiy.getValue());
// pageDiy.setValue(modifiedJsonString);
pageDiy.setValue(pageDiy.getValue());
}
return pageDiy;
}
/**
* 针对Admin
* 根据id加载diy模版配置
*
* @param id 对应的模版id
* 描述:
* id=0加载商城首页的也就是setDiyPageHome后的数据平台端会默认设置已经有首页的数据也会预制
* id>1时加载对应的模版即可
*/
@Override
public PageDiy getDiyPageByPageIdForAdmin(Integer id) {
PageDiy pageDiy = null;
if(0 == id){
LambdaQueryWrapper<PageDiy> getHomeDefault = Wrappers.lambdaQuery();
getHomeDefault.eq(PageDiy::getIsDefault, 1);
pageDiy = getOne(getHomeDefault);
}else{
pageDiy = getById(id);
}
if(ObjectUtil.isNull(pageDiy)) throw new CrmebException(SystemConfigResultCode.PAGE_DIY_NOT_EXIST);
// String modifiedJsonString = getModifiedJsonString(pageDiy.getValue());
// pageDiy.setValue(modifiedJsonString);
pageDiy.setValue(pageDiy.getValue());
return pageDiy;
}
/**
* 根据id加载diy模版配置
*
* @param id 对应的模版id
* 描述:
* id=0加载商城首页的也就是setDiyPageHome后的数据平台端会默认设置已经有首页的数据也会预制
* id>1时加载对应的模版即可
*/
@Override
public PageDiyResponse getDiyPageByPageIdForFront(Integer id) {
PageDiy pageDiy;
if(0 == id){
LambdaQueryWrapper<PageDiy> getHomeDefault = Wrappers.lambdaQuery();
getHomeDefault.eq(PageDiy::getIsDefault, 1);
pageDiy = getOne(getHomeDefault);
}else{
pageDiy = getById(id);
}
if(ObjectUtil.isNull(pageDiy)) throw new CrmebException(SystemConfigResultCode.PAGE_DIY_NOT_EXIST);
// 优化front比必要的字段 提高diy组件渲染效率
// DocumentContext jsonContext = JsonPath.parse(pageDiy.getValue());
// jsonContext.delete("$..*[?(@.name == 'goodList')].itemStyle.list");
// jsonContext.delete("$..*[?(@.name == 'goodList')].tabConfig.list");
// jsonContext.delete("$..*[?(@.name == 'goodList')].typeConfig.list");
//// jsonContext.delete("$..*[?(@.name == 'goodList')].selectConfig");
// jsonContext.delete("$..*[?(@.name == 'goodList')].goodsSort.list");
// jsonContext.delete("$..*[?(@.name == 'goodList')].goodsList.list[*].attrValue");
// jsonContext.delete("$..*[?(@.name == 'homeTab')].activeValueBrand");
// jsonContext.delete("$..*[?(@.name == 'homeTab')].goodsList");
// jsonContext.delete("$..*[?(@.name == 'homeTab')].selectConfig");
// jsonContext.delete("$..*[?(@.name == 'homeTab')].productList..*.goods[*].attrValue");
PageDiyResponse response = new PageDiyResponse();
BeanUtils.copyProperties(pageDiy, response);
// String modifiedJsonString = getModifiedJsonString(jsonContext.jsonString());
// response.setValue(JSON.parseObject(modifiedJsonString));
response.setValue(JSON.parseObject(pageDiy.getValue()));
return response;
}
/**
* 检查diy模版名称唯一
* @param pageDiyName 当前要检查的模版名称
* @param id 更新时的 diy id
*/
private void checkPageDiyNameUnique(String pageDiyName, Integer id) {
LambdaQueryWrapper<PageDiy> pageDiyLambdaQueryWrapper = Wrappers.lambdaQuery();
pageDiyLambdaQueryWrapper.eq(PageDiy::getName, pageDiyName);
if(ObjectUtil.isNotNull(id)){
pageDiyLambdaQueryWrapper.ne(PageDiy::getId, id);
}
List<PageDiy> pageDiyNameExist = dao.selectList(pageDiyLambdaQueryWrapper);
if(ObjectUtil.isNotNull(pageDiyNameExist) && !pageDiyNameExist.isEmpty()){
throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "当前模版名称已经存在,请修改后再保存!");
}
}
////////////////////////////////// 内部处理json配置中的素材地址方法 START
/**
* 调用diy配置数据后结合本地配置传递给递归方法替换
* @param diyValue 当前待操作的diy对象其实仅仅用到了value
* @return 替换后的json对象
*/
private String getModifiedJsonString(String diyValue) {
// 使用 Gson 解析 JSON 数据
Gson gson = new Gson();
JsonElement jsonElement = gson.fromJson(diyValue, JsonElement.class);
// 替换指定前缀的键
String adminApiPath = UploadConstants.UPLOAD_FILE_KEYWORD;
String newPrefix = systemConfigService.getValueByKey(SysConfigConstants.CONFIG_LOCAL_UPLOAD_URL);
JsonElement modifiedJsonElement = replaceJsonValue(jsonElement, adminApiPath, newPrefix);
// 将修改后的 JSON 数据转换回字符串
return gson.toJson(modifiedJsonElement);
}
/**
* 根据系统关键字匹配素材前缀,匹配后追加系统中对应的素材前缀
* @param jsonElement 当前操作的json对象
* @param keyword 匹配的关键字
* @param newValue 需要追加的前缀
* @return 操作后的正确json数据
*/
private JsonElement replaceJsonValue(JsonElement jsonElement, String keyword, String newValue) {
if (jsonElement.isJsonObject()) {
JsonObject jsonObject = jsonElement.getAsJsonObject();
JsonObject newJsonObject = new JsonObject();
for (String key : jsonObject.keySet()) {
JsonElement value = jsonObject.get(key);
if (value.isJsonPrimitive() && value.getAsString().startsWith(keyword)) {
newJsonObject.addProperty(key, newValue + "/" + value.getAsString());
} else {
newJsonObject.add(key, replaceJsonValue(value, keyword, newValue)); // 递归处理子元素
}
}
return newJsonObject;
} else if (jsonElement.isJsonArray()) {
// 如果数组元素也可能含有关键字,可以按需处理
JsonArray jsonArray = jsonElement.getAsJsonArray();
JsonArray newJsonArray = new JsonArray();
for (JsonElement element : jsonArray) {
newJsonArray.add(replaceJsonValue(element, keyword, newValue)); // 递归处理数组元素
}
return newJsonArray;
} else {
return jsonElement;
}
}
////////////////////////////////// 内部处理json配置中的素材地址方法 END
}

View File

@@ -0,0 +1,347 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.zbkj.common.constants.Constants;
import com.zbkj.common.constants.SysConfigConstants;
import com.zbkj.common.constants.SysGroupDataConstants;
import com.zbkj.common.constants.UploadConstants;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.common.model.system.SystemGroupData;
import com.zbkj.common.request.SystemFormItemCheckRequest;
import com.zbkj.common.response.pagelayout.PageLayoutBottomNavigationResponse;
import com.zbkj.common.utils.CrmebUtil;
import com.zbkj.common.vo.MyRecord;
import com.zbkj.service.service.PageLayoutService;
import com.zbkj.service.service.SystemAttachmentService;
import com.zbkj.service.service.SystemConfigService;
import com.zbkj.service.service.SystemGroupDataService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.support.TransactionTemplate;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
* 页面布局接口实现类
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class PageLayoutServiceImpl implements PageLayoutService {
@Autowired
private SystemGroupDataService systemGroupDataService;
@Autowired
private TransactionTemplate transactionTemplate;
@Autowired
private SystemAttachmentService systemAttachmentService;
@Autowired
private SystemConfigService systemConfigService;
/**
* 页面首页
* @return 首页信息
*/
@Override
public HashMap<String, Object> index() {
HashMap<String, Object> map = CollUtil.newHashMap();
// 首页banner
List<SystemGroupData> bannerList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_INDEX_BANNER);
map.put("indexBanner", convertData(bannerList));
// 首页金刚区
List<SystemGroupData> menuList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_INDEX_MENU);
map.put("indexMenu", convertData(menuList));
// 首页新闻
List<SystemGroupData> newsList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER);
map.put("indexNews", convertData(newsList));
// 我的页服务
List<SystemGroupData> userMenuList = systemGroupDataService.findListByGid(SysGroupDataConstants.GROUP_DATA_ID_USER_CENTER_MENU);
map.put("userMenu", convertData(userMenuList));
// 我的页banner
List<SystemGroupData> userBannerList = systemGroupDataService.findListByGid(SysGroupDataConstants.GROUP_DATA_ID_USER_CENTER_BANNER);
map.put("userBanner", convertData(userBannerList));
return map;
}
/**
* 首页保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean save(JSONObject jsonObject) {
List<SystemGroupData> dataList = CollUtil.newArrayList();
if (StrUtil.isNotBlank(jsonObject.getString("indexBanner"))) {
List<JSONObject> indexBanner = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexBanner"));
dataList.addAll(convertGroupData(indexBanner, Constants.GROUP_DATA_ID_INDEX_BANNER));
}
if (StrUtil.isNotBlank(jsonObject.getString("indexMenu"))) {
List<JSONObject> indexMenu = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexMenu"));
dataList.addAll(convertGroupData(indexMenu, Constants.GROUP_DATA_ID_INDEX_MENU));
}
if (StrUtil.isNotBlank(jsonObject.getString("indexNews"))) {
List<JSONObject> indexNews = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexNews"));
dataList.addAll(convertGroupData(indexNews, Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER));
}
if (StrUtil.isNotBlank(jsonObject.getString("userMenu"))) {
List<JSONObject> userMenu = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userMenu"));
dataList.addAll(convertGroupData(userMenu, Constants.GROUP_DATA_ID_USER_CENTER_MENU));
}
if (StrUtil.isNotBlank(jsonObject.getString("userBanner"))) {
List<JSONObject> userBanner = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userBanner"));
dataList.addAll(convertGroupData(userBanner, Constants.GROUP_DATA_ID_USER_CENTER_BANNER));
}
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_BANNER);
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_MENU);
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER);
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_MENU);
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_BANNER);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 页面首页banner保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean indexBannerSave(JSONObject jsonObject) {
List<JSONObject> indexBanner = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexBanner"));
List<SystemGroupData> dataList = convertGroupData(indexBanner, Constants.GROUP_DATA_ID_INDEX_BANNER);
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_BANNER);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 页面首页menu保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean indexMenuSave(JSONObject jsonObject) {
List<JSONObject> indexMenu = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexMenu"));
List<SystemGroupData> dataList = convertGroupData(indexMenu, Constants.GROUP_DATA_ID_INDEX_MENU);
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_MENU);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 页面首页新闻保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean indexNewsSave(JSONObject jsonObject) {
List<JSONObject> indexNews = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexNews"));
List<SystemGroupData> dataList = convertGroupData(indexNews, Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER);
if (StrUtil.isNotBlank(jsonObject.getString("indexNews"))) {
}
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_NEWS_BANNER);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 页面用户中心banner保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean userBannerSave(JSONObject jsonObject) {
List<JSONObject> userBanner = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userBanner"));
List<SystemGroupData> dataList = convertGroupData(userBanner, Constants.GROUP_DATA_ID_USER_CENTER_BANNER);
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_BANNER);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 页面用户中心导航保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean userMenuSave(JSONObject jsonObject) {
List<JSONObject> userMenu = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("userMenu"));
List<SystemGroupData> dataList = convertGroupData(userMenu, Constants.GROUP_DATA_ID_USER_CENTER_MENU);
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_USER_CENTER_MENU);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 页面用户中心商品table保存
* @param jsonObject 数据
* @return Boolean
*/
@Override
public Boolean indexTableSave(JSONObject jsonObject) {
List<JSONObject> indexBanner = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("indexTable"));
List<SystemGroupData> dataList = convertGroupData(indexBanner, Constants.GROUP_DATA_ID_INDEX_EX_BANNER);
Boolean execute = transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_INDEX_EX_BANNER);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
return Boolean.TRUE;
});
return execute;
}
/**
* 转换组合数据
* @param jsonObjectList 数组
* @param gid gid
* @return List
*/
private List<SystemGroupData> convertGroupData(List<JSONObject> jsonObjectList, Integer gid) {
return jsonObjectList.stream().map(e -> {
SystemGroupData groupData = new SystemGroupData();
if (e.containsKey("id") && ObjectUtil.isNotNull(e.getInteger("id"))) {
groupData.setId(e.getInteger("id"));
}
groupData.setGid(gid);
groupData.setSort(e.getInteger("sort"));
groupData.setStatus(e.getBoolean("status"));
// 组装json
Map<String, Object> jsonMap = CollUtil.newHashMap();
jsonMap.put("id", e.getInteger("tempid"));
jsonMap.put("sort", groupData.getSort());
jsonMap.put("status", groupData.getStatus());
List<Map<String, Object>> mapList = CollUtil.newArrayList();
e.remove("id");
e.remove("gid");
e.remove("sort");
e.remove("status");
e.remove("tempid");
e.forEach((key, value) -> {
Map<String, Object> map = CollUtil.newHashMap();
map.put("name", key);
map.put("title", key);
map.put("value", value);
if (String.valueOf(value).contains(UploadConstants.UPLOAD_FILE_KEYWORD)) {
String values = systemAttachmentService.clearPrefix(String.valueOf(value));
map.put("value", values);
}
mapList.add(map);
});
jsonMap.put("fields", mapList);
groupData.setValue(JSONObject.toJSONString(jsonMap));
return groupData;
}).collect(Collectors.toList());
}
/**
* 转换数据
* @param dataList 数据列表
* @return List<Map>
*/
private List<HashMap<String, Object>> convertData(List<SystemGroupData> dataList) {
return dataList.stream().map(data -> {
HashMap<String, Object> map = CollUtil.newHashMap();
map.put("id", data.getId());
map.put("gid", data.getGid());
map.put("sort", data.getSort());
map.put("status", data.getStatus());
JSONObject jsonObject = JSONObject.parseObject(data.getValue());
List<SystemFormItemCheckRequest> systemFormItemCheckRequestList = CrmebUtil.jsonToListClass(jsonObject.getString("fields"), SystemFormItemCheckRequest.class);
systemFormItemCheckRequestList.forEach(e -> {
map.put(e.getName(), e.getValue());
});
map.put("tempid", jsonObject.getInteger("id"));
return map;
}).collect(Collectors.toList());
}
/**
* 获取页面底部导航信息
*/
@Override
public PageLayoutBottomNavigationResponse getBottomNavigation() {
PageLayoutBottomNavigationResponse response = new PageLayoutBottomNavigationResponse();
// 个人中心页服务
List<SystemGroupData> dataList = systemGroupDataService.findListByGid(Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION);
response.setBottomNavigationList(convertData(dataList));
// 是否自定义
String isCustom = systemConfigService.getValueByKey(Constants.CONFIG_BOTTOM_NAVIGATION_IS_CUSTOM);
response.setIsCustom(isCustom);
return response;
}
/**
* 页面底部导航信息保存
* @return 保存结果
*/
@Override
public Boolean bottomNavigationSave(JSONObject jsonObject) {
String isCustom = jsonObject.getString("isCustom");
if (StrUtil.isBlank(isCustom)) {
throw new CrmebException("请选择是否自定义");
}
List<JSONObject> bottomNavigationList = CrmebUtil.jsonArrayToJsonObjectList(jsonObject.getJSONArray("bottomNavigationList"));
if (CollUtil.isEmpty(bottomNavigationList)) {
throw new CrmebException("请传入底部导航数据");
}
List<SystemGroupData> dataList = convertGroupData(bottomNavigationList, Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION);
return transactionTemplate.execute(e -> {
// 先删除历史数据
systemGroupDataService.deleteByGid(Constants.GROUP_DATA_ID_BOTTOM_NAVIGATION);
// 保存新数据
systemGroupDataService.saveBatch(dataList, 100);
systemConfigService.updateOrSaveValueByName(Constants.CONFIG_BOTTOM_NAVIGATION_IS_CUSTOM, isCustom);
return Boolean.TRUE;
});
}
}

View File

@@ -0,0 +1,175 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpResponse;
import com.alibaba.fastjson.JSONObject;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.common.result.CommonResultCode;
import com.zbkj.common.utils.CrmebUtil;
import com.zbkj.common.utils.QRCodeUtil;
import com.zbkj.common.utils.RestTemplateUtil;
import com.zbkj.common.vo.QrCodeVo;
import com.zbkj.service.service.QrCodeService;
import com.zbkj.service.service.WechatNewService;
import org.apache.commons.codec.binary.Base64;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.HashMap;
import java.util.Map;
/**
* QrCodeServiceImpl 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class QrCodeServiceImpl implements QrCodeService {
@Autowired
private RestTemplateUtil restTemplateUtil;
@Autowired
private WechatNewService wechatNewService;
/**
* 二维码
*
* @return QrCodeVo
*/
@Override
public QrCodeVo getWecahtQrCode(JSONObject data) {
// StringBuilder scene = new StringBuilder();
// String page = "";
// try {
// if (ObjectUtil.isNotNull(data)) {
// Map<Object, Object> dataMap = JSONObject.toJavaObject(data, Map.class);
//
// for (Map.Entry<Object, Object> m : dataMap.entrySet()) {
// if (m.getKey().equals("path")) {
// //前端路由, 不需要拼参数
// page = m.getValue().toString();
// continue;
// }
// if (scene.length() > 0) {
// scene.append(",");
// }
// scene.append(m.getKey()).append(":").append(m.getValue());
// }
// }
// } catch (Exception e) {
// throw new CrmebException("url参数错误 " + e.getMessage());
// }
if (ObjectUtil.isNull(data) || data.isEmpty())
throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "生成微信参数不能为空");
QrCodeVo vo = new QrCodeVo();
vo.setCode(wechatNewService.createQrCode(data));
return vo;
}
/**
* 远程图片转base64
*
* @param url 图片链接地址
* @return QrCodeVo
*/
@Override
public QrCodeVo urlToBase64(String url) {
HttpResponse httpResponse = HttpRequest.get(url).execute();
byte[] bytes = httpResponse.bodyBytes();
;
String base64Image = CrmebUtil.getBase64Image(Base64.encodeBase64String(bytes));
QrCodeVo vo = new QrCodeVo();
vo.setCode(base64Image);
return vo;
}
/**
* 字符串转base64
*
* @param text 待转换字符串
* @return QrCodeVo base64格式
*/
@Override
public QrCodeVo strToBase64(String text, Integer width, Integer height) {
if ((width < 50 || height < 50) && (width > 500 || height > 500) && text.length() >= 999) {
throw new CrmebException(CommonResultCode.VALIDATE_FAILED, "生成二维码参数不合法");
}
String base64Image;
try {
base64Image = QRCodeUtil.crateQRCode(text, width, height);
} catch (Exception e) {
throw new CrmebException("生成二维码异常");
}
QrCodeVo vo = new QrCodeVo();
vo.setCode(base64Image);
return vo;
}
/**
* 二维码
* @return Object
*/
@Override
public Map<String, Object> get(JSONObject data) {
Map<String, Object> map = new HashMap<>();
StringBuilder scene = new StringBuilder();
String page = "";
try{
if(null != data){
Map<Object, Object> dataMap = JSONObject.toJavaObject(data, Map.class);
for (Map.Entry<Object, Object> m : dataMap.entrySet()) {
if(m.getKey().equals("path")){
//前端路由, 不需要拼参数
page = m.getValue().toString();
continue;
}
if (scene.length() > 0) {
scene.append(",");
}
scene.append(m.getKey()).append(":").append(m.getValue());
}
}
}catch (Exception e){
throw new CrmebException("url参数错误 " + e.getMessage());
}
map.put("code", wechatNewService.createQrCode(page, scene.length() > 0 ? scene.toString() : ""));
return map;
}
@Override
public Map<String, Object> base64(String url) {
byte[] bytes = restTemplateUtil.getBuffer(url);
String base64Image = CrmebUtil.getBase64Image(Base64.encodeBase64String(bytes));
Map<String, Object> map = new HashMap<>();
map.put("code", base64Image);
return map;
}
/**
* 讲字符串转为QRcode
* @param text 待转换字符串
* @return QRcode base64格式
*/
@Override
public Map<String, Object> base64String(String text,int width, int height) {
String base64Image = null;
try {
base64Image = QRCodeUtil.crateQRCode(text,width,height);
}catch (Exception e){
throw new CrmebException("生成二维码异常");
}
Map<String, Object> map = new HashMap<>();
map.put("code", base64Image);
return map;
}
}

View File

@@ -0,0 +1,70 @@
package com.zbkj.service.service.impl;
import com.anji.captcha.model.common.ResponseModel;
import com.anji.captcha.model.vo.CaptchaVO;
import com.anji.captcha.service.CaptchaService;
import com.anji.captcha.util.StringUtils;
import com.zbkj.service.service.SafetyService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletRequest;
/**
* 行为验证码
*
* @author Han
* @version 1.0.0
* @Date 2025/6/12
*/
@Service
public class SafetyServiceImpl implements SafetyService {
@Autowired
private CaptchaService captchaService;
/**
* 获取行为验证码
*/
@Override
public ResponseModel getSafetyCode(CaptchaVO data, HttpServletRequest request) {
assert request.getRemoteHost() != null;
data.setBrowserInfo(getRemoteId(request));
return captchaService.get(data);
}
/**
* 验证行为验证码
*/
@Override
public ResponseModel checkSafetyCode(CaptchaVO data, HttpServletRequest request) {
data.setBrowserInfo(getRemoteId(request));
return captchaService.check(data);
}
/**
* 行为验证码二次校验
*/
@Override
public ResponseModel verifySafetyCode(CaptchaVO data) {
return captchaService.verification(data);
}
public static final String getRemoteId(HttpServletRequest request) {
String xfwd = request.getHeader("X-Forwarded-For");
String ip = getRemoteIpFromXfwd(xfwd);
String ua = request.getHeader("user-agent");
if (StringUtils.isNotBlank(ip)) {
return ip + ua;
}
return request.getRemoteAddr() + ua;
}
private static String getRemoteIpFromXfwd(String xfwd) {
if (StringUtils.isNotBlank(xfwd)) {
String[] ipList = xfwd.split(",");
return StringUtils.trim(ipList[0]);
}
return null;
}
}

View File

@@ -0,0 +1,762 @@
package com.zbkj.service.service.impl;
import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateField;
import cn.hutool.core.date.DateTime;
import cn.hutool.core.date.DateUnit;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import com.zbkj.common.constants.Constants;
import com.zbkj.common.exception.CrmebException;
import com.zbkj.common.model.user.User;
import com.zbkj.common.response.*;
import com.zbkj.service.service.*;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.math.BigDecimal;
import java.util.List;
import java.util.stream.Collectors;
/**
* UserStatisticsService 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class UserStatisticsServiceImpl implements UserStatisticsService {
@Autowired
private StoreOrderService storeOrderService;
@Autowired
private UserService userService;
@Autowired
private UserRechargeService userRechargeService;
@Autowired
private UserBrokerageRecordService brokerageRecordService;
@Autowired
private UserVisitRecordService userVisitRecordService;
/**
* 用户概览数据
* @param dateLimit 时间参数
* @return UserOverviewResponse
*/
@Override
public UserOverviewResponse getOverview(String dateLimit) {
if (StrUtil.isBlank(dateLimit)) {
throw new CrmebException("日期参数不能为空");
}
// 判断时间类型
if (Constants.SEARCH_DATE_DAY.equals(dateLimit)) {
// 获取今天的数据(所有数据现查)
UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd"));
// 获取昨天的数据
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = yesterday.toString("yyyy-MM-dd");
UserOverviewResponse yesterdayData = getSimpleDataByDate(yesterdayStr);
// 计算环比,返回对象
return getCommonResponse(nowDayData, yesterdayData);
}
if (Constants.SEARCH_DATE_YESTERDAY.equals(dateLimit)) {
// 获取昨天的数据
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = yesterday.toString("yyyy-MM-dd");
UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr);
// 获取更前一天的数据
String beforeDay = DateUtil.offsetDay(yesterday, -1).toString("yyyy-MM-dd");
UserOverviewResponse beforeDayDta = getSimpleDataByDate(beforeDay);
// 计算环比,返回对象
return getCommonResponse(yesterdayData, beforeDayDta);
}
// 时间段数据查询(包含7天、30天、周、月、年)
if (Constants.SEARCH_DATE_LATELY_7.equals(dateLimit)) {// 7天
// 分别获取今天、前6天的数据数据相加
DateTime nowDate = DateUtil.date();
// 获取今天的数据(所有数据现查)
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取往前推七天的日期跟昨天的日期
String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -6).toString("yyyy-MM-dd");
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
UserOverviewResponse intervalDate = getDataByPeriod(beforeSevenDateStr, yesterdayStr);
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
// 获取前14天-前8天这个区间的数据
String beforeFourteenDateStr = DateUtil.offsetDay(nowDate, -13).toString("yyyy-MM-dd");
String beforeEightDateStr = DateUtil.offsetDay(nowDate, -7).toString("yyyy-MM-dd");
UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeFourteenDateStr, beforeEightDateStr);
// 计算环比,返回对象
return getCommonResponse(intervalDate, intervalDate2);
}
if (Constants.SEARCH_DATE_LATELY_30.equals(dateLimit)) {// 30天
DateTime nowDate = DateUtil.date();
// 获取今天的数据(所有数据现查)
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取往前推30天的日期跟昨天的日期
String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -29).toString("yyyy-MM-dd");
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
UserOverviewResponse intervalDate = getDataByPeriod(beforeSevenDateStr, yesterdayStr);
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
// 获取前14天-前8天这个区间的数据
String beforeFourteenDateStr = DateUtil.offsetDay(nowDate, -59).toString("yyyy-MM-dd");
String beforeEightDateStr = DateUtil.offsetDay(nowDate, -30).toString("yyyy-MM-dd");
UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeFourteenDateStr, beforeEightDateStr);
// 计算环比,返回对象
return getCommonResponse(intervalDate, intervalDate2);
}
if (Constants.SEARCH_DATE_WEEK.equals(dateLimit)) {// 周
// 判断今天是否是本周第一天
int dayOfWeek = DateUtil.thisDayOfWeek();
DateTime nowDate = DateUtil.date();
UserOverviewResponse intervalDate = new UserOverviewResponse();
if (dayOfWeek == 2) {// 周一
// 获取今天的数据(所有数据现查)
intervalDate = getDataByDate(nowDate.toString("yyyy-MM-dd"));
} else if (dayOfWeek == 3) {// 周二
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取昨天的数据
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr);
intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(yesterdayData.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(yesterdayData.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(yesterdayData.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(yesterdayData.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(yesterdayData.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
} else {
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取周一到现在的数据
String weekStartDateStr = DateUtil.beginOfWeek(nowDate).toString("yyyy-MM-dd");
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
intervalDate = getDataByPeriod(weekStartDateStr, yesterdayStr);
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
}
// 获取上一周的数据
DateTime offsetWeek = DateUtil.offsetWeek(nowDate, -1);
String beforeWeekStartDateStr = DateUtil.beginOfWeek(offsetWeek).toString("yyyy-MM-dd");
String beforeWeekEndDateStr = DateUtil.endOfWeek(offsetWeek).toString("yyyy-MM-dd");
UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeWeekStartDateStr, beforeWeekEndDateStr);
// 计算环比,返回对象
return getCommonResponse(intervalDate, intervalDate2);
}
if (Constants.SEARCH_DATE_MONTH.equals(dateLimit)) {// 月
// 判断今天是否是本月第一天
int dayOfMonth = DateUtil.thisDayOfMonth();
DateTime nowDate = DateUtil.date();
UserOverviewResponse intervalDate = new UserOverviewResponse();
if (dayOfMonth == 1) {// 一号
// 获取今天的数据(所有数据现查)
intervalDate = getDataByDate(nowDate.toString("yyyy-MM-dd"));
} else if (dayOfMonth == 2) {// 二号
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取昨天的数据
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr);
intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(yesterdayData.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(yesterdayData.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(yesterdayData.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(yesterdayData.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(yesterdayData.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
} else {
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取月初到现在的数据
String monthStartDateStr = DateUtil.beginOfMonth(nowDate).toString("yyyy-MM-dd");
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
intervalDate = getDataByPeriod(monthStartDateStr, yesterdayStr);
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
}
// 获取上一月的数据
DateTime offsetMonth = DateUtil.offsetMonth(nowDate, -1);
String beforeMonthStartDateStr = DateUtil.beginOfMonth(offsetMonth).toString("yyyy-MM-dd");
String beforeMonthEndDateStr = DateUtil.endOfMonth(offsetMonth).toString("yyyy-MM-dd");
UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeMonthStartDateStr, beforeMonthEndDateStr);
// 计算环比,返回对象
return getCommonResponse(intervalDate, intervalDate2);
}
if (Constants.SEARCH_DATE_YEAR.equals(dateLimit)) {// 年
// 判断今天是否是本年第一天
DateTime nowDate = DateUtil.date();
UserOverviewResponse intervalDate = new UserOverviewResponse();
// 获取当年的开始日期
String beginOfYear = DateUtil.beginOfYear(nowDate).toString("yyyy-MM-dd");
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
if (beginOfYear.equals(nowDate.toString("yyyy-MM-dd"))) {// 第一天
// 获取今天的数据(所有数据现查)
intervalDate = getDataByDate(nowDate.toString("yyyy-MM-dd"));
} else if (beginOfYear.equals(yesterdayStr)) {// 第二天
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取昨天的数据
UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr);
intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(yesterdayData.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(yesterdayData.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(yesterdayData.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(yesterdayData.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(yesterdayData.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(yesterdayData.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
} else {
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
// 获取年初到现在的数据
intervalDate = getDataByPeriod(beginOfYear, yesterdayStr);
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
}
// 获取上一年的数据
DateTime offsetYear = DateUtil.offsetDay(DateUtil.beginOfYear(nowDate), -1);
String beforeYearStartDateStr = DateUtil.beginOfYear(offsetYear).toString("yyyy-MM-dd");
String beforeYearEndDateStr = DateUtil.endOfYear(offsetYear).toString("yyyy-MM-dd");
UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeYearStartDateStr, beforeYearEndDateStr);
// 计算环比,返回对象
return getCommonResponse(intervalDate, intervalDate2);
}
// 自定义时间,切割时间
String[] split = dateLimit.split(",");
if (split.length < 2) {
throw new CrmebException("请选择正确的时间范围");
}
DateTime startDate = DateUtil.parseDate(split[0]);
DateTime endDate = DateUtil.parseDate(split[1]);
// 是否是同一天
if (DateUtil.isSameDay(startDate, endDate)) {
String dateStr = startDate.toString("yyyy-MM-dd");
// 判断时间是否是今天
if (DateUtil.isSameDay(startDate, DateUtil.date())) {
// 获取今天的数据(所有数据现查)
UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd"));
// 获取昨天的数据
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = yesterday.toString("yyyy-MM-dd");
UserOverviewResponse yesterdayData = getSimpleDataByDate(yesterdayStr);
// 计算环比,返回对象
return getCommonResponse(nowDayData, yesterdayData);
}
// 不是今天
UserOverviewResponse dayData = getDataByDate(dateStr);
String beforeDateStr = DateUtil.offsetDay(startDate, -1).toString("yyyy-MM-dd");
UserOverviewResponse beforeDayData = getSimpleDataByDate(beforeDateStr);
// 计算环比,返回对象
return getCommonResponse(dayData, beforeDayData);
}
// 判断开始时间是否大于结束时间
if (startDate.compareTo(endDate) >= 0) {
throw new CrmebException("请选择正确的时间范围");
}
// 获取两个日期间隔了多少天
long between = DateUtil.between(startDate, endDate, DateUnit.DAY);
UserOverviewResponse intervalDate = new UserOverviewResponse();
// 判断结束时间是否是今天
if (DateUtil.isSameDay(startDate, DateUtil.date())) {
// 获取今天的数据(所有数据现查)
UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd"));
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
intervalDate = getDataByPeriod(startDate.toString("yyyy-MM-dd"), yesterdayStr);
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setPageviews(intervalDate.getPageviews() + nowDayData.getPageviews());
intervalDate.setActiveUserNum(intervalDate.getActiveUserNum() + nowDayData.getActiveUserNum());
intervalDate.setOrderUserNum(intervalDate.getOrderUserNum() + nowDayData.getOrderUserNum());
intervalDate.setRechargeUserNum(intervalDate.getRechargeUserNum() + nowDayData.getRechargeUserNum());
intervalDate.setOrderPayUserNum(intervalDate.getOrderPayUserNum() + nowDayData.getOrderPayUserNum());
intervalDate.setPayOrderAmount(intervalDate.getPayOrderAmount().add(nowDayData.getPayOrderAmount()));
intervalDate.setCustomerPrice(commonCustomerPrice(intervalDate.getPayOrderAmount(), intervalDate.getOrderPayUserNum()));
} else {
intervalDate = getDataByPeriod(startDate.toString("yyyy-MM-dd"), endDate.toString("yyyy-MM-dd"));
}
// 获取前一个区间的数据
String beforeDateStr = DateUtil.offsetDay(startDate, -((int) between + 1)).toString("yyyy-MM-dd");
String beforeEndDateStr = DateUtil.offsetDay(startDate, -1).toString("yyyy-MM-dd");
UserOverviewResponse intervalDate2 = getSimpleDataByPeriod(beforeDateStr, beforeEndDateStr);
// 计算环比,返回对象
return getCommonResponse(intervalDate, intervalDate2);
}
/**
* 获取用户渠道数据
* @return List
*/
@Override
public List<UserChannelDataResponse> getChannelData() {
List<User> userList = userService.getChannelData();
return userList.stream().map(e -> {
UserChannelDataResponse response = new UserChannelDataResponse();
response.setChannel(e.getUserType());
response.setNum(e.getPayCount());
return response;
}).collect(Collectors.toList());
}
/**
* 用户概览数据列表(导出使用)
* @param dateLimit 时间参数
* @return UserOverviewResponse
*/
@Override
public List<UserOverviewDateResponse> getOverviewList(String dateLimit) {
if (StrUtil.isBlank(dateLimit)) {
throw new CrmebException("日期参数不能为空");
}
List<UserOverviewDateResponse> responsesList = CollUtil.newArrayList();
// 判断时间类型
if (Constants.SEARCH_DATE_DAY.equals(dateLimit)) {
// 获取今天的数据(所有数据现查)
UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd"));
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(nowDayData, response);
responsesList.add(response);
return responsesList;
}
if (Constants.SEARCH_DATE_YESTERDAY.equals(dateLimit)) {
// 获取昨天的数据
DateTime yesterday = DateUtil.yesterday();
String yesterdayStr = yesterday.toString("yyyy-MM-dd");
UserOverviewResponse yesterdayData = getDataByDate(yesterdayStr);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(yesterdayData, response);
responsesList.add(response);
return responsesList;
}
// 时间段数据查询(包含7天、30天、周、月、年)
if (Constants.SEARCH_DATE_LATELY_7.equals(dateLimit)) {// 7天
// 分别获取今天、前6天的数据数据相加
DateTime nowDate = DateUtil.date();
String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -6).toString("yyyy-MM-dd");
List<String> rangeDateList = getRangeDateList(beforeSevenDateStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
}
if (Constants.SEARCH_DATE_LATELY_30.equals(dateLimit)) {// 30天
DateTime nowDate = DateUtil.date();
String beforeSevenDateStr = DateUtil.offsetDay(nowDate, -29).toString("yyyy-MM-dd");
List<String> rangeDateList = getRangeDateList(beforeSevenDateStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
}
if (Constants.SEARCH_DATE_WEEK.equals(dateLimit)) {// 周
// 判断今天是否是本周第一天
int dayOfWeek = DateUtil.thisDayOfWeek();
DateTime nowDate = DateUtil.date();
if (dayOfWeek == 2) {// 周一
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(nowDayData, response);
responsesList.add(response);
return responsesList;
} else if (dayOfWeek == 3) {// 周二
// 获取昨天的数据
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
List<String> rangeDateList = getRangeDateList(yesterdayStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
} else {
// 获取周一到现在的数据
String weekStartDateStr = DateUtil.beginOfWeek(nowDate).toString("yyyy-MM-dd");
List<String> rangeDateList = getRangeDateList(weekStartDateStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
}
}
if (Constants.SEARCH_DATE_MONTH.equals(dateLimit)) {// 月
// 判断今天是否是本月第一天
int dayOfMonth = DateUtil.thisDayOfMonth();
DateTime nowDate = DateUtil.date();
if (dayOfMonth == 1) {// 一号
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(nowDayData, response);
responsesList.add(response);
return responsesList;
} else if (dayOfMonth == 2) {// 二号
// 获取昨天的数据
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
List<String> rangeDateList = getRangeDateList(yesterdayStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
} else {
// 获取月初到现在的数据
String monthStartDateStr = DateUtil.beginOfMonth(nowDate).toString("yyyy-MM-dd");
List<String> rangeDateList = getRangeDateList(monthStartDateStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
}
}
if (Constants.SEARCH_DATE_YEAR.equals(dateLimit)) {// 年
// 判断今天是否是本年第一天
DateTime nowDate = DateUtil.date();
// 获取当年的开始日期
String beginOfYear = DateUtil.beginOfYear(nowDate).toString("yyyy-MM-dd");
String yesterdayStr = DateUtil.yesterday().toString("yyyy-MM-dd");
if (beginOfYear.equals(nowDate.toString("yyyy-MM-dd"))) {// 第一天
UserOverviewResponse nowDayData = getDataByDate(nowDate.toString("yyyy-MM-dd"));
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(nowDayData, response);
responsesList.add(response);
return responsesList;
} else if (beginOfYear.equals(yesterdayStr)) {// 第二天
List<String> rangeDateList = getRangeDateList(yesterdayStr, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
} else {
List<String> rangeDateList = getRangeDateList(beginOfYear, nowDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
}
}
// 自定义时间,切割时间
String[] split = dateLimit.split(",");
if (split.length < 2) {
throw new CrmebException("请选择正确的时间范围");
}
DateTime startDate = DateUtil.parseDate(split[0]);
DateTime endDate = DateUtil.parseDate(split[1]);
// 是否是同一天
if (DateUtil.isSameDay(startDate, endDate)) {
String dateStr = startDate.toString("yyyy-MM-dd");
// 判断时间是否是今天
if (DateUtil.isSameDay(startDate, DateUtil.date())) {
UserOverviewResponse nowDayData = getDataByDate(DateUtil.date().toString("yyyy-MM-dd"));
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(nowDayData, response);
responsesList.add(response);
return responsesList;
}
// 不是今天
UserOverviewResponse dayData = getDataByDate(dateStr);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dayData, response);
responsesList.add(response);
return responsesList;
}
// 判断开始时间是否大于结束时间
if (startDate.compareTo(endDate) >= 0) {
throw new CrmebException("请选择正确的时间范围");
}
// 获取两个日期间隔了多少天
List<String> rangeDateList = getRangeDateList(startDate.toString("yyyy-MM-dd"), endDate.toString("yyyy-MM-dd"));
rangeDateList.forEach(e -> {
UserOverviewResponse dataByDate = getDataByDate(e);
UserOverviewDateResponse response = new UserOverviewDateResponse();
BeanUtil.copyProperties(dataByDate, response);
responsesList.add(response);
});
return responsesList;
}
/**
* 根据日期获取数据
* @param date 日期
* @return UserOverviewResponse
*/
private UserOverviewResponse getDataByDate(String date) {
// 注册用户数
Integer registerNum = userService.getRegisterNumByDate(date);
// 浏览量
Integer pageviews = userVisitRecordService.getPageviewsByDate(date);
// 活跃用户数
Integer activeUserNum = userVisitRecordService.getActiveUserNumByDate(date);
// 下单用户数
Integer orderUserNum = storeOrderService.getOrderUserNumByDate(date);
// 充值用户数
Integer rechargeUserNum = userRechargeService.getRechargeUserNumByDate(date);
// 成交用户数(下单且支付)
Integer orderPayUserNum = storeOrderService.getOrderPayUserNumByDate(date);
// 成交金额
BigDecimal payOrderAmount = storeOrderService.getPayOrderAmountByDate(date);
// 客单价
BigDecimal customerPrice = commonCustomerPrice(payOrderAmount, orderPayUserNum);
UserOverviewResponse response = new UserOverviewResponse();
response.setRegisterNum(registerNum);
response.setPageviews(pageviews);
response.setActiveUserNum(activeUserNum);
response.setOrderUserNum(orderUserNum);
response.setRechargeUserNum(rechargeUserNum);
response.setOrderPayUserNum(orderPayUserNum);
response.setPayOrderAmount(payOrderAmount);
response.setCustomerPrice(customerPrice);
return response;
}
/**
* 根据日期获取数据(简版)
* @param date 日期
* @return UserOverviewResponse
*/
private UserOverviewResponse getSimpleDataByDate(String date) {
// 注册用户数
Integer registerNum = userService.getRegisterNumByDate(date);
// 活跃用户数
Integer activeUserNum = userVisitRecordService.getActiveUserNumByDate(date);
// 充值用户数
Integer rechargeUserNum = userRechargeService.getRechargeUserNumByDate(date);
UserOverviewResponse response = new UserOverviewResponse();
response.setRegisterNum(registerNum);
response.setActiveUserNum(activeUserNum);
response.setRechargeUserNum(rechargeUserNum);
return response;
}
/**
* 根据日期段获取数据
* @param startDate 日期
* @param endDate 日期
* @return UserOverviewResponse
*/
private UserOverviewResponse getDataByPeriod(String startDate, String endDate) {
// 注册用户数
Integer registerNum = userService.getRegisterNumByPeriod(startDate, endDate);
// 浏览量
Integer pageviews = userVisitRecordService.getPageviewsByPeriod(startDate, endDate);
// 活跃用户数
Integer activeUserNum = userVisitRecordService.getActiveUserNumByPeriod(startDate, endDate);
// 下单用户数
Integer orderUserNum = storeOrderService.getOrderUserNumByPeriod(startDate, endDate);
// 充值用户数
Integer rechargeUserNum = userRechargeService.getRechargeUserNumByPeriod(startDate, endDate);
// 成交用户数(下单且支付)
Integer orderPayUserNum = storeOrderService.getOrderPayUserNumByPeriod(startDate, endDate);
// 成交金额
BigDecimal payOrderAmount = storeOrderService.getPayOrderAmountByPeriod(startDate, endDate);
// 客单价
BigDecimal customerPrice = commonCustomerPrice(payOrderAmount, orderPayUserNum);
UserOverviewResponse response = new UserOverviewResponse();
response.setRegisterNum(registerNum);
response.setPageviews(pageviews);
response.setActiveUserNum(activeUserNum);
response.setOrderUserNum(orderUserNum);
response.setRechargeUserNum(rechargeUserNum);
response.setOrderPayUserNum(orderPayUserNum);
response.setPayOrderAmount(payOrderAmount);
response.setCustomerPrice(customerPrice);
return response;
}
/**
* 根据日期段获取数据(简版)
* @param startDate 日期
* @param endDate 日期
* @return UserOverviewResponse
*/
private UserOverviewResponse getSimpleDataByPeriod(String startDate, String endDate) {
// 注册用户数
Integer registerNum = userService.getRegisterNumByPeriod(startDate, endDate);
// 活跃用户数
Integer activeUserNum = userVisitRecordService.getActiveUserNumByPeriod(startDate, endDate);
// 充值用户数
Integer rechargeUserNum = userRechargeService.getRechargeUserNumByPeriod(startDate, endDate);
UserOverviewResponse response = new UserOverviewResponse();
response.setRegisterNum(registerNum);
response.setActiveUserNum(activeUserNum);
response.setRechargeUserNum(rechargeUserNum);
return response;
}
/**
* 客单价计算
* @param amount 支付总金额
* @param peopleNum 成交用户数(去重)
* @return BigDecimal
*/
private BigDecimal commonCustomerPrice(BigDecimal amount, Integer peopleNum) {
if (peopleNum.equals(0)) {
return BigDecimal.ZERO;
}
if (BigDecimal.ZERO.compareTo(amount) == 0) {
return BigDecimal.ZERO;
}
return amount.divide(BigDecimal.valueOf(peopleNum), 2, BigDecimal.ROUND_HALF_UP);
}
/**
* 计算环比并返回对象
* @param response 主对象
* @param tempResponse 临时对象
* @return UserOverviewResponse
*/
private UserOverviewResponse getCommonResponse(UserOverviewResponse response, UserOverviewResponse tempResponse) {
response.setRegisterNumRatio(calculateRatio(response.getRegisterNum(), tempResponse.getRegisterNum()));
response.setActiveUserNumRatio(calculateRatio(response.getActiveUserNum(), tempResponse.getActiveUserNum()));
response.setRechargeUserNumRatio(calculateRatio(response.getRechargeUserNum(), tempResponse.getRechargeUserNum()));
return response;
}
/**
* 计算环比
* @param data 数值
* @param beforeData 上一期数值
* @return 环比率
* (本期数 - 上期数)/上期数量*100%
*/
private String calculateRatio(Integer data, Integer beforeData) {
if (data - beforeData == 0) {
return "0%";
}
if (beforeData.equals(0)) {
return "100%";
}
BigDecimal bigDecimal = new BigDecimal(data);
BigDecimal beforeBigDecimal = new BigDecimal(beforeData);
BigDecimal ratio = bigDecimal.subtract(beforeBigDecimal).divide(beforeBigDecimal, 2, BigDecimal.ROUND_HALF_UP);
int intValue = ratio.multiply(BigDecimal.TEN).multiply(BigDecimal.TEN).intValue();
return intValue + "%";
}
/**
* 获取区域列表(省份)
* @return List
*/
private List<String> getAreaList() {
List<String> list = CollUtil.newArrayList();
list.add("北京");
list.add("天津");
list.add("河北");
list.add("山西");
list.add("内蒙古");
list.add("辽宁");
list.add("吉林");
list.add("黑龙江");
list.add("上海");
list.add("江苏");
list.add("浙江");
list.add("安徽");
list.add("福建");
list.add("江西");
list.add("山东");
list.add("河南");
list.add("湖北");
list.add("湖南");
list.add("广东");
list.add("广西");
list.add("海南");
list.add("重庆");
list.add("四川");
list.add("贵州");
list.add("云南");
list.add("西藏");
list.add("陕西");
list.add("甘肃");
list.add("青海");
list.add("宁夏");
list.add("新疆");
list.add("香港");
list.add("澳门");
list.add("台湾");
return list;
}
/**
* 获取时间区间列表
*/
private List<String> getRangeDateList(String startDate, String endDate) {
List<String> dateList = CollUtil.newArrayList();
if (startDate.equals(endDate)) {
dateList.add(startDate);
return dateList;
}
List<DateTime> dateTimeList = DateUtil.rangeToList(DateUtil.parse(startDate), DateUtil.parse(endDate), DateField.DAY_OF_YEAR);
dateTimeList.forEach(e -> {
dateList.add(e.toString("yyyy-MM-dd"));
});
return dateList;
}
}

View File

@@ -0,0 +1,131 @@
package com.zbkj.service.service.impl;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.zbkj.common.request.PageParamRequest;
import com.zbkj.common.constants.Constants;
import com.zbkj.common.vo.ProgramTempKeywordsVo;
import com.zbkj.common.vo.ProgramTemplateMessageVo;
import com.zbkj.common.vo.SendProgramTemplateMessageItemVo;
import com.github.pagehelper.PageHelper;
import com.zbkj.common.utils.RedisUtil;
import com.zbkj.common.model.user.UserToken;
import com.zbkj.common.model.wechat.WechatProgramMyTemp;
import com.zbkj.common.request.WechatProgramMyTempSearchRequest;
import com.zbkj.service.dao.WechatProgramMyTempDao;
import com.zbkj.service.service.UserTokenService;
import com.zbkj.service.service.WechatProgramMyTempService;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.List;
/**
* WechatProgramMyTempServiceImpl 接口实现
* +----------------------------------------------------------------------
* | CRMEB [ CRMEB赋能开发者助力企业发展 ]
* +----------------------------------------------------------------------
* | Copyright (c) 2016~2025 https://www.crmeb.com All rights reserved.
* +----------------------------------------------------------------------
* | Licensed CRMEB并不是自由软件未经许可不能去掉CRMEB相关版权
* +----------------------------------------------------------------------
* | Author: CRMEB Team <admin@crmeb.com>
* +----------------------------------------------------------------------
*/
@Service
public class WechatProgramMyTempServiceImpl extends ServiceImpl<WechatProgramMyTempDao, WechatProgramMyTemp> implements WechatProgramMyTempService {
@Resource
private WechatProgramMyTempDao dao;
@Autowired
private UserTokenService userTokenService;
@Autowired
private RedisUtil redisUtil;
/**
* 列表
* @param request 请求参数
* @param pageParamRequest 分页类参数
* @return List<WechatProgramMyTemp>
*/
@Override
public List<WechatProgramMyTemp> getList(WechatProgramMyTempSearchRequest request, PageParamRequest pageParamRequest) {
PageHelper.startPage(pageParamRequest.getPage(), pageParamRequest.getLimit());
//带 WechatProgramMyTemp 类的多条件查询
LambdaQueryWrapper<WechatProgramMyTemp> lambdaQueryWrapper = Wrappers.lambdaQuery();
//模板标题模糊查询,其余精确查询
if (StringUtils.isNotBlank(request.getTitle())) {
lambdaQueryWrapper.like(WechatProgramMyTemp::getTitle, request.getTitle());
}
if (StringUtils.isNotBlank(request.getTempId())) {
lambdaQueryWrapper.eq(WechatProgramMyTemp::getTempId, request.getTempId());
}
if (null != request.getStatus()) {
lambdaQueryWrapper.eq(WechatProgramMyTemp::getStatus, request.getStatus());
}
if (StringUtils.isNotBlank(request.getType())) {
lambdaQueryWrapper.eq(WechatProgramMyTemp::getType, request.getType());
}
if (null != request.getId()) {
lambdaQueryWrapper.eq(WechatProgramMyTemp::getId, request.getId());
}
lambdaQueryWrapper.orderByDesc(WechatProgramMyTemp::getUpdateTime);
return dao.selectList(lambdaQueryWrapper);
}
@Override
public void push(int myTempId, HashMap<String, String> map, Integer userId) {
// 查询对应id并且状态启用的模版
WechatProgramMyTempSearchRequest pram = new WechatProgramMyTempSearchRequest();
// pram.setTempId(tempKey+"");
pram.setId(myTempId);
pram.setStatus(true);
List<WechatProgramMyTemp> existMyTemps = getList(pram, new PageParamRequest());
if (null == existMyTemps) {
return;
}
WechatProgramMyTemp wechatProgramMyTemp = null;
if (existMyTemps.size() >= 1) wechatProgramMyTemp = existMyTemps.get(0);
if (wechatProgramMyTemp == null || StringUtils.isBlank(wechatProgramMyTemp.getKid())) {
return;
}
//拿到三方登录绑定的token
UserToken UserToken = userTokenService.getTokenByUserId(userId, Constants.THIRD_LOGIN_TOKEN_TYPE_PROGRAM);
if (null == UserToken || StringUtils.isBlank(UserToken.getToken())) {
return;
}
ProgramTemplateMessageVo programTemplateMessageVo = new ProgramTemplateMessageVo();
programTemplateMessageVo.setTemplate_id(wechatProgramMyTemp.getTempId());
//组装关键字数据
HashMap<String, SendProgramTemplateMessageItemVo> hashMap = new HashMap<>();
List<ProgramTempKeywordsVo> programTempKeywordsVoList = JSONArray.parseArray(wechatProgramMyTemp.getExtra(), ProgramTempKeywordsVo.class);
for (ProgramTempKeywordsVo programTempKeywordsVo : programTempKeywordsVoList) {
if (StringUtils.isBlank(map.get(programTempKeywordsVo.getKey()))) {
continue;
}
hashMap.put(programTempKeywordsVo.getSendKey(), new SendProgramTemplateMessageItemVo(map.get(programTempKeywordsVo.getKey())));
}
programTemplateMessageVo.setData(hashMap);
programTemplateMessageVo.setTouser(UserToken.getToken());
redisUtil.lPush(Constants.WE_CHAT_MESSAGE_KEY_PROGRAM, JSONObject.toJSONString(programTemplateMessageVo));
}
}

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zbkj.service.dao.ActivityStyleDao">
</mapper>

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zbkj.common.model.exception.ExceptionLogDao">
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.zbkj.common.model.exception.ExceptionLog">
<id column="id" property="id" />
<result column="exp_url" property="expUrl" />
<result column="exp_params" property="expParams" />
<result column="exp_type" property="expType" />
<result column="exp_controller" property="expController" />
<result column="exp_method" property="expMethod" />
<result column="exp_detail" property="expDetail" />
<result column="create_time" property="createTime" />
</resultMap>
<!-- 通用查询结果列 -->
<sql id="Base_Column_List">
id, exp_url, exp_params, exp_type, exp_controller, exp_method, exp_detail, create_time
</sql>
</mapper>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zbkj.service.dao.WechatProgramMyTempDao">
</mapper>

View File

@@ -0,0 +1,5 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.zbkj.service.dao.WechatProgramPublicTempDao">
</mapper>