This commit is contained in:
2025-10-16 13:53:07 +08:00
parent de062744b4
commit e5f0d57286
51 changed files with 1327 additions and 641 deletions

View File

@@ -5,10 +5,6 @@ import ${jakartaPackage}.annotation.Resource;
import org.springframework.validation.annotation.Validated;
#if ($sceneEnum.scene == 1)import org.springframework.security.access.prepost.PreAuthorize;#end
import io.swagger.v3.oas.annotations.tags.Tag;
import io.swagger.v3.oas.annotations.Parameter;
import io.swagger.v3.oas.annotations.Operation;
import ${jakartaPackage}.validation.constraints.*;
import ${jakartaPackage}.validation.*;
import ${jakartaPackage}.servlet.http.*;
@@ -34,7 +30,9 @@ import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.bu
#end
import ${basePackage}.module.${table.moduleName}.service.${table.businessName}.${table.className}Service;
@Tag(name = "${sceneEnum.name} - ${table.classComment}")
/**
* ${sceneEnum.name} - ${table.classComment}
*/
@RestController
##二级的 businessName 暂时不算在 HTTP 路径上,可以根据需要写
@RequestMapping("/${table.moduleName}/${simpleClassName_strikeCase}")
@@ -44,8 +42,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
@Resource
private ${table.className}Service ${classNameVar}Service;
/**
* 创建${table.classComment}
*/
@PostMapping("/create")
@Operation(summary = "创建${table.classComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
#end
@@ -53,8 +53,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(${classNameVar}Service.create${simpleClassName}(createReqVO));
}
/**
* 更新${table.classComment}
*/
@PutMapping("/update")
@Operation(summary = "更新${table.classComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")
#end
@@ -63,9 +65,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(true);
}
/**
* 删除${table.classComment}
*/
@DeleteMapping("/delete")
@Operation(summary = "删除${table.classComment}")
@Parameter(name = "id", description = "编号", required = true)
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
#end
@@ -74,9 +77,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(true);
}
/**
* 获得${table.classComment}
*/
@GetMapping("/get")
@Operation(summary = "获得${table.classComment}")
@Parameter(name = "id", description = "编号", required = true, example = "1024")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
@@ -86,8 +90,11 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
}
#if ( $table.templateType != 2 )
/**
* 获得${table.classComment}分页
*/
@GetMapping("/page")
@Operation(summary = "获得${table.classComment}分页")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
@@ -98,8 +105,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
## 特殊:树表专属逻辑(树不需要分页接口)
#else
/**
* 获得${table.classComment}列表
*/
@GetMapping("/list")
@Operation(summary = "获得${table.classComment}列表")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
@@ -109,8 +118,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
}
#end
/**
* 导出${table.classComment} Excel
*/
@GetMapping("/export-excel")
@Operation(summary = "导出${table.classComment} Excel")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:export')")
#end
@@ -149,9 +160,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
## 情况一MASTER_ERP 时,需要分查询页子表
#if ( $table.templateType == 11 )
/**
* 获得${subTable.classComment}分页
*/
@GetMapping("/${subSimpleClassName_strikeCase}/page")
@Operation(summary = "获得${subTable.classComment}分页")
@Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
@@ -163,9 +175,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
## 情况二:非 MASTER_ERP 时,需要列表查询子表
#else
#if ( $subTable.subJoinMany )
/**
* 获得${subTable.classComment}列表
*/
@GetMapping("/${subSimpleClassName_strikeCase}/list-by-${subJoinColumn_strikeCase}")
@Operation(summary = "获得${subTable.classComment}列表")
@Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
@@ -174,9 +187,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
}
#else
/**
* 获得${subTable.classComment}
*/
@GetMapping("/${subSimpleClassName_strikeCase}/get-by-${subJoinColumn_strikeCase}")
@Operation(summary = "获得${subTable.classComment}")
@Parameter(name = "${subJoinColumn.javaField}", description = "${subJoinColumn.columnComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end
@@ -188,8 +202,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
#end
## 特殊MASTER_ERP 时,支持单个的新增、修改、删除操作
#if ( $table.templateType == 11 )
/**
* 创建${subTable.classComment}
*/
@PostMapping("/${subSimpleClassName_strikeCase}/create")
@Operation(summary = "创建${subTable.classComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:create')")
#end
@@ -197,8 +213,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(${classNameVar}Service.create${subSimpleClassName}(${subClassNameVar}));
}
/**
* 更新${subTable.classComment}
*/
@PutMapping("/${subSimpleClassName_strikeCase}/update")
@Operation(summary = "更新${subTable.classComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:update')")
#end
@@ -207,9 +225,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(true);
}
/**
* 删除${subTable.classComment}
*/
@DeleteMapping("/${subSimpleClassName_strikeCase}/delete")
@Parameter(name = "id", description = "编号", required = true)
@Operation(summary = "删除${subTable.classComment}")
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:delete')")
#end
@@ -218,9 +237,10 @@ public class ${sceneEnum.prefixClass}${table.className}Controller {
return success(true);
}
/**
* 获得${subTable.classComment}
*/
@GetMapping("/${subSimpleClassName_strikeCase}/get")
@Operation(summary = "获得${subTable.classComment}")
@Parameter(name = "id", description = "编号", required = true)
#if ($sceneEnum.scene == 1)
@PreAuthorize("@ss.hasPermission('${permissionPrefix}:query')")
#end

View File

@@ -2,7 +2,7 @@ package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePac
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import ${PageParamClassName};
#foreach ($column in $columns)
#if (${column.javaType} == "BigDecimal")
@@ -22,18 +22,24 @@ import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
#end
## 字段模板
#macro(columnTpl $prefix $prefixStr)
@Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
/**
* ${prefixStr}${column.columnComment}"#if ("$!column.example" != "
*/, example = "${column.example}"#end)
private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end;
#end
@Schema(description = "${sceneEnum.name} - ${table.classComment}列表 Request VO")
/**
* ${sceneEnum.name} - ${table.classComment}列表 Request VO
*/
@Data
public class ${sceneEnum.prefixClass}${table.className}ListReqVO {
#foreach ($column in $columns)
#if (${column.listOperation})##查询操作
#if (${column.listOperationCondition} == "BETWEEN")## 情况一Between 的时候
@Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
/**
* ${column.columnComment}"#if ("$!column.example" != "
*/, example = "${column.example}"#end)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private ${column.javaType}[] ${column.javaField};
#else##情况二,非 Between 的时间

View File

@@ -2,7 +2,7 @@ package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePac
import lombok.*;
import java.util.*;
import io.swagger.v3.oas.annotations.media.Schema;
import ${PageParamClassName};
#foreach ($column in $columns)
#if (${column.javaType} == "BigDecimal")
@@ -22,11 +22,15 @@ import static ${DateUtilsClassName}.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
#end
## 字段模板
#macro(columnTpl $prefix $prefixStr)
@Schema(description = "${prefixStr}${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
/**
* ${prefixStr}${column.columnComment}"#if ("$!column.example" != "
*/, example = "${column.example}"#end)
private ${column.javaType}#if ("$!prefix" != "") ${prefix}${JavaField}#else ${column.javaField}#end;
#end
@Schema(description = "${sceneEnum.name} - ${table.classComment}分页 Request VO")
/**
* ${sceneEnum.name} - ${table.classComment}分页 Request VO
*/
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@@ -35,7 +39,9 @@ public class ${sceneEnum.prefixClass}${table.className}PageReqVO extends PagePar
#foreach ($column in $columns)
#if (${column.listOperation})##查询操作
#if (${column.listOperationCondition} == "BETWEEN")## 情况一Between 的时候
@Schema(description = "${column.columnComment}"#if ("$!column.example" != ""), example = "${column.example}"#end)
/**
* ${column.columnComment}"#if ("$!column.example" != "
*/, example = "${column.example}"#end)
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private ${column.javaType}[] ${column.javaField};
#else##情况二,非 Between 的时间

View File

@@ -1,6 +1,6 @@
package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
## 处理 BigDecimal 字段的引入
@@ -28,7 +28,9 @@ import ${DictConvertClassName};
#end
#end
@Schema(description = "${sceneEnum.name} - ${table.classComment} Response VO")
/**
* ${sceneEnum.name} - ${table.classComment} Response VO
*/
@Data
@ExcelIgnoreUnannotated
public class ${sceneEnum.prefixClass}${table.className}RespVO {
@@ -37,7 +39,9 @@ public class ${sceneEnum.prefixClass}${table.className}RespVO {
#foreach ($column in $columns)
#if (${column.listOperationResult})
## 1. 处理 Swagger 注解
@Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end)
/**
* ${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != "
*/, example = "${column.example}"#end)
## 2. 处理 Excel 导出
#if ("$!column.dictType" != "")##处理枚举值
@ExcelProperty(value = "${column.columnComment}", converter = DictConvert.class)

View File

@@ -1,6 +1,6 @@
package ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.*;
import java.util.*;
import ${jakartaPackage}.validation.constraints.*;
@@ -24,7 +24,9 @@ import java.time.LocalDateTime;
import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
#end
@Schema(description = "${sceneEnum.name} - ${table.classComment}新增/修改 Request VO")
/**
* ${sceneEnum.name} - ${table.classComment}新增/修改 Request VO
*/
@Data
public class ${sceneEnum.prefixClass}${table.className}SaveReqVO {
@@ -32,7 +34,9 @@ public class ${sceneEnum.prefixClass}${table.className}SaveReqVO {
#foreach ($column in $columns)
#if (${column.createOperation} || ${column.updateOperation})
## 1. 处理 Swagger 注解
@Schema(description = "${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != ""), example = "${column.example}"#end)
/**
* ${column.columnComment}"#if (!${column.nullable}), requiredMode = Schema.RequiredMode.REQUIRED#end#if ("$!column.example" != "
*/, example = "${column.example}"#end)
## 2. 处理 Validator 参数校验
#if (!${column.nullable} && !${column.primaryKey})
#if (${column.javaType} == 'String')
@@ -51,11 +55,15 @@ public class ${sceneEnum.prefixClass}${table.className}SaveReqVO {
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#if ( $subTable.subJoinMany)
@Schema(description = "${subTable.classComment}列表")
/**
* ${subTable.classComment}列表
*/
private List<${subTable.className}DO> ${subClassNameVars.get($index)}s;
#else
@Schema(description = "${subTable.classComment}")
/**
* ${subTable.classComment}
*/
private ${subTable.className}DO ${subClassNameVars.get($index)};
#end

View File

@@ -0,0 +1,52 @@
package ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName};
import lombok.*;
import java.util.*;
#foreach ($column in $columns)
#if (${column.javaType} == "BigDecimal")
import java.math.BigDecimal;
#end
#if (${column.javaType} == "LocalDateTime")
import java.time.LocalDateTime;
#end
#end
import com.baomidou.mybatisplus.annotation.*;
import ${BaseDOClassName};
/**
* ${table.classComment} DO
*
* @author ${table.author}
*/
@TableName("${table.tableName.toLowerCase()}")
@KeySequence("${table.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ${table.className}DO extends BaseDO {
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
public static final Long ${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT = 0L;
#end
#foreach ($column in $columns)
#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段
/**
* ${column.columnComment}
#if ("$!column.dictType" != "")##处理枚举值
*
* 枚举 {@link TODO ${column.dictType} 对应的类}
#end
*/
#if (${column.primaryKey})##处理主键
@TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end
#end
private ${column.javaType} ${column.javaField};
#end
#end
}

View File

@@ -0,0 +1,49 @@
#set ($subTable = $subTables.get($subIndex))##当前表
#set ($subColumns = $subColumnsList.get($subIndex))##当前字段数组
package ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName};
import lombok.*;
import java.util.*;
#foreach ($column in $subColumns)
#if (${column.javaType} == "BigDecimal")
import java.math.BigDecimal;
#end
#if (${column.javaType} == "LocalDateTime")
import java.time.LocalDateTime;
#end
#end
import com.baomidou.mybatisplus.annotation.*;
import ${BaseDOClassName};
/**
* ${subTable.classComment} DO
*
* @author ${subTable.author}
*/
@TableName("${subTable.tableName.toLowerCase()}")
@KeySequence("${subTable.tableName.toLowerCase()}_seq") // 用于 Oracle、PostgreSQL、Kingbase、DB2、H2 数据库的主键自增。如果是 MySQL 等数据库,可不写。
@Data
@EqualsAndHashCode(callSuper = true)
@ToString(callSuper = true)
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class ${subTable.className}DO extends BaseDO {
#foreach ($column in $subColumns)
#if (!${baseDOFields.contains(${column.javaField})})##排除 BaseDO 的字段
/**
* ${column.columnComment}
#if ("$!column.dictType" != "")##处理枚举值
*
* 枚举 {@link TODO ${column.dictType} 对应的类}
#end
*/
#if (${column.primaryKey})##处理主键
@TableId#if (${column.javaType} == 'String')(type = IdType.INPUT)#end
#end
private ${column.javaType} ${column.javaField};
#end
#end
}

View File

@@ -0,0 +1,82 @@
package ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName};
import java.util.*;
import ${PageResultClassName};
import ${QueryWrapperClassName};
import ${BaseMapperClassName};
import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
import org.apache.ibatis.annotations.Mapper;
import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
## 字段模板
#macro(listCondition)
#foreach ($column in $columns)
#if (${column.listOperation})
#set ($JavaField = $column.javaField.substring(0,1).toUpperCase() + ${column.javaField.substring(1)})##首字母大写
#if (${column.listOperationCondition} == "=")##情况一,= 的时候
.eqIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == "!=")##情况二,!= 的时候
.neIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == ">")##情况三,> 的时候
.gtIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == ">=")##情况四,>= 的时候
.geIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == "<")##情况五,< 的时候
.ltIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == "<=")##情况五,<= 的时候
.leIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == "LIKE")##情况七Like 的时候
.likeIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#if (${column.listOperationCondition} == "BETWEEN")##情况八Between 的时候
.betweenIfPresent(${table.className}DO::get${JavaField}, reqVO.get${JavaField}())
#end
#end
#end
#end
/**
* ${table.classComment} Mapper
*
* @author ${table.author}
*/
@Mapper
public interface ${table.className}Mapper extends BaseMapperX<${table.className}DO> {
## 特殊:树表专属逻辑(树不需要分页接口)
#if ( $table.templateType != 2 )
default PageResult<${table.className}DO> selectPage(${sceneEnum.prefixClass}${table.className}PageReqVO reqVO) {
return selectPage(reqVO, new LambdaQueryWrapperX<${table.className}DO>()
#listCondition()
.orderByDesc(${table.className}DO::getId));## 大多数情况下id 倒序
}
#else
default List<${table.className}DO> selectList(${sceneEnum.prefixClass}${table.className}ListReqVO reqVO) {
return selectList(new LambdaQueryWrapperX<${table.className}DO>()
#listCondition()
.orderByDesc(${table.className}DO::getId));## 大多数情况下id 倒序
}
#end
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
default ${table.className}DO selectBy${TreeParentJavaField}And${TreeNameJavaField}(Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) {
return selectOne(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField}, ${table.className}DO::get${TreeNameJavaField}, ${treeNameColumn.javaField});
}
default Long selectCountBy${TreeParentJavaField}(${treeParentColumn.javaType} ${treeParentColumn.javaField}) {
return selectCount(${table.className}DO::get${TreeParentJavaField}, ${treeParentColumn.javaField});
}
#end
}

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper">
<!--
一般情况下,尽可能使用 Mapper 进行 CRUD 增删改查即可。
无法满足的场景,例如说多表关联查询,才使用 XML 编写 SQL。
代码生成器暂时只生成 Mapper XML 文件本身,更多推荐 MybatisX 快速开发插件来生成查询。
文档可见https://www.iocoder.cn/MyBatis/x-plugins/
-->
</mapper>

View File

@@ -0,0 +1,57 @@
#set ($subTable = $subTables.get($subIndex))##当前表
#set ($subColumns = $subJoinColumnsList.get($subIndex))##当前字段数组
#set ($subJoinColumn = $subJoinColumns.get($subIndex))##当前 join 字段
#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
package ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName};
import java.util.*;
import ${PageResultClassName};
import ${PageParamClassName};
import ${QueryWrapperClassName};
import ${BaseMapperClassName};
import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
import org.apache.ibatis.annotations.Mapper;
/**
* ${subTable.classComment} Mapper
*
* @author ${subTable.author}
*/
@Mapper
public interface ${subTable.className}Mapper extends BaseMapperX<${subTable.className}DO> {
## 情况一MASTER_ERP 时,需要分查询页子表
#if ( $table.templateType == 11 )
default PageResult<${subTable.className}DO> selectPage(PageParam reqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return selectPage(reqVO, new LambdaQueryWrapperX<${subTable.className}DO>()
.eq(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField})
.orderByDesc(${subTable.className}DO::getId));## 大多数情况下id 倒序
}
## 主表与子表是一对一时
#if (!$subTable.subJoinMany)
default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
}
#end
## 情况二:非 MASTER_ERP 时,需要列表查询子表
#else
#if ( $subTable.subJoinMany)
default List<${subTable.className}DO> selectListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return selectList(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
}
#else
default ${subTable.className}DO selectBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return selectOne(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
}
#end
#end
default int deleteBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return delete(${subTable.className}DO::get${SubJoinColumnName}, ${subJoinColumn.javaField});
}
}

