mirror of
https://gitee.com/ZhongBangKeJi/crmeb_java.git
synced 2026-05-05 16:01:26 +08:00
后端代码提交
This commit is contained in:
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
Reference in New Issue
Block a user