Commit e1b920ae authored by yzc's avatar yzc

物流管理-物流公司管理

parent 78a66ed0
......@@ -499,9 +499,15 @@ public enum ResponseCode {
MAN_USER_EXISTS(49016, "账号或手机号已被注册"),
MAN_USER_DOES_NOT_EXIST(49017, "用户不存在");
MAN_USER_DOES_NOT_EXIST(49017, "用户不存在"),
//****************************************
//****** logistics-service 状态码***
//****************************************
LS_RECORDS_DON_T_EXIST(45001, "数据记录不存在"),
LS_DATA_STATUS_INCORRECT_OPERATE_INVALID(45002, "数据状态不正确操作无效");
private int code;
private String message;
......
HELP.md
.gradle
build/
!gradle/wrapper/gradle-wrapper.jar
!**/src/main/**/build/
!**/src/test/**/build/
### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache
### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr
out/
!**/src/main/**/out/
!**/src/test/**/out/
### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
### VS Code ###
.vscode/
plugins {
// springboot打包插件
id 'org.springframework.boot' version '2.2.7.RELEASE'
// 实现maven依赖管理的插件 dependencyManagement{}
id 'io.spring.dependency-management' version '1.0.9.RELEASE'
id 'java'
id 'war'
}
// 项目坐标
group 'com.ssy.lingxi'
version '2.0.0'
// souce使用1.8版本
sourceCompatibility = '1.8'
// 仓库
repositories {
maven {
url 'http://10.0.0.21:8081/repository/maven-public/'
}
maven {
url 'https://maven.aliyun.com/repository/public'
}
mavenCentral()
}
// 自定义属性, 可以在gradle文件中使用
ext {
set('springCloudVersion', "Hoxton.SR4")
}
// 引入依赖
dependencies {
implementation project(':logistics-service:logistics-service-api')
// 项目模块依赖引入
implementation project(':common')
implementation project(':merchant-member-service:merchant-member-service-api')
// redis
compile group: 'org.springframework.boot', name: 'spring-boot-starter-data-redis', version: '2.3.0.RELEASE'
// swagger
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
// 系统健康监控
implementation 'org.springframework.boot:spring-boot-starter-actuator'
// springjpa
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
// web相关
implementation 'org.springframework.boot:spring-boot-starter-web'
// consul客户端
implementation 'org.springframework.cloud:spring-cloud-starter-consul-discovery'
// feign客戶端
implementation 'org.springframework.cloud:spring-cloud-starter-openfeign'
// postgresql驱动
runtimeOnly 'org.postgresql:postgresql'
// tomcat容器
providedRuntime 'org.springframework.boot:spring-boot-starter-tomcat'
// 测试相关
testImplementation('org.springframework.boot:spring-boot-starter-test') {
exclude group: 'org.junit.vintage', module: 'junit-vintage-engine'
}
// lombok
implementation 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
}
dependencyManagement {
imports {
mavenBom "org.springframework.cloud:spring-cloud-dependencies:${springCloudVersion}"
}
}
\ No newline at end of file
#!/usr/bin/env sh
#
# Copyright 2015 the original author or authors.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
##############################################################################
##
## Gradle start up script for UN*X
##
##############################################################################
# Attempt to set APP_HOME
# Resolve links: $0 may be a link
PRG="$0"
# Need this for relative symlinks.
while [ -h "$PRG" ] ; do
ls=`ls -ld "$PRG"`
link=`expr "$ls" : '.*-> \(.*\)$'`
if expr "$link" : '/.*' > /dev/null; then
PRG="$link"
else
PRG=`dirname "$PRG"`"/$link"
fi
done
SAVED="`pwd`"
cd "`dirname \"$PRG\"`/" >/dev/null
APP_HOME="`pwd -P`"
cd "$SAVED" >/dev/null
APP_NAME="Gradle"
APP_BASE_NAME=`basename "$0"`
# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"'
# Use the maximum available, or set MAX_FD != -1 to use that value.
MAX_FD="maximum"
warn () {
echo "$*"
}
die () {
echo
echo "$*"
echo
exit 1
}
# OS specific support (must be 'true' or 'false').
cygwin=false
msys=false
darwin=false
nonstop=false
case "`uname`" in
CYGWIN* )
cygwin=true
;;
Darwin* )
darwin=true
;;
MINGW* )
msys=true
;;
NONSTOP* )
nonstop=true
;;
esac
CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar
# Determine the Java command to use to start the JVM.
if [ -n "$JAVA_HOME" ] ; then
if [ -x "$JAVA_HOME/jre/sh/java" ] ; then
# IBM's JDK on AIX uses strange locations for the executables
JAVACMD="$JAVA_HOME/jre/sh/java"
else
JAVACMD="$JAVA_HOME/bin/java"
fi
if [ ! -x "$JAVACMD" ] ; then
die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
else
JAVACMD="java"
which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
Please set the JAVA_HOME variable in your environment to match the
location of your Java installation."
fi
# Increase the maximum file descriptors if we can.
if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then
MAX_FD_LIMIT=`ulimit -H -n`
if [ $? -eq 0 ] ; then
if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then
MAX_FD="$MAX_FD_LIMIT"
fi
ulimit -n $MAX_FD
if [ $? -ne 0 ] ; then
warn "Could not set maximum file descriptor limit: $MAX_FD"
fi
else
warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT"
fi
fi
# For Darwin, add options to specify how the application appears in the dock
if $darwin; then
GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\""
fi
# For Cygwin or MSYS, switch paths to Windows format before running java
if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then
APP_HOME=`cygpath --path --mixed "$APP_HOME"`
CLASSPATH=`cygpath --path --mixed "$CLASSPATH"`
JAVACMD=`cygpath --unix "$JAVACMD"`
# We build the pattern for arguments to be converted via cygpath
ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null`
SEP=""
for dir in $ROOTDIRSRAW ; do
ROOTDIRS="$ROOTDIRS$SEP$dir"
SEP="|"
done
OURCYGPATTERN="(^($ROOTDIRS))"
# Add a user-defined pattern to the cygpath arguments
if [ "$GRADLE_CYGPATTERN" != "" ] ; then
OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)"
fi
# Now convert the arguments - kludge to limit ourselves to /bin/sh
i=0
for arg in "$@" ; do
CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -`
CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option
if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition
eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"`
else
eval `echo args$i`="\"$arg\""
fi
i=`expr $i + 1`
done
case $i in
0) set -- ;;
1) set -- "$args0" ;;
2) set -- "$args0" "$args1" ;;
3) set -- "$args0" "$args1" "$args2" ;;
4) set -- "$args0" "$args1" "$args2" "$args3" ;;
5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;;
6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;;
7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;;
8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;;
9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;;
esac
fi
# Escape application args
save () {
for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done
echo " "
}
APP_ARGS=`save "$@"`
# Collect all arguments for the java command, following the shell quoting and substitution rules
eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS"
exec "$JAVACMD" "$@"
@rem
@rem Copyright 2015 the original author or authors.
@rem
@rem Licensed under the Apache License, Version 2.0 (the "License");
@rem you may not use this file except in compliance with the License.
@rem You may obtain a copy of the License at
@rem
@rem https://www.apache.org/licenses/LICENSE-2.0
@rem
@rem Unless required by applicable law or agreed to in writing, software
@rem distributed under the License is distributed on an "AS IS" BASIS,
@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@rem See the License for the specific language governing permissions and
@rem limitations under the License.
@rem
@if "%DEBUG%" == "" @echo off
@rem ##########################################################################
@rem
@rem Gradle startup script for Windows
@rem
@rem ##########################################################################
@rem Set local scope for the variables with windows NT shell
if "%OS%"=="Windows_NT" setlocal
set DIRNAME=%~dp0
if "%DIRNAME%" == "" set DIRNAME=.
set APP_BASE_NAME=%~n0
set APP_HOME=%DIRNAME%
@rem Resolve any "." and ".." in APP_HOME to make it shorter.
for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi
@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script.
set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m"
@rem Find java.exe
if defined JAVA_HOME goto findJavaFromJavaHome
set JAVA_EXE=java.exe
%JAVA_EXE% -version >NUL 2>&1
if "%ERRORLEVEL%" == "0" goto init
echo.
echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH.
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:findJavaFromJavaHome
set JAVA_HOME=%JAVA_HOME:"=%
set JAVA_EXE=%JAVA_HOME%/bin/java.exe
if exist "%JAVA_EXE%" goto init
echo.
echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME%
echo.
echo Please set the JAVA_HOME variable in your environment to match the
echo location of your Java installation.
goto fail
:init
@rem Get command-line arguments, handling Windows variants
if not "%OS%" == "Windows_NT" goto win9xME_args
:win9xME_args
@rem Slurp the command line arguments.
set CMD_LINE_ARGS=
set _SKIP=2
:win9xME_args_slurp
if "x%~1" == "x" goto execute
set CMD_LINE_ARGS=%*
:execute
@rem Setup the command line
set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar
@rem Execute Gradle
"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %CMD_LINE_ARGS%
:end
@rem End local scope for the variables with windows NT shell
if "%ERRORLEVEL%"=="0" goto mainEnd
:fail
rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of
rem the _cmd.exe /c_ return code!
if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1
exit /b 1
:mainEnd
if "%OS%"=="Windows_NT" endlocal
:omega
plugins {
id 'java'
}
group 'com.ssy.lingxi'
version '2.0.0'
sourceCompatibility = 1.8
repositories {
maven {
url 'http://10.0.0.21:8081/repository/maven-public/'
}
//mavenCentral()
}
dependencies {
implementation 'org.projectlombok:lombok:1.18.12'
annotationProcessor 'org.projectlombok:lombok:1.18.12'
compile group: 'io.springfox', name: 'springfox-swagger2', version: '2.7.0'
compile group: 'io.springfox', name: 'springfox-swagger-ui', version: '2.7.0'
compile group: 'jakarta.validation', name: 'jakarta.validation-api', version: '2.0.2'
compile group: 'org.springframework.cloud', name: 'spring-cloud-starter-openfeign', version: '2.2.2.RELEASE'
implementation project(':common')
testCompile group: 'junit', name: 'junit', version: '4.12'
}
package com.ssy.lingxi.logistics.api.enums;
import com.ssy.lingxi.logistics.api.validate.IntArrayValuable;
import java.util.Arrays;
/**
* 通用停用/启用状态枚举
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
public enum CommonStatusEnum implements IntArrayValuable {
/**
* 停用 - 0
*/
PLATFORM(0, "停用"),
/**
* 启用 - 1
*/
MERCHANT(1, "启用");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CommonStatusEnum::getCode).toArray();
private int code;
private String message;
@Override
public int[] array() {
return ARRAYS;
}
CommonStatusEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
package com.ssy.lingxi.logistics.api.enums;
import com.ssy.lingxi.logistics.api.validate.IntArrayValuable;
import java.util.Arrays;
/**
* 物流公司合作类型枚举
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
public enum CooperateTypeEnum implements IntArrayValuable {
/**
* 平台物流服务商 - 1
*/
PLATFORM(1, "平台物流服务商"),
/**
* 商户合作物流公司 - 2
*/
MERCHANT(2, "商户合作物流公司");
public static final int[] ARRAYS = Arrays.stream(values()).mapToInt(CooperateTypeEnum::getCode).toArray();
private int code;
private String message;
@Override
public int[] array() {
return ARRAYS;
}
CooperateTypeEnum(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
package com.ssy.lingxi.logistics.api.request;
import com.ssy.lingxi.logistics.api.enums.CommonStatusEnum;
import com.ssy.lingxi.logistics.api.enums.CooperateTypeEnum;
import com.ssy.lingxi.logistics.api.validate.InEnum;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
/**
* 物流公司请求实体类
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
@Data
public class LogisticsCompanyRequest implements Serializable {
private static final long serialVersionUID = 2405606251096035801L;
@ApiModelProperty(value = "主键id")
@NotNull(message = "主键id不能为空", groups = {Update.class, UpdateStatus.class, Delete.class})
private long id;
@ApiModelProperty(value = "会员id")
private Long memberId;
@ApiModelProperty(value = "物流公司名称")
private String name;
@ApiModelProperty(value = "物流公司编码")
private String code;
@ApiModelProperty(value = "合作类型 1-平台物流服务商 2-商户合作物流公司")
@InEnum(value = CooperateTypeEnum.class, groups = {Add.class, Update.class})
private Integer cooperateType;
@ApiModelProperty(value = "状态 0-无效 1-有效")
@NotNull(message = "状态不能为空", groups = {UpdateStatus.class})
@InEnum(value = CommonStatusEnum.class, groups = {UpdateStatus.class})
private Integer status;
@ApiModelProperty(value = "备注")
private String remark;
public interface Add {
}
public interface Update {
}
public interface UpdateStatus {
}
public interface Delete {
}
}
package com.ssy.lingxi.logistics.api.response;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.io.Serializable;
/**
* 物流公司列表返回实体类
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
@Data
public class LogisticsCompanyResponse implements Serializable {
private static final long serialVersionUID = 4104322623856396340L;
@ApiModelProperty(value = "主键id")
private long id;
@ApiModelProperty(value = "物流公司名称")
private String name;
@ApiModelProperty(value = "物流公司编码")
private String code;
@ApiModelProperty(value = "合作类型 1-平台物流服务商 2-商户合作物流公司")
private Integer cooperateType;
@ApiModelProperty(value = "状态 0-无效 1-有效")
private Integer status;
}
package com.ssy.lingxi.logistics.api.validate;
import javax.validation.Constraint;
import javax.validation.Payload;
import java.lang.annotation.*;
@Target({
ElementType.METHOD,
ElementType.FIELD,
ElementType.ANNOTATION_TYPE,
ElementType.CONSTRUCTOR,
ElementType.PARAMETER,
ElementType.TYPE_USE
})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(
validatedBy = InEnumValidator.class
)
/**
* 枚举注解
* @author yzc
* @version 2.0.0
* @date 2020/7/13
*/
public @interface InEnum {
/**
* @return 实现 EnumValuable 接口的
*/
Class<? extends IntArrayValuable> value();
String message() default "参数必须在指定范围 {value}";
Class<?>[] groups() default {};
Class<? extends Payload>[] payload() default {};
}
package com.ssy.lingxi.logistics.api.validate;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;
/**
* 枚举类型判断
*
* @author yzc
* @version 2.0.0
* @date 2020/7/13
*/
public class InEnumValidator implements ConstraintValidator<InEnum, Integer> {
private List<Integer> values;
@Override
public void initialize(InEnum annotation) {
IntArrayValuable[] values = annotation.value().getEnumConstants();
if (values.length == 0) {
this.values = Collections.emptyList();
} else {
this.values = Arrays.stream(values[0].array()).boxed().collect(Collectors.toList());
}
}
@Override
public boolean isValid(Integer value, ConstraintValidatorContext context) {
// 校验通过
if (values.contains(value)) {
return true;
}
// 校验不通过,自定义提示语句(因为,注解上的 value 是枚举类,无法获得枚举类的实际值)
// 禁用默认的 message 的值
context.disableDefaultConstraintViolation();
// 重新添加错误提示语句
context.buildConstraintViolationWithTemplate(context.getDefaultConstraintMessageTemplate()
.replaceAll("\\{value}", values.toString()))
.addConstraintViolation();
return false;
}
}
package com.ssy.lingxi.logistics.api.validate;
/**
* 可生成 Int 数组的接口
* @author yzc
* @version 2.0.0
* @date 2020/7/13
*/
public interface IntArrayValuable {
/**
* @return int 数组
*/
int[] array();
}
rootProject.name = 'logistics-service'
include 'common'
project(':common').projectDir = "../common" as File
include 'logistics-service:logistics-service-api'
project(':logistics-service:logistics-service-api').projectDir = "$rootDir/logistics-service-api" as File
package com.ssy.lingxi.logistics;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import springfox.documentation.swagger2.annotations.EnableSwagger2;
@EnableSwagger2
@SpringBootApplication
public class LogisticsServiceApplication {
public static void main(String[] args) {
SpringApplication.run(LogisticsServiceApplication.class, args);
}
}
package com.ssy.lingxi.logistics;
import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(LogisticsServiceApplication.class);
}
}
package com.ssy.lingxi.logistics.controller;
import com.ssy.common.model.vo.PageVO;
import com.ssy.common.response.PageData;
import com.ssy.common.response.Wrapper;
import com.ssy.lingxi.logistics.api.request.LogisticsCompanyRequest;
import com.ssy.lingxi.logistics.api.response.LogisticsCompanyResponse;
import com.ssy.lingxi.logistics.service.ILogisticsCompanyService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import javax.annotation.Resource;
import javax.validation.Valid;
/**
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
@Api("物流公司管理")
@RestController
@RequestMapping("/logistics/logisticsCompany")
public class LogisticsCompanyController {
@Resource
private ILogisticsCompanyService logisticsCompanyService;
@ApiOperation(value = "物流公司列表管理")
@GetMapping("/page")
public Wrapper<PageData<LogisticsCompanyResponse>> pageLogisticsCompany(@Valid PageVO pageVO) {
return logisticsCompanyService.pageLogisticsCompany(pageVO);
}
@ApiOperation(value = "物流公司查询")
@PostMapping(value = "/get")
public Wrapper<LogisticsCompanyResponse> getLogisticsCompany(LogisticsCompanyRequest request) {
return logisticsCompanyService.getLogisticsCompany(request);
}
@ApiOperation(value = "物流公司添加")
@PostMapping(value = "/add")
public Wrapper addLogisticsCompany(@RequestBody @Validated(LogisticsCompanyRequest.Add.class) LogisticsCompanyRequest request) {
return logisticsCompanyService.addLogisticsCompany(request);
}
@ApiOperation(value = "物流公司修改")
@PostMapping(value = "/update")
public Wrapper updateLogisticsCompany(@RequestBody @Validated(LogisticsCompanyRequest.Update.class) LogisticsCompanyRequest request) {
return logisticsCompanyService.updateLogisticsCompany(request);
}
@ApiOperation(value = "物流公司停用/启用")
@PostMapping(value = "/enable")
public Wrapper updateStatusLogisticsCompany(@RequestBody @Validated(LogisticsCompanyRequest.UpdateStatus.class) LogisticsCompanyRequest request) {
return logisticsCompanyService.updateStatusLogisticsCompany(request);
}
@ApiOperation(value = "物流公司删除")
@PostMapping(value = "/delete")
public Wrapper deleteLogisticsCompany(@RequestBody LogisticsCompanyRequest request) {
return logisticsCompanyService.deleteLogisticsCompany(request);
}
}
package com.ssy.lingxi.logistics.entity;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDateTime;
/**
* 物流公司实体类
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
@Data
@Entity
@Table(schema = "public", name = "ls_logistics_company ")
public class LogisticsCompany implements Serializable {
private static final long serialVersionUID = -8962980252233409933L;
@ApiModelProperty(value = "主键id")
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "logistics_company_seq")
@SequenceGenerator(sequenceName = "ls_logistics_company_seq", name = "logistics_company_seq", allocationSize = 1)
private Long id;
@ApiModelProperty(value = "物流公司名称")
@Column(columnDefinition = "varchar(40)")
private String name;
@ApiModelProperty(value = "物流公司编码")
@Column(columnDefinition = "varchar(20)")
private String code;
@ApiModelProperty(value = "会员id")
@Column(columnDefinition = "int8")
private Long memberId;
@ApiModelProperty(value = "合作类型 1-平台物流服务商 2-商户合作物流公司")
@Column(columnDefinition = "int2")
private Integer cooperateType;
@ApiModelProperty(value = "状态 0-无效 1-有效")
@Column(columnDefinition = "int2")
private Integer status;
@ApiModelProperty(value = "备注")
@Column(columnDefinition = "varchar(60)")
private String remark;
@ApiModelProperty(value = "创建时间")
@Column(columnDefinition = "timestamp")
private LocalDateTime createTime;
}
package com.ssy.lingxi.logistics.repository;
import com.ssy.lingxi.logistics.entity.LogisticsCompany;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
/**
* 物流公司实体仓库
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
public interface LogisticsCompanyRepository extends JpaRepository<LogisticsCompany, Long>, JpaSpecificationExecutor<Long> {
}
\ No newline at end of file
package com.ssy.lingxi.logistics.service;
import com.ssy.common.model.vo.PageVO;
import com.ssy.common.response.PageData;
import com.ssy.common.response.Wrapper;
import com.ssy.lingxi.logistics.api.request.LogisticsCompanyRequest;
import com.ssy.lingxi.logistics.api.response.LogisticsCompanyResponse;
/**
* 物流公司服务服务类
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
public interface ILogisticsCompanyService {
/**
* 物流公司分页列表
*
* @param pageVO
* @return
*/
Wrapper<PageData<LogisticsCompanyResponse>> pageLogisticsCompany(PageVO pageVO);
/**
* 物流公司查询
* @param request
* @return
*/
Wrapper<LogisticsCompanyResponse> getLogisticsCompany(LogisticsCompanyRequest request);
/**
* 物流公司添加
*
* @param request
*/
Wrapper addLogisticsCompany(LogisticsCompanyRequest request);
/**
* 物流公司修改
*
* @param request
*/
Wrapper updateLogisticsCompany(LogisticsCompanyRequest request);
/**
* 物流公司停用/启用
* @param request
* @return
*/
Wrapper updateStatusLogisticsCompany(LogisticsCompanyRequest request);
/**
* 物流公司删除
* @param request
* @return
*/
Wrapper deleteLogisticsCompany(LogisticsCompanyRequest request);
}
package com.ssy.lingxi.logistics.serviceimpl;
import com.ssy.common.constant.EnableDisableStatus;
import com.ssy.common.model.vo.PageVO;
import com.ssy.common.response.PageData;
import com.ssy.common.response.ResponseCode;
import com.ssy.common.response.Wrapper;
import com.ssy.lingxi.logistics.api.enums.CooperateTypeEnum;
import com.ssy.lingxi.logistics.api.request.LogisticsCompanyRequest;
import com.ssy.lingxi.logistics.api.response.LogisticsCompanyResponse;
import com.ssy.lingxi.logistics.entity.LogisticsCompany;
import com.ssy.lingxi.logistics.repository.LogisticsCompanyRepository;
import com.ssy.lingxi.logistics.service.ILogisticsCompanyService;
import org.springframework.beans.BeanUtils;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;
import javax.annotation.Resource;
import java.time.LocalDateTime;
import java.util.List;
import java.util.stream.Collectors;
/**
* 物流公司服务实现类
*
* @author yzc
* @version 2.0.0
* @date 2020/7/10
*/
@Service
public class LogisticsCompanyImpl implements ILogisticsCompanyService {
@Resource
private LogisticsCompanyRepository logisticsCompanyRepository;
@Override
public Wrapper<PageData<LogisticsCompanyResponse>> pageLogisticsCompany(PageVO pageVO) {
Pageable page = PageRequest.of(pageVO.getCurrent() - 1, pageVO.getPageSize(), Sort.by("id").ascending());
Page<LogisticsCompany> pageList = logisticsCompanyRepository.findAll(page);
List<LogisticsCompanyResponse> resultList = pageList.stream().map(e -> {
LogisticsCompanyResponse logisticsCompanyResponse = new LogisticsCompanyResponse();
BeanUtils.copyProperties(e, logisticsCompanyResponse);
return logisticsCompanyResponse;
}).collect(Collectors.toList());
return Wrapper.success(new PageData<>(pageList.getTotalElements(), resultList));
}
@Override
public Wrapper<LogisticsCompanyResponse> getLogisticsCompany(LogisticsCompanyRequest request) {
LogisticsCompany logisticsCompany = logisticsCompanyRepository.findById(request.getId()).orElse(null);
if (ObjectUtils.isEmpty(logisticsCompany)) {
return Wrapper.fail(Wrapper.fail(ResponseCode.LS_RECORDS_DON_T_EXIST));
}
LogisticsCompanyResponse logisticsCompanyResponse = new LogisticsCompanyResponse();
BeanUtils.copyProperties(logisticsCompany, logisticsCompanyResponse);
// TODO 查询物流会员信息
return Wrapper.success(logisticsCompanyResponse);
}
@Override
public Wrapper addLogisticsCompany(LogisticsCompanyRequest request) {
LogisticsCompany logisticsCompany = new LogisticsCompany();
// 类型为平台物流
if (CooperateTypeEnum.PLATFORM.getCode() == request.getCooperateType()) {
logisticsCompany.setCooperateType(request.getCooperateType());
logisticsCompany.setStatus(EnableDisableStatus.ENABLE.getCode());
logisticsCompany.setMemberId(request.getMemberId());
logisticsCompany.setRemark(request.getRemark());
logisticsCompany.setCreateTime(LocalDateTime.now());
logisticsCompanyRepository.saveAndFlush(logisticsCompany);
}
// 类型为商户合作
if (CooperateTypeEnum.MERCHANT.getCode() == request.getCooperateType()) {
logisticsCompany.setCooperateType(request.getCooperateType());
logisticsCompany.setStatus(EnableDisableStatus.ENABLE.getCode());
logisticsCompany.setName(request.getName());
logisticsCompany.setCode(request.getCode());
logisticsCompany.setRemark(request.getRemark());
logisticsCompany.setCreateTime(LocalDateTime.now());
logisticsCompanyRepository.saveAndFlush(logisticsCompany);
}
return Wrapper.success();
}
@Override
public Wrapper updateLogisticsCompany(LogisticsCompanyRequest request) {
LogisticsCompany logisticsCompany = logisticsCompanyRepository.findById(request.getId()).orElse(null);
if (ObjectUtils.isEmpty(logisticsCompany)) {
return Wrapper.fail(ResponseCode.LS_RECORDS_DON_T_EXIST);
}
if (EnableDisableStatus.ENABLE.getCode() == logisticsCompany.getStatus()) {
return Wrapper.fail(ResponseCode.LS_DATA_STATUS_INCORRECT_OPERATE_INVALID);
}
// 类型为平台物流
if (CooperateTypeEnum.PLATFORM.getCode() == request.getCooperateType()) {
logisticsCompany.setMemberId(request.getMemberId());
logisticsCompany.setRemark(request.getRemark());
logisticsCompanyRepository.saveAndFlush(logisticsCompany);
}
// 类型为商户合作
if (CooperateTypeEnum.MERCHANT.getCode() == request.getCooperateType()) {
logisticsCompany.setName(request.getName());
logisticsCompany.setCode(request.getCode());
logisticsCompany.setRemark(request.getRemark());
logisticsCompanyRepository.saveAndFlush(logisticsCompany);
}
return Wrapper.success();
}
@Override
public Wrapper updateStatusLogisticsCompany(LogisticsCompanyRequest request) {
LogisticsCompany logisticsCompany = logisticsCompanyRepository.findById(request.getId()).orElse(null);
if (ObjectUtils.isEmpty(logisticsCompany)) {
return Wrapper.fail(ResponseCode.LS_RECORDS_DON_T_EXIST);
}
// 停用前提为当前商户与该物流公司没有未执行完成的物流单及单据结算 TODO
logisticsCompany.setStatus(request.getStatus());
logisticsCompanyRepository.saveAndFlush(logisticsCompany);
return Wrapper.success();
}
@Override
public Wrapper deleteLogisticsCompany(LogisticsCompanyRequest request) {
LogisticsCompany logisticsCompany = logisticsCompanyRepository.findById(request.getId()).orElse(null);
if (ObjectUtils.isEmpty(logisticsCompany)) {
return Wrapper.fail(ResponseCode.LS_RECORDS_DON_T_EXIST);
}
if (EnableDisableStatus.ENABLE.getCode() == logisticsCompany.getStatus()) {
return Wrapper.fail(ResponseCode.LS_DATA_STATUS_INCORRECT_OPERATE_INVALID);
}
logisticsCompanyRepository.deleteById(logisticsCompany.getId());
return Wrapper.success();
}
}
\ No newline at end of file
server:
port: 9100
tomcat:
uri-encoding: UTF-8
spring:
application:
name: logistics-service
datasource:
url: jdbc:postgresql://10.0.0.16:5432/lingxidb?stringtype=unspecified
username: dbadmin
password: dbadmin
type: com.zaxxer.hikari.HikariDataSource
hikari:
minimum-idle: 2
maximum-pool-size: 10
auto-commit: true
idle-timeout: 30000
pool-name: LogisticsServiceHikariPool
max-lifetime: 1800000
connection-timeout: 30000
connection-test-query: SELECT 1
jpa:
open-in-view: false
show-sql: true
database: postgresql
hibernate:
ddl-auto: update
properties:
hibernate:
jdbc:
batch_size: 500
batch_versioned_data: true
order_inserts: true
order_updates: true
# Consul Config
cloud:
consul:
host: 10.0.0.24
port: 8500
discovery:
prefer-ip-address: true
# 禁止使用Ribbon,否则启动时会报Warning信息
loadbalancer:
ribbon:
enabled: false
# 链路追踪Zipkin配置
zipkin:
base-url: http://10.0.0.24:9411
redis:
host: 10.0.0.16
port: 6379
database: 1
# 日志文件保存路径
logging:
config: classpath:logback-spring.xml
file:
path: d:\\logs
# 监控配置。如果不配置则无法访问/actuator/health, info, beans等接口,Consul注册中心会报错(但仍可注册)
management:
endpoints:
web:
base-path: /actuator
exposure:
include: "*"
\ No newline at end of file
server:
port: 9100
tomcat:
uri-encoding: UTF-8
spring:
application:
name: logistics-service
datasource:
url: jdbc:postgresql://10.0.0.16:5432/lingxidb?stringtype=unspecified
url: jdbc:postgresql://10.0.0.16:5432/lingxitestdb?stringtype=unspecified
username: dbadmin
password: dbadmin
type: com.zaxxer.hikari.HikariDataSource
......@@ -19,15 +26,36 @@ spring:
database: postgresql
hibernate:
ddl-auto: update
database-platform: com.ssy.lingxi.member.merchant.config.PostgreSQLWithoutForeignKeys95Dialect
# Consul Config
cloud:
consul:
host: 10.0.0.24
host: 10.0.0.25
port: 8500
discovery:
prefer-ip-address: true
# 禁止使用Ribbon,否则启动时会报Warning信息
loadbalancer:
ribbon:
enabled: false
# 链路追踪Zipkin配置
zipkin:
base-url: http://10.0.0.24:9411
base-url: http://10.0.0.25:9411
redis:
host: 10.0.0.16
port: 6379
database: 5
\ No newline at end of file
database: 0
# 日志文件保存路径
logging:
config: classpath:logback-spring.xml
file:
path: /usr/local/logs/merchant-member-service
# 监控配置。如果不配置则无法访问/actuator/health, info, beans等接口,Consul注册中心会报错(但仍可注册)
management:
endpoints:
web:
base-path: /actuator
exposure:
include: "*"
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration debug="false">
<!--LogBack的配置文件中不要使用相对路径,否则报错-->
<!--日志文件的存储路径,spring配置文件中的logging.file.path,一定要使用${LOG_PATH:-.}来引用这个配置-->
<property name="LOG_HOME" value="${LOG_PATH:-.}"/>
<!--本服务的名称-->
<!--从Spring Boot配置文件中读取配置,这种方式在IDEA调试时会在工程目录下生成一个SERVICE_NAME_IS_UNDEFINED.log文件-->
<springProperty scope="context" name="SERVICE_NAME" source="spring.application.name"/>
<!-- 控制台输出 -->
<appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
<withJansi>false</withJansi>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<!--%green,%red是日志显示的颜色,要用小括号-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %highlight(%-5level) %green([%thread]) %logger{50} --- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 总共10个日志文件轮流覆盖写入,每个文件大小为10M -->
<appender name="FILE" class="ch.qos.logback.core.rolling.RollingFileAppender">
<!--如果使用这种日志形式,一定要先定义这个file,它会根据fileNamePattern自动转换文件名称-->
<file>${LOG_HOME}/${SERVICE_NAME}.log</file>
<rollingPolicy class="ch.qos.logback.core.rolling.FixedWindowRollingPolicy">
<!--日志文件输出的文件名-->
<fileNamePattern>${SERVICE_NAME}.%i.log</fileNamePattern>
<!--日志文件后缀名的起始和结束,即上面一行的%i-->
<minIndex>1</minIndex>
<maxIndex>10</maxIndex>
</rollingPolicy>
<!--单个日志文件最大的大小-->
<triggeringPolicy class="ch.qos.logback.core.rolling.SizeBasedTriggeringPolicy">
<maxFileSize>10MB</maxFileSize>
</triggeringPolicy>
<encoder class="ch.qos.logback.classic.encoder.PatternLayoutEncoder" immediateFlush="true">
<!--格式化输出:%d表示日期,%thread表示线程名,%-5level:级别从左显示5个字符宽度%msg:日志消息,%n是换行符-->
<pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} ${SERVICE_NAME} %-5level [%thread] %logger{50} --- %msg%n</pattern>
<charset>UTF-8</charset>
</encoder>
</appender>
<!-- 日志输出级别 -->
<root level="INFO">
<appender-ref ref="STDOUT"/>
<appender-ref ref="FILE"/>
</root>
</configuration>
\ No newline at end of file
package com.ssy.lingxi.logistics;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class LogisticsServiceApplicationTests {
@Test
void contextLoads() {
}
}
......@@ -31,3 +31,6 @@ findProject(':workflow-service:workflow-service-testapi')?.name = 'workflow-serv
include 'order-service'
include 'order-service:order-service-api'
include 'logistics-service'
include 'logistics-service:logistics-service-api'
spring:
profiles:
active: dev
application:
name: sms-service
server:
port: 8300
# 监控配置。如果不配置则无法访问/actuator/health, info, beans等接口,Consul注册中心会报错(但仍可注册)
management:
endpoints:
web:
base-path: /actuator
exposure:
include: "*"
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment