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:
@@ -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>
|
||||
|
||||
96
tashow-module/tashow-module-ai/pom.xml
Normal file
96
tashow-module/tashow-module-ai/pom.xml
Normal 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>
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.controller.admin;
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 文本类型(1text,2image,3file,4audio)
|
||||
*/
|
||||
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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
//消息类型(1text,2file)
|
||||
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;
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.controller.app;
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.controller;
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
|
||||
/**
|
||||
* 文本类型(1text,2image,3file,4audio)
|
||||
*/
|
||||
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;
|
||||
|
||||
}
|
||||
@@ -0,0 +1,2 @@
|
||||
package com.tashow.cloud.ai.dal.dataobject;
|
||||
// 数据库对象
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.dal.mysql;
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.dal;
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.framework;
|
||||
@@ -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 {
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.framework.rpc;
|
||||
@@ -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();
|
||||
}
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
/**
|
||||
* 占位
|
||||
*/
|
||||
package com.tashow.cloud.ai.framework.security.core;
|
||||
@@ -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);
|
||||
|
||||
|
||||
}
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.tashow.cloud.ai.service.aisample;
|
||||
|
||||
/**
|
||||
* 样本标签-分组关联 Service 接口
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
public interface AiSampleTagGroupRelateService {
|
||||
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
package com.tashow.cloud.ai.service.aisample;
|
||||
|
||||
/**
|
||||
* 样本-标签关联 Service 接口
|
||||
*
|
||||
* @author 芋道源码
|
||||
*/
|
||||
public interface AiSampleTagRelateService {
|
||||
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
|
||||
}
|
||||
@@ -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();
|
||||
}
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
@@ -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> {
|
||||
|
||||
|
||||
}
|
||||
@@ -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 {
|
||||
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
package com.tashow.cloud.ai.service;
|
||||
@@ -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
|
||||
@@ -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】的配置
|
||||
@@ -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>
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
@@ -14,5 +14,6 @@ public class ProductServerApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(ProductServerApplication.class, args);
|
||||
System.out.println("产品启动成功");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
}
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
@@ -36,10 +36,10 @@ public interface ProdService {
|
||||
/**
|
||||
* 修改商品服务配置
|
||||
*
|
||||
* @param prodServiceVO 创建信息
|
||||
* @param prodServiceInfoVO 创建信息
|
||||
* @return 编号
|
||||
*/
|
||||
void uptateProdService(@Valid ProdServiceVO prodServiceVO);
|
||||
void uptateProdService(@Valid ProdServiceInfoVO prodServiceInfoVO);
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
/**
|
||||
|
||||
@@ -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;
|
||||
}*/
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -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>
|
||||
@@ -11,6 +11,7 @@ public class SystemServerApplication {
|
||||
|
||||
public static void main(String[] args) {
|
||||
SpringApplication.run(SystemServerApplication.class, args);
|
||||
System.out.println("系统启动成功");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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 枚举类 */
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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】的配置
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user