View File

@@ -0,0 +1,22 @@
// TODO 待办:请将下面的错误码复制到 yudao-module-${table.moduleName}-api 模块的 ErrorCodeConstants 类中。注意请给“TODO 补充编号”设置一个错误码编号!!!
// ========== ${table.classComment} TODO 补充编号 ==========
ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${table.classComment}不存在");
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN = new ErrorCode(TODO 补充编号, "存在存在子${table.classComment},无法删除");
ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS = new ErrorCode(TODO 补充编号,"父级${table.classComment}不存在");
ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR = new ErrorCode(TODO 补充编号, "不能设置自己为父${table.classComment}");
ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE = new ErrorCode(TODO 补充编号, "已经存在该${treeNameColumn.columnComment}的${table.classComment}");
ErrorCode ${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD = new ErrorCode(TODO 补充编号, "不能设置自己的子${table.className}为父${table.className}");
#end
## 特殊:主子表专属逻辑
#if ( $table.templateType == 11 )## 特殊ERP 情况
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index))
ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}不存在");
#if ( !$subTable.subJoinMany )
ErrorCode ${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS = new ErrorCode(TODO 补充编号, "${subTable.classComment}已存在");
#end
#end
#end

View File

@@ -0,0 +1,147 @@
package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
import java.util.*;
import ${jakartaPackage}.validation.*;
import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
#end
import ${PageResultClassName};
import ${PageParamClassName};
/**
* ${table.classComment} Service 接口
*
* @author ${table.author}
*/
public interface ${table.className}Service {
/**
* 创建${table.classComment}
*
* @param createReqVO 创建信息
* @return 编号
*/
${primaryColumn.javaType} create${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO);
/**
* 更新${table.classComment}
*
* @param updateReqVO 更新信息
*/
void update${simpleClassName}(@Valid ${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO);
/**
* 删除${table.classComment}
*
* @param id 编号
*/
void delete${simpleClassName}(${primaryColumn.javaType} id);
/**
* 获得${table.classComment}
*
* @param id 编号
* @return ${table.classComment}
*/
${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id);
## 特殊:树表专属逻辑(树不需要分页接口)
#if ( $table.templateType != 2 )
/**
* 获得${table.classComment}分页
*
* @param pageReqVO 分页查询
* @return ${table.classComment}分页
*/
PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO);
#else
/**
* 获得${table.classComment}列表
*
* @param listReqVO 查询条件
* @return ${table.classComment}列表
*/
List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO);
#end
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#set ($subSimpleClassName = $subSimpleClassNames.get($index))
#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
#set ($subClassNameVar = $subClassNameVars.get($index))
// ==================== 子表($subTable.classComment ====================
## 情况一MASTER_ERP 时,需要分查询页子表
#if ( $table.templateType == 11 )
/**
* 获得${subTable.classComment}分页
*
* @param pageReqVO 分页查询
* @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment}
* @return ${subTable.classComment}分页
*/
PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField});
## 情况二:非 MASTER_ERP 时,需要列表查询子表
#else
#if ( $subTable.subJoinMany )
/**
* 获得${subTable.classComment}列表
*
* @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment}
* @return ${subTable.classComment}列表
*/
List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField});
#else
/**
* 获得${subTable.classComment}
*
* @param ${subJoinColumn.javaField} ${subJoinColumn.columnComment}
* @return ${subTable.classComment}
*/
${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField});
#end
#end
## 特殊MASTER_ERP 时,支持单个的新增、修改、删除操作
#if ( $table.templateType == 11 )
/**
* 创建${subTable.classComment}
*
* @param ${subClassNameVar} 创建信息
* @return 编号
*/
${subPrimaryColumn.javaType} create${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar});
/**
* 更新${subTable.classComment}
*
* @param ${subClassNameVar} 更新信息
*/
void update${subSimpleClassName}(@Valid ${subTable.className}DO ${subClassNameVar});
/**
* 删除${subTable.classComment}
*
* @param id 编号
*/
void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id);
/**
* 获得${subTable.classComment}
*
* @param id 编号
* @return ${subTable.classComment}
*/
${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id);
#end
#end
}

View File

