Merge branch 'develop' into feature/order

# Conflicts:
#	tashow-module/pom.xml
#	tashow-module/tashow-module-infra/src/main/resources/application-local.yaml
This commit is contained in:
2025-10-15 11:33:01 +08:00
141 changed files with 4156 additions and 1744 deletions

View File

@@ -15,6 +15,7 @@
<module>tashow-module-infra</module>
<module>tashow-module-app</module>
<module>tashow-module-product</module>
<module>tashow-module-ai</module>
<module>tashow-module-pay</module>
<module>tashow-module-trade</module>
<module>tashow-module-member</module>

View File

@@ -0,0 +1,96 @@
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-module</artifactId>
<version>${revision}</version>
</parent>
<artifactId>tashow-module-ai</artifactId>
<packaging>jar</packaging>
<dependencies>
<!-- Registry 注册中心相关 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId>
</dependency>
<!-- Config 配置中心相关 -->
<dependency>
<groupId>com.alibaba.cloud</groupId>
<artifactId>spring-cloud-starter-alibaba-nacos-config</artifactId>
</dependency>
<!--文件管理-->
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-infra-api</artifactId>
</dependency>
<!-- RPC 远程调用相关 -->
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-rpc</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-data-mybatis</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-web</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-env</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-data-redis</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-data-excel</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<!-- 监控相关 -->
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-framework-monitor</artifactId>
</dependency>
</dependencies>
<build>
<!-- 设置构建的 jar 包名 -->
<finalName>${project.artifactId}</finalName>
<plugins>
<!-- 打包 -->
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal> <!-- 将引入的 jar 打入其中 -->
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -0,0 +1,15 @@
package com.tashow.cloud.ai;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* 应用服务启动类
*/
@SpringBootApplication
public class AiServerApplication {
public static void main(String[] args) {
SpringApplication.run(AiServerApplication.class, args);
}
}

View File

