diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java index 8e98259..9c2e3df 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/BaseSiteController.java @@ -115,6 +115,9 @@ public class BaseSiteController extends BaseController { @DeleteMapping("/{ids}") public AjaxResult remove(@PathVariable String[] ids) { List list = new ArrayList<>(Arrays.asList(ids)); + if (list.contains("main")){ + return error("请勿删除主站点"); + } return toAjax(baseSiteService.removeByIds(list)); } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java index dd0328d..7a22d2e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/controller/WebController.java @@ -21,10 +21,12 @@ import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.core.domain.R; import com.ruoyi.common.utils.StringUtils; import com.ruoyi.system.service.ISysDictDataService; +import com.ruoyi.utils.OssUtil; import io.swagger.annotations.Api; import io.swagger.annotations.ApiImplicitParam; import io.swagger.annotations.ApiImplicitParams; import io.swagger.annotations.ApiOperation; +import lombok.SneakyThrows; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import springfox.documentation.annotations.ApiIgnore; @@ -64,6 +66,8 @@ public class WebController extends BaseController { @Autowired private IBusiChatMainService busiChatMainService; @Autowired + private IBusiThirdItemService busiThirdItemService; + @Autowired private IBusiPageService pageService; @Autowired private CommonUtils commonUtils; @@ -73,6 +77,8 @@ public class WebController extends BaseController { private IBaseAppService appService; @Autowired private GoogleConfig googleConfig; + @Autowired + private OssUtil ossUtil; /** * 导航栏接口--所有分类 @@ -170,10 +176,13 @@ public class WebController extends BaseController { * @date 10:04 2025/7/8 **/ @ApiOperation("热门产品-前10") - @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) @GetMapping("/hotProduct") - public R> hotProduct(@RequestParam(required = true) String tenantId) { - return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, true)); + public R> hotProduct(@RequestParam(required = true) String tenantId,@RequestParam(required = true) String showPlat) { + return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, true,showPlat)); } /** @@ -184,10 +193,13 @@ public class WebController extends BaseController { * @date 10:04 2025/7/8 **/ @ApiOperation("普通产品-前10") - @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) @GetMapping("/product") - public R> product(@RequestParam(required = true) String tenantId) { - return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, false)); + public R> product(@RequestParam(required = true) String tenantId,@RequestParam(required = true) String showPlat) { + return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_PRODUCT, false,showPlat)); } /** @@ -198,10 +210,13 @@ public class WebController extends BaseController { * @date 10:04 2025/7/8 **/ @ApiOperation("热门新闻-前10") - @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + }) @GetMapping("/hotNews") - public R> hotNews(@RequestParam(required = true) String tenantId) { - return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_NEWS, true)); + public R> hotNews(@RequestParam(required = true) String tenantId,@RequestParam(required = true) String showPlat) { + return R.ok(prodNewService.hotProdOrNews(tenantId, DATA_TYPE_NEWS, true,showPlat)); } /** @@ -235,16 +250,18 @@ public class WebController extends BaseController { @ApiImplicitParam(name = "pageNum", value = "页码(1开始)", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "catgId", value = "分类id", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class), - @ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class) + @ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) }) @GetMapping("/prodPageList") - public R> prodPageList(String tenantId, String catgId, String text, + public R> prodPageList(String tenantId, @RequestParam(required = false) String catgId, @RequestParam(required = false) String text,String showPlat, @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNum, pageSize); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(BusiProdNew::getDataType, DATA_TYPE_PRODUCT) .eq(BusiProdNew::getIfPublic, true) + .like(BusiProdNew::getShowPlat,showPlat) .eq(BusiProdNew::getTenantId, tenantId); if (StringUtils.isNotEmpty(text)) { queryWrapper.and(wq -> wq @@ -289,16 +306,18 @@ public class WebController extends BaseController { @ApiImplicitParam(name = "pageNum", value = "页码(1开始)", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "catgId", value = "分类id", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class), - @ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class) + @ApiImplicitParam(name = "text", value = "搜索内容", required = false, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) }) @GetMapping("/newsPageList") - public R> newsPageList(String tenantId, String catgId, String text, + public R> newsPageList(String tenantId, @RequestParam(required = false) String catgId, @RequestParam(required = false) String text,String showPlat, @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNum, pageSize); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(BusiProdNew::getDataType, DATA_TYPE_NEWS) .eq(BusiProdNew::getIfPublic, true) + .like(BusiProdNew::getShowPlat,showPlat) .eq(BusiProdNew::getTenantId, tenantId); if (StringUtils.isNotEmpty(text)) { queryWrapper.and(wq -> wq @@ -352,14 +371,15 @@ public class WebController extends BaseController { @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), @ApiImplicitParam(name = "pageNum", value = "页码(1开始)", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), @ApiImplicitParam(name = "pageSize", value = "每页显示数量", required = true, dataType = "int", paramType = "query", dataTypeClass = Integer.class), - @ApiImplicitParam(name = "text", value = "搜索内容", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) + @ApiImplicitParam(name = "text", value = "搜索内容", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class), + @ApiImplicitParam(name = "showPlat", value = "平台标识(网站|App)", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) }) @GetMapping("/searchText") - public R> searchText(String tenantId, String text, + public R> searchText(String tenantId, String text,String showPlat, @RequestParam(name = "pageNum", defaultValue = "1") Integer pageNum, @RequestParam(name = "pageSize", defaultValue = "10") Integer pageSize) { Page page = new Page<>(pageNum, pageSize); - return R.ok(prodNewService.searchTextAll(tenantId, text, page)); + return R.ok(prodNewService.searchTextAll(tenantId, text, page,showPlat)); } /** @@ -373,7 +393,6 @@ public class WebController extends BaseController { @ApiImplicitParam(name = "tenantId", value = "站点唯一码", required = true, dataType = "string", paramType = "query", dataTypeClass = String.class) @GetMapping("/inquirySet") public R inquirySet(@RequestParam(required = true) String tenantId, HttpServletRequest request) { - String ip = CommonUtils.getIpAddr(request); return R.ok(baseInquiryService.getInquiry(tenantId)); } @@ -459,46 +478,17 @@ public class WebController extends BaseController { return R.ok(appService.selectNewApp()); } + @SneakyThrows @ApiOperation("下载APK文件") @GetMapping("/downloadApk") - public void downloadApk(HttpServletResponse response) { - try { - // APK文件路径 - File file = new File(googleConfig.getAppDownload()); - - // 检查文件是否存在 - if (!file.exists()) { - response.setStatus(HttpServletResponse.SC_NOT_FOUND); - response.getWriter().write("文件不存在"); - return; - } - - // 设置响应头 - response.setContentType("application/vnd.android.package-archive"); - response.setHeader("Content-Disposition", "attachment; filename=truck.apk"); - response.setHeader("Content-Length", String.valueOf(file.length())); - - // 写入响应流 - FileInputStream fis = new FileInputStream(file); - OutputStream os = response.getOutputStream(); - - byte[] buffer = new byte[1024]; - int bytesRead; - while ((bytesRead = fis.read(buffer)) != -1) { - os.write(buffer, 0, bytesRead); - } - - fis.close(); - os.flush(); - os.close(); - } catch (Exception e) { - try { - response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); - response.getWriter().write("文件下载失败: " + e.getMessage()); - } catch (Exception ex) { - logger.error("下载APK文件时发生错误", ex); - } + public void downloadApk(HttpServletResponse response,@RequestParam(required = false) String id) { + BaseApp appVersion; + if(StringUtils.isNotEmpty(id)){ + appVersion = appService.getById(id); + }else{ + appVersion = appService.selectNewApp(); } + ossUtil.downloadFile(response, appVersion.getApkUrl(), appVersion.getVersion()); } /** @@ -526,4 +516,27 @@ public class WebController extends BaseController { } } + /** + * 三方询盘点击记录次数 + * + * @return com.ruoyi.common.core.domain.AjaxResult + * @author vinjor-M + * @date 10:04 2025/7/8 + **/ + @ApiOperation("三方询盘点击记录次数") + @ApiImplicitParams(value = { + @ApiImplicitParam(name = "thirdSoft", value = "三方程序类型(Email|WhatsApp|Tel)", required = true, paramType = "body"), + @ApiImplicitParam(name = "tenantId", value = "站点编码", required = true, paramType = "body"), + @ApiImplicitParam(name = "equipment", value = "设备类型(移动端|电脑端)", required = true, paramType = "body") + }) + @PostMapping("/thirdItemSave") + public R thirdItemSave(@ApiIgnore @RequestBody BusiThirdItem thirdItem, HttpServletRequest request) { + thirdItem.setViewType("漂浮询盘"); + Map ipMap = commonUtils.getIPAndCountry(request); + thirdItem.setIp(ipMap.get("ip")); + thirdItem.setNational(ipMap.get("national")); + thirdItem.setOceania(ipMap.get("oceania")); + busiThirdItemService.save(thirdItem); + return R.ok(); + } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java index 4483bc7..f630b26 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/domain/BaseApp.java @@ -33,6 +33,10 @@ public class BaseApp extends DlBaseEntity @Excel(name = "版本") private String version; + /** app包下载地址 */ + @Excel(name = "app包下载地址") + private String apkUrl; + /** 本次升级描述 */ @Excel(name = "本次升级描述") private String content; diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java index df30c94..04bc451 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/base/service/impl/BaseSiteServiceImpl.java @@ -3,10 +3,12 @@ package com.ruoyi.base.service.impl; import java.util.List; import com.ruoyi.base.vo.SiteVO; +import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.utils.DateUtils; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.common.utils.SecurityUtils; +import com.ruoyi.system.service.ISysUserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; @@ -25,6 +27,8 @@ public class BaseSiteServiceImpl extends ServiceImpl i { @Autowired private BaseSiteMapper baseSiteMapper; + @Autowired + private ISysUserService sysUserService; @Override public IPage queryListPage(BaseSite pageReqVO, Page page) { @@ -45,6 +49,13 @@ public class BaseSiteServiceImpl extends ServiceImpl i //超级管理员,查所有站点 return this.list(); } - return baseSiteMapper.selectByUserId(userId); + List managerList = baseSiteMapper.selectByUserId(userId); + if(managerList.isEmpty()){ + //没有管理权限的站点,查当前用户所属的站点 + SysUser user = sysUserService.selectUserById(userId); + BaseSite site = this.getById(user.getTenantId()); + managerList.add(site); + } + return managerList; } } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java index e95f9a7..13426d1 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiChatMainController.java @@ -8,6 +8,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.busi.domain.BusiChatItem; import com.ruoyi.busi.service.IBusiChatItemService; +import com.ruoyi.busi.vo.ChatExcelMainVO; import com.ruoyi.busi.vo.ChatMainVO; import com.ruoyi.common.core.domain.model.LoginUser; import com.ruoyi.common.utils.SecurityUtils; @@ -66,10 +67,12 @@ public class BusiChatMainController extends BaseController @PreAuthorize("@ss.hasPermi('busi:chatMain:export')") @Log(title = "在线聊天", businessType = BusinessType.EXPORT) @PostMapping("/export") - public void export(HttpServletResponse response, BusiChatMain busiChatMain) + public void export(HttpServletResponse response, ChatMainVO busiChatMain) { - List list = busiChatMainService.list(); - ExcelUtil util = new ExcelUtil(BusiChatMain.class); +// List list = busiChatMainService.list(); +// ExcelUtil util = new ExcelUtil(BusiChatMain.class); + List list = busiChatMainService.listChatMain(busiChatMain); + ExcelUtil util = new ExcelUtil(ChatExcelMainVO.class); util.exportExcel(response, list, "在线聊天数据"); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java index c83dc4c..afea83a 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiNewController.java @@ -5,8 +5,10 @@ import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.base.service.IBasePicsService; import com.ruoyi.busi.domain.BusiProdNew; import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.domain.BusiRelation; import com.ruoyi.busi.service.IBusiProdNewService; import com.ruoyi.busi.service.IBusiProdRandomService; +import com.ruoyi.busi.service.IBusiRelationService; import com.ruoyi.busi.utils.SimHash; import com.ruoyi.busi.utils.TextPreprocessor; import com.ruoyi.busi.vo.ProdNewVO; @@ -15,6 +17,7 @@ import com.ruoyi.common.annotation.Log; import com.ruoyi.common.core.controller.BaseController; import com.ruoyi.common.core.domain.AjaxResult; import com.ruoyi.common.enums.BusinessType; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.poi.ExcelUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; @@ -43,6 +46,8 @@ public class BusiNewController extends BaseController private IBasePicsService basePicsService; @Autowired private IBusiProdRandomService prodRandomService; + @Autowired + private IBusiRelationService relationService; /** * 查询新闻列表 @@ -121,6 +126,13 @@ public class BusiNewController extends BaseController }); basePicsService.saveBatch(prodNewVO.getFileList()); } + //默认负责人就是当前用户 + BusiRelation relation = new BusiRelation(); + relation.setUserId(SecurityUtils.getUserId()); + relation.setProdId(prodNewVO.getId()); + relation.setTenantId(prodNewVO.getTenantId()); + relationService.save(relation); + busiProdNewService.setAmount(prodNewVO.getTenantId()); return success(); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java index 46b6039..a97eb13 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiProdController.java @@ -10,11 +10,14 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.base.service.IBasePicsService; import com.ruoyi.busi.domain.BusiProdRandom; +import com.ruoyi.busi.domain.BusiRelation; import com.ruoyi.busi.service.IBusiProdRandomService; +import com.ruoyi.busi.service.IBusiRelationService; import com.ruoyi.busi.utils.SimHash; import com.ruoyi.busi.utils.TextPreprocessor; import com.ruoyi.busi.vo.ProdNewVO; import com.ruoyi.busi.vo.ProdRandomVO; +import com.ruoyi.common.utils.SecurityUtils; import com.ruoyi.common.utils.StringUtils; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.beans.factory.annotation.Autowired; @@ -54,6 +57,8 @@ public class BusiProdController extends BaseController private IBasePicsService basePicsService; @Autowired private IBusiProdRandomService prodRandomService; + @Autowired + private IBusiRelationService relationService; /** * 查询产品列表 @@ -132,6 +137,13 @@ public class BusiProdController extends BaseController }); basePicsService.saveBatch(prodNewVO.getFileList()); } + //默认负责人就是当前用户 + BusiRelation relation = new BusiRelation(); + relation.setUserId(SecurityUtils.getUserId()); + relation.setProdId(prodNewVO.getId()); + relation.setTenantId(prodNewVO.getTenantId()); + relationService.save(relation); + busiProdNewService.setAmount(prodNewVO.getTenantId()); return success(); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java index 13eb083..35231bf 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/controller/BusiRelationController.java @@ -89,7 +89,7 @@ public class BusiRelationController extends BaseController List busiRelationList = new ArrayList<>(); userIdList.forEach(item->{ BusiRelation relation = new BusiRelation(); - relation.setUserId(item); + relation.setUserId(Long.valueOf(item)); relation.setProdId(busiRelation.getProdId()); relation.setTenantId(busiRelation.getTenantId()); busiRelationList.add(relation); diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java index d9edbc9..5962a47 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiProdNew.java @@ -1,6 +1,7 @@ package com.ruoyi.busi.domain; import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; import com.ruoyi.common.annotation.Excel; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; @@ -70,9 +71,15 @@ public class BusiProdNew extends DlBaseEntity @ApiModelProperty("文章来源") private String newsFrom; + /** 展示平台(PC、APP) */ + @Excel(name = "展示平台(PC、APP)") + @ApiModelProperty("展示平台(PC、APP)") + private String showPlat; + /** 文章发布日期 */ @Excel(name = "文章发布日期") @ApiModelProperty("文章发布日期") + @JsonFormat(pattern = "yyyy-MM-dd") private Date publicDate; /** 产品主图或文章图片 */ diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java index f85af2f..c6ae3cf 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiRelation.java @@ -30,7 +30,7 @@ public class BusiRelation extends DlBaseEntity /** 用户id */ @Excel(name = "用户id") - private String userId; + private Long userId; /** 产品、新闻id */ @Excel(name = "产品、新闻id") diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java index 8a99f01..dc91bbe 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/domain/BusiThirdItem.java @@ -39,6 +39,9 @@ public class BusiThirdItem extends DlBaseEntity /** 来源国家 */ @Excel(name = "来源国家") private String national; + /** 来源洲 */ + @Excel(name = "来源洲") + private String oceania; /** 所属email/电话/teams账户 */ @Excel(name = "所属email/电话/teams账户") diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java index 2745b8f..e90db42 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiChatMainMapper.java @@ -5,6 +5,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.ruoyi.busi.domain.BusiChatMain; import com.ruoyi.busi.vo.ChartDataVO; +import com.ruoyi.busi.vo.ChatExcelMainVO; import com.ruoyi.busi.vo.ChatMainVO; import com.ruoyi.busi.vo.ThirdSoftVO; import org.apache.ibatis.annotations.Param; @@ -22,6 +23,8 @@ public interface BusiChatMainMapper extends BaseMapper { IPage queryListPage(@Param("entity") ChatMainVO entity, Page page); + List selectChatList(@Param("entity") BusiChatMain entity); + /** * 查询IP数量 * @author vinjor-M diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java index 080a2f1..a145c5d 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordItemMapper.java @@ -24,7 +24,7 @@ public interface BusiKeywordItemMapper extends BaseMapper { IPage queryListPage(@Param("entity") BusiKeywordItem entity, Page page); - int deleteBySelectDateInt(@Param("date") String date); + int deleteBySelectDateInt(@Param("date") String date,@Param("title") String title); /** * 分页查询关键词基础信息 diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java index 5c616e3..ab873ad 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/mapper/BusiKeywordMapper.java @@ -26,4 +26,5 @@ public interface BusiKeywordMapper extends BaseMapper **/ Date selectNewDate(); + void deleteByIdAndTenantId(@Param("id") String item, @Param("tenantId") String tenantId); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java index 7f2425d..924730e 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiChatMainService.java @@ -6,6 +6,7 @@ import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.baomidou.mybatisplus.extension.service.IService; import com.ruoyi.busi.domain.BusiChatMain; +import com.ruoyi.busi.vo.ChatExcelMainVO; import com.ruoyi.busi.vo.ChatMainVO; /** @@ -17,6 +18,15 @@ import com.ruoyi.busi.vo.ChatMainVO; public interface IBusiChatMainService extends IService { IPage queryListPage(ChatMainVO pageReqVO, Page page); + /** + * 不分页查询聊天记录适配导出 + * @author PQZ + * @date 14:03 2025/10/21 + * @param chatMainVO {@link ChatMainVO} + * @return java.util.List + **/ + List listChatMain(ChatMainVO chatMainVO); + /** * 校验是否需要新增 * diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java index bab1d0c..a734d1b 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiKeywordItemService.java @@ -13,7 +13,7 @@ import com.ruoyi.busi.vo.BusiKeywordRankStatVO; /** * 关键词排名明细Service接口 - * + * * @author vinjor-m * @date 2025-08-21 */ @@ -26,7 +26,7 @@ public interface IBusiKeywordItemService extends IService * @author vinjor-M * @date 15:10 2025/8/21 **/ - void getKeywordRanking(); + void getKeywordRanking() throws InterruptedException; /** * 分页查询关键词排名统计 @@ -38,7 +38,6 @@ public interface IBusiKeywordItemService extends IService /** * 统计当天1-10名和11-20名的关键词数量 - * @param selectDate 选择日期 * @param tenantId 租户ID * @return Map形式的统计结果 {key1: 1-10名数量, key2: 11-20名数量} */ diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java index 9866acc..8d1b7b0 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/IBusiProdNewService.java @@ -54,7 +54,7 @@ public interface IBusiProdNewService extends IService * @param tenantId 租户id * @return java.util.List **/ - List hotProdOrNews(String tenantId,String dateType,Boolean ifHot); + List hotProdOrNews(String tenantId,String dateType,Boolean ifHot,String showPlat); /** * web站点查看详情 @@ -74,7 +74,7 @@ public interface IBusiProdNewService extends IService * @param page 分页对象 * @return com.baomidou.mybatisplus.core.metadata.IPage **/ - IPage searchTextAll(String tenantId, String text,Page page); + IPage searchTextAll(String tenantId, String text,Page page,String showPlat); /** * 相似度检测 diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java index 776a40b..4a557b1 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiCategoryServiceImpl.java @@ -40,20 +40,18 @@ public class BusiCategoryServiceImpl extends ServiceImpl treeCategory(BusiCategory category) { //查询全部栏目 LambdaQueryWrapper lambdaQueryWrapper = new LambdaQueryWrapper<>(); - lambdaQueryWrapper.eq(DlBaseEntity::getDelFlag,0) - .eq(BusiCategory::getTenantId,category.getTenantId()); - if(StringUtils.isNotEmpty(category.getCatgType())){ - lambdaQueryWrapper.eq(BusiCategory::getCatgType,category.getCatgType()); + lambdaQueryWrapper.eq(DlBaseEntity::getDelFlag, 0) + .eq(BusiCategory::getTenantId, category.getTenantId()); + if (StringUtils.isNotEmpty(category.getCatgType())) { + lambdaQueryWrapper.eq(BusiCategory::getCatgType, category.getCatgType()); } if (!StringUtils.isEmpty(category.getCatgName())) { lambdaQueryWrapper.like(BusiCategory::getCatgName, category.getCatgName()); } - lambdaQueryWrapper.orderByAsc(BusiCategory::getSort); + lambdaQueryWrapper.orderByDesc(BusiCategory::getSort); List list = list(lambdaQueryWrapper); List rtnList = buildCategoryTree(list); - return rtnList.stream().sorted(Comparator.comparing(BusiCategoryVO::getSort, - Comparator.nullsLast(Comparator.reverseOrder()))) - .collect(Collectors.toList()); + return rtnList; } /** @@ -152,12 +150,10 @@ public class BusiCategoryServiceImpl extends ServiceImpl - * @author PQZ - * @date 14:11 2025/6/23 **/ private List buildCategoryTree(List list) { // Map存放id到VO的映射 @@ -165,7 +161,7 @@ public class BusiCategoryServiceImpl extends ServiceImpl nodes) { + if (nodes == null || nodes.isEmpty()) { + return; + } + + // 对当前层级节点排序 + nodes.sort(Comparator.comparing(BusiCategoryVO::getSort, + Comparator.nullsLast(Comparator.reverseOrder()))); + + // 递归对子节点排序 + for (BusiCategoryVO node : nodes) { + if (node.getChildren() != null && !node.getChildren().isEmpty()) { + sortTreeNodes(node.getChildren()); + } + } + } + + /** * @param id 查询的栏目ID * @return java.util.List @@ -207,54 +230,55 @@ public class BusiCategoryServiceImpl extends ServiceImpl dealFirstId(List busiCategoryVOList) { - busiCategoryVOList.forEach(item->{ + busiCategoryVOList.forEach(item -> { String thisMaxParentId = item.getId(); item.setMaxParentId(thisMaxParentId); - if(null!=item.getChildren() && !item.getChildren().isEmpty()){ + if (null != item.getChildren() && !item.getChildren().isEmpty()) { //有子级 - this.setChildMaxParentId(item.getChildren(),thisMaxParentId); + this.setChildMaxParentId(item.getChildren(), thisMaxParentId); } }); return busiCategoryVOList; } - private void setChildMaxParentId(List childList,String maxParentId){ - childList.forEach(item->{ + private void setChildMaxParentId(List childList, String maxParentId) { + childList.forEach(item -> { item.setMaxParentId(maxParentId); - if(null!=item.getChildren()&& !item.getChildren().isEmpty()){ - this.setChildMaxParentId(item.getChildren(),maxParentId); + if (null != item.getChildren() && !item.getChildren().isEmpty()) { + this.setChildMaxParentId(item.getChildren(), maxParentId); } }); } /** * 给所有子级设置最父级ID并且反回map格式 - * @author vinjor-M - * @date 11:23 2025/7/19 + * * @param busiCategoryVOList 栏目树 * @return java.util.List + * @author vinjor-M + * @date 11:23 2025/7/19 **/ @Override - public Map dealFirstIdRtnMap(List busiCategoryVOList){ - Map rtnMap = new HashMap<>(); - busiCategoryVOList.forEach(item->{ + public Map dealFirstIdRtnMap(List busiCategoryVOList) { + Map rtnMap = new HashMap<>(); + busiCategoryVOList.forEach(item -> { String thisMaxParentId = item.getId(); item.setMaxParentId(thisMaxParentId); - rtnMap.put(item.getId(),thisMaxParentId); - if(null!=item.getChildren() && !item.getChildren().isEmpty()){ + rtnMap.put(item.getId(), thisMaxParentId); + if (null != item.getChildren() && !item.getChildren().isEmpty()) { //有子级 - this.setChildMaxParentIdMap(item.getChildren(),thisMaxParentId,rtnMap); + this.setChildMaxParentIdMap(item.getChildren(), thisMaxParentId, rtnMap); } }); return rtnMap; } - private void setChildMaxParentIdMap(List childList,String maxParentId,Map rtnMap){ - childList.forEach(item->{ + private void setChildMaxParentIdMap(List childList, String maxParentId, Map rtnMap) { + childList.forEach(item -> { item.setMaxParentId(maxParentId); - rtnMap.put(item.getId(),maxParentId); - if(null!=item.getChildren()&& !item.getChildren().isEmpty()){ - this.setChildMaxParentIdMap(item.getChildren(),maxParentId,rtnMap); + rtnMap.put(item.getId(), maxParentId); + if (null != item.getChildren() && !item.getChildren().isEmpty()) { + this.setChildMaxParentIdMap(item.getChildren(), maxParentId, rtnMap); } }); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java index d697ba8..3574f38 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiChatMainServiceImpl.java @@ -7,8 +7,10 @@ import java.util.concurrent.TimeUnit; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.ruoyi.base.service.IBaseManagerService; +import com.ruoyi.busi.domain.BusiChatItem; import com.ruoyi.busi.mapper.BusiChatItemMapper; import com.ruoyi.busi.service.IBusiChatItemService; +import com.ruoyi.busi.vo.ChatExcelMainVO; import com.ruoyi.busi.vo.ChatMainVO; import com.ruoyi.common.core.domain.entity.SysUser; import com.ruoyi.common.core.redis.RedisCache; @@ -53,6 +55,43 @@ public class BusiChatMainServiceImpl extends ServiceImpl + * @author PQZ + * @date 14:03 2025/10/21 + **/ + @Override + public List listChatMain(ChatMainVO chatMainVO) { + List result = busiChatMainMapper.selectChatList(chatMainVO); + result.forEach(item -> { + item.setCreateTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",item.getCreateTime())); + item.setUpdateTimeStr(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss",item.getUpdateTime())); + // 将chatItemList转换为指定格式的字符串 + if (item.getChatItemList() != null && !item.getChatItemList().isEmpty()) { + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < item.getChatItemList().size(); i++) { + BusiChatItem chatItem = item.getChatItemList().get(i); + String dataFromDisplay = "customer".equals(chatItem.getDataFrom()) ? "客户" : "平台"; + sb.append(dataFromDisplay) + .append(":") + .append(chatItem.getContent()) + .append("(") + .append(DateUtils.parseDateToStr("yyyy-MM-dd HH:mm:ss", chatItem.getCreateTime())) + .append(")"); + // 如果不是最后一个元素,添加换行符 + if (i < item.getChatItemList().size() - 1) { + sb.append("\n"); + } + } + item.setChatHistory(sb.toString()); + } + }); + return result; + } + /** * 校验是否需要新增 * diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java index 1f77150..7fe0814 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordItemServiceImpl.java @@ -4,9 +4,10 @@ import java.util.*; import java.util.stream.Collectors; import cn.hutool.core.date.DateUtil; -import com.alibaba.fastjson2.JSONObject; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; +import com.ruoyi.base.domain.BaseSite; +import com.ruoyi.base.service.IBaseSiteService; import com.ruoyi.busi.domain.BusiKeyword; import com.ruoyi.busi.service.IBusiKeywordService; import com.ruoyi.busi.vo.BusiKeywordItemQueryVO; @@ -18,9 +19,11 @@ import com.ruoyi.busi.mapper.BusiKeywordItemMapper; import com.ruoyi.busi.domain.BusiKeywordItem; import com.ruoyi.busi.service.IBusiKeywordItemService; +import static com.ruoyi.common.utils.GoogleRankUtil.getGoogleRankMain; + /** * 关键词排名明细Service业务层处理 - * + * * @author vinjor-m * @date 2025-08-21 */ @@ -31,6 +34,8 @@ public class BusiKeywordItemServiceImpl extends ServiceImpl queryListPage(BusiKeywordItem pageReqVO, Page page) { @@ -44,20 +49,40 @@ public class BusiKeywordItemServiceImpl extends ServiceImpl siteList = baseSiteService.list(); + Map siteMap = siteList.stream().collect(Collectors.toMap(BaseSite::getId, BaseSite::getSiteUrl)); List keywordList = busiKeywordService.list(); - //删除今日所有的排名数据 - busiKeywordItemMapper.deleteBySelectDateInt(DateUtil.formatDate(nowDate)); List insertList = new ArrayList<>(); + int i = 0; for (BusiKeyword keyword : keywordList) { BusiKeywordItem busiKeywordItem = new BusiKeywordItem(); busiKeywordItem.setTitle(keyword.getId()); busiKeywordItem.setSelectDate(nowDate); - //TODO 调朱哥的接口获取排名 - busiKeywordItem.setRanking(1); - busiKeywordItem.setTenantId(keyword.getTenantId()); - insertList.add(busiKeywordItem); + System.out.println("第" + (i+1) + "次搜索: 关键词=" + keyword.getId() + ", 目标网站=" + siteMap.get(keyword.getTenantId())); + int rank = 0; + try { + // 测试用例:搜索关键词,查找特定网站的排名 + rank = getGoogleRankMain( keyword.getId(), siteMap.get(keyword.getTenantId())); + System.out.println("第" + (i+1) + "次搜索:"+"排名:" + rank); + } catch (Exception e) { + System.err.println("搜索过程中发生异常: " + e.getMessage()); + } + // 模拟用户行为:随机休眠5-15秒 + int randomSleep = 10000 + (int) (Math.random() * 20000); + System.out.println("等待 " + (randomSleep / 1000) + " 秒后进行下次搜索..."); + Thread.sleep(randomSleep); + if(rank>0 && rank<=20){ + //找到今天的排名 + busiKeywordItem.setRanking(rank); + busiKeywordItem.setTenantId(keyword.getTenantId()); + insertList.add(busiKeywordItem); + //删除这个关键词今天的排名 + busiKeywordItemMapper.deleteBySelectDateInt(DateUtil.formatDate(nowDate),busiKeywordItem.getTitle()); + } + i++; } if(!insertList.isEmpty()){ this.saveBatch(insertList); diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java index d6c86e7..48d82bd 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/service/impl/BusiKeywordServiceImpl.java @@ -69,6 +69,8 @@ public class BusiKeywordServiceImpl extends ServiceImpl hotProdOrNews(String tenantId,String dateType,Boolean ifHot) { + public List hotProdOrNews(String tenantId,String dateType,Boolean ifHot,String showPlat) { Page page = new Page<>(1, 10); LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(BusiProdNew::getTenantId,tenantId) .eq(BusiProdNew::getDataType,dateType) .eq(BusiProdNew::getIfPublic,true) .eq(BusiProdNew::getIfReco,ifHot) + .like(BusiProdNew::getShowPlat,showPlat) .orderByDesc(BusiProdNew::getSort); //查所有栏目 BusiCategory category = new BusiCategory(); @@ -202,10 +203,11 @@ public class BusiProdNewServiceImpl extends ServiceImpl searchTextAll(String tenantId, String text, Page page) { + public IPage searchTextAll(String tenantId, String text, Page page,String showPlat) { LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper() .eq(BusiProdNew::getTenantId,tenantId) .eq(BusiProdNew::getIfPublic,true) + .like(BusiProdNew::getShowPlat,showPlat) .and(wq->wq .like(BusiProdNew::getTitle,text) .or().like(BusiProdNew::getDescription,text) diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatExcelMainVO.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatExcelMainVO.java new file mode 100644 index 0000000..140ab29 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/busi/vo/ChatExcelMainVO.java @@ -0,0 +1,61 @@ +package com.ruoyi.busi.vo; + +import com.baomidou.mybatisplus.annotation.FieldFill; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableName; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.ruoyi.busi.domain.BusiChatItem; +import com.ruoyi.common.annotation.Excel; +import lombok.*; + +import java.util.Date; +import java.util.List; + +@Data +@ToString(callSuper = true) +@Builder +@NoArgsConstructor +@AllArgsConstructor +public class ChatExcelMainVO{ + private String id; + /** 产品名称 */ + @Excel(name = "产品名称") + private String prodName; + /** 来源IP */ + @Excel(name = "IP") + private String ip; + /** 来源国家 */ + @Excel(name = "国家") + private String national; + /** 来源洲 */ + @Excel(name = "洲") + private String oceania; + /** 设备类型 */ + @Excel(name = "设备类型") + private String equipment; + /** 用户名称 */ + @Excel(name = "负责员工") + private String userName; + + /** 创建时间 */ + @Excel(name = "最早聊天时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String createTimeStr; + /** 创建时间 */ + @Excel(name = "最近聊天时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String updateTimeStr; + /** 聊天记录 */ + @Excel(name = "聊天记录") + private String chatHistory; + + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + /** 创建时间 */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + private List chatItemList; + +} diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java index 260a51c..4fb9db5 100644 --- a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/task/BusiTask.java @@ -32,7 +32,7 @@ public class BusiTask { * @author vinjor-M * @date 14:51 2025/8/21 **/ - public void updateKeywordRanking() { + public void updateKeywordRanking() throws InterruptedException { busiKeywordItemService.getKeywordRanking(); System.out.println("【"+ DateUtil.now() +"】执行更新本站使用关键词google排名成功"); } diff --git a/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/OssUtil.java b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/OssUtil.java new file mode 100644 index 0000000..0b845f0 --- /dev/null +++ b/dl_admin/ruoyi-admin/src/main/java/com/ruoyi/utils/OssUtil.java @@ -0,0 +1,88 @@ +package com.ruoyi.utils; + +import com.aliyun.oss.ClientBuilderConfiguration; +import com.aliyun.oss.OSS; +import com.aliyun.oss.OSSClientBuilder; +import com.aliyun.oss.model.ObjectMetadata; +import com.aliyuncs.utils.IOUtils; +import com.ruoyi.common.config.OssConfig; +import lombok.extern.slf4j.Slf4j; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import javax.servlet.http.HttpServletResponse; +import java.io.BufferedInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.net.URLEncoder; + +@Slf4j +@Component +public class OssUtil { + @Autowired + private OssConfig ossConfig; + + /** + * 上传文件(fileKey-InputStream) + */ + public void uploadFile(String fileKey, InputStream stream) throws IOException { + ClientBuilderConfiguration conf = new ClientBuilderConfiguration(); + OSS client = new OSSClientBuilder().build(ossConfig.getEndPoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret(), conf); + + try { + client.putObject(ossConfig.getBucketName(), fileKey, stream); + } finally { + stream.close(); + if (client != null) { + client.shutdown(); + } + IOUtils.closeQuietly(stream); + } + } + + + /** + * 文件下载 + */ + public void downloadFile(HttpServletResponse response, String fileKey, String fileName) throws IOException { + fileKey = fileKey.replace("https://"+ossConfig.getBucketName()+"."+ossConfig.getEndPoint()+"/",""); + InputStream stream = null; + BufferedInputStream bufferedInputStream = null; + ClientBuilderConfiguration conf = new ClientBuilderConfiguration(); + OSS client = new OSSClientBuilder().build(ossConfig.getEndPoint(), ossConfig.getAccessKeyId(), ossConfig.getAccessKeySecret(), conf); + try { + // 在获取文件流之前,先获取文件元数据 + ObjectMetadata metadata = client.getObjectMetadata(ossConfig.getBucketName(), fileKey); + long contentLength = metadata.getContentLength(); + stream = client.getObject(ossConfig.getBucketName(), fileKey).getObjectContent(); + response.reset(); + // 设置Content-Length响应头 + response.setContentLengthLong(contentLength); + response.setContentType("application/octet-stream"); + response.addHeader("Content-Disposition", "attachment;filename=CDbay-" + URLEncoder.encode(fileName, "UTF-8") + .replace("+", "%20")+".apk"); + OutputStream outputStream = response.getOutputStream(); + bufferedInputStream = new BufferedInputStream(stream); + byte[] buf = new byte[16384]; + int bytesRead; + while ((bytesRead = stream.read(buf, 0, buf.length)) >= 0) { + outputStream.write(buf, 0, bytesRead); + outputStream.flush(); + } + } finally { + if (client != null) { + client.shutdown(); + } + + if (bufferedInputStream != null || stream != null) { + try { + bufferedInputStream.close(); + stream.close(); + } catch (IOException e) { + log.error("Oss Download IOException,fileKey:" + fileKey, e); + } + } + } + } +} diff --git a/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml b/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml index c6a11ed..01673a8 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application-druid.yml @@ -4,16 +4,16 @@ spring: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver druid: - # 主库数据源-点亮开发库 +# # 主库数据源-成达服务器-测试库 master: - url: jdbc:mysql://82.156.161.160:3306/dl_site_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 - username: site - password: 123456 - #主库数据源-客户测试服务器 + url: jdbc:mysql://8.220.74.244:3306/dl_test_site?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 + username: dl_test_site + password: Aa123456. +# 主库数据源-成达服务器-生产库 # master: -# url: jdbc:mysql://127.0.0.1:3306/dl_site_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 +# url: jdbc:mysql://8.220.74.244:3306/dl_site_system?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 # username: site -# password: 123456 +# password: Chengda@2025~ # 从库数据源 slave: # 从数据源开关/默认关闭 diff --git a/dl_admin/ruoyi-admin/src/main/resources/application.yml b/dl_admin/ruoyi-admin/src/main/resources/application.yml index 348b02e..cbd191b 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/application.yml +++ b/dl_admin/ruoyi-admin/src/main/resources/application.yml @@ -7,7 +7,7 @@ ruoyi: # 版权年份 copyrightYear: 2025 # 文件路径 示例( Windows配置D:/ruoyi/uploadPath,Linux配置 /home/ruoyi/uploadPath) - profile: D:/ruoyi/uploadPath + profile: /uploadPath # 获取ip地址开关 addressEnabled: false # 验证码类型 math 数字计算 char 字符验证 @@ -146,10 +146,10 @@ xss: # 阿里云OSS配置 aliyun: oss: - end-point: oss-cn-qingdao.aliyuncs.com - access-key-id: LTAI5tLThQFWgMLRTf3siNjb - access-key-secret: M5HjOyB8ir5tYEPFOQwImfJNgsumaG - bucket-name: dianliang123 + end-point: oss-eu-central-1.aliyuncs.com + access-key-id: LTAI5tB7zL8KuHDnMsdUhXRy + access-key-secret: bZ28G69DLR6Q3WhvvrWyxWw3lEbfzk + bucket-name: sd-chengda #google ads配置 google: ads: diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml index 560aa22..b53d06f 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/base/BaseAppMapper.xml @@ -7,6 +7,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" + @@ -16,7 +17,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" - select id, version, content, creator, create_time, updater, update_time, del_flag from dl_base_app + select id, version, apk_url, content, creator, create_time, updater, update_time, del_flag from dl_base_app \ No newline at end of file diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml index 5d15daa..31620e3 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiChatMainMapper.xml @@ -28,6 +28,23 @@ + + + + + + + + + + + + + + + + + + diff --git a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml index 9716e1b..9a110e6 100644 --- a/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml +++ b/dl_admin/ruoyi-admin/src/main/resources/mapper/busi/BusiKeywordMapper.xml @@ -12,6 +12,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" select id, tenant_id from dl_busi_keyword + + DELETE FROM dl_busi_keyword WHERE id =#{id} AND tenant_id=#{tenantId} + - select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status,u.open_id,u.wx_open_id,u.union_id,u.invite_id,u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u + select u.user_id, u.dept_id, u.nick_name, u.user_name, u.email, u.avatar, u.phonenumber, u.sex, u.status,u.open_id,u.wx_open_id,u.union_id,u.invite_id,u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, u.tenant_id,d.dept_name, d.leader from sys_user u left join sys_dept d on u.dept_id = d.dept_id where u.del_flag = '0' @@ -73,6 +74,9 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" AND u.status = #{status} + + AND u.tenant_id = #{tenantId} + AND u.phonenumber like concat('%', #{phonenumber}, '%') @@ -90,7 +94,7 @@ PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"