@@ -0,0 +1,351 @@
package ${basePackage}.module.${table.moduleName}.service.${table.businessName};
import org.springframework.stereotype.Service;
import ${jakartaPackage}.annotation.Resource;
import org.springframework.validation.annotation.Validated;
import org.springframework.transaction.annotation.Transactional;
import java.util.*;
import ${basePackage}.module.${table.moduleName}.controller.${sceneEnum.basePackage}.${table.businessName}.vo.*;
import ${basePackage}.module.${table.moduleName}.dal.dataobject.${table.businessName}.${table.className}DO;
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
import ${basePackage}.module.${subTable.moduleName}.dal.dataobject.${subTable.businessName}.${subTable.className}DO;
#end
import ${PageResultClassName};
import ${PageParamClassName};
import ${BeanUtils};
import ${basePackage}.module.${table.moduleName}.dal.mysql.${table.businessName}.${table.className}Mapper;
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
import ${basePackage}.module.${subTable.moduleName}.dal.mysql.${subTable.businessName}.${subTable.className}Mapper;
#end
import static ${ServiceExceptionUtilClassName}.exception;
import static ${basePackage}.module.${table.moduleName}.enums.ErrorCodeConstants.*;
/**
* ${table.classComment} Service 实现类
*
* @author ${table.author}
*/
@Service
@Validated
public class ${table.className}ServiceImpl implements ${table.className}Service {
@Resource
private ${table.className}Mapper ${classNameVar}Mapper;
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
@Resource
private ${subTable.className}Mapper ${subClassNameVars.get($index)}Mapper;
#end
@Override
## 特殊:主子表专属逻辑(非 ERP 模式)
#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
@Transactional(rollbackFor = Exception.class)
#end
public ${primaryColumn.javaType} create${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO createReqVO) {
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
// 校验${treeParentColumn.columnComment}的有效性
validateParent${simpleClassName}(null, createReqVO.get${TreeParentJavaField}());
// 校验${treeNameColumn.columnComment}的唯一性
validate${simpleClassName}${TreeNameJavaField}Unique(null, createReqVO.get${TreeParentJavaField}(), createReqVO.get${TreeNameJavaField}());
#end
// 插入
${table.className}DO ${classNameVar} = BeanUtils.toBean(createReqVO, ${table.className}DO.class);
${classNameVar}Mapper.insert(${classNameVar});
## 特殊:主子表专属逻辑(非 ERP 模式)
#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
// 插入子表
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#set ($subSimpleClassName = $subSimpleClassNames.get($index))
#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
#if ( $subTable.subJoinMany)
create${subSimpleClassName}List(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}s());
#else
create${subSimpleClassName}(${classNameVar}.getId(), createReqVO.get${subSimpleClassNames.get($index)}());
#end
#end
#end
// 返回
return ${classNameVar}.getId();
}
@Override
## 特殊:主子表专属逻辑(非 ERP 模式)
#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11 )
@Transactional(rollbackFor = Exception.class)
#end
public void update${simpleClassName}(${sceneEnum.prefixClass}${table.className}SaveReqVO updateReqVO) {
// 校验存在
validate${simpleClassName}Exists(updateReqVO.getId());
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
// 校验${treeParentColumn.columnComment}的有效性
validateParent${simpleClassName}(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}());
// 校验${treeNameColumn.columnComment}的唯一性
validate${simpleClassName}${TreeNameJavaField}Unique(updateReqVO.getId(), updateReqVO.get${TreeParentJavaField}(), updateReqVO.get${TreeNameJavaField}());
#end
// 更新
${table.className}DO updateObj = BeanUtils.toBean(updateReqVO, ${table.className}DO.class);
${classNameVar}Mapper.updateById(updateObj);
## 特殊:主子表专属逻辑(非 ERP 模式)
#if ( $subTables && $subTables.size() > 0 && $table.templateType != 11)
// 更新子表
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#set ($subSimpleClassName = $subSimpleClassNames.get($index))
#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
#if ( $subTable.subJoinMany)
update${subSimpleClassName}List(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}s());
#else
update${subSimpleClassName}(updateReqVO.getId(), updateReqVO.get${subSimpleClassNames.get($index)}());
#end
#end
#end
}
@Override
## 特殊:主子表专属逻辑
#if ( $subTables && $subTables.size() > 0)
@Transactional(rollbackFor = Exception.class)
#end
public void delete${simpleClassName}(${primaryColumn.javaType} id) {
// 校验存在
validate${simpleClassName}Exists(id);
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
#set ($ParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
// 校验是否有子${table.classComment}
if (${classNameVar}Mapper.selectCountBy${ParentJavaField}(id) > 0) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_EXITS_CHILDREN);
}
#end
// 删除
${classNameVar}Mapper.deleteById(id);
## 特殊:主子表专属逻辑
#if ( $subTables && $subTables.size() > 0)
// 删除子表
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#set ($subSimpleClassName = $subSimpleClassNames.get($index))
#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
delete${subSimpleClassName}By${SubJoinColumnName}(id);
#end
#end
}
private void validate${simpleClassName}Exists(${primaryColumn.javaType} id) {
if (${classNameVar}Mapper.selectById(id) == null) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_NOT_EXISTS);
}
}
## 特殊:树表专属逻辑
#if ( $table.templateType == 2 )
#set ($TreeParentJavaField = $treeParentColumn.javaField.substring(0,1).toUpperCase() + ${treeParentColumn.javaField.substring(1)})##首字母大写
#set ($TreeNameJavaField = $treeNameColumn.javaField.substring(0,1).toUpperCase() + ${treeNameColumn.javaField.substring(1)})##首字母大写
private void validateParent${simpleClassName}(Long id, Long ${treeParentColumn.javaField}) {
if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) {
return;
}
// 1. 不能设置自己为父${table.classComment}
if (Objects.equals(id, ${treeParentColumn.javaField})) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_ERROR);
}
// 2. 父${table.classComment}不存在
${simpleClassName}DO parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField});
if (parent${simpleClassName} == null) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_NOT_EXITS);
}
// 3. 递归校验父${table.classComment},如果父${table.classComment}是自己的子${table.classComment},则报错,避免形成环路
if (id == null) { // id 为空,说明新增,不需要考虑环路
return;
}
for (int i = 0; i < Short.MAX_VALUE; i++) {
// 3.1 校验环路
${treeParentColumn.javaField} = parent${simpleClassName}.get${TreeParentJavaField}();
if (Objects.equals(id, ${treeParentColumn.javaField})) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_PARENT_IS_CHILD);
}
// 3.2 继续递归下一级父${table.classComment}
if (${treeParentColumn.javaField} == null || ${simpleClassName}DO.${treeParentColumn_javaField_underlineCase.toUpperCase()}_ROOT.equals(${treeParentColumn.javaField})) {
break;
}
parent${simpleClassName} = ${classNameVar}Mapper.selectById(${treeParentColumn.javaField});
if (parent${simpleClassName} == null) {
break;
}
}
}
private void validate${simpleClassName}${TreeNameJavaField}Unique(Long id, Long ${treeParentColumn.javaField}, String ${treeNameColumn.javaField}) {
${simpleClassName}DO ${classNameVar} = ${classNameVar}Mapper.selectBy${TreeParentJavaField}And${TreeNameJavaField}(${treeParentColumn.javaField}, ${treeNameColumn.javaField});
if (${classNameVar} == null) {
return;
}
// 如果 id 为空,说明不用比较是否为相同 id 的${table.classComment}
if (id == null) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE);
}
if (!Objects.equals(${classNameVar}.getId(), id)) {
throw exception(${simpleClassName_underlineCase.toUpperCase()}_${treeNameColumn_javaField_underlineCase.toUpperCase()}_DUPLICATE);
}
}
#end
@Override
public ${table.className}DO get${simpleClassName}(${primaryColumn.javaType} id) {
return ${classNameVar}Mapper.selectById(id);
}
## 特殊:树表专属逻辑(树不需要分页接口)
#if ( $table.templateType != 2 )
@Override
public PageResult<${table.className}DO> get${simpleClassName}Page(${sceneEnum.prefixClass}${table.className}PageReqVO pageReqVO) {
return ${classNameVar}Mapper.selectPage(pageReqVO);
}
#else
@Override
public List<${table.className}DO> get${simpleClassName}List(${sceneEnum.prefixClass}${table.className}ListReqVO listReqVO) {
return ${classNameVar}Mapper.selectList(listReqVO);
}
#end
## 特殊:主子表专属逻辑
#foreach ($subTable in $subTables)
#set ($index = $foreach.count - 1)
#set ($subSimpleClassName = $subSimpleClassNames.get($index))
#set ($simpleClassNameUnderlineCase = $simpleClassNameUnderlineCases.get($index))
#set ($subPrimaryColumn = $subPrimaryColumns.get($index))##当前 primary 字段
#set ($subJoinColumn = $subJoinColumns.get($index))##当前 join 字段
#set ($SubJoinColumnName = $subJoinColumn.javaField.substring(0,1).toUpperCase() + ${subJoinColumn.javaField.substring(1)})##首字母大写
#set ($subClassNameVar = $subClassNameVars.get($index))
// ==================== 子表($subTable.classComment ====================
## 情况一MASTER_ERP 时,需要分查询页子表
#if ( $table.templateType == 11 )
@Override
public PageResult<${subTable.className}DO> get${subSimpleClassName}Page(PageParam pageReqVO, ${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return ${subClassNameVars.get($index)}Mapper.selectPage(pageReqVO, ${subJoinColumn.javaField});
}
## 情况二:非 MASTER_ERP 时,需要列表查询子表
#else
#if ( $subTable.subJoinMany )
@Override
public List<${subTable.className}DO> get${subSimpleClassName}ListBy${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return ${subClassNameVars.get($index)}Mapper.selectListBy${SubJoinColumnName}(${subJoinColumn.javaField});
}
#else
@Override
public ${subTable.className}DO get${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaType} ${subJoinColumn.javaField}) {
return ${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subJoinColumn.javaField});
}
#end
#end
## 情况一MASTER_ERP 时,支持单个的新增、修改、删除操作
#if ( $table.templateType == 11 )
@Override
public ${subPrimaryColumn.javaType} create${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) {
## 特殊:一对一时,需要保证只有一条,不能重复插入
#if ( !$subTable.subJoinMany)
// 校验是否已经存在
if (${subClassNameVars.get($index)}Mapper.selectBy${SubJoinColumnName}(${subClassNameVar}.get${SubJoinColumnName}()) != null) {
throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_EXISTS);
}
// 插入
#end
${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar});
return ${subClassNameVar}.getId();
}
@Override
public void update${subSimpleClassName}(${subTable.className}DO ${subClassNameVar}) {
// 校验存在
validate${subSimpleClassName}Exists(${subClassNameVar}.getId());
// 更新
${subClassNameVar}.setUpdater(null).setUpdateTime(null); // 解决更新情况下updateTime 不更新
${subClassNameVars.get($index)}Mapper.updateById(${subClassNameVar});
}
@Override
public void delete${subSimpleClassName}(${subPrimaryColumn.javaType} id) {
// 校验存在
validate${subSimpleClassName}Exists(id);
// 删除
${subClassNameVars.get($index)}Mapper.deleteById(id);
}
@Override
public ${subTable.className}DO get${subSimpleClassName}(${subPrimaryColumn.javaType} id) {
return ${subClassNameVars.get($index)}Mapper.selectById(id);
}
private void validate${subSimpleClassName}Exists(${subPrimaryColumn.javaType} id) {
if (${subClassNameVar}Mapper.selectById(id) == null) {
throw exception(${simpleClassNameUnderlineCase.toUpperCase()}_NOT_EXISTS);
}
}
## 情况二:非 MASTER_ERP 时,支持批量的新增、修改操作
#else
#if ( $subTable.subJoinMany)
private void create${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
list.forEach(o -> o.set$SubJoinColumnName(${subJoinColumn.javaField}));
${subClassNameVars.get($index)}Mapper.insertBatch(list);
}
private void update${subSimpleClassName}List(${primaryColumn.javaType} ${subJoinColumn.javaField}, List<${subTable.className}DO> list) {
delete${subSimpleClassName}By${SubJoinColumnName}(${subJoinColumn.javaField});
list.forEach(o -> o.setId(null).setUpdater(null).setUpdateTime(null)); // 解决更新情况下1id 冲突2updateTime 不更新
create${subSimpleClassName}List(${subJoinColumn.javaField}, list);
}
#else
private void create${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) {
if (${subClassNameVar} == null) {
return;
}
${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField});
${subClassNameVars.get($index)}Mapper.insert(${subClassNameVar});
}
private void update${subSimpleClassName}(${primaryColumn.javaType} ${subJoinColumn.javaField}, ${subTable.className}DO ${subClassNameVar}) {
if (${subClassNameVar} == null) {
return;
}
${subClassNameVar}.set$SubJoinColumnName(${subJoinColumn.javaField});
${subClassNameVar}.setUpdater(null).setUpdateTime(null); // 解决更新情况下updateTime 不更新
${subClassNameVars.get($index)}Mapper.insertOrUpdate(${subClassNameVar});
}
#end
#end
private void delete${subSimpleClassName}By${SubJoinColumnName}(${primaryColumn.javaType} ${subJoinColumn.javaField}) {
${subClassNameVars.get($index)}Mapper.deleteBy${SubJoinColumnName}(${subJoinColumn.javaField});
}
#end
}