@@ -0,0 +1,94 @@
package com.tashow.cloud.ai.controller.admin.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
import com.tashow.cloud.ai.service.aisample.AiSampleService;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 样本库")
@RestController
@RequestMapping("/ai/sample")
@Validated
public class AiSampleController {
@Resource
private AiSampleService aiSampleService;
@PostMapping("/create")
@Operation(summary = "创建样本库-上传文件")
@PermitAll
// @PreAuthorize("@ss.hasPermission('ai:sample:create')")
public CommonResult<List<AiSampleFileRespVO>> createAiSample(FileUploadReqVO uploadReqVO) {
return success(aiSampleService.createAiSample(uploadReqVO));
}
@PutMapping("/updates")
@Operation(summary = "更新样本库")
// @PreAuthorize("@ss.hasPermission('ai:sample:update')")
@PermitAll
public CommonResult<Boolean> updateAiSample(@Valid @RequestBody List<AiSampleSaveReqVO> updateReqVO) {
aiSampleService.updateAiSamples(updateReqVO);
return success(true);
}
@PutMapping("/relate")
@Operation(summary = "添加关联标签")
// @PreAuthorize("@ss.hasPermission('ai:sample:update')")
@PermitAll
public CommonResult<Boolean> relate(@Valid @RequestBody AiSampleRelateTagVO relateTagVO) {
aiSampleService.relate(relateTagVO);
return success(true);
}
@DeleteMapping("/deleteRelate")
@Operation(summary = "删除关联标签")
// @PreAuthorize("@ss.hasPermission('ai:sample:delete')")
@PermitAll
public CommonResult<Boolean> deleteRelate(@Valid @RequestBody AiSampleRelateTagVO relateTagVO) {
aiSampleService.deleteRelate(relateTagVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除样本库")
@Parameter(name = "id", description = "编号", required = true)
// @PreAuthorize("@ss.hasPermission('ai:sample:delete')")
@PermitAll
public CommonResult<Boolean> deleteAiSample(@RequestParam("id") String ids) {
aiSampleService.deleteAiSample(ids);
return success(true);
}
@GetMapping("/get")
@Operation(summary = "获得样本库")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
// @PreAuthorize("@ss.hasPermission('ai:sample:query')")
@PermitAll
public CommonResult<AiSampleRespVO> getAiSample(@RequestParam("id") Long id) {
AiSampleDO aiSample = aiSampleService.getAiSample(id);
return success(BeanUtils.toBean(aiSample, AiSampleRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得样本库分页")
// @PreAuthorize("@ss.hasPermission('ai:sample:query')")
@PermitAll
public CommonResult<PageResult<AiSampleRespVO>> getAiSamplePage(@Valid AiSamplePageReqVO pageReqVO) {
PageResult<AiSampleDO> pageResult = aiSampleService.getAiSamplePage(pageReqVO);
return success(BeanUtils.toBean(pageResult, AiSampleRespVO.class));
}
}

View File

@@ -0,0 +1,78 @@
package com.tashow.cloud.ai.controller.admin.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagListRespVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.service.aisample.AiSampleTagService;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 样本标签库")
@RestController
@RequestMapping("/ai/sampleTag")
@Validated
public class AiSampleTagController {
@Resource
private AiSampleTagService aiSampleTagService;
@PostMapping("/create")
@Operation(summary = "创建样本标签库")
// @PreAuthorize("@ss.hasPermission('ai:sampleTag:create')")
@PermitAll
public CommonResult<Long> createAiSampleTag(@Valid @RequestBody AiSampleTagSaveReqVO createReqVO) {
return success(aiSampleTagService.createAiSampleTag(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新样本标签库")
// @PreAuthorize("@ss.hasPermission('ai:sampleTag:update')")
@PermitAll
public CommonResult<Boolean> updateAiSampleTag(@Valid @RequestBody AiSampleTagSaveReqVO updateReqVO) {
aiSampleTagService.updateAiSampleTag(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除样本标签库")
@Parameter(name = "id", description = "编号", required = true)
// @PreAuthorize("@ss.hasPermission('ai:sampleTag:delete')")
@PermitAll
public CommonResult<Boolean> deleteAiSampleTag(@RequestParam("id") Long id) {
aiSampleTagService.deleteAiSampleTag(id);
return success(true);
}
@GetMapping("/list")
@Operation(summary = "获得样本标签库列表")
// @PreAuthorize("@ss.hasPermission('ai:sampleTag:query')")
@PermitAll
public CommonResult<List<AiSampleTagListRespVO>> getAiSampleTagList() {
return success(BeanUtils.toBean(aiSampleTagService.getAiSampleTagList(), AiSampleTagListRespVO.class));
}
@GetMapping("/page")
@Operation(summary = "获得样本标签库分页")
// @PreAuthorize("@ss.hasPermission('ai:sampleTag:query')")
@PermitAll
public CommonResult<PageResult<AiSampleTagDO>> getAiSampleTagPage(@Valid AiSampleTagPageReqVO pageReqVO) {
PageResult<AiSampleTagDO> pageResult = aiSampleTagService.getAiSampleTagPage(pageReqVO);
return success(pageResult);
}
}

View File

@@ -0,0 +1,68 @@
package com.tashow.cloud.ai.controller.admin.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupRespVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import com.tashow.cloud.ai.service.aisample.AiSampleTagGroupService;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
@Tag(name = "管理后台 - 样本标签分组库")
@RestController
@RequestMapping("/ai/sampleTagGroup")
@Validated
public class AiSampleTagGroupController {
@Resource
private AiSampleTagGroupService aiSampleTagGroupService;
@PostMapping("/create")
@Operation(summary = "创建样本标签分组库")
// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:create')")
@PermitAll
public CommonResult<Long> createAiSampleTagGroup(@Valid @RequestBody AiSampleTagGroupSaveReqVO createReqVO) {
return success(aiSampleTagGroupService.createAiSampleTagGroup(createReqVO));
}
@PutMapping("/update")
@Operation(summary = "更新样本标签分组库")
// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:update')")
@PermitAll
public CommonResult<Boolean> updateAiSampleTagGroup(@Valid @RequestBody AiSampleTagGroupSaveReqVO updateReqVO) {
aiSampleTagGroupService.updateAiSampleTagGroup(updateReqVO);
return success(true);
}
@DeleteMapping("/delete")
@Operation(summary = "删除样本标签分组库")
@Parameter(name = "id", description = "编号", required = true)
// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:delete')")
@PermitAll
public CommonResult<Boolean> deleteAiSampleTagGroup(@RequestParam("id") Long id) {
aiSampleTagGroupService.deleteAiSampleTagGroup(id);
return success(true);
}
@GetMapping("/list")
@Operation(summary = "获得样本标签分组库列表")
// @PreAuthorize("@ss.hasPermission('ai:sampleTagGroup:query')")
@PermitAll
public CommonResult<List<AiSampleTagGroupRespVO>> getAiSampleTagGroupPage() {
List<AiSampleTagGroupDO> aiSampleTagGroupList = aiSampleTagGroupService.getAiSampleTagGroupList();
return success(BeanUtils.toBean(aiSampleTagGroupList, AiSampleTagGroupRespVO.class));
}
}

View File

@@ -0,0 +1,17 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 样本库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AiSampleFileRespVO {
@Schema(description = "文件地址")
private String fileUrl;
@Schema(description = "文件名称")
private String fileName;
}

View File

@@ -0,0 +1,28 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.tashow.cloud.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 样本库分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AiSamplePageReqVO extends PageParam {
@Schema(description = "标签ids", example = "25839")
private String tagIds;
@Schema(description = "样本名称", example = "张三")
private String sampleName;
@Schema(description = "样本格式", example = "1")
private String sampleMineType;
@Schema(description = "排序", example = "正序asc倒序desc")
private String sort;
}

View File

@@ -0,0 +1,17 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 关联 Request VO")
@Data
public class AiSampleRelateTagVO {
@Schema(description = "标签id")
private List<Long> tagId;
@Schema(description = "样本ids")
private List<Long> sampleIds;
}

View File

@@ -0,0 +1,48 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.time.LocalDateTime;
import java.util.List;
@Schema(description = "管理后台 - 样本库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AiSampleRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "7701")
private Long id;
@Schema(description = "标签列表")
private List<AiSampleTagDO> tags;
@Schema(description = "样本文件地址")
private String sampleFilePath;
@Schema(description = "样本名称", example = "张三")
private String sampleName;
@Schema(description = "样本时长")
private String sampleTime;
@Schema(description = "样本格式", example = "1")
private String sampleMineType;
@Schema(description = "样本大小")
private String sampleSize;
@Schema(description = "样本注释", example = "随便")
private String remark;
@Schema(description = "创建时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime createTime;
@Schema(description = "修改时间")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
private LocalDateTime updateTime;
}

View File

@@ -0,0 +1,19 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 样本库新增/修改 Request VO")
@Data
public class AiSampleSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "7701")
private Long id;
@Schema(description = "样本名称", example = "张三")
private String sampleName;
@Schema(description = "样本注释", example = "随便")
private String remark;
}

View File

@@ -0,0 +1,27 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.tashow.cloud.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@Schema(description = "管理后台 - 样本标签分组库分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AiSampleTagGroupPageReqVO extends PageParam {
@Schema(description = "分组名称", example = "张三")
private String groupName;
@Schema(description = "创建时间")
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
}

View File

@@ -0,0 +1,26 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.time.LocalDateTime;
import com.alibaba.excel.annotation.*;
@Schema(description = "管理后台 - 样本标签分组库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AiSampleTagGroupRespVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "18784")
@ExcelProperty("主键")
private Long id;
@Schema(description = "分组名称", example = "张三")
@ExcelProperty("分组名称")
private String groupName;
@Schema(description = "创建时间", requiredMode = Schema.RequiredMode.REQUIRED)
@ExcelProperty("创建时间")
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
@Schema(description = "管理后台 - 样本标签分组库新增/修改 Request VO")
@Data
public class AiSampleTagGroupSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "18784")
private Long id;
@Schema(description = "分组名称", example = "张三")
private String groupName;
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Schema(description = "管理后台 - 样本标签库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AiSampleTagListRespVO {
@Schema(description = "标签id")
private Long id;
@Schema(description = "标签名称")
private String tagName;
}

View File

@@ -0,0 +1,20 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.tashow.cloud.common.pojo.PageParam;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
@Schema(description = "管理后台 - 样本标签库分页 Request VO")
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
public class AiSampleTagPageReqVO extends PageParam {
@Schema(description = "分组id")
private Long groupId;
@Schema(description = "标签名称", example = "张三")
private String tagName;
}

View File

@@ -0,0 +1,20 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 样本标签库 Response VO")
@Data
@ExcelIgnoreUnannotated
public class AiSampleTagRespVO {
@Schema(description = "标签列表")
List<AiSampleTagDO> tags;
@Schema(description = "分组列表")
List<AiSampleTagGroupDO> tagGroupDOS;
}

View File

@@ -0,0 +1,21 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "管理后台 - 样本标签库新增/修改 Request VO")
@Data
public class AiSampleTagSaveReqVO {
@Schema(description = "主键", requiredMode = Schema.RequiredMode.REQUIRED, example = "32538")
private Long id;
@Schema(description = "分组ids")
private List<Long> groupIds;
@Schema(description = "标签名称", example = "张三")
private String tagName;
}

View File

@@ -0,0 +1,15 @@
package com.tashow.cloud.ai.controller.admin.aisample.vo;
import jakarta.validation.constraints.NotNull;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
/** 管理后台 - 上传文件 Request VO */
@Data
public class FileUploadReqVO {
/** 文件附件 */
@NotNull(message = "文件附件不能为空")
private MultipartFile[] files;
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.controller.admin;

View File

@@ -0,0 +1,57 @@
package com.tashow.cloud.ai.controller.app.dialog;
import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
import com.tashow.cloud.ai.service.dialog.AiDialogService;
import com.tashow.cloud.common.pojo.CommonResult;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
import static com.tashow.cloud.common.pojo.CommonResult.success;
/**
* 翻译
*/
@RestController
@RequestMapping("/ai/dialog")
@Validated
@Slf4j
public class DialogController {
List<String> message = List.of("渴了", "饿了", "想睡觉", "想出去玩", "想溜达", "情绪低落", "很开心", "很伤心", "想哭");
@Resource
private AiDialogService aiDialogService;
/**
* 获取对话消息列表
*/
@GetMapping("/getDialog")
@PermitAll
public CommonResult<DialogResp> msList() {
//获取当前登录用户
Long userId = 1L;
return success(aiDialogService.getDialog(userId));
}
/**
* 翻译
*/
@PostMapping("/translate")
@PermitAll
public CommonResult<TranslateRespVo> translate(@Validated TranslateReqVo fileReqVo) {
return success(aiDialogService.translate(fileReqVo));
}
}

View File

@@ -0,0 +1,76 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.Date;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* ai-对话消息 DO
*
* @author 芋道源码
*/
@Schema(description = "api - 对话 Response VO")
@Data
public class AiDialogMessageRespVo {
private Long id;
/**
* 对话id
*/
private Long dialogId;
/**
* 内容
*/
private String contentText;
/**
* 文件时长
*/
private Long contentDuration;
/**
* 文本类型1text2image3file4audio
*/
private Integer contentType;
/**
* 对话中的顺序
*/
private Integer messageOrder;
/**
* 消息状态 1正常 0删除
*/
private Integer messageStatus;
/**
* 宠物id
*/
private Long petId;
/**
* 宠物名称
*/
private String petName;
/**
* 宠物头像
*/
private String petAvatar;
/**
* 宠物类型
*/
private String petType;
/**
* 翻译结果
*/
private String transResult;
/**
* 翻译结果
*/
private Integer transStatus;
/**
* 创建时间
*/
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private Date createTime;
}

View File

@@ -0,0 +1,21 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
import java.util.List;
@Schema(description = "api - 对话 Response VO")
@Data
public class DialogResp {
@Schema(description = "对话id")
private Long dialogId;
@Schema(description = "对话标题")
private String title;
@Schema(description = "对话状态")
private String dialogStatus;
@Schema(description = "对话消息内容")
private List<AiDialogMessageRespVo> messages;
}

View File

@@ -0,0 +1,24 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import lombok.Data;
import org.springframework.web.multipart.MultipartFile;
/**
* 翻译接口请求vo
*/
@Data
public class TranslateReqVo {
//对话id
private Long dialogId;
//消息id
private Long msgId;
/** 文件附件 */
private MultipartFile file;
//文件时长
private String contentDuration;
}

View File

@@ -0,0 +1,47 @@
package com.tashow.cloud.ai.controller.app.dialog.vo;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/**
* 翻译接口结果vo
*/
@Data
public class TranslateRespVo {
//消息id
private Long id;
//对话id
private Long dialogId;
//消息顺序
private Integer messageOrder;
//消息类型1text2file
private Integer contentType;
//消息内容 若消息类型是file 则为文件地址
private String contentText;
//消息内容 若消息类型是file 则为文件地址
private String fileType;
//宠物类型
private String petType;
//宠物名称
private String petName;
//宠物头像
private String petAvatar;
//宠物id
private Long petId;
//翻译状态
private Integer transStatus;
//翻译结果
private String transResult;
//文件时长
private Long contentDuration;
//发送时间
@JsonFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private String createTime;
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.controller.app;

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.controller;

View File

@@ -0,0 +1,61 @@
package com.tashow.cloud.ai.dal.dataobject.aisample;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
import java.util.List;
/**
* 样本库 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_sample")
@KeySequence("tz_ai_sample_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiSampleDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
@TableField(exist = false)
private List<AiSampleTagDO> tags;
/**
* 样本文件id
*/
private String sampleFilePath;
/**
* 样本名称
*/
private String sampleName;
/**
* 样本时长
*/
private String sampleTime;
/**
* 样本格式
*/
private String sampleMineType;
/**
* 样本大小
*/
private Long sampleSize;
/**
* 样本注释
*/
private String remark;
}

View File

@@ -0,0 +1,34 @@
package com.tashow.cloud.ai.dal.dataobject.aisample;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
/**
* 样本标签库 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_sample_tag")
@KeySequence("tz_ai_sample_tag_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiSampleTagDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 标签名称
*/
private String tagName;
}

View File

@@ -0,0 +1,34 @@
package com.tashow.cloud.ai.dal.dataobject.aisample;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import lombok.*;
/**
* 样本标签分组库 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_sample_tag_group")
@KeySequence("tz_ai_sample_tag_group_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiSampleTagGroupDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 分组名称
*/
private String groupName;
}

View File

@@ -0,0 +1,36 @@
package com.tashow.cloud.ai.dal.dataobject.aisample;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 样本标签-分组关联 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_sample_tag_group_relate")
@KeySequence("tz_ai_sample_tag_group_relate_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiSampleTagGroupRelateDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 样本标签id
*/
private Long sampleTagId;
/**
* 样本标签分组id
*/
private Long sampleTagGroupId;
}

View File

@@ -0,0 +1,36 @@
package com.tashow.cloud.ai.dal.dataobject.aisample;
import com.baomidou.mybatisplus.annotation.KeySequence;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.*;
/**
* 样本-标签关联 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_sample_tag_relate")
@KeySequence("tz_ai_sample_tag_relate_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiSampleTagRelateDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 样本id
*/
private Long sampleId;
/**
* 样本标签id
*/
private Long sampleTagId;
}

View File

@@ -0,0 +1,40 @@
package com.tashow.cloud.ai.dal.dataobject.dialog;
import lombok.*;
import com.baomidou.mybatisplus.annotation.*;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
/**
* ai-对话 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_dialog")
@KeySequence("tz_ai_dialog_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiDialogDO extends BaseDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 对话标题
*/
private String title;
/**
* 用户id
*/
private Long userId;
/**
* 对话状态1active, 2archived, 3deleted
*/
private Integer dialogStatus;
}

View File

@@ -0,0 +1,94 @@
package com.tashow.cloud.ai.dal.dataobject.dialog;
import com.baomidou.mybatisplus.annotation.*;
import lombok.*;
import java.time.LocalDateTime;
/**
* ai-对话消息 DO
*
* @author 芋道源码
*/
@TableName("tz_ai_dialog_message")
@KeySequence("tz_ai_dialog_message_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class AiDialogMessageDO {
/**
* 主键
*/
@TableId
private Long id;
/**
* 对话id
*/
private Long dialogId;
/**
* 内容
*/
private String contentText;
/**
* 文件名
*/
private String fileName;
/**
* 文件类型
*/
private String fileType;
/**
* 文件时长
*/
private Long contentDuration;
/**
* 文本类型1text2image3file4audio
*/
private Integer contentType;
/**
* 对话中的顺序
*/
private Integer messageOrder;
/**
* 消息状态 1正常 0删除
*/
private Integer messageStatus;
/**
* 宠物id
*/
private Long petId;
/**
* 宠物名称
*/
private String petName;
/**
* 宠物头像
*/
private String petAvatar;
/**
* 宠物类型
*/
private String petType;
/**
* 原始结果
*/
private String sourceResult;
/**
* 翻译结果
*/
private String transResult;
/**
* 翻译结果
*/
private Integer transStatus;
/**
* 创建时间
*/
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;
}

View File

@@ -0,0 +1,2 @@
package com.tashow.cloud.ai.dal.dataobject;
// 数据库对象

View File

@@ -0,0 +1,43 @@
package com.tashow.cloud.ai.dal.mysql.aisample;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSamplePageReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* 样本库 Mapper
*/
@Mapper
public interface AiSampleMapper extends BaseMapperX<AiSampleDO> {
default PageResult<AiSampleDO> selectPage(AiSamplePageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AiSampleDO>()
.likeIfPresent(AiSampleDO::getSampleName, reqVO.getSampleName())
.orderByDesc(AiSampleDO::getId));
}
@Select("<script>" +
"SELECT t.id, t.sample_file_path sampleFilePath,t.sample_name sampleName,t.sample_time sampleTime" +
",sample_mine_type sampleMineType ,sample_size sampleSize, remark,creator,updater,create_time createTime" +
",update_time updateTime,deleted,tenant_id tenantId " +
"FROM tz_ai_sample t " +
"INNER JOIN tz_ai_sample_tag_relate r ON t.id = r.sample_id " +
"<where>" +
" <if test=\"pageReqVO.tagIds != null and pageReqVO.tagIds != ''\">" +
" AND FIND_IN_SET(r.sample_tag_id,${pageReqVO.tagIds}) " +
" </if>" +
" <if test=\"pageReqVO.sampleName != null and pageReqVO.sampleName != ''\">" +
" AND t.sample_name LIKE CONCAT('%',#{pageReqVO.sampleName},'%')" +
" </if>" +
"</where>" +
"ORDER BY t.id DESC" +
"</script>")
IPage<AiSampleDO> getAiSamplePage(Page<AiSampleDO> objectPage, AiSamplePageReqVO pageReqVO);
}

View File

@@ -0,0 +1,25 @@
package com.tashow.cloud.ai.dal.mysql.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupPageReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* 样本标签分组库 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiSampleTagGroupMapper extends BaseMapperX<AiSampleTagGroupDO> {
default PageResult<AiSampleTagGroupDO> selectPage(AiSampleTagGroupPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AiSampleTagGroupDO>()
.likeIfPresent(AiSampleTagGroupDO::getGroupName, reqVO.getGroupName())
.betweenIfPresent(AiSampleTagGroupDO::getCreateTime, reqVO.getCreateTime())
.orderByDesc(AiSampleTagGroupDO::getId));
}
}

View File

@@ -0,0 +1,15 @@
package com.tashow.cloud.ai.dal.mysql.aisample;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupRelateDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* 样本标签-分组关联 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiSampleTagGroupRelateMapper extends BaseMapperX<AiSampleTagGroupRelateDO> {
}

View File

@@ -0,0 +1,42 @@
package com.tashow.cloud.ai.dal.mysql.aisample;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Select;
/**
* 样本标签库 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiSampleTagMapper extends BaseMapperX<AiSampleTagDO> {
default PageResult<AiSampleTagDO> selectPage(AiSampleTagPageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<AiSampleTagDO>()
.orderByDesc(AiSampleTagDO::getId));
}
@Select("<script>" +
"SELECT t.id, t.tag_name tagName " +
"FROM tz_ai_sample_tag t " +
"INNER JOIN tz_ai_sample_tag_group_relate r ON t.id = r.sample_tag_id " +
"<where>" +
" <if test=\"pageReqVO.groupId != null\">" +
" AND r.sample_tag_group_id = #{pageReqVO.groupId}" +
" </if>" +
" <if test=\"pageReqVO.tagName != null and pageReqVO.tagName != ''\">" +
" AND t.tag_name LIKE CONCAT('%',#{pageReqVO.tagName},'%')" +
" </if>" +
"</where>" +
"ORDER BY t.id DESC" +
"</script>")
IPage<AiSampleTagDO> getAiSampleTagPage(Page<AiSampleTagDO> page, AiSampleTagPageReqVO pageReqVO);
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.dal.mysql.aisample;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagRelateDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* 样本-标签关联 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiSampleTagRelateMapper extends BaseMapperX<AiSampleTagRelateDO> {
}

View File

@@ -0,0 +1,15 @@
package com.tashow.cloud.ai.dal.mysql.dialog;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* ai-对话 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiDialogMapper extends BaseMapperX<AiDialogDO> {
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.dal.mysql.dialog;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import org.apache.ibatis.annotations.Mapper;
/**
* ai-对话消息 Mapper
*
* @author 芋道源码
*/
@Mapper
public interface AiDialogMessageMapper extends BaseMapperX<AiDialogMessageDO> {
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.dal.mysql;

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.dal;

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.framework;

View File

@@ -0,0 +1,10 @@
package com.tashow.cloud.ai.framework.rpc.config;
import com.tashow.cloud.infraapi.api.file.FileApi;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Configuration;
@Configuration(proxyBeanMethods = false)
@EnableFeignClients(clients = {FileApi.class})
public class RpcConfiguration {
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.framework.rpc;

View File

@@ -0,0 +1,44 @@
package com.tashow.cloud.ai.framework.security.config;
import com.tashow.cloud.infraapi.enums.ApiConstants;
import com.tashow.cloud.security.security.config.AuthorizeRequestsCustomizer;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configurers.AuthorizeHttpRequestsConfigurer;
/**
* Infra 模块的 Security 配置
*/
@Configuration(proxyBeanMethods = false, value = "infraSecurityConfiguration")
public class SecurityConfiguration {
@Value("${spring.boot.admin.context-path:''}")
private String adminSeverContextPath;
@Bean("infraAuthorizeRequestsCustomizer")
public AuthorizeRequestsCustomizer authorizeRequestsCustomizer() {
return new AuthorizeRequestsCustomizer() {
@Override
public void customize(AuthorizeHttpRequestsConfigurer<HttpSecurity>.AuthorizationManagerRequestMatcherRegistry registry) {
// Spring Boot Actuator 的安全配置
registry.requestMatchers("/actuator").permitAll()
.requestMatchers("/actuator/**").permitAll();
// Druid 监控
registry.requestMatchers("/druid/**").permitAll();
// Spring Boot Admin Server 的安全配置
registry.requestMatchers(adminSeverContextPath).permitAll()
.requestMatchers(adminSeverContextPath + "/**").permitAll();
// 文件读取
registry.requestMatchers(buildAdminApi("/infra/file/*/get/**")).permitAll();
// TODO 芋艿:这个每个项目都需要重复配置,得捉摸有没通用的方案
// RPC 服务的安全配置
registry.requestMatchers(ApiConstants.PREFIX + "/**").permitAll();
}
};
}
}

View File

@@ -0,0 +1,4 @@
/**
* 占位
*/
package com.tashow.cloud.ai.framework.security.core;

View File

@@ -0,0 +1,73 @@
package com.tashow.cloud.ai.service.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
import com.tashow.cloud.common.pojo.PageResult;
import jakarta.validation.Valid;
import java.util.List;
/**
* 样本库 Service 接口
*
* @author 芋道源码
*/
public interface AiSampleService {
/**
* 创建样本库
*
* @param createReqVO 创建信息
* @return 编号
*/
List<AiSampleFileRespVO> createAiSample(@Valid FileUploadReqVO createReqVO);
/**
* 更新样本库
*
* @param updateReqVO 更新信息
*/
void updateAiSample(@Valid AiSampleSaveReqVO updateReqVO);
/**
* 批量更新
* @param updateReqVO
*/
void updateAiSamples(@Valid List<AiSampleSaveReqVO> updateReqVO);
/**
* 关联标签
* @param relateTagVO
*/
void relate(@Valid AiSampleRelateTagVO relateTagVO);
/**
* 删除样本库
*
* @param id 编号
*/
void deleteAiSample(String id);
/**
* 删除样本库
* @param relateTagVO 编号
*/
void deleteRelate(AiSampleRelateTagVO relateTagVO);
/**
* 获得样本库
*
* @param id 编号
* @return 样本库
*/
AiSampleDO getAiSample(Long id);
/**
* 获得样本库分页
*
* @param pageReqVO 分页查询
* @return 样本库分页
*/
PageResult<AiSampleDO> getAiSamplePage(AiSamplePageReqVO pageReqVO);
}

View File

@@ -0,0 +1,180 @@
package com.tashow.cloud.ai.service.aisample;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tashow.cloud.ai.controller.admin.aisample.vo.*;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagRelateDO;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleMapper;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagMapper;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagRelateMapper;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.infraapi.api.file.FileApi;
import com.tashow.cloud.mybatis.mybatis.core.util.MyBatisUtils;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* 样本库 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class AiSampleServiceImpl implements AiSampleService {
@Resource
private AiSampleMapper aiSampleMapper;
@Resource
private AiSampleTagMapper aiSampleTagMapper;
@Resource
private AiSampleTagRelateMapper aiSampleTagRelateMapper;
@Resource
private FileApi fileApi;
@Value("file-server")
private String fileServer;
@Override
@SneakyThrows
public List<AiSampleFileRespVO> createAiSample(FileUploadReqVO uploadReqVO) {
//返回图片路径
List<AiSampleFileRespVO> urls = new ArrayList<>();
/* 调用文件上传服务*/
for (MultipartFile file : uploadReqVO.getFiles()) {
//返回上传结果
String file1 = fileServer + fileApi.createFile(file.getBytes());
//保存样本信息
AiSampleDO aiSampleDO = new AiSampleDO();
aiSampleDO.setSampleFilePath(file1);
aiSampleDO.setSampleName(file.getOriginalFilename());
aiSampleDO.setSampleMineType(file.getContentType());
aiSampleDO.setSampleSize(file.getSize());
aiSampleMapper.insert(aiSampleDO);
urls.add(new AiSampleFileRespVO().setFileUrl(file1).setFileName(file.getOriginalFilename()));
}
// 返回
return urls;
}
@Override
public void updateAiSample(AiSampleSaveReqVO updateReqVO) {
// 校验存在
validateAiSampleExists(updateReqVO.getId());
// 更新
AiSampleDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleDO.class);
aiSampleMapper.updateById(updateObj);
}
@Override
public void updateAiSamples(List<AiSampleSaveReqVO> updateReqVO) {
aiSampleMapper.updateBatch(BeanUtils.toBean(updateReqVO, AiSampleDO.class));
}
@Override
public void relate(AiSampleRelateTagVO relateTagVO) {
List<AiSampleTagRelateDO> tagRelateDOS = new ArrayList<>();
for (Long sampleId : relateTagVO.getSampleIds()) {
for (Long tagId : relateTagVO.getTagId()) {
AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne(
new LambdaQueryWrapper<AiSampleTagRelateDO>()
.eq(AiSampleTagRelateDO::getSampleId, sampleId)
.eq(AiSampleTagRelateDO::getSampleTagId, tagId) );
if (relateDO== null){
relateDO = new AiSampleTagRelateDO();
relateDO.setSampleId(sampleId);
relateDO.setSampleTagId(tagId);
tagRelateDOS.add(relateDO);
}
}
}
if (!tagRelateDOS.isEmpty()){
aiSampleTagRelateMapper.insertBatch(tagRelateDOS);
}
}
@Override
public void deleteRelate(AiSampleRelateTagVO relateTagVO) {
List<Long> tagRelateIds = new ArrayList<>();
for (Long sampleId : relateTagVO.getSampleIds()) {
for (Long tagId : relateTagVO.getTagId()) {
AiSampleTagRelateDO relateDO = aiSampleTagRelateMapper.selectOne(
new LambdaQueryWrapper<AiSampleTagRelateDO>()
.eq(AiSampleTagRelateDO::getSampleId, sampleId)
.eq(AiSampleTagRelateDO::getSampleTagId, tagId)
);
if (relateDO != null) {
tagRelateIds.add(relateDO.getId());
}
}
}
if (!tagRelateIds.isEmpty()) {
aiSampleTagRelateMapper.deleteBatchIds(tagRelateIds);
}
}
@Override
public void deleteAiSample(String ids) {
// 删除
aiSampleMapper.deleteByIds(Arrays.asList(ids.split(StrUtil.COMMA)));
}
private void validateAiSampleExists(Long id) {
if (aiSampleMapper.selectById(id) == null) {
// throw exception(AI_SAMPLE_NOT_EXISTS);
}
}
@Override
public AiSampleDO getAiSample(Long id) {
AiSampleDO aiSampleDO = aiSampleMapper.selectById(id);
aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath());
//先获取关联的标签id
List<AiSampleTagRelateDO> tagRelateDOS = aiSampleTagRelateMapper.selectList(new LambdaQueryWrapper<AiSampleTagRelateDO>().eq(AiSampleTagRelateDO::getSampleId, id));
List<Long> tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList();
aiSampleDO.setTags(aiSampleTagMapper.selectList(new LambdaQueryWrapper<AiSampleTagDO>().in(AiSampleTagDO::getId, tagIds)));
return aiSampleDO;
}
@Override
public PageResult<AiSampleDO> getAiSamplePage(AiSamplePageReqVO pageReqVO) {
// PageResult<AiSampleDO> aiSampleDOPageResult = aiSampleMapper.selectPage(pageReqVO);
IPage<AiSampleDO> aiSampleDOPageResult = aiSampleMapper.getAiSamplePage(MyBatisUtils.buildPage(pageReqVO),pageReqVO);
//根据样本id获取关联的标签id
List<Long> sampleIds = aiSampleDOPageResult.getRecords().stream().map(AiSampleDO::getId).toList();
List<AiSampleTagRelateDO> tagRelateDOS = aiSampleTagRelateMapper.selectList(
new LambdaQueryWrapper<AiSampleTagRelateDO>()
.in(!sampleIds.isEmpty(), AiSampleTagRelateDO::getSampleId, sampleIds));
List<Long> tagIds = tagRelateDOS.stream().map(AiSampleTagRelateDO::getSampleTagId).toList();
//获取标签信息
List<AiSampleTagDO> aiSampleTagDOS = aiSampleTagMapper.selectList(
new LambdaQueryWrapper<AiSampleTagDO>()
.in(!tagIds.isEmpty(), AiSampleTagDO::getId, tagIds));
//封装标签信息
for (AiSampleDO aiSampleDO : aiSampleDOPageResult.getRecords()) {
List<AiSampleTagRelateDO> list = tagRelateDOS.stream()
.filter(a -> ObjectUtil.equals(aiSampleDO.getId(), a.getSampleId()))
.toList();
Object[] tagsId = list.stream().map(AiSampleTagRelateDO::getSampleTagId).toArray();
List<AiSampleTagDO> list1 = aiSampleTagDOS.stream().filter(a -> ArrayUtil.containsAny(tagsId, a.getId())).toList();
aiSampleDO.setTags(list1);
aiSampleDO.setSampleFilePath(aiSampleDO.getSampleFilePath());
}
return new PageResult<>(aiSampleDOPageResult.getRecords(), aiSampleDOPageResult.getTotal());
}
}

View File

@@ -0,0 +1,11 @@
package com.tashow.cloud.ai.service.aisample;
/**
* 样本标签-分组关联 Service 接口
*
* @author 芋道源码
*/
public interface AiSampleTagGroupRelateService {
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.service.aisample;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* 样本标签-分组关联 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class AiSampleTagGroupRelateServiceImpl implements AiSampleTagGroupRelateService {
}

View File

@@ -0,0 +1,62 @@
package com.tashow.cloud.ai.service.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupRespVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import com.tashow.cloud.common.pojo.PageResult;
import jakarta.validation.Valid;
import java.util.List;
/**
* 样本标签分组库 Service 接口
*
* @author 芋道源码
*/
public interface AiSampleTagGroupService {
/**
* 创建样本标签分组库
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createAiSampleTagGroup(@Valid AiSampleTagGroupSaveReqVO createReqVO);
/**
* 更新样本标签分组库
*
* @param updateReqVO 更新信息
*/
void updateAiSampleTagGroup(@Valid AiSampleTagGroupSaveReqVO updateReqVO);
/**
* 删除样本标签分组库
*
* @param id 编号
*/
void deleteAiSampleTagGroup(Long id);
/**
* 获得样本标签分组库
*
* @param id 编号
* @return 样本标签分组库
*/
AiSampleTagGroupDO getAiSampleTagGroup(Long id);
/**
* 获得样本标签分组库分页
*
* @param pageReqVO 分页查询
* @return 样本标签分组库分页
*/
PageResult<AiSampleTagGroupDO> getAiSampleTagGroupPage(AiSampleTagGroupPageReqVO pageReqVO);
/**
* 获取标签分组列表
* @return
*/
List<AiSampleTagGroupDO> getAiSampleTagGroupList();
}

View File

@@ -0,0 +1,74 @@
package com.tashow.cloud.ai.service.aisample;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagGroupSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupDO;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagGroupMapper;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.List;
/**
* 样本标签分组库 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class AiSampleTagGroupServiceImpl implements AiSampleTagGroupService {
@Resource
private AiSampleTagGroupMapper aiSampleTagGroupMapper;
@Override
public Long createAiSampleTagGroup(AiSampleTagGroupSaveReqVO createReqVO) {
// 插入
AiSampleTagGroupDO aiSampleTagGroup = BeanUtils.toBean(createReqVO, AiSampleTagGroupDO.class);
aiSampleTagGroupMapper.insert(aiSampleTagGroup);
// 返回
return aiSampleTagGroup.getId();
}
@Override
public void updateAiSampleTagGroup(AiSampleTagGroupSaveReqVO updateReqVO) {
// 校验存在
validateAiSampleTagGroupExists(updateReqVO.getId());
// 更新
AiSampleTagGroupDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleTagGroupDO.class);
aiSampleTagGroupMapper.updateById(updateObj);
}
@Override
public void deleteAiSampleTagGroup(Long id) {
// 校验存在
validateAiSampleTagGroupExists(id);
// 删除
aiSampleTagGroupMapper.deleteById(id);
}
private void validateAiSampleTagGroupExists(Long id) {
if (aiSampleTagGroupMapper.selectById(id) == null) {
// throw exception(AI_SAMPLE_TAG_GROUP_NOT_EXISTS);
}
}
@Override
public AiSampleTagGroupDO getAiSampleTagGroup(Long id) {
return aiSampleTagGroupMapper.selectById(id);
}
@Override
public PageResult<AiSampleTagGroupDO> getAiSampleTagGroupPage(AiSampleTagGroupPageReqVO pageReqVO) {
return aiSampleTagGroupMapper.selectPage(pageReqVO);
}
@Override
public List<AiSampleTagGroupDO> getAiSampleTagGroupList() {
return aiSampleTagGroupMapper.selectList(new LambdaQueryWrapper<AiSampleTagGroupDO>().orderByDesc(AiSampleTagGroupDO::getId));
}
}

View File

@@ -0,0 +1,11 @@
package com.tashow.cloud.ai.service.aisample;
/**
* 样本-标签关联 Service 接口
*
* @author 芋道源码
*/
public interface AiSampleTagRelateService {
}

View File

@@ -0,0 +1,16 @@
package com.tashow.cloud.ai.service.aisample;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* 样本-标签关联 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class AiSampleTagRelateServiceImpl implements AiSampleTagRelateService {
}

View File

@@ -0,0 +1,61 @@
package com.tashow.cloud.ai.service.aisample;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.common.pojo.PageResult;
import jakarta.validation.Valid;
import java.util.List;
/**
* 样本标签库 Service 接口
*
* @author 芋道源码
*/
public interface AiSampleTagService {
/**
* 创建样本标签库
*
* @param createReqVO 创建信息
* @return 编号
*/
Long createAiSampleTag(@Valid AiSampleTagSaveReqVO createReqVO);
/**
* 更新样本标签库
*
* @param updateReqVO 更新信息
*/
void updateAiSampleTag(@Valid AiSampleTagSaveReqVO updateReqVO);
/**
* 删除样本标签库
*
* @param id 编号
*/
void deleteAiSampleTag(Long id);
/**
* 获得样本标签库
*
* @param id 编号
* @return 样本标签库
*/
AiSampleTagDO getAiSampleTag(Long id);
/**
* 获得样本标签库分页
*
* @param pageReqVO 分页查询
* @return 样本标签库分页
*/
PageResult<AiSampleTagDO> getAiSampleTagPage(AiSampleTagPageReqVO pageReqVO);
/**
* 获取样本标签列表
* @return
*/
List<AiSampleTagDO> getAiSampleTagList();
}

View File

@@ -0,0 +1,103 @@
package com.tashow.cloud.ai.service.aisample;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagPageReqVO;
import com.tashow.cloud.ai.controller.admin.aisample.vo.AiSampleTagSaveReqVO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagDO;
import com.tashow.cloud.ai.dal.dataobject.aisample.AiSampleTagGroupRelateDO;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagGroupRelateMapper;
import com.tashow.cloud.ai.dal.mysql.aisample.AiSampleTagMapper;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.mybatis.mybatis.core.util.MyBatisUtils;
import jakarta.annotation.Resource;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import java.util.ArrayList;
import java.util.List;
/**
* 样本标签库 Service 实现类
*
* @author 芋道源码
*/
@Service
@Validated
public class AiSampleTagServiceImpl implements AiSampleTagService {
@Resource
private AiSampleTagMapper aiSampleTagMapper;
@Resource
private AiSampleTagGroupRelateMapper tagGroupRelateMapper;
@Override
public Long createAiSampleTag(AiSampleTagSaveReqVO createReqVO) {
// 插入
AiSampleTagDO aiSampleTag = BeanUtils.toBean(createReqVO, AiSampleTagDO.class);
aiSampleTagMapper.insert(aiSampleTag);
//插入关联
List<AiSampleTagGroupRelateDO> tagGroupRelateDOS = new ArrayList<>();
for (Long groupId : createReqVO.getGroupIds()) {
AiSampleTagGroupRelateDO tagGroupRelateDO = new AiSampleTagGroupRelateDO();
tagGroupRelateDO.setSampleTagId(createReqVO.getId());
tagGroupRelateDO.setSampleTagGroupId(groupId);
tagGroupRelateDO.setSampleTagId(aiSampleTag.getId());
tagGroupRelateDOS.add(tagGroupRelateDO);
}
tagGroupRelateMapper.insertBatch(tagGroupRelateDOS);
// 返回
return aiSampleTag.getId();
}
@Override
public void updateAiSampleTag(AiSampleTagSaveReqVO updateReqVO) {
// 校验存在
validateAiSampleTagExists(updateReqVO.getId());
// 更新
AiSampleTagDO updateObj = BeanUtils.toBean(updateReqVO, AiSampleTagDO.class);
aiSampleTagMapper.updateById(updateObj);
//删除所有关联
tagGroupRelateMapper.delete(new LambdaQueryWrapper<AiSampleTagGroupRelateDO>().eq(AiSampleTagGroupRelateDO::getSampleTagId, updateReqVO.getId()));
//插入关联
List<AiSampleTagGroupRelateDO> tagGroupRelateDOS = new ArrayList<>();
for (Long groupId : updateReqVO.getGroupIds()) {
AiSampleTagGroupRelateDO tagGroupRelateDO = new AiSampleTagGroupRelateDO();
tagGroupRelateDO.setSampleTagId(updateReqVO.getId());
tagGroupRelateDO.setSampleTagGroupId(groupId);
tagGroupRelateDOS.add(tagGroupRelateDO);
}
tagGroupRelateMapper.insertBatch(tagGroupRelateDOS);
}
@Override
public void deleteAiSampleTag(Long id) {
// 校验存在
validateAiSampleTagExists(id);
// 删除
aiSampleTagMapper.deleteById(id);
}
private void validateAiSampleTagExists(Long id) {
if (aiSampleTagMapper.selectById(id) == null) {
// throw exception(AI_SAMPLE_TAG_NOT_EXISTS);
}
}
@Override
public AiSampleTagDO getAiSampleTag(Long id) {
return aiSampleTagMapper.selectById(id);
}
@Override
public PageResult<AiSampleTagDO> getAiSampleTagPage(AiSampleTagPageReqVO pageReqVO) {
IPage<AiSampleTagDO> prodPageList = aiSampleTagMapper.getAiSampleTagPage(MyBatisUtils.buildPage(pageReqVO),pageReqVO);
return new PageResult<>(prodPageList.getRecords(), prodPageList.getTotal());
}
@Override
public List<AiSampleTagDO> getAiSampleTagList() {
return aiSampleTagMapper.selectList(new LambdaQueryWrapper<AiSampleTagDO>().orderByDesc(AiSampleTagDO::getId));
}
}

View File

@@ -0,0 +1,14 @@
package com.tashow.cloud.ai.service.dialog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
/**
* ai-对话消息 Service 接口
*
* @author lwq
*/
public interface AiDialogMessageService extends IService<AiDialogMessageDO> {
}

View File

@@ -0,0 +1,20 @@
package com.tashow.cloud.ai.service.dialog;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
/**
* ai-对话消息 Service 实现类
*
* @author lwq
*/
@Service
@Validated
public class AiDialogMessageServiceImpl extends ServiceImpl<AiDialogMessageMapper, AiDialogMessageDO> implements AiDialogMessageService {
}

View File

@@ -0,0 +1,20 @@
package com.tashow.cloud.ai.service.dialog;
import com.baomidou.mybatisplus.extension.service.IService;
import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
/**
* ai-对话 Service 接口
*
* @author lwq
*/
public interface AiDialogService extends IService<AiDialogDO> {
DialogResp getDialog(Long userId);
TranslateRespVo translate(TranslateReqVo fileReqVo);
}

View File

@@ -0,0 +1,195 @@
package com.tashow.cloud.ai.service.dialog;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.tashow.cloud.ai.controller.app.dialog.vo.AiDialogMessageRespVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.DialogResp;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateReqVo;
import com.tashow.cloud.ai.controller.app.dialog.vo.TranslateRespVo;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogDO;
import com.tashow.cloud.ai.dal.dataobject.dialog.AiDialogMessageDO;
import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMapper;
import com.tashow.cloud.ai.dal.mysql.dialog.AiDialogMessageMapper;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.infraapi.api.file.FileApi;
import jakarta.annotation.Resource;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.multipart.MultipartFile;
import javax.sound.sampled.AudioInputStream;
import javax.sound.sampled.AudioSystem;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.time.LocalDateTime;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
/**
* ai-对话 Service 实现类
*
* @author lwq
*/
@Service
@Validated
@Slf4j
public class AiDialogServiceImpl extends ServiceImpl<AiDialogMapper, AiDialogDO> implements AiDialogService {
@Resource
private AiDialogMessageMapper aiDialogMessageMapper;
@Value("${translate-server}")
private String translateServer;
@Value("${file-server}")
private String fileServer;
@Resource
private FileApi fileApi;
@Override
public DialogResp getDialog(Long userId) {
AiDialogDO aiDialogDO = this.getOne(new LambdaQueryWrapper<AiDialogDO>().eq(AiDialogDO::getUserId, userId));
if (aiDialogDO == null) {
aiDialogDO = new AiDialogDO();
aiDialogDO.setDialogStatus(1);
aiDialogDO.setTitle("xxx");
aiDialogDO.setUserId(userId);
this.save(aiDialogDO);
}
List<AiDialogMessageDO> messageDOS = aiDialogMessageMapper.selectList(new LambdaQueryWrapper<AiDialogMessageDO>().eq(AiDialogMessageDO::getDialogId, aiDialogDO.getId()));
DialogResp resp = new DialogResp();
resp.setDialogId(aiDialogDO.getId());
resp.setTitle(aiDialogDO.getTitle());
resp.setMessages(BeanUtils.toBean(messageDOS, AiDialogMessageRespVo.class));
return resp;
}
@Override
@SneakyThrows
public TranslateRespVo translate(TranslateReqVo fileReqVo) {
AiDialogMessageDO messageDO = aiDialogMessageMapper.selectById(fileReqVo.getMsgId());
if (messageDO == null) {
messageDO = new AiDialogMessageDO();
}
String fileName = StrUtil.isBlank(messageDO.getFileName()) ? fileReqVo.getFile().getOriginalFilename() : messageDO.getFileName();
//上传文件获取文件地址
String fileUrl = StrUtil.isBlank(messageDO.getContentText()) ? fileServer + fileApi.createFile(fileName, "", fileReqVo.getFile().getBytes()) : messageDO.getContentText();
//翻译结果
translate(messageDO, fileUrl, fileName);
//创建消息 持久化消息
if (messageDO.getId() == null) {
messageDO.setFileName(fileName);
messageDO.setFileType(fileReqVo.getFile().getContentType());
messageDO.setDialogId(fileReqVo.getDialogId());
//前端无法转换时 后端进行转
messageDO.setContentDuration(
StrUtil.isBlank(fileReqVo.getContentDuration()) || "Infinity".equals(fileReqVo.getContentDuration())
? 0 : Long.parseLong(fileReqVo.getContentDuration())
);
messageDO.setContentText(fileUrl);
messageDO.setContentType(2);
//宠物档案 todo
messageDO.setPetId(1l);
messageDO.setPetName("猫猫翻译");
messageDO.setPetAvatar("https://img1.baidu.com/it/u=1224902049,3440357835&fm=253&app=138&f=JPEG?w=801&h=800");
//获取当前最后的排序
AiDialogMessageDO aiDialogMessageDO = aiDialogMessageMapper.selectOne(new LambdaQueryWrapper<AiDialogMessageDO>()
.eq(AiDialogMessageDO::getDialogId, fileReqVo.getDialogId())
.orderByDesc(AiDialogMessageDO::getMessageOrder)
.last("limit 1")
);
messageDO.setMessageOrder(aiDialogMessageDO == null ? 1 : aiDialogMessageDO.getMessageOrder() + 1);
messageDO.setCreateTime(LocalDateTime.now());
}
int i = messageDO.getId() == null ? aiDialogMessageMapper.insert(messageDO) : aiDialogMessageMapper.updateById(messageDO);
TranslateRespVo bean = BeanUtils.toBean(messageDO, TranslateRespVo.class);
bean.setId(messageDO.getId());
return bean;
}
@SneakyThrows
private Long getFileDuration(MultipartFile file) {
AudioInputStream audioStream = AudioSystem.getAudioInputStream(file.getInputStream());
return (long) (audioStream.getFrameLength() / audioStream.getFormat().getFrameRate());
}
private AiDialogMessageDO translate(AiDialogMessageDO messageDO, String file, String fileName) {
//调用大模型接口
String result = "";
try {
result = HttpRequest.post(translateServer).form("audio_data", HttpUtil.downloadBytes(file), fileName).timeout(20000) //20秒超时时间
.execute().body();
} catch (Exception e) {
log.error("调用大模型翻译出错", e);
}
messageDO.setSourceResult(result);
//数据解析
JSONObject translateResult = JSON.parseObject(result);
if (translateResult.isEmpty() || !translateResult.containsKey("intent_result") || !translateResult.getBoolean("is_species_sound")) {
messageDO.setTransStatus(0);
messageDO.setTransResult("");
return messageDO;
}
//标签 如 cat dog
String speciesLabels = translateResult.getString("species_labels");
//解析翻译结果
JSONObject probabilities = translateResult.getJSONObject("intent_result")
.getJSONObject("probabilities");
String resultKey = probabilities.entrySet().stream()
.filter(entry -> entry.getValue() instanceof Number)
.max(Comparator.comparingDouble(entry -> ((Number) entry.getValue()).doubleValue()))
.map(Map.Entry::getKey)
.orElse(null);
//返回结果
messageDO.setPetType(speciesLabels);
messageDO.setTransStatus(1);
messageDO.setTransResult(StrUtil.isBlank(resultKey) ? "" : resultKey.split(StrUtil.UNDERLINE)[1]);
return messageDO;
}
public static void main(String[] args) throws Exception {
InputStream inputStream = getInputStreamFromUrl("https://petshy.tashowz.com/admin-api/infra/file/29/get/857def513547ec33a105f71108c8ece329cb64dacc3a4779c94b0fcc3398cc32.webm");
AudioInputStream audioStream = AudioSystem.getAudioInputStream(inputStream);
System.out.println((long) (audioStream.getFrameLength() / audioStream.getFormat().getFrameRate()));
// byte[] bytes = HttpUtil.downloadBytes("http://192.168.1.231:48080/admin-api/infra/file/29/get/c7351abf780f18600c104ec5662d843783ed8c309c01fb427046565217f51102.wav");
//
//// File file = new File("http://192.168.1.231:48080/admin-api/infra/file/29/get/c7351abf780f18600c104ec5662d843783ed8c309c01fb427046565217f51102.wav");
// String result = HttpRequest.post("http://43.139.42.137:8000/analyze/audio").form("audio_data", bytes, "aaa").timeout(20000) //20秒超时时间
// .execute().body();
// System.out.println(result);
}
public static InputStream getInputStreamFromUrl(String urlString) throws Exception {
URL url = new URL(urlString);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET"); // 可以是GET, POST等
connection.setConnectTimeout(5000); // 设置连接超时时间
connection.setReadTimeout(5000); // 设置读取超时时间
int responseCode = connection.getResponseCode(); // 获取响应码
if (responseCode == HttpURLConnection.HTTP_OK) { // 状态码200表示成功
return connection.getInputStream();
} else {
// 处理错误情况例如抛出异常或返回null等
throw new RuntimeException("Failed : HTTP error code : " + responseCode);
}
}
}

View File

@@ -0,0 +1 @@
package com.tashow.cloud.ai.service;

View File

@@ -0,0 +1,18 @@
--- #################### 注册中心 + 配置中心相关配置 ####################
spring:
cloud:
nacos:
server-addr: 43.139.42.137:8848 # Nacos 服务器地址
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
# 添加字符编码配置解决YAML解析时的字符编码问题
encode: UTF-8

View File

@@ -0,0 +1,12 @@
server:
port: 48086
spring:
application:
name: ai-server
profiles:
active: local
config:
import:
- optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
- optional:nacos:application.yaml # 加载【Nacos】的配置
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置

View File

@@ -0,0 +1,75 @@
<configuration>
<!-- 引用 Spring Boot 的 logback 基础配置 -->
<include resource="org/springframework/boot/logging/logback/defaults.xml" />
<!-- 变量 yudao.info.base-package基础业务包 -->
<springProperty scope="context" name="tashow.info.base-package" source="tashow.info.base-package"/>
<!-- 格式化输出:%d 表示日期,%X{tid} SkWalking 链路追踪编号,%thread 表示线程名,%-5level级别从左显示 5 个字符宽度,%msg日志消息%n是换行符 -->
<property name="PATTERN_DEFAULT" value="%d{${LOG_DATEFORMAT_PATTERN:-yyyy-MM-dd HH:mm:ss.SSS}} | %highlight(${LOG_LEVEL_PATTERN:-%5p} ${PID:- }) | %boldYellow(%thread [%tid]) %boldGreen(%-40.40logger{39}) | %m%n${LOG_EXCEPTION_CONVERSION_WORD:-%wEx}"/>
<!-- 控制台 Appender -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">     
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
<!-- 文件 Appender -->
<!-- 参考 Spring Boot 的 file-appender.xml 编写 -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
<!-- 日志文件名 -->
<file>${LOG_FILE}</file>
<rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
<!-- 滚动后的日志文件名 -->
<fileNamePattern>${LOGBACK_ROLLINGPOLICY_FILE_NAME_PATTERN:-${LOG_FILE}.%d{yyyy-MM-dd}.%i.gz}</fileNamePattern>
<!-- 启动服务时,是否清理历史日志,一般不建议清理 -->
<cleanHistoryOnStart>${LOGBACK_ROLLINGPOLICY_CLEAN_HISTORY_ON_START:-false}</cleanHistoryOnStart>
<!-- 日志文件,到达多少容量,进行滚动 -->
<maxFileSize>${LOGBACK_ROLLINGPOLICY_MAX_FILE_SIZE:-10MB}</maxFileSize>
<!-- 日志文件的总大小0 表示不限制 -->
<totalSizeCap>${LOGBACK_ROLLINGPOLICY_TOTAL_SIZE_CAP:-0}</totalSizeCap>
<!-- 日志文件的保留天数 -->
<maxHistory>${LOGBACK_ROLLINGPOLICY_MAX_HISTORY:-30}</maxHistory>
</rollingPolicy>
</appender>
<!-- 异步写入日志,提升性能 -->
<appender name="ASYNC" class="ch.qos.logback.classic.AsyncAppender">
<!-- 不丢失日志。默认的,如果队列的 80% 已满,则会丢弃 TRACT、DEBUG、INFO 级别的日志 -->
<discardingThreshold>0</discardingThreshold>
<!-- 更改默认的队列的深度,该值会影响性能。默认值为 256 -->
<queueSize>256</queueSize>
<appender-ref ref="FILE"/>
</appender>
<!-- SkyWalking GRPC 日志收集实现日志中心。注意SkyWalking 8.4.0 版本开始支持 -->
<appender name="GRPC" class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.log.GRPCLogClientAppender">
<encoder class="ch.qos.logback.core.encoder.LayoutWrappingEncoder">
<layout class="org.apache.skywalking.apm.toolkit.log.logback.v1.x.TraceIdPatternLogbackLayout">
<pattern>${PATTERN_DEFAULT}</pattern>
</layout>
</encoder>
</appender>
<!-- 本地环境 -->
<springProfile name="local">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="GRPC"/> <!-- 本地环境下,如果不想接入 SkyWalking 日志服务,可以注释掉本行 -->
<appender-ref ref="ASYNC"/> <!-- 本地环境下,如果不想打印日志,可以注释掉本行 -->
</root>
</springProfile>
<!-- 其它环境 -->
<springProfile name="dev,test,stage,prod,default">
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="ASYNC"/>
<appender-ref ref="GRPC"/>
</root>
</springProfile>
</configuration>

View File

@@ -1,8 +1,5 @@
package com.tashow.cloud.infra.controller.admin.file;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.infra.framework.file.core.utils.FileTypeUtils.writeAttachment;
import cn.hutool.core.io.IoUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
@@ -24,11 +21,15 @@ import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import static com.tashow.cloud.common.pojo.CommonResult.success;
import static com.tashow.cloud.infra.framework.file.core.utils.FileTypeUtils.writeAttachment;
/** 管理后台 - 文件存储 */
@RestController
@RequestMapping("/infra/file")
@Validated
@Slf4j
@PermitAll
public class FileController {
@Resource private FileService fileService;
@@ -87,6 +88,7 @@ public class FileController {
response.setStatus(HttpStatus.NOT_FOUND.value());
return;
}
response.setContentLength(content.length);
writeAttachment(response, path, content);
}

View File

@@ -30,7 +30,7 @@ public class LocalFileClient extends AbstractFileClient<LocalFileClientConfig> {
String filePath = getFilePath(path);
FileUtil.writeBytes(content, filePath);
// 拼接返回路径
return super.formatFileUrl(config.getDomain(), path);
return super.formatFileUrl("", path);
}
@Override

View File

@@ -7,11 +7,11 @@ spring:
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
namespace: liwq # 命名空间。这里使用 dev 开发环境
namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
namespace: liwq # 命名空间。这里使用 dev 开发环境
namespace: dev # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP

View File

@@ -96,9 +96,26 @@
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>com.tashow.cloud</groupId>
<artifactId>tashow-data-redis</artifactId>
</dependency>
</dependencies>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${spring.boot.version}</version>
<configuration>
<mainClass>com.tashow.cloud.product.ProductServerApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

View File

@@ -14,5 +14,6 @@ public class ProductServerApplication {
public static void main(String[] args) {
SpringApplication.run(ProductServerApplication.class, args);
System.out.println("产品启动成功");
}
}

View File

@@ -54,8 +54,8 @@ public class ProdController {
@PostMapping("/uptateProdService")
@Operation(summary = "修改商品服务配置")
@PermitAll
public CommonResult<Boolean> uptateProdService(@Valid @RequestBody ProdServiceVO prodServiceVO) {
prodService.uptateProdService(prodServiceVO);
public CommonResult<Boolean> uptateProdService(@Valid @RequestBody ProdServiceInfoVO prodServiceInfoVO) {
prodService.uptateProdService(prodServiceInfoVO);
return success(true);
}
@@ -114,7 +114,7 @@ public class ProdController {
ProdDO prod = new ProdDO();
prod.setProdId(id);
prod.setStatus(status);
prodMapper.updateBatch(prod);
prodMapper.updateById(prod);
}
return success(true);
}

View File

@@ -3,12 +3,16 @@ package com.tashow.cloud.product.controller.admin;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.common.util.object.BeanUtils;
import com.tashow.cloud.product.mapper.ProdPropMapper;
import com.tashow.cloud.product.mapper.ProdPropValueMapper;
import com.tashow.cloud.productapi.api.product.dto.*;
import com.tashow.cloud.product.mapper.SkuMapper;
import com.tashow.cloud.product.service.ProdExtendService;
import com.tashow.cloud.product.service.ProdPropService;
import com.tashow.cloud.product.service.ProdPropValueService;
import com.tashow.cloud.product.service.SkuService;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.*;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.Parameter;
@@ -41,6 +45,12 @@ public class SkuController {
@Resource
private ProdExtendService prodExtendService;
@Resource
private ProdPropValueMapper prodPropValueMapper;
@Resource
private ProdPropMapper prodPropMapper;
@Resource
private SkuMapper skuMapper;
@@ -54,20 +64,40 @@ public class SkuController {
@PutMapping("/update")
@Operation(summary = "更新单品SKU")
@PermitAll
public CommonResult<Boolean> updateSku(@Valid @RequestBody SkuSaveReqVO updateReqVO) {
public CommonResult<Boolean> updateSku(@RequestBody SkuSaveReqVO updateReqVO) {
skuService.updateSku(updateReqVO);
return success(true);
}
@PutMapping("/updateProp")
@Operation(summary = "新sku规格")
@Operation(summary = "增统一保存sku规格")
@PermitAll
public CommonResult<Boolean> updateProp(@Valid @RequestBody SkuPropVO skuPropVO) {
skuService.updateProp(skuPropVO);
return success(true);
}
@PutMapping("/updatePropValue")
@Operation(summary = "修改属性下面规格值")
@PermitAll
public CommonResult<Boolean> updatePropValue(@RequestParam("id") Long id,@RequestParam("propValue") String propValue) {
skuService.updatePropVal(id,propValue);
return success(true);
}
@PutMapping("/updateProdProp")
@Operation(summary = "修改属性规格值")
@PermitAll
public CommonResult<Boolean> updateProdProp(@RequestParam("id") Long id,@RequestParam("propName") String propName) {
ProdPropDO prodPropDO = new ProdPropDO();
prodPropDO.setId( id);
prodPropDO.setPropName(propName);
prodPropMapper.updateById(prodPropDO);
return success(true);
}
@GetMapping("/getSKuPropList")
@Operation(summary = "获取sku规格")
@PermitAll
@@ -76,6 +106,25 @@ public class SkuController {
return success(skuService.getSKuPropList(prodId));
}
@PermitAll
@GetMapping("/getPropRecycleBinList")
@Operation(summary = "获取规格回收站")
public CommonResult<PageResult<ProPropRecycleBinVO>> getSKuPropRecycleBinList(ProPageReqVO proPageReqVO) {
PageResult<ProPropRecycleBinVO> pageResult = skuService.getSKuPropRecycleBinList(proPageReqVO);
return success(pageResult);
}
@PostMapping("/restorePropList")
@Operation(summary = "恢复规格")
@Parameter(name = "ids", description = "规格id集合", required = true)
@PermitAll
public CommonResult<Boolean> restorePropList(@RequestParam("ids") List<Long> ids) {
skuService.restorePropList(ids);
return success(true);
}
@PutMapping("/deleteProp")
@Operation(summary = "删除规格值")
@PermitAll
@@ -86,10 +135,12 @@ public class SkuController {
@PutMapping("/disableProp")
@Operation(summary = "禁用规格值")
@Operation(summary = "禁用或者启用规格值")
@Parameter(name = "id", description = "规格id")
@Parameter(name = "state", description = "状态0禁用1启用")
@PermitAll
public CommonResult<Boolean> disableProp(@RequestParam("id") Long id) {
skuService.disableProp(id);
public CommonResult<Boolean> disableProp(@RequestParam("id") Long id,@RequestParam("state") Integer state) {
skuService.disableProp(id,state);
return success(true);
}
@@ -108,19 +159,12 @@ public class SkuController {
@Parameter(name = "ids", description = "编号", required = true)
@PermitAll
public CommonResult<Boolean> deleteSkuList(@RequestParam("ids") List<Long> ids) {
/*for(Long id:ids){
SkuDO sku = new SkuDO();
sku.setSkuId(id);
sku.setDeleteTime(new Date());
// 删除
skuMapper.deleteById(sku);
}*/
skuService.deleteSkus(ids);
return success(true);
}
@PostMapping("/updateSkuShelf")
@PutMapping("/updateSkuShelf")
@Operation(summary = "修改单品上下架")
@Parameter(name = "id", description = "编号", required = true)
@Parameter(name = "isShelf", description = "是否上下架0下架 1上架", required = true)
@@ -130,7 +174,7 @@ public class SkuController {
return success(true);
}
@PostMapping("/updateSkuShelfList")
@PutMapping("/updateSkuShelfList")
@Operation(summary = "批量上下架")
@Parameter(name = "ids", description = "编号", required = true)
@Parameter(name = "isShelf", description = "是否上下架0下架 1上架", required = true)
@@ -140,7 +184,7 @@ public class SkuController {
SkuDO sku = new SkuDO();
sku.setSkuId(id);
sku.setIsShelf(isShelf);
skuMapper.updateBatch(sku);
skuMapper.updateById(sku);
}
skuService.updatSkuIsShelfs(ids,isShelf);
return success(true);

View File

@@ -7,6 +7,7 @@ import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdAdditionalFeeDatesDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 特殊日期附加费用规则 Mapper
@@ -16,5 +17,9 @@ import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface ProdAdditionalFeeDatesMapper extends BaseMapperX<ProdAdditionalFeeDatesDO> {
/**
* 删除关联
*/
public int deleteAdditionalFeeDates(@Param("prodId")Long prodId,@Param("type")Integer type);
}

View File

@@ -30,24 +30,9 @@ public interface ProdMapper extends BaseMapperX<ProdDO> {
, @Param("status") Integer status
, @Param("categoryId") Long categoryId);
ProdServiceVO selectProdService(@Param("prodId") Long prodId
, @Param("regionSwitch") Integer regionSwitch
, @Param("reservationSwitch") Integer reservationSwitch
, @Param("emergencySwitch") Integer emergencySwitch
, @Param("orderLimitSwitch") Integer orderLimitSwitch
, @Param("additionalSwitch") Integer additionalSwitch
, @Param("additionalFeeSwitch") Integer additionalFeeSwitch
, @Param("weightSwitch") Integer weightSwitch
);
ProdServiceVO selectProdService(@Param("prodId") Long prodId);
ProdServiceVO selectProdServiceInfo(@Param("prodId") Long prodId
, @Param("reservationSwitch") Integer reservationSwitch
, @Param("emergencySwitch") Integer emergencySwitch
, @Param("orderLimitSwitch") Integer orderLimitSwitch
, @Param("additionalSwitch") Integer additionalSwitch
, @Param("additionalFeeSwitch") Integer additionalFeeSwitch
, @Param("weightSwitch") Integer weightSwitch
);
ProdServiceVO selectProdServiceInfo(@Param("prodId") Long prodId);
IPage<ProdRestoreListVO> getProdRecycleBinPageList(Page<?> page, @Param("deleteTime") String[] deleteTime
, @Param("prodName") String prodName);

View File

@@ -2,10 +2,15 @@ package com.tashow.cloud.product.mapper;
import java.util.*;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdPropValueDO;
import com.tashow.cloud.productapi.api.product.dto.SkuDO;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuRecycleBinVO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
@@ -34,4 +39,14 @@ public interface ProdPropValueMapper extends BaseMapperX<ProdPropValueDO> {
List<ProdPropValueDO> selectRestoreProp(@Param("prodId") Long prodId);
IPage<ProPropRecycleBinVO> getSKuPropRecycleBinList(Page<?> page, @Param("prodId") Long prodId,@Param("propValue")String propValue);
List<ProdPropValueDO> getskuListByPropValueIds(@Param("ids")List<Long> ids);
void restorePropValue(@Param("ids") List<Long> ids);
int getMaxPropValue(@Param("propId")Long propId);
// 根据商品 ID 更新销售属性值的 state仅 rule=1 的)
void updateStateByProdId(@Param("prodId") Long prodId, @Param("state") Integer state);
}

View File

@@ -7,6 +7,7 @@ import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdReservationConfigDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 商品预约配置 Mapper
@@ -17,4 +18,8 @@ import org.apache.ibatis.annotations.Mapper;
public interface ProdReservationConfigMapper extends BaseMapperX<ProdReservationConfigDO> {
/**
* 删除关联
*/
public int deleteReservationConfig(@Param("prodId")Long prodId);
}

View File

@@ -7,6 +7,7 @@ import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO;
import org.apache.ibatis.annotations.Mapper;
import org.apache.ibatis.annotations.Param;
/**
* 体重区间价格 Mapper
@@ -17,4 +18,8 @@ import org.apache.ibatis.annotations.Mapper;
public interface ProdWeightRangePricesMapper extends BaseMapperX<ProdWeightRangePricesDO> {
/**
* 删除关联
*/
public int deleteWeightRangePrices(@Param("prodId")Long prodId);
}

View File

@@ -23,7 +23,8 @@ public interface SkuMapper extends BaseMapperX<SkuDO> {
IPage<SkuDO> getSkuPageList(Page<?> page, @Param("prodId") Long prodId,@Param("skuId") Long skuId, @Param("properties")String properties);
List<SkuDO> getSkuListByName( @Param("propertiesName")String propertiesName);
List<SkuDO> getSkuListByName( @Param("prodId")Long prodId , @Param("propertiesName")String propertiesName);
List<String> selectPropertiesByProdIdAndNotDeleted( @Param("prodId")Long prodId);
List<String> selectPropertiesByProdIdShelf( @Param("prodId")Long prodId);
@@ -31,4 +32,16 @@ public interface SkuMapper extends BaseMapperX<SkuDO> {
int deleteBySkuId( @Param("skuId")Long skuId);
void batchSkuDeleted(@Param("ids") List<Long> ids);
void updateSkuDeleted(@Param("skuId") Long skuId);
List<SkuDO> getskuListBySkuIds( @Param("ids")List<Long> ids);
List<SkuDO> getskuListByDeleted( @Param("prodId")Long prodId,@Param("ids")List<Long> ids);
void batchSkuRecover(@Param("ids") List<Long> ids);
// 查询商品下所有 SKU 的 is_shelf 状态(未删除)
List<Integer> selectShelfStatusByProdId(@Param("prodId") Long prodId);
}

View File

@@ -36,10 +36,10 @@ public interface ProdService {
/**
* 修改商品服务配置
*
* @param prodServiceVO 创建信息
* @param prodServiceInfoVO 创建信息
* @return 编号
*/
void uptateProdService(@Valid ProdServiceVO prodServiceVO);
void uptateProdService(@Valid ProdServiceInfoVO prodServiceInfoVO);

View File

@@ -3,6 +3,8 @@ package com.tashow.cloud.product.service;
import java.util.*;
import com.tashow.cloud.productapi.api.product.dto.*;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.*;
import jakarta.validation.*;
import com.tashow.cloud.common.pojo.PageResult;
@@ -56,6 +58,9 @@ public interface SkuService {
*/
void updateProp(SkuPropVO skuPropVO);
void updatePropVal(Long id, String propValue);
/**
* 删除规格值
*
@@ -68,12 +73,13 @@ public interface SkuService {
*
* @param id 删除规格值
*/
void disableProp(Long id);
void disableProp(Long id,Integer state);
SkuPropInfoVO getSKuPropList(Long prodId);
PageResult<ProPropRecycleBinVO> getSKuPropRecycleBinList(ProPageReqVO proPageReqVO);
/**
* 删除单品SKU
*
@@ -94,6 +100,12 @@ public interface SkuService {
* @param ids
*/
void restoreSkuList(List<Long> ids);
/**
* 恢复规格
*
* @param ids
*/
void restorePropList(List<Long> ids);
/**

View File

@@ -12,6 +12,10 @@ import com.tashow.cloud.product.service.ProdPropService;
import com.tashow.cloud.product.service.ProdService;
import com.tashow.cloud.productapi.api.product.vo.prod.*;
import com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO;
import com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoVO;
import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoReqVO;
import com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoVO;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.sku.SkuRecycleBinVO;
import com.tashow.cloud.productapi.enums.BaseEnum;
@@ -123,12 +127,12 @@ public class ProdServiceImpl implements ProdService {
}
}
//预约设置设置
if (Objects.equals(prodServiceVO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())) {
/*if (Objects.equals(prodServiceVO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())) {
prodDO.setReservationSwitch(BaseEnum.YES_ONE.getKey());
ProdReservationConfigDO prodReservationConfigDO = prodServiceVO.prodReservationConfig;
ProdReservationInfoVO prodReservationConfigDO = prodServiceVO.getProdReservationConfig();
prodReservationConfigDO.setProdId(prodDO.getProdId());
prodReservationConfigMapper.insert(prodReservationConfigDO);
}
}*/
//紧急响应设置
if (Objects.equals(prodServiceVO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())) {
prodDO.setEmergencySwitch(BaseEnum.YES_ONE.getKey());
@@ -165,18 +169,18 @@ public class ProdServiceImpl implements ProdService {
}
}
//体重设置
if (Objects.equals(prodServiceVO.getWeightSwitch(), BaseEnum.YES_ONE.getKey())) {
/* if (Objects.equals(prodServiceVO.getWeightSwitch(), BaseEnum.YES_ONE.getKey())) {
prodDO.setWeightSwitch(BaseEnum.YES_ONE.getKey());
ProdWeightRangePricesDO prodWeightRangePrices = prodServiceVO.prodWeightConfig;
prodWeightRangePrices.setProdId(prodDO.getProdId());
prodWeightRangePricesMapper.insert(prodWeightRangePrices);
}
}*/
prodMapper.updateById(prodDO);
}
@Override
@Transactional
public void uptateProdService(ProdServiceVO prodServiceVO) {
public void uptateProdService(ProdServiceInfoVO prodServiceVO) {
ProdDO prod = BeanUtils.toBean(prodServiceVO, ProdDO.class);
//服务区域设置
@@ -233,17 +237,39 @@ public class ProdServiceImpl implements ProdService {
if (Objects.equals(prodServiceVO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())) {
ProdReservationConfigDO reservationConfig = prodReservationConfigMapper.selectOne(new LambdaQueryWrapper<ProdReservationConfigDO>()
.eq(ProdReservationConfigDO::getProdId, prodServiceVO.getProdId()));
ProdReservationInfoReqVO prodReservationInfoVO = prodServiceVO.getProdReservationConfig();
if (reservationConfig == null) {
prod.setReservationSwitch(BaseEnum.YES_ONE.getKey());
ProdReservationConfigDO prodReservationConfigDO = prodServiceVO.getProdReservationConfig();
ProdReservationConfigDO prodReservationConfigDO = BeanUtils.toBean(prodReservationInfoVO, ProdReservationConfigDO.class);
prodReservationConfigDO.setProdId(prod.getProdId());
prodReservationConfigDO.setTimeBook(prodServiceVO.getProdReservationConfig().getTimeBook());
prodReservationConfigDO.setReservationTimeSlots(prodServiceVO.getProdReservationConfig().getReservationTimeSlots());
prodReservationConfigDO.setTimeSlot(prodReservationInfoVO.getTimeBook().getTimeSlot());
prodReservationConfigDO.setReservationTimeSlots(prodReservationInfoVO.getTimeBook().getReservationTimeSlots());
prodReservationConfigMapper.insert(prodReservationConfigDO);
//先删除在新增
prodAdditionalFeeDatesMapper.deleteAdditionalFeeDates(prod.getProdId(), 2);
if (prodServiceVO.getProdReservationConfig().getProdReservationBlackList() != null) {
for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdReservationConfig().getProdReservationBlackList()) {
ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
prodAdditionalFeeDatesDO.setType(2);
prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
}
}
} else {
prodServiceVO.getProdReservationConfig().setTimeBook(prodServiceVO.getProdReservationConfig().getTimeBook());
prodServiceVO.getProdReservationConfig().setReservationTimeSlots(prodServiceVO.getProdReservationConfig().getReservationTimeSlots());
prodReservationConfigMapper.updateById(prodServiceVO.getProdReservationConfig());
ProdReservationConfigDO prodReservationConfigDO = BeanUtils.toBean(prodServiceVO.getProdReservationConfig(), ProdReservationConfigDO.class);
prodReservationConfigDO.setTimeSlot(prodReservationInfoVO.getTimeBook().getTimeSlot());
prodReservationConfigDO.setReservationTimeSlots(prodReservationInfoVO.getTimeBook().getReservationTimeSlots());
prodReservationConfigMapper.updateById(prodReservationConfigDO);
//先删除在新增
prodAdditionalFeeDatesMapper.deleteAdditionalFeeDates(prod.getProdId(), 2);
if (prodServiceVO.getProdReservationConfig().getProdReservationBlackList() != null) {
for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdReservationConfig().getProdReservationBlackList()) {
ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
prodAdditionalFeeDatesDO.setType(2);
prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
}
}
}
}
//紧急响应设置
@@ -256,26 +282,47 @@ public class ProdServiceImpl implements ProdService {
ProdEmergencyResponseDO prodEmergencyResponse = BeanUtils.toBean(prodServiceVO.getProdEmergencyInfoVO(), ProdEmergencyResponseDO.class);
prodEmergencyResponse.setProdId(prod.getProdId());
prodEmergencyResponseMapper.insert(prodEmergencyResponse);
if(prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()!=null){
if (prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList() != null) {
for (ProdEmergencyResponseIntervalsDO prodEmergencyResponseIntervals : prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()) {
prodEmergencyResponseIntervals.setId(null);
prodEmergencyResponseIntervals.setConfigId(prodEmergencyResponse.getId());
prodEmergencyResponseIntervals.setProdId(prod.getProdId());
prodEmergencyResponseIntervalsMapper.insert(prodEmergencyResponseIntervals);
}
}
if (prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList() != null) {
for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList()) {
ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
prodAdditionalFeeDatesDO.setId(null);
prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
prodAdditionalFeeDatesDO.setType(3);
prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
}
}
} else {
ProdEmergencyResponseDO prodEmergencyResponse = BeanUtils.toBean(prodServiceVO.getProdEmergencyInfoVO(), ProdEmergencyResponseDO.class);
if (prodEmergencyResponse != null) {
prodEmergencyResponseMapper.updateById(prodEmergencyResponse);
prodEmergencyResponseIntervalsMapper.deleteIntervals(prodEmergencyResponse.getId());
if(prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()!=null) {
if (prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList() != null) {
for (ProdEmergencyResponseIntervalsDO prodEmergencyResponseIntervals : prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList()) {
prodEmergencyResponseIntervals.setId(null);
prodEmergencyResponseIntervals.setConfigId(prodEmergencyResponse.getId());
prodEmergencyResponseIntervals.setProdId(prod.getProdId());
prodEmergencyResponseIntervalsMapper.insert(prodEmergencyResponseIntervals);
}
}
//先删除在新增
prodAdditionalFeeDatesMapper.deleteAdditionalFeeDates(prod.getProdId(), 3);
if (prodServiceVO.getProdReservationConfig().getProdReservationBlackList() != null) {
for (ProdAdditionalFeeBlackVO prodAdditionalFeeBlackVO : prodServiceVO.getProdReservationConfig().getProdReservationBlackList()) {
ProdAdditionalFeeDatesDO prodAdditionalFeeDatesDO = BeanUtils.toBean(prodAdditionalFeeBlackVO, ProdAdditionalFeeDatesDO.class);
prodAdditionalFeeDatesDO.setId(null);
prodAdditionalFeeDatesDO.setProdId(prod.getProdId());
prodAdditionalFeeDatesDO.setType(3);
prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDatesDO);
}
}
}
}
}
@@ -298,6 +345,7 @@ public class ProdServiceImpl implements ProdService {
for (ProdAdditionalFeeDatesDO prodAdditionalFeeDates : prodServiceVO.getProdAdditionalFeeDatesList()) {
if (prodAdditionalFeeDates.getId() == null) {
prodAdditionalFeeDates.setProdId(prodServiceVO.getProdId());
prodAdditionalFeeDates.setType(1);
prodAdditionalFeeDatesMapper.insert(prodAdditionalFeeDates);
} else {
prodAdditionalFeeDatesMapper.updateById(prodAdditionalFeeDates);
@@ -317,13 +365,23 @@ public class ProdServiceImpl implements ProdService {
}
//体重设置
if (Objects.equals(prodServiceVO.getWeightSwitch(), BaseEnum.YES_ONE.getKey())) {
if (prodServiceVO.getProdWeightConfig().getId() == null) {
prod.setWeightSwitch(BaseEnum.YES_ONE.getKey());
ProdWeightRangePricesDO prodWeightRangePrices = prodServiceVO.getProdWeightConfig();
prodWeightRangePrices.setProdId(prod.getProdId());
prodWeightRangePricesMapper.insert(prodWeightRangePrices);
prod.setWeightSwitch(prodServiceVO.getWeightSwitch());
ProdExtendDO prodExtendDO = prodExtendMapper.selectOne(ProdExtendDO::getProdId, prod.getProdId());
if (prodExtendDO != null) {
prodExtendDO.setIsWeightCharge(prodServiceVO.getProdWeightConfig().getIsWeightCharge());
prodExtendMapper.updateById(prodExtendDO);
} else {
prodWeightRangePricesMapper.updateById(prodServiceVO.getProdWeightConfig());
prodExtendDO = new ProdExtendDO();
prodExtendDO.setProdId(prod.getProdId());
prodExtendDO.setIsWeightCharge(prodServiceVO.getProdWeightConfig().getIsWeightCharge());
prodExtendMapper.insert(prodExtendDO);
}
prodWeightRangePricesMapper.deleteWeightRangePrices(prod.getProdId());
if (prodServiceVO.getProdWeightConfig().getProdWeightConfigList() != null) {
for (ProdWeightRangePricesDO prodWeightRangePricesDO : prodServiceVO.getProdWeightConfig().getProdWeightConfigList()) {
prodWeightRangePricesDO.setProdId(prod.getProdId());
prodWeightRangePricesMapper.insert(prodWeightRangePricesDO);
}
}
}
prodMapper.updateById(prod);
@@ -332,15 +390,66 @@ public class ProdServiceImpl implements ProdService {
@Override
public ProdServiceVO getProdService(Long prodId) {
ProdDO prodDO = prodMapper.selectById(prodId);
if (prodDO != null && prodDO.getRegionSwitch() == BaseEnum.YES_ONE.getKey()) {
return prodMapper.selectProdService(prodDO.getProdId(), prodDO.getRegionSwitch(),
prodDO.getReservationSwitch(), prodDO.getEmergencySwitch(), prodDO.getOrderLimitSwitch(),
prodDO.getAdditionalSwitch(), prodDO.getAdditionalFeeSwitch(), prodDO.getWeightSwitch());
} else {
return prodMapper.selectProdServiceInfo(prodDO.getProdId(),
prodDO.getReservationSwitch(), prodDO.getEmergencySwitch(), prodDO.getOrderLimitSwitch(),
prodDO.getAdditionalSwitch(), prodDO.getAdditionalFeeSwitch(), prodDO.getWeightSwitch());
ProdServiceVO prodServiceVO = prodMapper.selectProdService(prodDO.getProdId());
if (prodServiceVO.getProdEmergencyInfoVO().getId()== null) {
prodServiceVO.setProdEmergencyInfoVO(null);
}else {
if (prodServiceVO.getProdEmergencyInfoVO().getId()!= null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList().size()== 0) {
ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
prodEmergencyInfoVO.setProdEmergencyResponseIntervalsList(new ArrayList<>());
}
if (prodServiceVO.getProdEmergencyInfoVO().getId()!= null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList().get(0).isEmpty()) {
ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
prodEmergencyInfoVO.setProdEmergencyResponseBlackList(new ArrayList<>());
}
}
if (prodServiceVO.getProdAdditionalFeeDatesList().get(0).getId()==null) {
prodServiceVO.setProdAdditionalFeeDatesList(new ArrayList<>());
}
if (prodServiceVO.getProdAdditionalFeePeriodsList().get(0).getId()==null) {
prodServiceVO.setProdAdditionalFeePeriodsList(new ArrayList<>());
}
return prodServiceVO;
/* if (prodDO != null && prodDO.getRegionSwitch() == BaseEnum.YES_ONE.getKey()) {
ProdServiceVO prodServiceVO = prodMapper.selectProdService(prodDO.getProdId());
if (Objects.equals(prodDO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdReservationConfig().getProdReservationBlackList().get(0).isEmpty()) {
ProdReservationInfoVO prodReservationInfoVO = prodServiceVO.getProdReservationConfig();
prodReservationInfoVO.setProdReservationBlackList(new ArrayList<>());
}
if (Objects.equals(prodDO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList().get(0).isEmpty()) {
ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
prodEmergencyInfoVO.setProdEmergencyResponseIntervalsList(new ArrayList<>());
}
if (Objects.equals(prodDO.getAdditionalSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeeDatesList().get(0).isEmpty()) {
prodServiceVO.setProdAdditionalFeeDatesList(new ArrayList<>());
}
if (Objects.equals(prodDO.getAdditionalFeeSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeePeriodsList().get(0).isEmpty()) {
prodServiceVO.setProdAdditionalFeePeriodsList(new ArrayList<>());
}
return prodServiceVO;
} else {
ProdServiceVO prodServiceVO = prodMapper.selectProdServiceInfo(prodDO.getProdId());
if (Objects.equals(prodDO.getReservationSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdReservationConfig()!=null&&prodServiceVO.getProdReservationConfig().getProdReservationBlackList().get(0).isEmpty()) {
ProdReservationInfoVO prodReservationInfoVO = prodServiceVO.getProdReservationConfig();
prodReservationInfoVO.setProdReservationBlackList(new ArrayList<>());
}
if (Objects.equals(prodDO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdEmergencyInfoVO()!=null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseIntervalsList().get(0).isEmpty()) {
ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
prodEmergencyInfoVO.setProdEmergencyResponseIntervalsList(new ArrayList<>());
}
if (Objects.equals(prodDO.getEmergencySwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdEmergencyInfoVO()!=null&&prodServiceVO.getProdEmergencyInfoVO().getProdEmergencyResponseBlackList().get(0).isEmpty()) {
ProdEmergencyInfoVO prodEmergencyInfoVO = prodServiceVO.getProdEmergencyInfoVO();
prodEmergencyInfoVO.setProdEmergencyResponseBlackList(new ArrayList<>());
}
if (Objects.equals(prodDO.getAdditionalSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeeDatesList()!=null&&prodServiceVO.getProdAdditionalFeeDatesList().get(0).isEmpty()) {
prodServiceVO.setProdAdditionalFeeDatesList(new ArrayList<>());
}
if (Objects.equals(prodDO.getAdditionalFeeSwitch(), BaseEnum.YES_ONE.getKey())&&prodServiceVO.getProdAdditionalFeePeriodsList()!=null&&prodServiceVO.getProdAdditionalFeePeriodsList().get(0).isEmpty()) {
prodServiceVO.setProdAdditionalFeePeriodsList(new ArrayList<>());
}
return prodServiceVO;
}*/
}

View File

@@ -12,6 +12,8 @@ import com.tashow.cloud.product.service.ProdExtendService;
import com.tashow.cloud.product.service.ProdPropService;
import com.tashow.cloud.product.service.ProdPropValueService;
import com.tashow.cloud.product.service.SkuService;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPageReqVO;
import com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO;
import com.tashow.cloud.productapi.api.product.vo.sku.*;
import com.tashow.cloud.productapi.enums.BaseEnum;
import com.tashow.cloud.productapi.enums.ErrorCodeConstants;
@@ -63,7 +65,8 @@ public class SkuServiceImpl implements SkuService {
private ProdExtendService prodExtendService;
@Resource
private ProdPropValueMapper prodPropValueMapper;
@Resource
private ProdPropMapper prodPropMapper;
@Override
public Long createSku(SkuSaveReqVO createReqVO) {
@@ -393,32 +396,50 @@ public class SkuServiceImpl implements SkuService {
if (CollectionUtil.isNotEmpty(skuPropVO.getSkuList())) {
List<SkuDO> skuList = skuPropVO.getSkuList();
List<SkuDO> skuListNew = new ArrayList<>();
List<SkuDO> skuListUpdate = new ArrayList<>();
for (SkuDO sku : skuList) {
if (Objects.equals(BaseEnum.YES_ONE.getKey(), sku.getIsExist())) {
sku.setProdId(skuPropVO.getProdId());
skuListNew.add(sku);
} else {
skuListUpdate.add(sku);
}
}
if (CollUtil.isNotEmpty(skuListNew)) {
skuMapper.insertBatch(skuListNew);
}
if (CollUtil.isNotEmpty(skuListUpdate)) {
skuMapper.updateBatch(skuListUpdate);
}
}
prodExtendMapper.updateByProdId(skuPropVO.getProdId(), skuPropVO.getIsDisable(), skuPropVO.getIsExpire());
//保存规格
prodPropService.updateProdPropAndValues(skuPropVO);
}
@Override
public void updatePropVal(Long id, String propValue) {
ProdPropValueDO prodPropValueDO = prodPropValueMapper.selectById(id);
ProdPropDO prodPropDO =prodPropMapper.selectById(prodPropValueDO.getPropId());
List<SkuDO> skuDOList = skuMapper.getSkuListByName(prodPropDO.getProdId(),prodPropValueDO.getPropValue());
for (SkuDO skuDO : skuDOList) {
if (skuDO.getProperties() != null) {
String[] split = skuDO.getProperties().split(",");
for (String s : split) {
if (s.equals(prodPropValueDO.getPropValue())) {
skuDO.setProperties(propValue);
skuDO.setSkuName(propValue);
skuMapper.updateById(skuDO);
}
}
}
}
prodPropValueDO.setPropValue(propValue);
prodPropValueMapper.updateById(prodPropValueDO);
}
@Override
public void deleteProp(Long id) {
ProdPropValueDO prodPropValueDO = prodPropValueService.getById(id);
ProdPropDO prodPropDO =prodPropMapper.selectById(prodPropValueDO.getPropId());
prodPropValueService.deleteProdPropValue(id);
List<SkuDO> skuDOList = skuMapper.getSkuListByName(prodPropValueDO.getPropValue());
List<SkuDO> skuDOList = skuMapper.getSkuListByName(prodPropDO.getProdId(),prodPropValueDO.getPropValue());
List<Long> skuids = new ArrayList<>();
for (SkuDO skuDO : skuDOList) {
if (skuDO.getProperties() != null) {
@@ -436,25 +457,28 @@ public class SkuServiceImpl implements SkuService {
}
@Override
public void disableProp(Long id) {
public void disableProp(Long id, Integer state) {
ProdPropValueDO prodPropValueDO = prodPropValueService.getById(id);
prodPropValueDO.setState(BaseEnum.YES_ONE.getKey());
prodPropValueDO.setState(state);
prodPropValueService.updateById(prodPropValueDO);
List<SkuDO> skuDOList = skuMapper.getSkuListByName(prodPropValueDO.getPropValue());
List<SkuDO> skuDOList1 = new ArrayList<>();
for (SkuDO skuDO : skuDOList) {
if (skuDO.getProperties() != null) {
String[] split = skuDO.getProperties().split(",");
for (String s : split) {
if (s.equals(prodPropValueDO.getPropValue())) {
skuDO.setIsShelf(BaseEnum.NO_ZERO.getKey());
skuDOList1.add(skuDO);
ProdPropDO prodPropDO =prodPropMapper.selectById(prodPropValueDO.getPropId());
if (Objects.equals(BaseEnum.NO_ZERO.getKey(), state)) {
List<SkuDO> skuDOList = skuMapper.getSkuListByName(prodPropDO.getProdId(),prodPropValueDO.getPropValue());
List<SkuDO> skuDOList1 = new ArrayList<>();
for (SkuDO skuDO : skuDOList) {
if (skuDO.getProperties() != null) {
String[] split = skuDO.getProperties().split(",");
for (String s : split) {
if (s.equals(prodPropValueDO.getPropValue())) {
skuDO.setIsShelf(BaseEnum.NO_ZERO.getKey());
skuDOList1.add(skuDO);
}
}
}
}
}
if (CollUtil.isNotEmpty(skuDOList1)) {
skuMapper.updateBatch(skuDOList1);
if (CollUtil.isNotEmpty(skuDOList1)) {
skuMapper.updateBatch(skuDOList1);
}
}
}
@@ -470,6 +494,7 @@ public class SkuServiceImpl implements SkuService {
List<ProdPropValueDO> values = prodPropValueService.list(
new LambdaQueryWrapper<ProdPropValueDO>()
.eq(ProdPropValueDO::getPropId, prop.getId())
.eq(ProdPropValueDO::getDeleted, BaseEnum.NO_ZERO.getKey())
.orderByAsc(ProdPropValueDO::getSort)
);
prop.setProdPropValues(values);
@@ -483,6 +508,17 @@ public class SkuServiceImpl implements SkuService {
return skuPropInfoVO;
}
@Override
public PageResult<ProPropRecycleBinVO> getSKuPropRecycleBinList(ProPageReqVO proPageReqVO) {
IPage<ProPropRecycleBinVO> prodPageList = prodPropValueMapper.getSKuPropRecycleBinList(MyBatisUtils.buildPage(proPageReqVO), proPageReqVO.getProdId(), proPageReqVO.getPropValue());
for (ProPropRecycleBinVO prodPage : prodPageList.getRecords()) {
if (prodPage.getDeleteTime() != null) {
prodPage.setRemainingDays(DateUtils.getRemainingDays(prodPage.getDeleteTime()));
}
}
return new PageResult<>(prodPageList.getRecords(), prodPageList.getTotal());
}
/* @Override
public SkuPropInfoVO getSKuPropList(Long prodId, Integer isExpire, Integer state) {
if (prodId == null) {
@@ -710,14 +746,27 @@ public class SkuServiceImpl implements SkuService {
@Override
@Transactional(rollbackFor = Exception.class)
public void restoreSkuList(List<Long> ids) {
List<SkuDO> skuList = skuMapper.selectByIds(ids);
List<SkuDO> skuList = skuMapper.getskuListBySkuIds(ids);
if (skuList.isEmpty()) {
return;
}
// 获取商品下所有被删除的SKU除了当前要恢复的 ids
List<SkuDO> skuAllDeletedList = skuMapper.getskuListByDeleted(skuList.get(0).getProdId(), ids);
Set<String> allDeletedValues = new HashSet<>();
for (SkuDO sku : skuAllDeletedList) {
if (sku.getProperties() != null && !sku.getProperties().trim().isEmpty()) {
String[] values = sku.getProperties().split(",");
for (String v : values) {
allDeletedValues.add(v.trim());
}
}
}
Set<String> currentlyUsedValues = new HashSet<>();
for (SkuDO sku : skuList) {
sku.setDeleted(BaseEnum.NO_ZERO.getKey());
skuMapper.updateById(sku);
skuMapper.updateSkuDeleted(sku.getSkuId());
if (sku.getProperties() != null && !sku.getProperties().trim().isEmpty()) {
String[] values = sku.getProperties().split(",");
for (String v : values) {
@@ -725,21 +774,42 @@ public class SkuServiceImpl implements SkuService {
}
}
}
//恢复被删除的属性值
if(!currentlyUsedValues.isEmpty()){
Long prodId = skuList.get(0).getProdId();
List<ProdPropValueDO> allPropValues =prodPropValueMapper.selectRestoreProp(prodId);
if(!allPropValues.isEmpty()){
for (ProdPropValueDO pv : allPropValues){
if (currentlyUsedValues.contains(pv.getPropValue())) {
pv.setIsExpire(BaseEnum.NO_ZERO.getKey());
prodPropValueMapper.updateById(pv);
}
// === 核心修改点:提取 currentlyUsedValues 中不在 allDeletedValues 的值(即新增启用的规格值)===
Set<String> valuesToRestore = new HashSet<>(currentlyUsedValues);
valuesToRestore.removeAll(allDeletedValues); // 只保留“之前被删掉过”的规格值
// 如果没有需要恢复的规格值,直接返回
if (valuesToRestore.isEmpty()) {
return;
}
// 查询商品下所有属性值
Long prodId = skuList.get(0).getProdId();
List<ProdPropValueDO> allPropValues = prodPropValueMapper.selectRestoreProp(prodId);
if (!allPropValues.isEmpty()) {
for (ProdPropValueDO pv : allPropValues) {
// 仅当该属性值是“当前使用”且“之前被删除”的(即在 valuesToRestore 中),才恢复
if (valuesToRestore.contains(pv.getPropValue())) {
pv.setIsExpire(BaseEnum.NO_ZERO.getKey()); // 标记为未过期
prodPropValueMapper.updateById(pv);
}
}
}
}
@Override
public void restorePropList(List<Long> ids) {
prodPropValueMapper.restorePropValue(ids);
List<ProdPropValueDO> prodPropValueDOList = prodPropValueMapper.getskuListByPropValueIds(ids);
for (ProdPropValueDO prodPropValueDO : prodPropValueDOList) {
int maxPropValue =prodPropValueMapper.getMaxPropValue(prodPropValueDO.getPropId());
prodPropValueDO.setSort(maxPropValue+1);
prodPropValueService.updateById(prodPropValueDO);
}
}
@Override
public void updatSkuIsShelf(Long id, Integer isShelf) {
@@ -749,10 +819,8 @@ public class SkuServiceImpl implements SkuService {
SkuDO prodSku = skuMapper.selectById(id);
// Step 1: 获取该商品下所有未禁用的 SKU 的 properties
List<String> activeProperties = skuMapper.selectPropertiesByProdIdShelf(prodSku.getProdId());
SkuDO sku = new SkuDO();
sku.setSkuId(id);
sku.setIsShelf(isShelf);
skuMapper.updateById(sku);
prodSku.setIsShelf(isShelf);
skuMapper.updateById(prodSku);
// Step 2: 提取所有正在被使用的属性值(去重)
Set<String> currentlyUsedValues = new HashSet<>();
for (String props : activeProperties) {
@@ -797,42 +865,35 @@ public class SkuServiceImpl implements SkuService {
if (!allSameProd) {
throw new IllegalArgumentException("批量删除的 SKU 必须属于同一个商品");
}
// Step 3: 获取该商品下【当前仍然未禁用】的 SKU 的 properties
List<String> activeProperties = skuMapper.selectPropertiesByProdIdShelf(prodId);
for (Long id : ids) {
SkuDO sku = new SkuDO();
sku.setSkuId(id);
sku.setIsShelf(isShelf);
skuMapper.updateBatch(sku);
skuMapper.updateById(sku);
}
// Step 4: 提取所有仍在使用的属性值(去重 + trim
Set<String> currentlyUsedValues = new HashSet<>();
for (String props : activeProperties) {
if (props != null && !props.trim().isEmpty()) {
String[] values = props.split(",");
for (String v : values) {
currentlyUsedValues.add(v.trim());
}
}
// ================================
//新增逻辑:判断商品整体上下架状态,并更新 tz_prod_prop_value.state
// ================================
// 查询该商品下所有未删除的 SKU 的 is_shelf 状态
List<Integer> allSkuShelfStatus = skuMapper.selectShelfStatusByProdId(prodId);
if (allSkuShelfStatus.isEmpty()) {
return; // 没有 SKU无需处理
}
// Step 5: 查询该商品下所有 rule=1 的销售属性值(未删除的)
List<ProdPropValueDO> allPropValues = prodPropValueMapper.selectSalesValuesByState(prodId);
boolean allShelf = allSkuShelfStatus.stream().allMatch(status -> status == 1); // 全部上架
boolean allOffShelf = allSkuShelfStatus.stream().allMatch(status -> status == 0); // 全部下架
// Step 6: 收集需要删除的属性值 ID
List<Long> valueIdsToDelete = new ArrayList<>();
for (ProdPropValueDO pv : allPropValues) {
String value = pv.getPropValue().trim();
if (!currentlyUsedValues.contains(value)) {
valueIdsToDelete.add(pv.getId());
}
Integer targetState = null;
if (allShelf) {
targetState = 1; // 启用
} else if (allOffShelf) {
targetState = 0; // 禁用
}
// Step 7: 批量删除无用的属性值
if (!valueIdsToDelete.isEmpty()) {
prodPropValueMapper.batchMarkDeleted(valueIdsToDelete);
// 混合状态:不修改 state
// 如果需要更新状态,则批量更新 tz_prod_prop_value 的 state 字段
if (targetState != null) {
prodPropValueMapper.updateStateByProdId(prodId, targetState);
}
}

View File

@@ -7,10 +7,10 @@ spring:
username: nacos # Nacos 账号
password: nacos # Nacos 密码
discovery: # 【配置中心】配置项
namespace: 76667956-2ac2-4e05-906b-4bca4ebcc5f0 # 命名空间。这里使用 dev 开发环境
namespace: 16bd40df-7cc7-4c2c-82c2-6186ade7bb08 # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP
metadata:
version: 1.0.0 # 服务实例的版本号,可用于灰度发布
config: # 【注册中心】配置项
namespace: 76667956-2ac2-4e05-906b-4bca4ebcc5f0 # 命名空间。这里使用 dev 开发环境
namespace: 16bd40df-7cc7-4c2c-82c2-6186ade7bb08 # 命名空间。这里使用 dev 开发环境
group: DEFAULT_GROUP # 使用的 Nacos 配置分组,默认为 DEFAULT_GROUP

View File

@@ -9,4 +9,7 @@
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<delete id="deleteAdditionalFeeDates">
delete from tz_prod_additional_fee_dates where prod_id = #{prodId} AND type = #{type}
</delete>
</mapper>

View File

@@ -25,16 +25,20 @@
<association property="prodEmergencyInfoVO" javaType="com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoVO">
<id property="id" column="erc_record_id"/>
<result property="prodId" column="erc_prod_id"/>
<result property="responseTimeSlots" column="response_time_slots"/>
<result property="blacklistedDates" column="blacklisted_dates"/>
<result property="blackAppointDates" column="black_appoint_dates"/>
<result property="blackHappy" column="black_happy"/>
<result property="blackWeekend" column="black_weekend"/>
<result property="responseTimeSlots" column="erc_response_time_slots"/>
<!-- 嵌套集合:紧急响应时间区间 -->
<collection property="prodEmergencyResponseBlackList" ofType="com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO">
<id property="id" column="eblack_record_id"/>
<result property="dateType" column="eblack_date_type"/>
<result property="customTimeSlots" column="eblack_custom_time_slots"/>
<result property="type" column="eblack_type"/>
<result property="isEnabled" column="eblack_is_enabled"/>
</collection>
<!-- 嵌套集合:紧急响应时间区间 -->
<collection property="prodEmergencyResponseIntervalsList" ofType="com.tashow.cloud.productapi.api.product.dto.ProdEmergencyResponseIntervalsDO">
<id property="id" column="eri_record_id"/>
<result property="configId" column="eri_config_id"/>
<result property="modeName" column="mode_name"/>
<result property="name" column="eri_name"/>
<result property="responseHours" column="response_hours"/>
<result property="chargeMode" column="charge_mode"/>
<result property="floatingPercentage" column="floating_percentage"/>
@@ -42,7 +46,7 @@
</collection>
</association>
<association property="prodReservationConfig" javaType="com.tashow.cloud.productapi.api.product.dto.ProdReservationConfigDO">
<association property="prodReservationConfig" javaType="com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoVO">
<id property="id" column="rc_record_id"/>
<result property="prodId" column="rc_prod_id"/>
<result property="reservationTimeSlots" column="rc_reservation_time_slots"/>
@@ -52,12 +56,15 @@
<result property="changeTimeRule" column="rc_change_time_rule"/>
<result property="timeSlot" column="rc_time_slot"/>
<result property="maxChangeTimes" column="rc_max_change_times"/>
<result property="blacklistedDates" column="rc_blacklisted_dates"/>
<result property="isBlacklisted" column="rc_is_blacklisted"/>
<result property="blackAppointDates" column="rc_black_appoint_dates"/>
<result property="isBlackAppoint" column="rc_is_black_appoint"/>
<result property="blackHappy" column="rc_black_happy"/>
<result property="blackWeekend" column="rc_black_weekend"/>
<collection property="prodReservationBlackList"
ofType="com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO"> <!-- 所有 blacklist 字段加 black_ 前缀 -->
<id property="id" column="black_id"/>
<result property="dateType" column="black_date_type"/>
<result property="customTimeSlots" column="black_custom_time_slots"/>
<result property="type" column="black_type"/>
<result property="isEnabled" column="black_is_enabled"/>
</collection>
</association>
<!-- 映射接单上限配置 (productOrderLimitVO) -->
@@ -83,17 +90,22 @@
<!-- 新增:映射体重区间价格配置列表 (prodWeightConfigList) -->
<collection property="prodWeightConfig" ofType="com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO">
<id property="id" column="wrp_record_id"/>
<result property="prodId" column="wrp_prod_id"/>
<result property="weightRange" column="wrp_weight_range"/> <!-- 注意:数据库列是 weight_range -->
<result property="price" column="wrp_price"/>
<result property="isEnabled" column="wrp_is_enabled"/>
<!-- <result property="createTime" column="wrp_create_time"/> -->
<!-- <result property="updateTime" column="wrp_update_time"/> -->
<!-- <result property="creator" column="wrp_creator"/> -->
<!-- <result property="updater" column="wrp_updater"/> -->
</collection>
<association property="prodWeightConfig" javaType="com.tashow.cloud.productapi.api.product.vo.prodweightrangeprices.ProdWeightRangePricesSaveInfoVO">
<result property="isWeightCharge" column="tpe_is_weight_charge"/>
<!-- 新增:映射体重区间价格配置列表 (prodWeightConfigList) -->
<collection property="prodWeightConfigList" ofType="com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO">
<id property="id" column="wrp_record_id"/>
<result property="prodId" column="wrp_prod_id"/>
<result property="weightRange" column="wrp_weight_range"/> <!-- 注意:数据库列是 weight_range -->
<result property="price" column="wrp_price"/>
<result property="isEnabled" column="wrp_is_enabled"/>
<!-- <result property="createTime" column="wrp_create_time"/> -->
<!-- <result property="updateTime" column="wrp_update_time"/> -->
<!-- <result property="creator" column="wrp_creator"/> -->
<!-- <result property="updater" column="wrp_updater"/> -->
</collection>
</association>
<!-- 新增:映射特殊日期规则配置列表 (prodAdditionalFeePeriodsList) -->
<collection property="prodAdditionalFeePeriodsList" ofType="com.tashow.cloud.productapi.api.product.dto.ProdAdditionalFeePeriodsDO">
@@ -113,21 +125,15 @@
<result property="name" column="afd_name"/>
<result property="dateType" column="afd_date_type"/>
<result property="customTimeSlots" column="afd_custom_time_slots"/>
<result property="specificDates" column="afd_specific_dates"/>
<!-- <result property="specificDates" column="afd_specific_dates"/>-->
<result property="chargeMode" column="afd_charge_mode"/>
<result property="price" column="afd_price"/>
<result property="isEnabled" column="afd_is_enabled"/>
</collection>
<!-- 映射服务区域地址名称 (areaNameList) -->
<!--<collection property="prodServiceAreasInfo.areaNameList" ofType="string">
<result column="sa_area_name"/>
</collection>-->
</resultMap>
@@ -149,16 +155,20 @@
<association property="prodEmergencyInfoVO" javaType="com.tashow.cloud.productapi.api.product.vo.prodemergencyresponse.ProdEmergencyInfoVO">
<id property="id" column="erc_record_id"/>
<result property="prodId" column="erc_prod_id"/>
<result property="responseTimeSlots" column="response_time_slots"/>
<result property="blacklistedDates" column="blacklisted_dates"/>
<result property="blackAppointDates" column="black_appoint_dates"/>
<result property="blackHappy" column="black_happy"/>
<result property="blackWeekend" column="black_weekend"/>
<result property="responseTimeSlots" column="erc_response_time_slots"/>
<!-- 嵌套集合:紧急响应时间区间 -->
<collection property="prodEmergencyResponseBlackList" ofType="com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO">
<id property="id" column="eblack_record_id"/>
<result property="dateType" column="eblack_date_type"/>
<result property="customTimeSlots" column="eblack_custom_time_slots"/>
<result property="type" column="eblack_type"/>
<result property="isEnabled" column="eblack_is_enabled"/>
</collection>
<!-- 嵌套集合:紧急响应时间区间 -->
<collection property="prodEmergencyResponseIntervalsList" ofType="com.tashow.cloud.productapi.api.product.dto.ProdEmergencyResponseIntervalsDO">
<id property="id" column="eri_record_id"/>
<result property="configId" column="eri_config_id"/>
<result property="modeName" column="mode_name"/>
<result property="name" column="eri_name"/>
<result property="responseHours" column="response_hours"/>
<result property="chargeMode" column="charge_mode"/>
<result property="floatingPercentage" column="floating_percentage"/>
@@ -166,7 +176,7 @@
</collection>
</association>
<association property="prodReservationConfig" javaType="com.tashow.cloud.productapi.api.product.dto.ProdReservationConfigDO">
<association property="prodReservationConfig" javaType="com.tashow.cloud.productapi.api.product.vo.prodreservationconfig.ProdReservationInfoVO">
<id property="id" column="rc_record_id"/>
<result property="prodId" column="rc_prod_id"/>
<result property="reservationTimeSlots" column="rc_reservation_time_slots"/>
@@ -176,12 +186,14 @@
<result property="changeTimeRule" column="rc_change_time_rule"/>
<result property="timeSlot" column="rc_time_slot"/>
<result property="maxChangeTimes" column="rc_max_change_times"/>
<result property="blacklistedDates" column="rc_blacklisted_dates"/>
<result property="isBlacklisted" column="rc_is_blacklisted"/>
<result property="blackAppointDates" column="rc_black_appoint_dates"/>
<result property="isBlackAppoint" column="rc_is_black_appoint"/>
<result property="blackHappy" column="rc_black_happy"/>
<result property="blackWeekend" column="rc_black_weekend"/>
<collection property="prodReservationBlackList"
ofType="com.tashow.cloud.productapi.api.product.vo.prodadditionalfeedates.ProdAdditionalFeeBlackVO"> <!-- 所有 blacklist 字段加 black_ 前缀 -->
<id property="id" column="black_id"/>
<result property="dateType" column="black_date_type"/>
<result property="customTimeSlots" column="black_custom_time_slots"/>
<result property="type" column="black_type"/>
<result property="isEnabled" column="black_is_enabled"/>
</collection>
</association>
<!-- 映射接单上限配置 (productOrderLimitVO) -->
@@ -192,19 +204,23 @@
<result property="maxOrders" column="ol_max_orders"/>
</association>
<association property="prodWeightConfig" javaType="com.tashow.cloud.productapi.api.product.vo.prodweightrangeprices.ProdWeightRangePricesSaveInfoVO">
<result property="isWeightCharge" column="tpe_is_weight_charge"/>
<!-- 新增:映射体重区间价格配置列表 (prodWeightConfigList) -->
<collection property="prodWeightConfigList" ofType="com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO">
<id property="id" column="wrp_record_id"/>
<result property="prodId" column="wrp_prod_id"/>
<result property="weightRange" column="wrp_weight_range"/> <!-- 注意:数据库列是 weight_range -->
<result property="price" column="wrp_price"/>
<result property="isEnabled" column="wrp_is_enabled"/>
<!-- <result property="createTime" column="wrp_create_time"/> -->
<!-- <result property="updateTime" column="wrp_update_time"/> -->
<!-- <result property="creator" column="wrp_creator"/> -->
<!-- <result property="updater" column="wrp_updater"/> -->
</collection>
</association>
<!-- 新增:映射体重区间价格配置列表 (prodWeightConfigList) -->
<collection property="prodWeightConfig" ofType="com.tashow.cloud.productapi.api.product.dto.ProdWeightRangePricesDO">
<id property="id" column="wrp_record_id"/>
<result property="prodId" column="wrp_prod_id"/>
<result property="weightRange" column="wrp_weight_range"/> <!-- 注意:数据库列是 weight_range -->
<result property="price" column="wrp_price"/>
<result property="isEnabled" column="wrp_is_enabled"/>
<!-- <result property="createTime" column="wrp_create_time"/> -->
<!-- <result property="updateTime" column="wrp_update_time"/> -->
<!-- <result property="creator" column="wrp_creator"/> -->
<!-- <result property="updater" column="wrp_updater"/> -->
</collection>
<!-- 新增:映射特殊日期规则配置列表 (prodAdditionalFeePeriodsList) -->
<collection property="prodAdditionalFeePeriodsList" ofType="com.tashow.cloud.productapi.api.product.dto.ProdAdditionalFeePeriodsDO">
@@ -224,7 +240,7 @@
<result property="name" column="afd_name"/>
<result property="dateType" column="afd_date_type"/>
<result property="customTimeSlots" column="afd_custom_time_slots"/>
<result property="specificDates" column="afd_specific_dates"/>
<!-- <result property="specificDates" column="afd_specific_dates"/>-->
<result property="chargeMode" column="afd_charge_mode"/>
<result property="price" column="afd_price"/>
<result property="isEnabled" column="afd_is_enabled"/>
@@ -241,145 +257,135 @@
<!-- 动态SQL查询商品列表及其服务配置 (返回 List<ProdServiceVO>) -->
<!-- 用于列表页,可根据开关动态决定是否关联紧急响应信息以优化性能 -->
<select id="selectProdService" parameterType="map" resultMap="ProdServiceResultMap">
SELECT
p.emergency_switch,
p.additional_switch,
p.additional_fee_switch,
p.reservation_switch,
p.order_limit_switch,
p.weight_switch,
p.region_switch,
p.create_time,
p.update_time,
p.creator,
p.updater,
p.category_name,
<!-- 只有当 emergencySwitch 开启时,才查询紧急响应相关字段 -->
<if test="emergencySwitch != null and emergencySwitch == 1">
erc.id AS erc_record_id,
erc.prod_id AS erc_prod_id,
erc.response_time_slots,
erc.blacklisted_dates,
erc.black_appoint_dates,
erc.black_happy,
erc.black_weekend,
erc.create_time AS erc_create_time,
erc.update_time AS erc_update_time,
erc.creator AS erc_creator,
erc.updater AS erc_updater,
erc.deleted AS erc_deleted,
eri.id AS eri_record_id,
eri.config_id AS eri_config_id,
eri.mode_name,
eri.response_hours,
eri.charge_mode,
eri.floating_percentage,
eri.price,
eri.create_time AS eri_create_time,
eri.update_time AS eri_update_time,
eri.creator AS eri_creator,
eri.updater AS eri_updater,
eri.deleted AS eri_deleted,
</if>
<!-- 只有当 additionalFeeSwitch 开启时,才查询特殊日期规则相关字段 -->
<if test="additionalFeeSwitch != null and additionalFeeSwitch == 1">
afp.id AS afp_record_id,
afp.prod_id AS afp_prod_id,
afp.name AS afp_name,
afp.special_time_slots AS afp_special_time_slots,
afp.charge_mode AS afp_charge_mode,
afp.price AS afp_price,
afp.floating_percentage AS afp_floating_percentage,
</if>
<!-- 只有当 additionalSwitch 开启时,才查询特殊时段规则相关字段 -->
<if test="additionalSwitch != null and additionalSwitch == 1">
afd.id AS afd_record_id,
afd.prod_id AS afd_prod_id,
afd.name AS afd_name,
afd.date_type AS afd_date_type,
afd.custom_time_slots AS afd_custom_time_slots,
afd.specific_dates AS afd_specific_dates,
afd.charge_mode AS afd_charge_mode,
afd.price AS afd_price,
afd.is_enabled AS afd_is_enabled,
afd.create_time AS afd_create_time,
afd.update_time AS afd_update_time,
afd.creator AS afd_creator,
afd.updater AS afd_updater,
afd.deleted AS afd_deleted,
</if>
<!-- 只有当 reservationSwitch 开启时,才查询预约配置相关字段 -->
<if test="reservationSwitch != null and reservationSwitch == 1">
rc.id AS rc_record_id,
rc.prod_id AS rc_prod_id,
rc.reservation_time_slots AS rc_reservation_time_slots,
rc.advance_hours AS rc_advance_hours,
rc.reservation_date_range AS rc_reservation_date_range,
rc.allow_change AS rc_allow_change,
rc.change_time_rule AS rc_change_time_rule,
rc.time_slot AS rc_time_slot,
rc.max_change_times AS rc_max_change_times,
rc.blacklisted_dates AS rc_blacklisted_dates,
rc.is_blacklisted AS rc_is_blacklisted,
rc.black_appoint_dates AS rc_black_appoint_dates,
rc.is_black_appoint AS rc_is_black_appoint,
rc.black_happy AS rc_black_happy,
rc.black_weekend AS rc_black_weekend,
</if>
<!-- 只有当 orderLimitSwitch 开启时,才查询接单上限配置相关字段 -->
<if test="orderLimitSwitch != null and orderLimitSwitch == 1">
ol.id AS ol_record_id,
ol.prod_id AS ol_prod_id,
ol.limit_unit AS ol_limit_unit,
ol.max_orders AS ol_max_orders,
</if>
<!-- 只有当 weightSwitch 开启时,才查询体重区间价格相关字段 -->
<if test="weightSwitch != null and weightSwitch == 1">
wrp.id AS wrp_record_id,
wrp.prod_id AS wrp_prod_id,
wrp.weight_range AS wrp_weight_range,
wrp.price AS wrp_price,
wrp.is_enabled AS wrp_is_enabled,
</if>
<!-- 只有当 regionSwitch 开启时,才查询服务区域相关字段 -->
<if test="regionSwitch != null and regionSwitch == 1">
sa.id AS sa_rule_id,
sa.prod_id AS sa_prod_id,
sa.rule_type AS sa_rule_type,
sa.fee AS sa_fee,
saa.area_name AS sa_area_name,
</if>
p.prod_id
FROM
tz_prod p
<!-- 只有当 emergencySwitch 开启时才进行 LEFT JOIN -->
<if test="emergencySwitch != null and emergencySwitch == 1">
LEFT JOIN tz_prod_emergency_response erc ON p.prod_id = erc.prod_id AND erc.deleted = 0
LEFT JOIN tz_prod_emergency_response_intervals eri ON erc.id = eri.config_id AND eri.deleted = 0
</if>
<if test="additionalFeeSwitch != null and additionalFeeSwitch == 1">
LEFT JOIN tz_prod_additional_fee_periods afp ON p.prod_id = afp.prod_id AND afp.deleted = 0
</if>
<if test="additionalSwitch != null and additionalSwitch == 1">
LEFT JOIN tz_prod_additional_fee_dates afd ON p.prod_id = afd.prod_id AND afd.deleted = 0
</if>
<if test="reservationSwitch != null and reservationSwitch == 1">
LEFT JOIN tz_prod_reservation_config rc ON p.prod_id = rc.prod_id AND rc.deleted = 0
</if>
<if test="orderLimitSwitch != null and orderLimitSwitch == 1">
LEFT JOIN tz_product_order_limit ol ON p.prod_id = ol.prod_id AND ol.deleted = 0
</if>
<if test="weightSwitch != null and weightSwitch == 1">
LEFT JOIN tz_prod_weight_range_prices wrp ON p.prod_id = wrp.prod_id AND wrp.deleted = 0
</if>
<if test="regionSwitch != null and regionSwitch == 1">
LEFT JOIN tz_prod_service_over_area_rules sa ON p.prod_id = sa.prod_id AND sa.deleted = 0
LEFT JOIN tz_prod_service_area_relevance sar ON p.prod_id = sar.prod_id
LEFT JOIN tz_prod_service_areas saa ON sar.area_id = saa.id AND saa.deleted = 0
</if>
where p.deleted = 0
AND p.prod_id = #{prodId}
ORDER BY p.prod_id
SELECT p.prod_id,
p.emergency_switch,
p.additional_switch,
p.additional_fee_switch,
p.reservation_switch,
p.order_limit_switch,
p.weight_switch,
p.region_switch,
p.create_time,
p.update_time,
p.creator,
p.updater,
p.category_name,
erc.id AS erc_record_id,
erc.response_time_slots as erc_response_time_slots,
epafd.id AS eblack_record_id,
epafd.date_type as eblack_date_type,
epafd.custom_time_slots as eblack_custom_time_slots,
epafd.type as eblack_type,
epafd.is_enabled as eblack_is_enabled,
eri.id AS eri_record_id,
eri.config_id AS eri_config_id,
eri.name as eri_name,
eri.response_hours,
eri.charge_mode,
eri.floating_percentage,
eri.price,
eri.create_time AS eri_create_time,
eri.update_time AS eri_update_time,
eri.creator AS eri_creator,
eri.updater AS eri_updater,
eri.deleted AS eri_deleted,
afp.id AS afp_record_id,
afp.prod_id AS afp_prod_id,
afp.name AS afp_name,
afp.special_time_slots AS afp_special_time_slots,
afp.charge_mode AS afp_charge_mode,
afp.price AS afp_price,
afp.floating_percentage AS afp_floating_percentage,
afd.id AS afd_record_id,
afd.prod_id AS afd_prod_id,
afd.name AS afd_name,
afd.date_type AS afd_date_type,
afd.custom_time_slots AS afd_custom_time_slots,
afd.specific_dates AS afd_specific_dates,
afd.charge_mode AS afd_charge_mode,
afd.price AS afd_price,
afd.is_enabled AS afd_is_enabled,
afd.create_time AS afd_create_time,
afd.update_time AS afd_update_time,
afd.creator AS afd_creator,
afd.updater AS afd_updater,
afd.deleted AS afd_deleted,
rc.id AS rc_record_id,
rc.prod_id AS rc_prod_id,
rc.reservation_time_slots AS rc_reservation_time_slots,
rc.advance_hours AS rc_advance_hours,
rc.reservation_date_range AS rc_reservation_date_range,
rc.allow_change AS rc_allow_change,
rc.change_time_rule AS rc_change_time_rule,
rc.time_slot AS rc_time_slot,
rc.max_change_times AS rc_max_change_times,
rpafd.id AS black_id,
rpafd.date_type as black_date_type,
rpafd.custom_time_slots as black_custom_time_slots,
rpafd.type as black_type,
rpafd.is_enabled as black_is_enabled,
ol.id AS ol_record_id,
ol.prod_id AS ol_prod_id,
ol.limit_unit AS ol_limit_unit,
ol.max_orders AS ol_max_orders,
tpe.is_weight_charge as tpe_is_weight_charge,
wrp.id AS wrp_record_id,
wrp.prod_id AS wrp_prod_id,
wrp.weight_range AS wrp_weight_range,
wrp.price AS wrp_price,
wrp.is_enabled AS wrp_is_enabled,
sa.id AS sa_rule_id,
sa.prod_id AS sa_prod_id,
sa.rule_type AS sa_rule_type,
sa.fee AS sa_fee,
saa.area_name AS sa_area_name,
p.prod_name
FROM tz_prod p
LEFT JOIN tz_prod_emergency_response erc ON p.prod_id = erc.prod_id AND erc.deleted = 0
LEFT JOIN tz_prod_additional_fee_dates epafd
ON p.prod_id = epafd.prod_id AND epafd.deleted = 0 AND epafd.type = 3
LEFT JOIN tz_prod_emergency_response_intervals eri ON erc.id = eri.config_id AND eri.deleted = 0
LEFT JOIN tz_prod_additional_fee_periods afp ON p.prod_id = afp.prod_id AND afp.deleted = 0
LEFT JOIN tz_prod_additional_fee_dates afd
ON p.prod_id = afd.prod_id AND afd.deleted = 0 and afd.type = 1
LEFT JOIN tz_prod_reservation_config rc ON p.prod_id = rc.prod_id AND rc.deleted = 0
LEFT JOIN tz_prod_additional_fee_dates rpafd
ON p.prod_id = rpafd.prod_id AND rpafd.deleted = 0 AND rpafd.type = 2
LEFT JOIN tz_product_order_limit ol ON p.prod_id = ol.prod_id AND ol.deleted = 0
LEFT JOIN tz_prod_extend tpe ON p.prod_id = tpe.prod_id
LEFT JOIN tz_prod_weight_range_prices wrp ON p.prod_id = wrp.prod_id AND wrp.deleted = 0
LEFT JOIN tz_prod_service_over_area_rules sa ON p.prod_id = sa.prod_id AND sa.deleted = 0
LEFT JOIN tz_prod_service_area_relevance sar ON p.prod_id = sar.prod_id
LEFT JOIN tz_prod_service_areas saa ON sar.area_id = saa.id AND saa.deleted = 0
where p.deleted = 0
AND p.prod_id = #{prodId}
ORDER BY p.prod_id ,rpafd.date_type ,epafd.date_type,afd.date_type ASC
</select>
@@ -389,6 +395,7 @@
<!-- 用于列表页,可根据开关动态决定是否关联紧急响应信息以优化性能 -->
<select id="selectProdServiceInfo" parameterType="map" resultMap="ProdServiceResultInfoMap">
SELECT
p.prod_id,
p.emergency_switch,
p.additional_switch,
p.additional_fee_switch,
@@ -396,23 +403,19 @@
p.order_limit_switch,
p.weight_switch,
p.region_switch,
<!-- 只有当 emergencySwitch 开启时,才查询紧急响应相关字段 -->
<if test="emergencySwitch != null and emergencySwitch == 1">
erc.id AS erc_record_id,
erc.prod_id AS erc_prod_id,
erc.response_time_slots,
erc.blacklisted_dates,
erc.black_appoint_dates,
erc.black_happy,
erc.black_weekend,
erc.create_time AS erc_create_time,
erc.update_time AS erc_update_time,
erc.creator AS erc_creator,
erc.updater AS erc_updater,
erc.deleted AS erc_deleted,
erc.response_time_slots as erc_response_time_slots,
epafd.id AS eblack_record_id,
epafd.date_type as eblack_date_type,
epafd.custom_time_slots as eblack_custom_time_slots,
epafd.type as eblack_type,
epafd.is_enabled as eblack_is_enabled,
eri.id AS eri_record_id,
eri.config_id AS eri_config_id,
eri.mode_name,
eri.name as eri_name,
eri.response_hours,
eri.charge_mode,
eri.floating_percentage,
@@ -422,9 +425,8 @@
eri.creator AS eri_creator,
eri.updater AS eri_updater,
eri.deleted AS eri_deleted,
</if>
<!-- 只有当 additionalFeeSwitch 开启时,才查询特殊日期规则相关字段 -->
<if test="additionalFeeSwitch != null and additionalFeeSwitch == 1">
afp.id AS afp_record_id,
afp.prod_id AS afp_prod_id,
afp.name AS afp_name,
@@ -432,9 +434,8 @@
afp.charge_mode AS afp_charge_mode,
afp.price AS afp_price,
afp.floating_percentage AS afp_floating_percentage,
</if>
<!-- 只有当 additionalSwitch 开启时,才查询特殊时段规则相关字段 -->
<if test="additionalSwitch != null and additionalSwitch == 1">
afd.id AS afd_record_id,
afd.prod_id AS afd_prod_id,
afd.name AS afd_name,
@@ -449,9 +450,8 @@
afd.creator AS afd_creator,
afd.updater AS afd_updater,
afd.deleted AS afd_deleted,
</if>
<!-- 只有当 reservationSwitch 开启时,才查询预约配置相关字段 -->
<if test="reservationSwitch != null and reservationSwitch == 1">
rc.id AS rc_record_id,
rc.prod_id AS rc_prod_id,
rc.reservation_time_slots AS rc_reservation_time_slots,
@@ -461,51 +461,54 @@
rc.change_time_rule AS rc_change_time_rule,
rc.time_slot AS rc_time_slot,
rc.max_change_times AS rc_max_change_times,
rc.blacklisted_dates AS rc_blacklisted_dates,
rc.is_blacklisted AS rc_is_blacklisted,
rc.black_appoint_dates AS rc_black_appoint_dates,
rc.is_black_appoint AS rc_is_black_appoint,
rc.black_happy AS rc_black_happy,
rc.black_weekend AS rc_black_weekend,
</if>
<!-- 只有当 orderLimitSwitch 开启时,才查询接单上限配置相关字段 -->
<if test="orderLimitSwitch != null and orderLimitSwitch == 1">
rpafd.id AS black_id,
rpafd.date_type as black_date_type,
rpafd.custom_time_slots as black_custom_time_slots,
rpafd.type as black_type,
rpafd.is_enabled as black_is_enabled,
ol.id AS ol_record_id,
ol.prod_id AS ol_prod_id,
ol.limit_unit AS ol_limit_unit,
ol.max_orders AS ol_max_orders,
</if>
<!-- 只有当 weightSwitch 开启时,才查询体重区间价格相关字段 -->
<if test="weightSwitch != null and weightSwitch == 1">
tpe.is_weight_charge as tpe_is_weight_charge,
wrp.id AS wrp_record_id,
wrp.prod_id AS wrp_prod_id,
wrp.weight_range AS wrp_weight_range,
wrp.price AS wrp_price,
wrp.is_enabled AS wrp_is_enabled,
</if>
p.prod_id
p.prod_name
FROM
tz_prod p
<!-- 只有当 emergencySwitch 开启时才进行 LEFT JOIN -->
<if test="emergencySwitch != null and emergencySwitch == 1">
LEFT JOIN tz_prod_emergency_response erc ON p.prod_id = erc.prod_id AND erc.deleted = 0
LEFT JOIN tz_prod_additional_fee_dates epafd ON p.prod_id = epafd.prod_id AND epafd.deleted = 0 AND epafd.type = 3
LEFT JOIN tz_prod_emergency_response_intervals eri ON erc.id = eri.config_id AND eri.deleted = 0
</if>
<if test="additionalFeeSwitch != null and additionalFeeSwitch == 1">
LEFT JOIN tz_prod_additional_fee_periods afp ON p.prod_id = afp.prod_id AND afp.deleted = 0
</if>
<if test="additionalSwitch != null and additionalSwitch == 1">
LEFT JOIN tz_prod_additional_fee_dates afd ON p.prod_id = afd.prod_id AND afd.deleted = 0
</if>
<if test="reservationSwitch != null and reservationSwitch == 1">
LEFT JOIN tz_prod_additional_fee_dates afd ON p.prod_id = afd.prod_id AND afd.deleted = 0 and afd.type = 1
LEFT JOIN tz_prod_reservation_config rc ON p.prod_id = rc.prod_id AND rc.deleted = 0
</if>
<if test="orderLimitSwitch != null and orderLimitSwitch == 1">
LEFT JOIN tz_prod_additional_fee_dates rpafd ON p.prod_id = rpafd.prod_id AND rpafd.deleted = 0 AND rpafd.type = 2
LEFT JOIN tz_product_order_limit ol ON p.prod_id = ol.prod_id AND ol.deleted = 0
</if>
<if test="weightSwitch != null and weightSwitch == 1">
LEFT JOIN tz_prod_extend tpe ON p.prod_id = tpe.prod_id
LEFT JOIN tz_prod_weight_range_prices wrp ON p.prod_id = wrp.prod_id AND wrp.deleted = 0
</if>
where p.deleted = 0
AND p.prod_id = #{prodId}
ORDER BY p.prod_id
@@ -572,7 +575,7 @@
) min_eri ON tp.prod_id = min_eri.prod_id
where tp.deleted = 1
<if test="prodName != null and prodName != ''">
and tp.prod_ame like concat('%', #{prodName}, '%')
and tp.prod_name like concat('%', #{prodName}, '%')
</if>
<if test="deleteTime != null and deleteTime.length == 2">
AND tp.delete_time BETWEEN #{deleteTime[0]} AND #{deleteTime[1]}
@@ -625,4 +628,7 @@
</foreach>
</update>
</mapper>

View File

@@ -11,4 +11,7 @@
<select id="getProdPropByPropNameAndShopId" resultType="com.tashow.cloud.productapi.api.product.dto.ProdPropDO">
select * from tz_prod_prop where prop_name = #{propName} and prod_id = #{prodId} and rule = #{rule}
</select>
</mapper>

View File

@@ -47,6 +47,20 @@
</select>
<select id="getMaxPropValue" resultType="int">
SELECT max(sort) FROM `tz_prod_prop_value` WHERE prop_id = #{propId} AND deleted = 0
</select>
<update id="updateStateByProdId">
UPDATE tz_prod_prop_value
SET state = #{state}
WHERE prop_id IN (
SELECT id FROM tz_prod_prop
WHERE prod_id = #{prodId}
AND deleted = 0
)
AND deleted = 0
</update>
<update id="batchMarkDeleted">
@@ -62,7 +76,7 @@
<update id="deleteProdPropValueById">
UPDATE tz_prod_prop_value
SET
is_expire = 1, delete_time = NOW()
deleted = 1, delete_time = NOW()
WHERE id = #{id}
</update>
@@ -78,6 +92,39 @@
</select>
<select id="getSKuPropRecycleBinList" resultType="com.tashow.cloud.productapi.api.product.vo.prodpropvalue.ProPropRecycleBinVO" >
SELECT
ppv.id,
ppv.prop_value,
ppv.prop_id,
ppv.delete_time
FROM tz_prod_prop pp
JOIN tz_prod_prop_value ppv ON pp.id = ppv.prop_id
WHERE pp.prod_id = #{prodId}
AND (ppv.is_expire = 1 or ppv.deleted = 1)
<if test="propValue != null and propValue != ''">
and prop_value like concat('%', #{propValue}, '%')
</if>
</select>
<select id="getskuListByPropValueIds" resultType="com.tashow.cloud.productapi.api.product.dto.ProdPropValueDO">
SELECT *
FROM tz_prod_prop_value
WHERE id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<update id="restorePropValue">
UPDATE tz_prod_prop_value
SET is_expire = 1, deleted = 0
WHERE id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</update>
</mapper>

View File

@@ -8,5 +8,7 @@
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<delete id="deleteReservationConfig">
delete from tz_prod_reservation_config where prod_id = #{prodId}
</delete>
</mapper>

View File

@@ -8,5 +8,7 @@
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
<delete id="deleteWeightRangePrices">
delete from tz_prod_weight_range_prices where prod_id = #{prodId}
</delete>
</mapper>

View File

@@ -10,7 +10,7 @@
-->
<select id="getSkuRecycleBinPageList" resultType="com.tashow.cloud.productapi.api.product.vo.sku.SkuRecycleBinVO" >
select sku_id, properties, delete_time from tz_sku where prod_id = #{prodId} and deleted = 1
select * from tz_sku where prod_id = #{prodId} and deleted = 1
<if test="properties != null and properties != ''">
and properties like concat('%', #{properties}, '%')
</if>
@@ -32,7 +32,7 @@
<select id="getSkuListByName" resultType="com.tashow.cloud.productapi.api.product.dto.SkuDO" >
select sku_id, properties, delete_time,deleted from tz_sku where deleted = 0
select sku_id, properties, delete_time,deleted from tz_sku where deleted = 0 and prod_id = #{prodId}
<if test="propertiesName != null and propertiesName != ''">
and properties like concat('%', #{propertiesName}, '%')
</if>
@@ -73,4 +73,49 @@
#{id}
</foreach>
</update>
<select id="getskuListBySkuIds" resultType="com.tashow.cloud.productapi.api.product.dto.SkuDO">
SELECT *
FROM tz_sku
WHERE sku_id IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<select id="getskuListByDeleted" resultType="com.tashow.cloud.productapi.api.product.dto.SkuDO">
SELECT *
FROM tz_sku
WHERE prod_id = #{prodId} AND deleted = 1 and sku_id not IN
<foreach collection="ids" item="id" open="(" separator="," close=")">
#{id}
</foreach>
</select>
<update id="updateSkuDeleted">
UPDATE tz_sku
SET deleted = 0
WHERE sku_id = #{skuId}
</update>
<update id="batchSkuRecover">
UPDATE tz_sku
SET deleted = 0
WHERE sku_id IN
<foreach item="id" collection="ids" open="(" separator="," close=")">
#{id}
</foreach>
</update>
<select id="selectShelfStatusByProdId" resultType="int">
SELECT is_shelf
FROM tz_sku
WHERE prod_id = #{prodId}
AND deleted = 0
</select>
</mapper>

View File

@@ -11,6 +11,7 @@ public class SystemServerApplication {
public static void main(String[] args) {
SpringApplication.run(SystemServerApplication.class, args);
System.out.println("系统启动成功");
}
}

View File

@@ -1,14 +1,15 @@
package com.tashow.cloud.system.controller.admin.sms.vo.log;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
import com.tashow.cloud.common.pojo.PageParam;
import java.time.LocalDateTime;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
/** 管理后台 - 短信日志分页 Request VO */
@Data
@EqualsAndHashCode(callSuper = true)
@@ -27,8 +28,8 @@ public class SmsLogPageReqVO extends PageParam {
/** 发送状态,参见 SmsSendStatusEnum 枚举类 */
private Integer sendStatus;
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
/** 发送时间 */
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] sendTime;
/** 接收状态,参见 SmsReceiveStatusEnum 枚举类 */

View File

@@ -240,7 +240,7 @@ public class PermissionServiceImpl implements PermissionService {
}
@Override
@Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId")
// @Cacheable(value = RedisKeyConstants.USER_ROLE_ID_LIST, key = "#userId")
public Set<Long> getUserRoleIdListByUserIdFromCache(Long userId) {
return getUserRoleIdListByUserId(userId);
}

View File

@@ -10,7 +10,6 @@ spring:
- optional:classpath:application-${spring.profiles.active}.yaml # 加载【本地】配置
- optional:nacos:application.yaml # 加载【Nacos】通用的配置
- optional:nacos:tenant.yaml # 加载【Nacos】通用的配置
- optional:nacos:application-login.yaml # 加载登录配置
- optional:nacos:${spring.application.name}-${spring.profiles.active}.yaml # 加载【Nacos】的配置