View File

@@ -4,7 +4,7 @@ package com.tashow.cloud.pay.controller.admin.transfer.vo;
import com.tashow.cloud.common.util.validation.ValidationUtils;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayTypeEnum;
import com.tashow.cloud.sdk.payment.enums.transfer.PayTransferTypeEnum;
import jakarta.validation.Validator;
import jakarta.validation.constraints.*;
@@ -83,7 +83,7 @@ public class PayTransferCreateReqVO {
PayTransferTypeEnum transferType = typeOf(type);
switch (transferType) {
case ALIPAY_BALANCE: {
return PayChannelEnum.isAlipay(channelCode);
return PayTypeEnum.isAlipay(channelCode);
}
case WX_BALANCE:
case BANK_CARD:

View File

@@ -6,7 +6,7 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.tashow.cloud.common.enums.CommonStatusEnum;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.sdk.payment.client.PayClientConfig;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayTypeEnum;
import com.tashow.cloud.tenant.core.db.TenantBaseDO;
import lombok.*;
@@ -33,7 +33,7 @@ public class PayChannelDO extends TenantBaseDO {
/**
* 渠道编码
*
* 枚举 {@link PayChannelEnum}
* 枚举 {@link PayTypeEnum}
*/
private String code;
/**

View File

@@ -5,7 +5,7 @@ import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.channel.PayChannelDO;
import com.tashow.cloud.payapi.enums.order.PayOrderStatusEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayTypeEnum;
import lombok.*;
import java.time.LocalDateTime;
@@ -42,7 +42,7 @@ public class PayOrderDO extends BaseDO {
/**
* 渠道编码
*
* 枚举 {@link PayChannelEnum}
* 枚举 {@link PayTypeEnum}
*/
private String channelCode;

View File

@@ -8,7 +8,7 @@ import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.channel.PayChannelDO;
import com.tashow.cloud.pay.dal.dataobject.order.PayOrderDO;
import com.tashow.cloud.payapi.enums.refund.PayRefundStatusEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayTypeEnum;
import lombok.*;
import java.time.LocalDateTime;
@@ -60,7 +60,7 @@ public class PayRefundDO extends BaseDO {
/**
* 渠道编码
*
* 枚举 {@link PayChannelEnum}
* 枚举 {@link PayTypeEnum}
*/
private String channelCode;
/**

View File

@@ -8,7 +8,7 @@ import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import com.tashow.cloud.pay.dal.dataobject.app.PayAppDO;
import com.tashow.cloud.pay.dal.dataobject.channel.PayChannelDO;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayTypeEnum;
import com.tashow.cloud.sdk.payment.enums.transfer.PayTransferStatusRespEnum;
import lombok.Data;
@@ -55,7 +55,7 @@ public class PayTransferDO extends BaseDO {
/**
* 转账渠道编码
*
* 枚举 {@link PayChannelEnum}
* 枚举 {@link PayTypeEnum}
*/
private String channelCode;

View File

@@ -13,7 +13,7 @@ import com.tashow.cloud.sdk.payment.client.PayClient;
import com.tashow.cloud.sdk.payment.client.PayClientConfig;
import com.tashow.cloud.sdk.payment.client.PayClientFactory;
import com.tashow.cloud.sdk.payment.client.impl.weixin.WxPubPayClient;
import com.tashow.cloud.sdk.payment.enums.channel.PayChannelEnum;
import com.tashow.cloud.sdk.payment.enums.channel.PayTypeEnum;
import jakarta.annotation.PostConstruct;
import jakarta.annotation.Resource;
import jakarta.validation.Validator;
@@ -52,7 +52,7 @@ public class PayChannelServiceImpl implements PayChannelService {
*/
@PostConstruct
public void init() {
payClientFactory.registerPayClientClass(PayChannelEnum.WX_PUB, WxPubPayClient.class);
payClientFactory.registerPayClientClass(PayTypeEnum.WX_PUB, WxPubPayClient.class);
}
@Override
@@ -90,7 +90,7 @@ public class PayChannelServiceImpl implements PayChannelService {
*/
private PayClientConfig parseConfig(String code, String configStr) {
// 解析配置
Class<? extends PayClientConfig> payClass = PayChannelEnum.getByCode(code).getConfigClass();
Class<? extends PayClientConfig> payClass = PayTypeEnum.getByCode(code).getConfigClass();
if (ObjectUtil.isNull(payClass)) {
throw exception(CHANNEL_NOT_FOUND);
}

View File

@@ -1,14 +0,0 @@
### 获得交易订单分页 => 成功
GET {{baseUrl}}/trade/order/page?pageNo=1&pageSize=10
Authorization: Bearer {{token}}
tenant-id: {{adminTenantId}}
### 获得交易订单分页 => 成功
GET {{baseUrl}}/trade/order/get-detail?id=21
Authorization: Bearer {{token}}
tenant-id: {{adminTenantId}}
### 获得交易订单的物流轨迹 => 成功
GET {{baseUrl}}/trade/order/get-express-track-list?id=21
Authorization: Bearer {{token}}
tenant-id: {{adminTenantId}}

View File

@@ -5,7 +5,7 @@ import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.memberapi.api.user.MemberUserApi;
import com.tashow.cloud.trade.controller.admin.order.vo.TradeOrderDetailRespVO;
import com.tashow.cloud.trade.controller.admin.order.vo.TradeOrderPageItemRespVO;
import com.tashow.cloud.trade.controller.admin.order.vo.TradeOrderPageRespVO;
import com.tashow.cloud.trade.controller.admin.order.vo.TradeOrderPageReqVO;
import com.tashow.cloud.trade.convert.order.TradeOrderConvert;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderDO;
@@ -16,6 +16,7 @@ import com.tashow.cloud.trade.service.order.TradeOrderQueryService;
import com.tashow.cloud.trade.service.order.TradeOrderUpdateService;
import jakarta.annotation.Resource;
import jakarta.annotation.security.PermitAll;
import jakarta.validation.Valid;
import lombok.extern.slf4j.Slf4j;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.GetMapping;
@@ -56,7 +57,7 @@ public class TradeOrderController {
@GetMapping("/page")
@PermitAll
// @PreAuthorize("@ss.hasPermission('trade:order:query')")
public CommonResult<PageResult<TradeOrderPageItemRespVO>> getOrderPage(@Validated TradeOrderPageReqVO reqVO) {
public CommonResult<PageResult<TradeOrderPageRespVO>> getOrderPage(@Valid TradeOrderPageReqVO reqVO) {
// 查询订单
PageResult<TradeOrderDO> pageResult = tradeOrderQueryService.getOrderPage(reqVO);
if (CollUtil.isEmpty(pageResult.getList())) {

View File

@@ -1,151 +1,71 @@
package com.tashow.cloud.trade.controller.admin.order.vo;
// 移除Swagger相关导入
import lombok.Data;
import java.time.LocalDateTime;
/**
* 交易订单 Base VO提供给添加、修改、详细的子 VO 使用
* 如果子 VO 存在差异的字段,请不要添加到这里,影响 Swagger 文档生成
*/
@Data
public class TradeOrderBaseVO {
// ========== 订单基本信息 ==========
// 订单编号 - 必填示例1024
// 订单编号
private Long id;
// 订单流水号 - 必填示例1146347329394184195
// 订单流水号
private String orderNum;
// 下单时间 - 必填
// 下单时间
private LocalDateTime createTime;
// 订单类型 - 必填示例1
private Integer type;
// 订单类
private String orderCategoryName;
// 订单来源 - 必填示例1
private Integer terminal;
// 订单来源
private Integer orderTerminal;
// 用户编号 - 必填示例2048
// 用户编号
private Long userId;
// 用户姓名
private String userName;
//用户昵称
private String userNickName;
// 用户头像
private String userAvatar;
//用户手机号
private String userMobile;
// 订单状态
private Integer orderStatus;
// 用户 IP - 必填示例127.0.0.1
private String userIp;
//商品图片
private String picUrl;
//商品名称
private String spuName;
//商品规格
private String skuName;
// 购买的商品数量
private Integer count;
// 单价
private Integer price;
//到手价
private Integer handedPrice;
//实付金额
private Integer payPrice;
// 单位
private String unit;
//预约时间
private String orderTime;
//服务地址
private String serveAddress;
// 用户备注 - 必填,示例:你猜
private String userRemark;
// 订单状态 - 必填示例1
private Integer status;
// 购买的商品数量 - 必填示例10
private Integer productCount;
// 订单完成时间
private LocalDateTime finishTime;
// 订单取消时间
private LocalDateTime cancelTime;
// 取消类型示例10
private Integer cancelType;
// 商家备注,示例:你猜一下
private String remark;
// ========== 价格 + 支付基本信息 ==========
// 支付订单编号 - 必填示例1024
private Long payOrderId;
// 是否已支付 - 必填示例true
private Boolean payStatus;
// 付款时间
private LocalDateTime payTime;
// 支付渠道 - 必填示例wx_lite
private String payChannelCode;
// 商品原价(总) - 必填示例1000
private Integer totalPrice;
// 订单优惠(总) - 必填示例100
private Integer discountPrice;
// 运费金额 - 必填示例100
private Integer deliveryPrice;
// 订单调价(总) - 必填示例100
private Integer adjustPrice;
// 应付金额(总) - 必填示例1000
private Integer payPrice;
// ========== 收件 + 物流基本信息 ==========
// 配送方式示例10
private Integer deliveryType;
// 自提门店示例10
private Long pickUpStoreId;
// 自提核销码示例10
private Long pickUpVerifyCode;
// 配送模板编号示例1024
private Long deliveryTemplateId;
// 发货物流公司编号示例1024
private Long logisticsId;
// 发货物流单号示例1024
private String logisticsNo;
// 发货时间
private LocalDateTime deliveryTime;
// 收货时间
private LocalDateTime receiveTime;
// 收件人名称 - 必填,示例:张三
private String receiverName;
// 收件人手机 - 必填示例13800138000
private String receiverMobile;
// 收件人地区编号 - 必填示例110000
private Integer receiverAreaId;
// 收件人详细地址 - 必填,示例:中关村大街 1 号
private String receiverDetailAddress;
// ========== 售后基本信息 ==========
// 售后状态示例1
private Integer afterSaleStatus;
// 退款金额 - 必填示例100
private Integer refundPrice;
// ========== 营销基本信息 ==========
// 优惠劵编号示例1024
private Long couponId;
// 优惠劵减免金额 - 必填示例100
private Integer couponPrice;
// 积分抵扣的金额 - 必填示例100
private Integer pointPrice;
// VIP 减免金额 - 必填示例888
private Integer vipPrice;
// 推广人编号示例1
private Long brokerageUserId;
//支付方式
private String payType;
//财务状态
private String financeStatus;
}

View File

@@ -1,35 +0,0 @@
package com.tashow.cloud.trade.controller.admin.order.vo;
import com.tashow.cloud.trade.controller.admin.base.member.user.MemberUserRespVO;
import com.tashow.cloud.trade.controller.admin.base.product.property.ProductPropertyValueDetailRespVO;
import lombok.Data;
import java.util.List;
// 管理后台 - 交易订单的分页项 Response VO
@Data
public class TradeOrderPageItemRespVO extends TradeOrderBaseVO {
// 收件人地区名字 - 必填,示例:上海 上海市 普陀区
private String receiverAreaName;
// 订单项列表 - 必填
private List<Item> items;
// 用户信息 - 必填
private MemberUserRespVO user;
// 推广人信息
private MemberUserRespVO brokerageUser;
// 管理后台 - 交易订单的分页项的订单项目
@Data
public static class Item extends TradeOrderItemBaseVO {
// 属性列表 - 必填
private List<ProductPropertyValueDetailRespVO> properties;
}
}

View File

@@ -2,16 +2,11 @@ package com.tashow.cloud.trade.controller.admin.order.vo;
// 移除Swagger相关导入
import com.tashow.cloud.common.enums.TerminalEnum;
import com.tashow.cloud.common.pojo.PageParam;
import com.tashow.cloud.common.validation.InEnum;
import com.tashow.cloud.common.validation.Mobile;
import com.tashow.cloud.tradeapi.enums.order.TradeOrderStatusEnum;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;
import java.time.LocalDateTime;
import java.util.List;
import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND;
@@ -20,47 +15,34 @@ import static com.tashow.cloud.common.util.date.DateUtils.FORMAT_YEAR_MONTH_DAY_
@Data
public class TradeOrderPageReqVO extends PageParam {
// 订单号示例88888888
private String orderNum;
// 用户编号示例1024
private Long userId;
// 用户昵称,示例:小王
private String userNickname;
// 用户手机号,示例:小王
@Mobile
private String userMobile;
// 配送方式示例1
private Integer deliveryType;
// 发货物流公司编号示例1
private Long logisticsId;
// 自提门店编号,示例:[1,2]
private List<Long> pickUpStoreIds;
// 自提核销码示例12345678
private String pickUpVerifyCode;
// 订单类型示例1
private Integer type;
// 订单状态示例1
@InEnum(value = TradeOrderStatusEnum.class, message = "订单状态必须是 {value}")
private Integer status;
private Integer orderStatus;
//聚合检索字段商品名称商品id订单号
private String prodSearch;
// 支付渠道示例wx_lite
private String payChannelCode;
//聚合检索字段 买家昵称/手机号
private String userSearch;
//卖家名称
private String merchantName;
// 订单类目id示例1
private Integer orderCategoryId;
// 订单来源示例1
private Integer orderTerminal;
// 财务状态示例1
private Integer financeStatus;
// 售后状态示例1
private Integer afterSaleStatus;
// 预约类型示例1
private Integer subType;
// 创建时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] createTime;
// 创建时间
@DateTimeFormat(pattern = FORMAT_YEAR_MONTH_DAY_HOUR_MINUTE_SECOND)
private LocalDateTime[] subTime;
// 订单来源示例10
@InEnum(value = TerminalEnum.class, message = "订单来源 {value}")
private Integer terminal;
}

View File

@@ -0,0 +1,11 @@
package com.tashow.cloud.trade.controller.admin.order.vo;
import lombok.Data;
// 管理后台 - 交易订单的分页项 Response VO
@Data
public class TradeOrderPageRespVO extends TradeOrderBaseVO {
}

View File

@@ -91,7 +91,7 @@ public interface TradeOrderConvert {
.setAppKey(orderProperties.getPayAppKey()).setUserIp(order.getUserIp());
// 商户相关字段
createReqDTO.setMerchantOrderId(String.valueOf(order.getId()));
String subject = orderItems.get(0).getProdName();
String subject = orderItems.get(0).getSpuName();
subject = StrUtils.maxLength(subject, PayOrderCreateReqDTO.SUBJECT_MAX_LENGTH); // 避免超过 32 位
createReqDTO.setSubject(subject);
createReqDTO.setBody(subject); // TODO 芋艿:临时写死
@@ -100,20 +100,15 @@ public interface TradeOrderConvert {
return createReqDTO;
}
default PageResult<TradeOrderPageItemRespVO> convertPage(PageResult<TradeOrderDO> pageResult,
List<TradeOrderItemDO> orderItems,
Map<Long, MemberUserRespDTO> memberUserMap) {
default PageResult<TradeOrderPageRespVO> convertPage(PageResult<TradeOrderDO> pageResult,
List<TradeOrderItemDO> orderItems,
Map<Long, MemberUserRespDTO> memberUserMap) {
Map<Long, List<TradeOrderItemDO>> orderItemMap = convertMultiMap(orderItems, TradeOrderItemDO::getOrderId);
// 转化 List
List<TradeOrderPageItemRespVO> orderVOs = CollectionUtils.convertList(pageResult.getList(), order -> {
List<TradeOrderPageRespVO> orderVOs = CollectionUtils.convertList(pageResult.getList(), order -> {
List<TradeOrderItemDO> xOrderItems = orderItemMap.get(order.getId());
TradeOrderPageItemRespVO orderVO = convert(order, xOrderItems);
TradeOrderPageRespVO orderVO = convert(order, xOrderItems);
// 处理收货地址
orderVO.setReceiverAreaName(AreaUtils.format(order.getReceiverAreaId()));
// 增加用户信息
orderVO.setUser(convertUser(memberUserMap.get(orderVO.getUserId())));
// 增加推广人信息
orderVO.setBrokerageUser(convertUser(memberUserMap.get(orderVO.getBrokerageUserId())));
return orderVO;
});
return new PageResult<>(orderVOs, pageResult.getTotal());
@@ -121,7 +116,7 @@ public interface TradeOrderConvert {
MemberUserRespVO convertUser(MemberUserRespDTO memberUserRespDTO);
TradeOrderPageItemRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> items);
TradeOrderPageRespVO convert(TradeOrderDO order, List<TradeOrderItemDO> items);
// ProductPropertyValueDetailRespVO convert(ProductPropertyValueDetailRespDTO bean);
@@ -250,7 +245,7 @@ public interface TradeOrderConvert {
ProductSpuRespDTO spu, ProductSkuRespDTO sku) {
BrokerageAddReqBO bo = new BrokerageAddReqBO().setBizId(String.valueOf(item.getId())).setSourceUserId(item.getUserId())
.setBasePrice(item.getPayPrice())
.setTitle(StrUtil.format("{}成功购买{}", user.getNickname(), item.getProdId()))
.setTitle(StrUtil.format("{}成功购买{}", user.getNickname(), item.getSpuId()))
.setFirstFixedPrice(0).setSecondFixedPrice(0);
if (BooleanUtil.isTrue(spu.getSubCommissionType())) {
bo.setFirstFixedPrice(sku.getFirstBrokeragePrice()).setSecondFixedPrice(sku.getSecondBrokeragePrice());
@@ -262,7 +257,7 @@ public interface TradeOrderConvert {
List<TradeOrderRespDTO> convertList04(List<TradeOrderDO> list);
@Mappings({
@Mapping(target = "prodId", source = "item.prodId"),
@Mapping(target = "spuId", source = "item.spuId"),
@Mapping(target = "skuId", source = "item.skuId"),
@Mapping(target = "count", source = "item.count"),
@Mapping(target = "orderId", source = "order.id"),

View File

@@ -20,7 +20,7 @@ public class CombinationRecordCreateReqDTO {
* spu 编号
*/
@NotNull(message = "spu 编号不能为空")
private Long prodId;
private Long spuId;
/**
* sku 编号
*/

View File

@@ -62,6 +62,8 @@ public class TradeOrderDO extends BaseDO {
* 关联 MemberUserDO 的 id 编号
*/
private Long userId;
private String userMobile;
private String userName;
/**
* 用户 IP
*/
@@ -76,10 +78,7 @@ public class TradeOrderDO extends BaseDO {
* 枚举 {@link TradeOrderStatusEnum}
*/
private Integer orderStatus;
/**
* 购买的商品数量
*/
private Integer productCount;
private Integer financeStatus;
/**
* 订单完成时间
*/
@@ -98,6 +97,8 @@ public class TradeOrderDO extends BaseDO {
* 商家备注
*/
private String merchantRemark;
private String merchantName;
private Long orderCategoryId;
/**
* 是否评价
*
@@ -164,12 +165,9 @@ public class TradeOrderDO extends BaseDO {
* 应付金额(总),单位:分
*
* = {@link #totalPrice}
* - {@link #couponPrice}
* - {@link #pointPrice}
* - {@link #discountPrice}
* + {@link #deliveryPrice}
* + {@link #adjustPrice}
* - {@link #vipPrice}
*/
private Integer payPrice;
@@ -246,4 +244,8 @@ public class TradeOrderDO extends BaseDO {
*/
private Integer refundPrice;
private Integer afterSaleStatus;
private Integer subType;
private LocalDateTime subTime;
}

View File

@@ -2,15 +2,15 @@ package com.tashow.cloud.trade.dal.dataobject.order;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableName;
import com.baomidou.mybatisplus.annotation.Version;
import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.tashow.cloud.mybatis.mybatis.core.dataobject.BaseDO;
import com.tashow.cloud.trade.dal.dataobject.aftersale.AfterSaleDO;
import com.tashow.cloud.tradeapi.enums.order.TradeOrderItemAfterSaleStatusEnum;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.List;
/**
@@ -52,19 +52,22 @@ public class TradeOrderItemDO extends BaseDO {
*
* 关联 ProductSkuDO 的 spuId 编号
*/
private Long prodId;
private Long spuId;
/**
* 商品 SPU 名称
*
* 冗余 ProductSkuDO 的 spuName 编号
*/
private String prodName;
private String spuName;
private Integer spuType;
/**
* 商品 SKU 编号
*
* 关联 ProductSkuDO 的 id 编号
*/
private Long skuId;
private String skuName;
/**
* 属性数组JSON 格式
*
@@ -80,15 +83,10 @@ public class TradeOrderItemDO extends BaseDO {
* 购买数量
*/
private Integer count;
/**
* 是否评价
*
* true - 已评价
* false - 未评价
*/
private Boolean commentStatus;
// ========== 价格 + 支付基本信息 ==========
//商品成本
private Integer expensePrice;
/**
* 商品原价(单),单位:分
@@ -117,60 +115,25 @@ public class TradeOrderItemDO extends BaseDO {
* 应付金额(总),单位:分
*
* = {@link #price} * {@link #count}
* - {@link #couponPrice}
* - {@link #pointPrice}
* - {@link #discountPrice}
* + {@link #deliveryPrice}
* + {@link #adjustPrice}
* - {@link #vipPrice}
*/
private Integer payPrice;
//实收金额
private Integer livePrice;
// ========== 营销基本信息 ==========
private Integer orderType;
private LocalDateTime orderTime;
private String serveAddress;
private String serveInfo;
private String serveExtInfo;
private String priceExtInfo;
/**
* 优惠劵减免金额,单位:分
*
* 对应 taobao 的 trade.coupon_fee 字段
*/
private Integer couponPrice;
/**
* 积分抵扣的金额,单位:分
*
* 对应 taobao 的 trade.point_fee 字段
*/
private Integer pointPrice;
/**
* 使用的积分
*
* 目的:用于后续取消或者售后订单时,需要归还赠送
*/
private Integer usePoint;
/**
* 赠送的积分
*
* 目的:用于后续取消或者售后订单时,需要扣减赠送
*/
private Integer givePoint;
/**
* VIP 减免金额,单位:分
*/
private Integer vipPrice;
@Version
private Integer version;
// ========== 售后基本信息 ==========
/**
* 售后单编号
*
* 关联 {@link AfterSaleDO#getId()} 字段
*/
private Long afterSaleId;
/**
* 售后状态
*
* 枚举 {@link TradeOrderItemAfterSaleStatusEnum}
*/
private Integer afterSaleStatus;
/**
* 商品属性

View File

@@ -3,7 +3,6 @@ package com.tashow.cloud.trade.dal.mysql.order;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.map.MapUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
import com.tashow.cloud.mybatis.mybatis.core.query.LambdaQueryWrapperX;
import com.tashow.cloud.trade.dal.dataobject.order.TradeOrderItemDO;
@@ -20,8 +19,8 @@ public interface TradeOrderItemMapper extends BaseMapperX<TradeOrderItemDO> {
default int updateAfterSaleStatus(Long id, Integer oldAfterSaleStatus, Integer newAfterSaleStatus,
Long afterSaleId) {
return update(new TradeOrderItemDO().setAfterSaleStatus(newAfterSaleStatus).setAfterSaleId(afterSaleId),
new LambdaUpdateWrapper<>(new TradeOrderItemDO().setId(id).setAfterSaleStatus(oldAfterSaleStatus)));
return 1;// update(new TradeOrderItemDO().setAfterSaleStatus(newAfterSaleStatus).setAfterSaleId(afterSaleId),
//new LambdaUpdateWrapper<>(new TradeOrderItemDO().setId(id).setAfterSaleStatus(oldAfterSaleStatus)));
}
default List<TradeOrderItemDO> selectListByOrderId(Long orderId) {
@@ -41,7 +40,8 @@ public interface TradeOrderItemMapper extends BaseMapperX<TradeOrderItemDO> {
default List<TradeOrderItemDO> selectListByOrderIdAndCommentStatus(Long orderId, Boolean commentStatus) {
return selectList(new LambdaQueryWrapperX<TradeOrderItemDO>()
.eq(TradeOrderItemDO::getOrderId, orderId)
.eq(TradeOrderItemDO::getCommentStatus, commentStatus));
// .eq(TradeOrderItemDO::getCommentStatus, commentStatus)
);
}
default int selectProductSumByOrderId(@Param("orderIds") Set<Long> orderIds) {

View File

@@ -1,5 +1,6 @@
package com.tashow.cloud.trade.dal.mysql.order;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.tashow.cloud.common.pojo.PageResult;
import com.tashow.cloud.mybatis.mybatis.core.mapper.BaseMapperX;
@@ -30,18 +31,21 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
default PageResult<TradeOrderDO> selectPage(TradeOrderPageReqVO reqVO, Set<Long> userIds) {
return selectPage(reqVO, new LambdaQueryWrapperX<TradeOrderDO>()
.likeIfPresent(TradeOrderDO::getOrderNum, reqVO.getOrderNum())
.eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(TradeOrderDO::getDeliveryType, reqVO.getDeliveryType())
.inIfPresent(TradeOrderDO::getUserId, userIds)
.eqIfPresent(TradeOrderDO::getOrderType, reqVO.getType())
.eqIfPresent(TradeOrderDO::getOrderStatus, reqVO.getStatus())
.eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
.eqIfPresent(TradeOrderDO::getOrderTerminal, reqVO.getTerminal())
.eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
.inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
.likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
.likeIfPresent(TradeOrderDO::getMerchantName, reqVO.getMerchantName())
.eqIfPresent(TradeOrderDO::getOrderCategoryId, reqVO.getOrderCategoryId())
.eqIfPresent(TradeOrderDO::getOrderTerminal, reqVO.getOrderTerminal())
.eqIfPresent(TradeOrderDO::getFinanceStatus, reqVO.getFinanceStatus())
.eqIfPresent(TradeOrderDO::getAfterSaleStatus, reqVO.getAfterSaleStatus())
.eqIfPresent(TradeOrderDO::getSubType, reqVO.getSubType())
.betweenIfPresent(TradeOrderDO::getSubTime, reqVO.getSubTime())
.betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
.and(StrUtil.isNotBlank(reqVO.getProdSearch()),
qw->qw.like(TradeOrderDO::getOrderNum, reqVO.getProdSearch())
.or().like(TradeOrderDO::getOrderStatus, reqVO.getProdSearch())
.or().like(TradeOrderDO::getOrderType, reqVO.getProdSearch()))
.and(StrUtil.isNotBlank(reqVO.getUserSearch()),
qw->qw.eq(TradeOrderDO::getUserMobile, reqVO.getUserSearch())
.or().like(TradeOrderDO::getUserName,reqVO.getProdSearch()))
.orderByDesc(TradeOrderDO::getId));
}
@@ -51,17 +55,7 @@ public interface TradeOrderMapper extends BaseMapperX<TradeOrderDO> {
.selectAs(TradeOrderDO::getRefundStatus, TradeOrderDO::getRefundStatus) // 售后状态
.selectCount(TradeOrderDO::getId, "count") // 售后状态对应的数量
.selectSum(TradeOrderDO::getPayPrice, "price") // 售后状态对应的支付金额
.likeIfPresent(TradeOrderDO::getOrderNum, reqVO.getOrderNum())
.eqIfPresent(TradeOrderDO::getUserId, reqVO.getUserId())
.eqIfPresent(TradeOrderDO::getDeliveryType, reqVO.getDeliveryType())
.inIfPresent(TradeOrderDO::getUserId, userIds)
.eqIfPresent(TradeOrderDO::getOrderType, reqVO.getType())
.eqIfPresent(TradeOrderDO::getOrderStatus, reqVO.getStatus())
.eqIfPresent(TradeOrderDO::getPayChannelCode, reqVO.getPayChannelCode())
.eqIfPresent(TradeOrderDO::getOrderTerminal, reqVO.getTerminal())
.eqIfPresent(TradeOrderDO::getLogisticsId, reqVO.getLogisticsId())
.inIfPresent(TradeOrderDO::getPickUpStoreId, reqVO.getPickUpStoreIds())
.likeIfPresent(TradeOrderDO::getPickUpVerifyCode, reqVO.getPickUpVerifyCode())
.betweenIfPresent(TradeOrderDO::getCreateTime, reqVO.getCreateTime())
.groupBy(TradeOrderDO::getRefundStatus)); // 按售后状态分组
}

View File

@@ -122,7 +122,7 @@ public class AfterSaleServiceImpl implements AfterSaleService {
throw exception(ORDER_ITEM_NOT_FOUND);
}
// 已申请售后,不允许再发起售后申请
if (!TradeOrderItemAfterSaleStatusEnum.isNone(orderItem.getAfterSaleStatus())) {
if (!TradeOrderItemAfterSaleStatusEnum.isNone(1)) {
throw exception(AFTER_SALE_CREATE_FAIL_ORDER_ITEM_APPLIED);
}
// 申请的退款金额,不能超过商品的价格

View File

@@ -157,7 +157,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
TradePriceCalculateRespBO calculateRespBO = calculatePrice(userId, createReqVO);
// 1.2 构建订单
TradeOrderDO order = null;// buildTradeOrder(userId, createReqVO, calculateRespBO);
List<TradeOrderItemDO> orderItems =null;// buildTradeOrderItems(order, calculateRespBO);
List<TradeOrderItemDO> orderItems = null;// buildTradeOrderItems(order, calculateRespBO);
// 2. 订单创建前的逻辑
tradeOrderHandlers.forEach(handler -> handler.beforeOrderCreate(order, orderItems));
@@ -227,9 +227,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// 3. 生成预支付
// 特殊情况:积分兑换时,可能支付金额为零
if (order.getPayPrice() > 0) {
createPayOrder(order, orderItems);
}
createPayOrder(order, orderItems);
// 4. 插入订单日志
TradeOrderLogUtils.setOrderInfo(order.getId(), null, order.getOrderStatus());
@@ -787,7 +785,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
*/
private boolean isAllOrderItemAfterSaleSuccess(Long id) {
List<TradeOrderItemDO> orderItems = tradeOrderItemMapper.selectListByOrderId(id);
return orderItems.stream().allMatch(orderItem -> Objects.equals(orderItem.getAfterSaleStatus(),
return orderItems.stream().allMatch(orderItem -> Objects.equals(1,
TradeOrderItemAfterSaleStatusEnum.SUCCESS.getStatus()));
}
@@ -923,7 +921,7 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
createOrderItemComment0(orderItem, commentCreateReqVO);
// 2.2 更新订单项评价状态
tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()));
}
// 3. 所有订单项都评论了,则更新订单评价状态
@@ -946,8 +944,8 @@ public class TradeOrderUpdateServiceImpl implements TradeOrderUpdateService {
// Long commentId = productCommentApi.createComment(productCommentCreateReqDTO).getCheckedData();
// 2. 更新订单项评价状态
tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()).setCommentStatus(Boolean.TRUE));
return 0l;//commentId;
tradeOrderItemMapper.updateById(new TradeOrderItemDO().setId(orderItem.getId()));
return 0l;//commentId;
}
// =================== 营销相关的操作 ===================

View File

@@ -73,7 +73,7 @@ public interface TradeOrderHandler {
*/
default List<TradeOrderItemDO> filterOrderItemListByNoneAfterSale(List<TradeOrderItemDO> orderItems) {
return CollectionUtils.filterList(orderItems,
item -> TradeOrderItemAfterSaleStatusEnum.isNone(item.getAfterSaleStatus()));
item -> TradeOrderItemAfterSaleStatusEnum.isNone(1));
}
}

View File

@@ -1,9 +1,9 @@
spring:
cloud:
nacos:
server-addr: localhost:8848 # Nacos 服务器地址
# username: nacos # Nacos 账号
# password: nacos # 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