commit skyer-channel

This commit is contained in:
jiangjianfeng 2022-06-20 18:51:34 +08:00
parent 3a0e40ecaa
commit 2db479a775
121 changed files with 8420 additions and 0 deletions

103
skyer-channel/.gitignore vendored Normal file
View file

@ -0,0 +1,103 @@
#======================================================================================================================
#========================================= gitignore的基础用法 =========================================
#======================================================================================================================
# 一.基础语法
# .gitignore配置文件的一些通用技巧 [参考:https://git-scm.com/docs/gitignore]
# 1.空白行不匹配任何文件,所以可以作为可读性的分隔符,同时两端的空格将会被忽略.
# 2.使用[#]开头,将会注释掉整行,使其不进行匹配操作,如果需要匹配#开头,可以使用转义字符[\].
# 3.1匹配模式以[/]结尾,表示想要匹配一个目录及其子文件.(比如[foo/]会匹配foo目录及其下面的路径.)
# 3.2匹配模式不包含[/],将会全局匹配该文件.
# 4.通配符
# [*]: 匹配除[/]以外的任何内容,也就意味着[*]不能跨目录.
# [?]: 匹配除[/]和[[]以及[]]以外的任何一个字符.
# [**]: 匹配所有的内容,或者说匹配任意目录下的内容.
# 示例:
# 1.[**/foo/bar] 将会匹配所有直接在foo目录下的bar,无论foo处在何处.
# 2.[foo/**]则表示匹配foo目录下的所有文件和目录.
# 3.[a/**/b]则可以匹配a/b, a/c/b, a/c/d/b,即此处的[**]可以表示0个或多个.
# !!! 需要注意的是,除上面示例的用法外,剩余的[**]都是无效的..
# 5.可以通过前缀[!]来表示不忽略某些文件,比如可以通过[!a]来确保文件a不会被忽略,即时前面已经声明了忽略其父目录,该模式优先级高于普通忽略模式.
# 二.常用命令
# 1.git -rm [https://git-scm.com/docs/git-rm]
# 删除文件索引,或者同时删除文件索引和物理文件.可以使用通配符.
# 2.git-check-ignore [https://git-scm.com/docs/git-check-ignore]
# 调试.gitignore文件
# 三.注意事项
# 1.如果文件已经被git管理,那么后续添加的忽略模式将不会生效,具体解决方法,参考<<二.常用命令>>.
#=======================================================================================================================
#============================== java忽略文件 =====================================
#===================== https://github.com/github/gitignore/blob/master/Java.gitignore ==================
#=======================================================================================================================
# 编译后的class文件,忽略所有以[.class]结尾的文件
*.class
# 日志文件,忽略所有以[.log]结尾的文件.
*.log
# BlueJ 文件,忽略所有以[.ctxt]结尾的文件.
*.ctxt
# Mobile Tools for Java (J2ME),忽略[.mtj.tmp/]目录及其子文件.
.mtj.tmp/
# 打包文件,忽略所有以[.jar]或[.war]或[.nar]或[.ear]或[.zip]或[.tar.gz]或[rar]结尾的文件.
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# 虚拟机崩溃日志,忽略所有以[hs_err_pid]开头的文件.[see http://www.java.com/en/download/help/error_hotspot.xml]
hs_err_pid*
#=======================================================================================================================
#============================== maven忽略文件 ===================================
#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ==================
#=======================================================================================================================
target/
pom.xml.tag
pom.xml.releaseBackup
pom.xml.versionsBackup
pom.xml.next
release.properties
dependency-reduced-pom.xml
buildNumber.properties
.mvn/timing.properties
# Avoid ignoring Maven wrapper jar file (.jar files are usually ignored)
!/.mvn/wrapper/maven-wrapper.jar
#=======================================================================================================================
#============================== IDE环境忽略文件 ==================================
#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ==================
#=======================================================================================================================
#----------------IDEA-------------
.idea/*
.idea/compiler.xml
.idea/encodings.xml
.idea/modules.xml
*.iml
#=======================================================================================================================
#============================== other环境忽略文件 ================================
#===================== https://github.com/github/gitignore/blob/master/Maven.gitignore ==================
#=======================================================================================================================
*.sw?
.#*
*#
*~
.classpath
.project
.settings/
bin
build
target
dependency-reduced-pom.xml
*.sublime-*
/scratch
.gradle
Guardfile
README.html
*.iml
.idea
*/.DS_Store
.DS_Store

View file

@ -0,0 +1,5 @@
include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/b4ff52ed-c506-4083-a403-ccb2b5403653/content.yaml
#include: http://api.baogicloud.com/devops/v1/projects/204888765897510912/ci_contents/pipelines/ac34bd4f-a85d-424c-983f-d6df76419b8b/content.yaml
#
##include: http://api.baogicloud.com/devops/v1/projects/187577360164982784/ci_contents/pipelines/30c4f61e-d629-4189-981d-b5bf7c463c2e/content.yaml

View file

@ -0,0 +1,5 @@
apiVersion: v1
appVersion: "1.0"
description: A Helm chart for Kubernetes
name: skyer-channel
version: 0.1.0

View file

@ -0,0 +1,81 @@
# skyer Base Service
基于Spring Cloud Channel的微服务渠道管理服务
## Introduction
## Add Helm chart repository
``` bash
helm repo add skyer https://chart.skyer.com.cn/skyer/c7n
helm repo update
```
## Installing the Chart
```bash
$ helm install c7n/skyer-platform --name skyer-platform
```
Specify each parameter using the `--set key=value[,key=value]` argument to `helm install`.
## Uninstalling the Chart
```bash
$ helm delete skyer-platform
```
## Configuration
Parameter | Description | Default
--- | --- | ---
`replicaCount` | pod运行数量 | `1`
`image.repository` | 镜像库地址 | `registry.skyer.com.cn/skyer/skyer-platform`
`image.pullPolicy` | 镜像拉取策略 | `IfNotPresent`
`preJob.timeout` | job超时时间 | `300`
`preJob.image` | job镜像库地址 | `registry.cn-hangzhou.aliyuncs.com/skyer-tools/dbtool:0.6.4`
`metrics.path` | 收集应用的指标数据路径 | `/actuator/prometheus`
`metrics.group` | 性能指标应用分组 | `spring-boot`
`logs.parser` | 日志收集格式 | `spring-boot`
`deployment.managementPort` | 服务管理端口 | `8101`
`ingress.enabled` | 是否创建k8s ingress | `false`
`env.open.SPRING_DATASOURCE_URL` | 数据库连接地址 | `jdbc:mysql://localhost/base_service?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true`
`env.open.SPRING_DATASOURCE_USERNAME` | 数据库用户名 | `skyer`
`env.open.SPRING_DATASOURCE_PASSWORD` | 数据库密码 | `password`
`env.open.SPRING_REDIS_HOST` | redis主机地址 | `localhost`
`env.open.SPRING_REDIS_PORT` | redis端口 | `6379`
`env.open.SPRING_REDIS_DATABASE` | redis db | `1`
`env.open.EUREKA_CLIENT_SERVICEURL_DEFAULTZONE` | 注册服务地址 | `http://register-server:8000/eureka/`
`service.enabled` | 是否创建k8s service | `false`
`service.type` | service类型 | `ClusterIP`
`service.port` | service端口 | `8100`
`service.name` | service名称 | `skyer-channel`
`resources.limits` | k8s中容器能使用资源的资源最大值 | `3Gi`
`resources.requests` | k8s中容器使用的最小资源需求 | `2Gi`
### SkyWalking Configuration
Parameter | Description
--- | ---
`javaagent` | SkyWalking 代理jar包(添加则开启 SkyWalking删除则关闭)
`skywalking.agent.application_code` | SkyWalking 应用名称
`skywalking.agent.sample_n_per_3_secs` | SkyWalking 采样率配置
`skywalking.agent.namespace` | SkyWalking 跨进程链路中的header配置
`skywalking.agent.authentication` | SkyWalking 认证token配置
`skywalking.agent.span_limit_per_segment` | SkyWalking 每segment中的最大span数配置
`skywalking.agent.ignore_suffix` | SkyWalking 需要忽略的调用配置
`skywalking.agent.is_open_debugging_class` | SkyWalking 是否保存增强后的字节码文件
`skywalking.collector.backend_service` | SkyWalking OAP 服务地址和端口配置
```bash
$ helm install c7n/skyer-platform \
--set env.open.SKYWALKING_OPTS="-javaagent:/agent/skywalking-agent.jar -Dskywalking.agent.application_code=skyer-platform -Dskywalking.agent.sample_n_per_3_secs=-1 -Dskywalking.collector.backend_service=oap.skywalking:11800" \
--name skyer-platform
```
## 验证部署
```bash
curl -s $(kubectl get po -n c7n-system -l skyer.io/release=skyer-platform -o jsonpath="{.items[0].status.podIP}"):8081/actuator/health | jq -r .status
```
出现以下类似信息即为成功部署
```bash
UP
```

View file

@ -0,0 +1,28 @@
{{/* vim: set filetype=mustache: */}}
{{- /*
service.labels.standard prints the standard service Helm labels.
The standard labels are frequently used in metadata.
*/ -}}
{{- define "service.image" -}}
{{- printf "%s:%s" .Values.image.repository (default (.Chart.Version) .Values.image.tag) -}}
{{- end -}}
{{/*
Return the appropriate apiVersion for deployment.
*/}}
{{- define "app.deployment.apiVersion" -}}
{{- if semverCompare "<1.9-0" .Capabilities.KubeVersion.GitVersion -}}
{{- print "apps/v1beta2" -}}
{{- else -}}
{{- print "apps/v1" -}}
{{- end -}}
{{- end -}}
{{- define "service.labels.kubesphere" -}}
app: {{ .Release.Name | quote }}
app.kubernetes.io/name: {{ .Values.kubesphere.app.name | quote }}
app.kubernetes.io/version: {{ .Values.kubesphere.app.version | quote }}
version: {{ .Values.kubesphere.app.version | quote }}
{{- end -}}

View file

@ -0,0 +1,121 @@
apiVersion: {{ include "app.deployment.apiVersion" . }}
kind: Deployment
metadata:
name: {{ .Release.Name }}
labels:
{{ include "service.labels.kubesphere" . | indent 4 }}
annotations:
deployment.kubernetes.io/revision: '1'
kubesphere.io/creator: {{ .Values.kubesphere.app.creator | quote }}
servicemesh.kubesphere.io/enabled: '{{ .Values.kubesphere.app.servicemesh }}'
spec:
strategy:
type: {{ .Values.deploymentUpdate.type }}
{{- if eq .Values.deploymentUpdate.type "RollingUpdate" }}
rollingUpdate:
maxSurge: {{ .Values.deploymentUpdate.maxSurge }}
maxUnavailable: {{ .Values.deploymentUpdate.maxUnavailable }}
{{- else }}
rollingUpdate: null
{{- end}}
replicas: {{ .Values.replicaCount }}
selector:
matchLabels:
{{ include "service.labels.kubesphere" . | indent 6 }}
template:
metadata:
annotations:
sidecar.istio.io/inject: '{{ .Values.kubesphere.app.servicemesh }}'
labels:
{{ include "service.labels.kubesphere" . | indent 8 }}
spec:
volumes:
- name: host-time
hostPath:
path: /etc/localtime
type: ''
- name: data
{{- if .Values.persistence.enabled }}
persistentVolumeClaim:
claimName: {{ .Values.persistence.existingClaim | default ( .Release.Name ) }}
{{- else }}
emptyDir: {}
{{- end }}
containers:
- name: {{ .Release.Name }}
image: {{ include "service.image" . }}
imagePullPolicy: {{ .Values.image.pullPolicy }}
env:
{{- range $name, $value := .Values.env.open }}
{{- if ne (len ($value | quote)) 0 }}
- name: {{ $name | quote }}
value: {{ $value | quote }}
{{- end }}
{{- end }}
ports:
- name: http-{{ .Values.service.port }}
containerPort: {{ .Values.service.port }}
protocol: TCP
{{- if not (empty .Values.deployment.managementPort) }}
- name: http-{{ .Values.deployment.managementPort }}
containerPort: {{ .Values.deployment.managementPort }}
protocol: TCP
{{- end }}
readinessProbe:
initialDelaySeconds: {{ .Values.readinessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.readinessProbe.periodSeconds }}
timeoutSeconds: {{ .Values.readinessProbe.timeoutSeconds }}
successThreshold: {{ .Values.readinessProbe.successThreshold }}
failureThreshold: {{ .Values.readinessProbe.failureThreshold }}
exec:
command:
- /bin/sh
- -c
- >
nc -z localhost {{ .Values.env.open.SERVER_PORT }}
&& curl -s --fail localhost:{{ .Values.env.open.MANAGEMENT_SERVER_PORT }}/actuator/health
livenessProbe:
initialDelaySeconds: {{ .Values.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.livenessProbe.periodSeconds }}
timeoutSeconds: {{ .Values.livenessProbe.timeoutSeconds }}
successThreshold: {{ .Values.livenessProbe.successThreshold }}
failureThreshold: {{ .Values.livenessProbe.failureThreshold }}
exec:
command:
- /bin/sh
- -c
- >
nc -z localhost {{ .Values.env.open.SERVER_PORT }}
&& curl -s --fail localhost:{{ .Values.env.open.MANAGEMENT_SERVER_PORT }}/actuator/health
resources:
{{ toYaml .Values.resources | indent 12 }}
volumeMounts:
- name: host-time
readOnly: true
mountPath: /etc/localtime
- mountPath: /Charts
name: data
{{- if not (empty .Values.persistence.subPath) }}
subPath: {{ .Values.persistence.subPath }}
{{- end }}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: default
serviceAccount: default
securityContext: {}
schedulerName: default-scheduler
{{- with .Values.nodeSelector }}
nodeSelector:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.affinity }}
affinity:
{{ toYaml . | indent 8 }}
{{- end }}
{{- with .Values.tolerations }}
tolerations:
{{ toYaml . | indent 8 }}
{{- end }}

View file

@ -0,0 +1,41 @@
{{- if .Values.service.enabled }}
kind: Service
apiVersion: v1
metadata:
name: {{ .Release.Name }}
labels:
{{ include "service.labels.kubesphere" . | indent 4 }}
annotations:
kubesphere.io/creator: {{ .Values.kubesphere.app.creator }}
kubesphere.io/serviceType: {{ .Values.kubesphere.app.serviceType | quote }}
{{- if .Values.kubesphere.app.ingress }}
service.beta.kubernetes.io/qingcloud-load-balancer-eip-ids: ''
service.beta.kubernetes.io/qingcloud-load-balancer-type: '0'
{{- end }}
servicemesh.kubesphere.io/enabled: '{{ .Values.kubesphere.app.servicemesh }}'
spec:
ports:
- name: http-{{ .Values.service.port }}
protocol: TCP
port: {{ .Values.service.port }}
targetPort: {{ .Values.service.port }}
{{- if not (empty .Values.service.nodePort) }}
nodePort: {{ .Values.service.nodePort }}
{{- end }}
{{- if not (empty .Values.deployment.managementPort) }}
- name: http-{{ .Values.deployment.managementPort }}
protocol: TCP
port: {{ .Values.deployment.managementPort }}
targetPort: {{ .Values.deployment.managementPort }}
{{- if not (empty .Values.deployment.nodePort) }}
nodePort: {{ .Values.deployment.nodePort }}
{{- end }}
{{- end }}
selector:
{{ include "service.labels.kubesphere" . | indent 4 }}
type: {{ .Values.service.type | quote }}
sessionAffinity: None
ipFamilies:
- IPv4
ipFamilyPolicy: SingleStack
{{- end }}

View file

@ -0,0 +1,137 @@
## 实例运行数量
replicaCount: 1
## 设置默认的 image、imageTag 和 imagePullPolicy。
image:
repository: harbor.k8s9.com/k8s9-skyer-ebc/skyer-channel
pullPolicy: IfNotPresent
deployment:
managementPort: 8301
nodePort:
kubesphere:
app:
name: ebc
version: v1
creator: admin
servicemesh: true
# statelessservice statefulservice
serviceType: statelessservice
ingress: false
## Deployment 更新策略
deploymentUpdate:
type: RollingUpdate
maxUnavailable: 25%
maxSurge: 25%
## Pod 节点分配
## ref: https://kubernetes.io/docs/user-guide/node-selection/
##
nodeSelector: {}
tolerations: []
affinity: {}
## 实例运行时的环境变量
env:
open:
# 本实例服务端口
SERVER_PORT: 8300
# 本实例管理端口
MANAGEMENT_SERVER_PORT: 8301
# 是否启用配置中心
SPRING_CLOUD_CONFIG_ENABLED: false
# 配置中心地址
SPRING_CLOUD_CONFIG_URI: http://skyer-config:8010
# Redis 主机地址
SPRING_REDIS_HOST: skyer-redis
# Redis 端口
SPRING_REDIS_PORT: 6379
# Redis db 固定数据不可更改
SPRING_REDIS_DATABASE: 1
# 数据库连接地址
SPRING_DATASOURCE_URL: jdbc:mysql://skyer-mysql:3306/skyer_channel?useUnicode=true&characterEncoding=utf-8&useSSL=false&useInformationSchema=true&remarks=true&serverTimezone=Asia/Shanghai
# 数据库用户名
SPRING_DATASOURCE_USERNAME: root
# 数据库密码
SPRING_DATASOURCE_PASSWORD: 123456
# 注册服务地址
EUREKA_CLIENT_SERVICEURL_DEFAULTZONE: http://skyer-register:8000/eureka/
EUREKA_INSTANCE_PREFER_IP_ADDRESS: true
# 项目级API是否必须检查项目参数
SKYER_GATEWAY_FILTER_COMMON_REQUEST_CHECK_PROJECT: true
# 组织级API是否必须检查组织参数
SKYER_GATEWAY_FILTER_COMMON_REQUEST_CHECK_ORGANIZATION: true
# 是否启用标准的权限检查
SKYER_GATEWAY_FILTER_COMMON_REQUEST_ENABLE: true
# 是否统计API访问情况
SKYER_GATEWAY_FILTER_COLLECT_SPAN_ENABLED: true
# 是否打印 JWT
SKYER_GATEWAY_HELPER_ENABLE_JWT_LOG: false
# 主键加密配置 encrypt(主键加密) to_string(主键变字符串类型) do_nothing(关闭加密)
SKYER_REQUEST_ENCRYPT_MODE: encrypt
LOG_LEVEL: info
SKYER_GATEWAY_AUTHENTICATE_REDIS: true
# 百分比使用物理内存,预留一部分用于堆外内存以及外部程序
JAVA_OPTS: >-
-XX:MaxRAMPercentage=80.0
## Skywalking 配置参数
# SKYWALKING_OPTS: >-
# -javaagent:/agent/skywalking-agent.jar
# -Dskywalking.agent.application_code=asgard-service
# -Dskywalking.agent.sample_n_per_3_secs=-1
# -Dskywalking.collector.backend_service=oap.skywalking:11800
## Liveness 和 Readiness 探针相关配置
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
livenessProbe:
initialDelaySeconds: 300
periodSeconds: 30
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 3
readinessProbe:
initialDelaySeconds: 300
periodSeconds: 15
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 3
## 资源请求和限制相关配置
## ref: http://kubernetes.io/docs/user-guide/compute-resources/
##
resources:
limits:
cpu: 900m
memory: 2Gi
requests:
cpu: 100m
memory: 2Gi
## service 相关设置
## ref: http://kubernetes.io/docs/user-guide/services/
##
service:
enabled: true
# LoadBalancer ClusterIP
type: ClusterIP
port: 8300
nodePort:
persistence:
enabled: false
## A manually managed Persistent Volume and Claim
## Requires persistence.enabled: true
## If defined, PVC must be created manually before volume will be bound
# existingClaim:
# subPath:

View file

@ -0,0 +1,6 @@
FROM registry.cn-shanghai.aliyuncs.com/c7n/javabase:0.10.0
RUN mkdir /skyer && chown -R www-data:www-data /skyer
COPY --chown=www-data:www-data app.jar /skyer/skyer-channel.jar
WORKDIR /skyer
USER 33
CMD java $JAVA_OPTS $SKYWALKING_OPTS -jar /skyer/skyer-channel.jar

View file

@ -0,0 +1,13 @@
#!/usr/bin/env bash
mkdir -p target
if [ ! -f target/skyer-tool-liquibase.jar ]
then
curl https://nexus.skyer.com.cn/repository/skyer-release/io/skyer/skyer-tool-liquibase/0.8.1.RELEASE/skyer-tool-liquibase-0.8.1.RELEASE.jar -o target/skyer-tool-liquibase.jar
fi
java -Dspring.datasource.url="jdbc connection url" \
-Dspring.datasource.username=username \
-Dspring.datasource.password=password \
-Ddata.drop=false -Ddata.init=init \
-Ddata.dir=src/main/resources \
-jar target/skyer-tool-liquibase.jar

312
skyer-channel/pom.xml Normal file
View file

@ -0,0 +1,312 @@
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.skyer</groupId>
<artifactId>skyer-parent</artifactId>
<version>1.0.0-SNAPSHOT</version>
</parent>
<artifactId>skyer-channel</artifactId>
<dependencies>
<!-- skyer starter -->
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-core</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-mybatis-mapper</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-export</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-feign-replay</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-config-client</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-metric</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-keyencrypt</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-saga</artifactId>
</dependency>
<!-- skyer boot -->
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-iam</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-platform</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-message</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-scheduler</artifactId>
</dependency>
<!-- 个性化插件boot-->
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-customize</artifactId>
</dependency>
<!-- api 客制化 -->
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-api-customize</artifactId>
</dependency>
<!-- 使用 api 客制化时,依赖的项目必须自行引入 tools.jar 热部署时用到,同时,需要在打包时将其打包进去 includeSystemScope=true -->
<!-- <dependency>-->
<!-- <groupId>jdk.tools</groupId>-->
<!-- <artifactId>jdk.tools</artifactId>-->
<!-- <version>1.8</version>-->
<!-- <scope>system</scope>-->
<!-- <systemPath>${env.JAVA_HOME}/lib/tools.jar</systemPath>-->
<!-- </dependency>-->
<!-- db -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.oracle</groupId>
<artifactId>ojdbc7</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.microsoft.sqlserver</groupId>
<artifactId>sqljdbc4</artifactId>
<optional>true</optional>
</dependency>
<!-- spring-boot -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-undertow</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-websocket</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>retrofit</artifactId>
</dependency>
<dependency>
<groupId>com.squareup.retrofit2</groupId>
<artifactId>converter-jackson</artifactId>
</dependency>
<!-- commons -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-collections4</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
<!-- jsr310 时间支持 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-typehandlers-jsr310</artifactId>
<version>1.0.2</version>
</dependency>
<!-- test -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<!-- spock测试相关依赖 -->
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-core</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.spockframework</groupId>
<artifactId>spock-spring</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib-nodep</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
</dependency>
<!-- register and config -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-config-client</artifactId>
<optional>true</optional>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
</dependencies>
<build>
<finalName>app</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.properties</include>
</includes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/**</include>
</includes>
<excludes>
<exclude>saml/*.jks</exclude>
</excludes>
<filtering>true</filtering>
</resource>
<resource>
<directory>src</directory>
<includes>
<include>**/*.sh</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>xlsx</nonFilteredFileExtension>
<nonFilteredFileExtension>xls</nonFilteredFileExtension>
<nonFilteredFileExtension>ttf</nonFilteredFileExtension>
<nonFilteredFileExtension>ttc</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>1.8</source>
<target>1.8</target>
<encoding>${project.build.sourceEncoding}</encoding>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<configuration>
<skip>${maven.javadoc.skip}</skip>
</configuration>
<executions>
<execution>
<id>attach-javadocs</id>
<phase>package</phase>
<goals>
<goal>jar</goal>
</goals>
<configuration>
<additionalOptions>
<additionalOption>
-Xdoclint:none
</additionalOption>
</additionalOptions>
</configuration>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<skip>false</skip>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<configuration>
<includes>
<include>**/*Test.java</include>
<include>**/*Spec.java</include>
</includes>
</configuration>
</plugin>
</plugins>
</build>
</project>

View file

@ -0,0 +1,55 @@
package org.skyer.autoconfigure.channel;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import org.skyer.channel.infra.properties.DataHierarchyProperties;
import org.skyer.channel.infra.properties.ChannelProperties;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
import org.springframework.scheduling.annotation.EnableAsync;
import org.skyer.resource.annoation.EnableSkyerResourceServer;
import org.skyer.core.jackson.annotation.EnableObjectMapper;
import org.skyer.core.util.CommonExecutor;
/**
* @author bojiangzhou 2018/10/25
*/
@ComponentScan(value = {"org.hippius.wd", "org.skyer.channel.api", "org.skyer.channel.app",
"org.skyer.channel.config", "org.skyer.channel.domain", "org.skyer.channel.infra"})
@EnableFeignClients({"org.skyer.channel", "org.skyer", "org.skyer.plugin"})
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@EnableSkyerResourceServer
@EnableObjectMapper
@EnableAsync
@EnableConfigurationProperties({ChannelProperties.class, DataHierarchyProperties.class})
public class ChannelAutoConfiguration {
/**
* 通用线程池
*/
@Bean
@Qualifier("commonAsyncTaskExecutor")
public ThreadPoolExecutor commonAsyncTaskExecutor() {
int coreSize = CommonExecutor.getCpuProcessors();
int maxSize = coreSize * 8;
ThreadPoolExecutor executor =
new ThreadPoolExecutor(coreSize, maxSize, 30, TimeUnit.MINUTES, new LinkedBlockingQueue<>(16),
new ThreadFactoryBuilder().setNameFormat("CommonExecutor-%d").build(),
new ThreadPoolExecutor.CallerRunsPolicy());
CommonExecutor.displayThreadPoolStatus(executor, "HpfmCommonExecutor");
CommonExecutor.hookShutdownThreadPool(executor, "HpfmCommonExecutor");
return executor;
}
}

View file

@ -0,0 +1,16 @@
package org.skyer.autoconfigure.channel;
import java.lang.annotation.*;
import org.springframework.context.annotation.Import;
/**
* @author bojiangzhou 2018/10/25
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(ChannelAutoConfiguration.class)
public @interface EnableSkyerChannel {
}

View file

@ -0,0 +1,25 @@
package org.skyer.channel;
import org.skyer.autoconfigure.channel.EnableSkyerChannel;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
/**
* Skyer平台服务启动类 主要包含平台通用功能
*
* @author xianzhi.chen@hand-china.com 2018年6月7日下午6:09:44
*/
@EnableSkyerChannel
@EnableDiscoveryClient
@SpringBootApplication
public class ChannelApplication {
public static void main(String[] args) {
try {
SpringApplication.run(ChannelApplication.class, args);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,92 @@
package org.skyer.channel.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import org.skyer.channel.api.dto.DealerDTO;
import org.skyer.channel.api.dto.DealerListDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.config.ChannelSwaggerApiConfig;
import org.skyer.channel.domain.entity.Dealer;
import org.skyer.channel.domain.service.DealerService;
import org.skyer.channel.domain.vo.DealerVO;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* @author: lzh
* @date: 2021-06-17
* @description: 经销商
*/
@Api(tags = ChannelSwaggerApiConfig.DEALER_MANAGE)
@RestController("dealerController.v1")
@RequestMapping("/v1/channel/dealer")
public class DealerController {
@Autowired
private DealerService dealerService;
@ApiOperation("新增经销商")
@PostMapping("/add")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> addDealer(@Valid @RequestBody Dealer dealer) {
return dealerService.addDealer(dealer) ? Results.success() : Results.error();
}
@ApiOperation(value = "分页获取信息")
@GetMapping("/list")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Page<DealerVO>> pageList( DealerListDTO dealerListDTO, PageRequest pageRequest) {
return Results.success( dealerService.pageDealerList(pageRequest, dealerListDTO));
}
@ApiOperation(value = "修改经销商信息")
@PostMapping("/update")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> updatDealer(@RequestBody DealerDTO dealerDTO) {
return dealerService.updateDealer (dealerDTO)? Results.success():Results.error();
}
@ApiOperation(value = "删除经销商信息")
@PostMapping("/delete")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> deleteById(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return dealerService.deleteById(id)? Results.success():Results.error();
}
@ApiOperation(value = "根据Id获取经销商信息信息")
@GetMapping("/details")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Dealer> getDealerDetail(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(dealerService.getDealerDetail(id));
}
@ApiOperation("禁用 OR 启用")
@PostMapping("/operation")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> operation(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("true OR false") @RequestParam(value = "flag") Boolean flag) {
return dealerService.operation(id, flag) ? Results.success() : Results.error();
}
@ApiOperation("批量删除数据")
@PostMapping("/deletes")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deletes(@ApiParam("批量删除集合") @RequestBody @Encrypt ShopDeleteDTO shopDeleteDTO) {
return dealerService.deletes(shopDeleteDTO) ? Results.success() : Results.error();
}
}

View file

@ -0,0 +1,52 @@
package org.skyer.channel.api.controller.v1;
import org.skyer.channel.domain.service.GroupService;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.channel.domain.entity.Group;
import org.skyer.channel.domain.repository.GroupRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.skyer.mybatis.helper.SecurityTokenHelper;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.mybatis.pagehelper.annotation.SortDefault;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.mybatis.pagehelper.domain.Sort;
import org.skyer.swagger.annotation.Permission;
import io.swagger.annotations.ApiOperation;
import springfox.documentation.annotations.ApiIgnore;
/**
* 集团组织 API
*
* @author zhanglongbing@ebc.com 2021-12-21
*/
@RestController("groupController.v1")
@RequestMapping("/v1/groups")
public class GroupController extends BaseController {
@Autowired
private GroupService groupService;
@ApiOperation(value = "获取默认集团")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@GetMapping("/default")
public ResponseEntity<Group> getDefaultGroups() {
Group group = groupService.getDefaultGroups();
return Results.success(group);
}
@ApiOperation(value = "修改默认集团信息")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping("/update")
public ResponseEntity<Group> updateDefaultGroups(@RequestBody Group group) {
groupService.updateDefaultGroups(group);
return Results.success(group);
}
}

View file

@ -0,0 +1,113 @@
package org.skyer.channel.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import org.skyer.channel.api.dto.*;
import org.skyer.channel.config.ChannelSwaggerApiConfig;
import org.skyer.channel.domain.service.OnlineShopService;
import org.skyer.channel.domain.vo.OnlineShopDetailVO;
import org.skyer.channel.domain.vo.OnlineShopSettingVO;
import org.skyer.channel.domain.vo.OnlineShopVO;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* 网店管理
*
* @author lixiaoyang
* @date 2021/6/16 15:19
*/
@Api(tags = ChannelSwaggerApiConfig.ONLINE_SHOP_MANAGE)
@RestController("onlineShopController.v1")
@RequestMapping("/v1/online/shop")
public class OnlineShopController {
@Autowired
private OnlineShopService onlineShopService;
@ApiOperation("查询列表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/page")
public ResponseEntity<Page<OnlineShopVO>> showPage(OnlineShopShowDTO onlineShopShowDTO, PageRequest pageRequest) {
return Results.success(onlineShopService.getPage(onlineShopShowDTO, pageRequest));
}
@ApiOperation("查询详情")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/details")
public ResponseEntity<OnlineShopDetailVO> showDetails(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(onlineShopService.getDetails(id));
}
@ApiOperation("查询详情")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/details/by/code")
public ResponseEntity<OnlineShopDetailVO> showDetailsByCode(@ApiParam("编码") @RequestParam(value = "code") String code) {
return Results.success(onlineShopService.getDetailsByCode(code));
}
@ApiOperation("新增与修改")
@PostMapping("/save")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> save(@Valid @RequestBody @Encrypt OnlineShopDTO onlineShopDTO) {
return onlineShopService.save(onlineShopDTO) ? Results.success() : Results.error();
}
@ApiOperation("网店设置")
@PostMapping("/setting")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> setting(@Valid @RequestBody @Encrypt OnlineShopSettingDTO onlineShopSettingDTO) {
return onlineShopService.setting(onlineShopSettingDTO) ? Results.success() : Results.error();
}
@ApiOperation("删除数据")
@PostMapping("/delete")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> delete(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("当前版本号") @RequestParam(value = "objectVersionNumber") Long objectVersionNumber) {
return onlineShopService.delete(id, objectVersionNumber) ? Results.success() : Results.error();
}
@ApiOperation("禁用 OR 启用")
@PostMapping("/operation")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> operation(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("true OR false") @RequestParam(value = "flag") Boolean flag,
@ApiParam("当前版本号") @RequestParam(value = "objectVersionNumber") Long objectVersionNumber) {
return onlineShopService.operation(id, flag, objectVersionNumber) ? Results.success() : Results.error();
}
@ApiOperation("清除缓存")
@PostMapping("/delete/cache")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deleteCache(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
onlineShopService.deleteCache(id);
return Results.success();
}
@ApiOperation("查询设置")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/get/setting")
public ResponseEntity<OnlineShopSettingVO> getSetting(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(onlineShopService.getSetting(id));
}
@ApiOperation("批量删除数据")
@PostMapping("/deletes")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deletes(@ApiParam("批量删除集合") @RequestBody @Encrypt ShopDeleteDTO shopDeleteDTO) {
return onlineShopService.deletes(shopDeleteDTO) ? Results.success() : Results.error();
}
}

View file

@ -0,0 +1,92 @@
package org.skyer.channel.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import org.skyer.channel.api.dto.PhysicalShopDTO;
import org.skyer.channel.api.dto.PhysicalShopShowDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.config.ChannelSwaggerApiConfig;
import org.skyer.channel.domain.service.PhysicalShopService;
import org.skyer.channel.domain.vo.PhysicalShopDetailVO;
import org.skyer.channel.domain.vo.PhysicalShopVO;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* 门店管理
*
* @author lixiaoyang
* @date 2021/6/16 15:19
*/
@Api(tags = ChannelSwaggerApiConfig.PHYSICAL_SHOP_MANAGE)
@RestController("physicalShopController.v1")
@RequestMapping("/v1/physical/shop")
public class PhysicalShopController {
@Autowired
private PhysicalShopService physicalShopService;
@ApiOperation("查询列表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/page")
public ResponseEntity<Page<PhysicalShopVO>> showPage(PhysicalShopShowDTO physicalShopShowDTO, PageRequest pageRequest) {
return Results.success(physicalShopService.getPage(physicalShopShowDTO, pageRequest));
}
@ApiOperation("查询详情")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/details")
public ResponseEntity<PhysicalShopDetailVO> showDetails(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(physicalShopService.getDetails(id));
}
@ApiOperation("新增与修改")
@PostMapping("/save")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> save(@Valid @RequestBody @Encrypt PhysicalShopDTO physicalShop) {
return physicalShopService.save(physicalShop) ? Results.success() : Results.error();
}
@ApiOperation("删除数据")
@PostMapping("/delete")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> delete(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("当前版本号") @RequestParam(value = "objectVersionNumber") Long objectVersionNumber) {
return physicalShopService.delete(id, objectVersionNumber) ? Results.success() : Results.error();
}
@ApiOperation("禁用 OR 启用")
@PostMapping("/operation")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> operation(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("true OR false") @RequestParam(value = "flag") Boolean flag,
@ApiParam("当前版本号") @RequestParam(value = "objectVersionNumber") Long objectVersionNumber) {
return physicalShopService.operation(id, flag, objectVersionNumber) ? Results.success() : Results.error();
}
@ApiOperation("清除缓存")
@PostMapping("/delete/cache")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deleteCache(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
physicalShopService.deleteCache(id);
return Results.success();
}
@ApiOperation("批量删除数据")
@PostMapping("/deletes")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deletes(@ApiParam("批量删除集合") @RequestBody @Encrypt ShopDeleteDTO shopDeleteDTO) {
return physicalShopService.deletes(shopDeleteDTO) ? Results.success() : Results.error();
}
}

View file

@ -0,0 +1,116 @@
package org.skyer.channel.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
import org.skyer.channel.api.dto.SalesOrganizationDTO;
import org.skyer.channel.api.dto.SalesOrganizationListDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.config.ChannelSwaggerApiConfig;
import org.skyer.channel.domain.entity.SalesOrganization;
import org.skyer.channel.domain.service.SalesOrganizationService;
import org.skyer.channel.domain.vo.ListOfTreeVO;
import org.skyer.channel.domain.vo.SalesOrganizationByTenantIdVO;
import org.skyer.channel.domain.vo.SalesOrganizationListVO;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* <p>
* 销售组织
* </p>
*
* @author lzh
* @since 2021-06-18
*/
@RestController("SalesOrganizationController.v1")
@RequestMapping(value = "/v1/channel/salesOrganization")
@Api(tags = ChannelSwaggerApiConfig.SALE_ORGANIZATION_MANAGE)
public class SalesOrganizationController {
@Autowired
private SalesOrganizationService salesOrganizationService;
@ApiOperation(value = "分页获取信息")
@GetMapping("/list")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Page<SalesOrganizationListVO>> pageSalesOrganizationList(@Encrypt SalesOrganizationListDTO salesOrganizationListDTO, PageRequest pageRequest) {
return Results.success( salesOrganizationService.pageSalesOrganizationList(pageRequest,salesOrganizationListDTO));
}
@ApiOperation(value = "修改销售组织")
@PostMapping("/update")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> updatSalesOrganization(@Encrypt @RequestBody SalesOrganizationDTO salesOrganizationDTO) {
return salesOrganizationService.updateSalesOrganization (salesOrganizationDTO)? Results.success(): Results.error();
}
@ApiOperation(value = "新增销售组织")
@PostMapping("/add")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> createLabel(@Encrypt @RequestBody SalesOrganization salesOrganization) {
return salesOrganizationService.createSalesOrganization (salesOrganization)?Results.success() : Results.error();
}
@ApiOperation(value = "删除销售组织")
@PostMapping("/delete")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> deleteById(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return salesOrganizationService.deleteById(id) ? Results.success() : Results.error();
}
@ApiOperation(value = "根据Id获取销售组织信息")
@GetMapping("/details")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<SalesOrganization> getSalesOrganizationDetail(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(salesOrganizationService.getSalesOrganizationDetail(id));
}
@ApiOperation("禁用 OR 启用")
@PostMapping("/operation")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> operation(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("true OR false") @RequestParam(value = "flag") Boolean flag) {
return salesOrganizationService.operation(id, flag) ? Results.success() : Results.error();
}
@ApiOperation(value = "根据租户Id获取销售组织信息")
@GetMapping("/getByTenantId")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<List<SalesOrganizationByTenantIdVO>> getsalesOrganizationByTenantId(@ApiParam("租户ID") @RequestParam(value = "tenantId") @Encrypt Long tenantId) {
return Results.success(salesOrganizationService.getsalesOrganizationByTenantId(tenantId));
}
@ApiOperation("批量删除数据")
@PostMapping("/deletes")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deletes(@ApiParam("批量删除集合") @RequestBody @Encrypt ShopDeleteDTO shopDeleteDTO) {
return salesOrganizationService.deletes(shopDeleteDTO) ? Results.success() : Results.error();
}
@ApiOperation("公司列表树")
@GetMapping("/listOfTree")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<List<ListOfTreeVO>> listOfTree(@ApiParam("true") @RequestParam(value = "flag") Boolean flag) {
List<ListOfTreeVO> list = salesOrganizationService.listOfTree(flag);
return Results.success(list);
}
}

View file

@ -0,0 +1,47 @@
package org.skyer.channel.api.controller.v1;
import feign.ResponseMapper;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.skyer.channel.api.dto.ChannelSaleOrderDTO;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.skyer.channel.api.dto.QueryShopListDTO;
import org.skyer.channel.config.ChannelSwaggerApiConfig;
import org.skyer.channel.domain.service.saga.ShopService;
import org.skyer.channel.domain.vo.ShopListVO;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.swagger.annotation.Permission;
import java.util.List;
@RestController("shopController.v1")
@RequestMapping(value = "/v1/shop")
@Api(tags = ChannelSwaggerApiConfig.SHOP_MANAGE)
public class ShopController {
@Autowired
private ShopService shopService;
@ApiOperation("查询所有店铺")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/page")
public ResponseEntity<Page<ShopListVO>> queryShop(@RequestBody QueryShopListDTO dto) {
return Results.success(shopService.queryShop(dto));
}
@ApiOperation("店铺销售表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/channel-order-report")
public ResponseEntity<List<ChannelSaleOrderVO>> queryChannelOrderSaleReport(@RequestBody ChannelSaleOrderDTO dto) {
List<ChannelSaleOrderVO> channelSaleOrderVOS = shopService.queryChannelOrderSaleReport(dto);
return Results.success(channelSaleOrderVOS);
}
}

View file

@ -0,0 +1,102 @@
package org.skyer.channel.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
import javax.validation.Valid;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.api.dto.WarehouseDTO;
import org.skyer.channel.api.dto.WarehouseListDTO;
import org.skyer.channel.config.ChannelSwaggerApiConfig;
import org.skyer.channel.domain.entity.Warehouse;
import org.skyer.channel.domain.service.WarehouseService;
import org.skyer.channel.domain.vo.WarehouseListVO;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.mybatis.pagehelper.annotation.SortDefault;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.mybatis.pagehelper.domain.Sort;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* <p>
* 渠道仓库管理
* </p>
*
* @author lzh
* @since 2021-06-18
*/
@RestController("WarehouseController.v1")
@RequestMapping(value = "/v1/channel/warehouse")
@Api(tags = ChannelSwaggerApiConfig.WAREHOUSE_MANAGE)
public class WarehouseController {
@Autowired
private WarehouseService warehouseService;
@ApiOperation(value = "分页获取渠道仓库信息")
@GetMapping("/list")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Page<WarehouseListVO>> pageList( WarehouseListDTO warehouseListDTO, PageRequest pageRequest) {
return Results.success( warehouseService.pageWarehouseList(pageRequest,warehouseListDTO));
}
@ApiOperation(value = "修改渠道仓库")
@PostMapping("/update")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> updatWarehouse(@RequestBody WarehouseDTO warehouse) {
return warehouseService.updateWarehouse (warehouse)? Results.success() : Results.error();
}
@ApiOperation(value = "新增渠道仓库")
@PostMapping("/add")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Warehouse> createLabel(@RequestBody Warehouse warehouse) {
return warehouseService.createWarehouse (warehouse) ? Results.success() : Results.error() ;
}
@ApiOperation(value = "删除渠道仓库")
@PostMapping("/delete")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> deleteById(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return warehouseService.deleteById(id) ? Results.success() : Results.error() ;
}
@ApiOperation(value = "根据Id获取渠道仓库信息")
@GetMapping("/details")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Warehouse> getWarehouseDetail(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(warehouseService.getWarehouseDetail(id));
}
@ApiOperation("禁用 OR 启用")
@PostMapping("/operation")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Void> operation(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id,
@ApiParam("true OR false") @RequestParam(value = "flag") Boolean flag) {
return warehouseService.operation(id, flag) ? Results.success() : Results.error();
}
@ApiOperation("批量删除数据")
@PostMapping("/deletes")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Void> deletes(@ApiParam("批量删除集合") @RequestBody @Encrypt ShopDeleteDTO shopDeleteDTO) {
return warehouseService.deletes(shopDeleteDTO) ? Results.success() : Results.error();
}
}

View file

@ -0,0 +1,31 @@
package org.skyer.channel.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.Date;
import java.util.List;
@Data
public class ChannelSaleOrderDTO {
@ApiModelProperty("开始时间")
private Date startDate;
@ApiModelProperty("结束时间")
private Date endDate;
@ApiModelProperty("渠道")
private String channel;
@ApiModelProperty("店铺名")
@Encrypt
private List<Long> storeIds;
@ApiModelProperty("网店类型")
private String storeType;
@ApiModelProperty("所属公司")
private String organization;
}

View file

@ -0,0 +1,47 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-17
* @description:
*/
@Data
@ApiModel("经销商传参")
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DealerDTO {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty(value = "经销商编码")
@NotNull
private String dealerCode;
@ApiModelProperty(value = "经销商名称")
@NotNull
private String dealerName;
@ApiModelProperty(value = "联系人姓名")
@NotNull
private String contactName;
@ApiModelProperty(value = "联系人电话")
@NotNull
private String contactPhone;
@ApiModelProperty(value = "描述")
private String description;
}

View file

@ -0,0 +1,27 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author: lzh
* @date: 2021-06-18
* @description:
*/
@ApiModel("经销商列表请求")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class DealerListDTO {
@ApiModelProperty(value = "经销商名称")
private String dealerName;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
}

View file

@ -0,0 +1,68 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import org.skyer.boot.platform.lov.annotation.LovValue;
import org.skyer.starter.keyencrypt.core.Encrypt;
@ApiModel("网店入参类")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OnlineShopDTO {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("网店名称")
@NotNull
private String name;
@ApiModelProperty("渠道类型")
@NotNull
private String channelTypeCode;
@ApiModelProperty("网店类型")
@NotNull
private String onlineStoreTypeCode;
@ApiModelProperty("负责人")
@NotNull
private String manager;
@ApiModelProperty("网店地址(url)")
@NotNull
private String url;
@ApiModelProperty("销售组织")
@NotNull
@Encrypt
private Long salesOrganizingId;
@ApiModelProperty("发票种类")
@NotNull
private String invoiceTypeCode;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("渠道仓使用状态 true是")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty("网店关联的门店id")
@Encrypt
private Long relationPhysicalShopId;
@ApiModelProperty("版本号")
private Long objectVersionNumber;
}

View file

@ -0,0 +1,32 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import org.skyer.starter.keyencrypt.core.Encrypt;
@ApiModel("网店设置入参类")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OnlineShopSettingDTO {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("自动确认发货(天)")
private Integer autoConfirmDay;
@ApiModelProperty("自动下载商品 true是 false否")
private Boolean autoDownloadGoods;
@ApiModelProperty("自动同步库存 true是 false否")
private Boolean autoSyncInventory;
@ApiModelProperty("版本号")
private Long objectVersionNumber;
}

View file

@ -0,0 +1,31 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("网店查看入参类")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class OnlineShopShowDTO {
@ApiModelProperty("网店名称")
private String name;
@ApiModelProperty("网店编码")
private String code;
@ApiModelProperty("渠道类型")
private String channelTypeCode;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
@ApiModelProperty("销售组织名称")
private String orgName;
@ApiModelProperty("网店类型")
private String onlineStoreTypeCode;
}

View file

@ -0,0 +1,76 @@
package org.skyer.channel.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.starter.keyencrypt.core.Encrypt;
@Data
public class PhysicalShopDTO extends AuditDomain {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("租户ID(入参不填)")
private Long tenantId;
@ApiModelProperty("门店名称")
@NotNull
private String name;
@ApiModelProperty("门店类型编码")
@NotNull
private String typeCode;
@ApiModelProperty("负责人")
@NotNull
private String manager;
@ApiModelProperty("销售组织")
@NotNull
@Encrypt
private Long salesOrganizingId;
@ApiModelProperty("发票种类编码")
@NotNull
private String invoiceTypeCode;
@ApiModelProperty("详细地址")
private String address;
@ApiModelProperty("国家ID")
private Long countryId;
@ApiModelProperty("省ID")
private Long provinceId;
@ApiModelProperty("市ID")
private Long cityId;
@ApiModelProperty("县ID")
private Long countyId;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("状态 true启用")
private Boolean status;
@ApiModelProperty("渠道仓使用状态")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty("删除标识 true删除")
private Boolean deleteFlag;
@ApiModelProperty(value = "o2o自提门店")
private Boolean selfPickupFlag;
}

View file

@ -0,0 +1,29 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("门店设置入参类")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class PhysicalShopShowDTO {
@ApiModelProperty("网店名称")
private String name;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean channelWarehouseStatus;
@ApiModelProperty("销售组织名称")
private String orgName;
@ApiModelProperty("门店类型")
private String typeCode;
@ApiModelProperty("o2o自提门店")
private Boolean selfPickupFlag;
@ApiModelProperty("负责人")
private String manager;
}

View file

@ -0,0 +1,38 @@
package org.skyer.channel.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
@Data
public class QueryShopListDTO extends PageRequest {
@ApiModelProperty("店铺名称")
private String name;
@ApiModelProperty("店铺编码")
private String code;
@ApiModelProperty("渠道编码")
private String channelTypeCode;
@ApiModelProperty("o2o销售店铺id")
@Encrypt
private Long o2oSalesStoreId;
@ApiModelProperty(value = "网店或门店", hidden = true)
private String categoryType;
@ApiModelProperty(value = "店铺id", hidden = true)
@Encrypt
private Long id;
@ApiModelProperty(value = "网店关联的门店id", hidden = true)
@Encrypt
private Long relationPhysicalShopId;
@ApiModelProperty(value = "是否o2o自提店铺", hidden = true)
private Boolean selfPickupFlag;
}

View file

@ -0,0 +1,62 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-21
* @description:
*/
@ApiModel("销售组织请求参数")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class SalesOrganizationDTO {
@ApiModelProperty("表ID主键供其他表做外键")
@Id
@GeneratedValue
@Encrypt
private Long id;
@ApiModelProperty(value = "组织编码")
private String orgCode;
@ApiModelProperty(value = "组织名称")
private String orgName;
@ApiModelProperty(value = "租户ID")
@Encrypt
private Long tenantId;
@ApiModelProperty(value = "营业执照名称")
private String shopPermitName;
@ApiModelProperty(value = "法人姓名")
private String legalPerson;
@ApiModelProperty(value = "统一社会信用代码")
private String uniformSocialCreditCode;
@ApiModelProperty(value = "状态 0启用 1禁用")
private Boolean status;
@ApiModelProperty("删除标识")
private Boolean deleteFlag;
@ApiModelProperty(value = "营业执照")
private String businessLicense;
@ApiModelProperty(value = "所属上级公司")
@Encrypt
private Long pid;
}

View file

@ -0,0 +1,36 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-18
* @description:
*/
@ApiModel("销售组织列表请求参数")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class SalesOrganizationListDTO {
@ApiModelProperty(value = "组织名称")
private String orgName;
@ApiModelProperty(value = "营业执照名称")
private String shopPermitName;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
@ApiModelProperty(value = "所属上级公司")
@Encrypt
private Long pid;
}

View file

@ -0,0 +1,11 @@
package org.skyer.channel.api.dto;
import lombok.Data;
import org.skyer.channel.domain.entity.Shop;
@Data
public class SaveShopDTO {
private Shop shop;
private Boolean flag;
}

View file

@ -0,0 +1,30 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ShopDTO {
@ApiModelProperty("表ID主键供其他表做外键")
private Long id;
@ApiModelProperty("店铺编码")
private String code;
@ApiModelProperty(value = "店铺类别:区分网店还是实体店")
private String categoryType;
@ApiModelProperty(value = "渠道类型")
private String channelTypeCode;
@ApiModelProperty("渠道仓使用状态 true是")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty("租户ID")
private Long tenantId;
}

View file

@ -0,0 +1,19 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
import org.skyer.starter.keyencrypt.core.Encrypt;
@ApiModel("批量删除入参类")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class ShopDeleteDTO {
@ApiModelProperty("主键集合")
@Encrypt
private List<Long> ids;
}

View file

@ -0,0 +1,71 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-21
* @description:
*/
@ApiModel("仓库修改请求参数")
@JsonInclude(JsonInclude.Include.NON_NULL)
@Data
public class WarehouseDTO {
@ApiModelProperty("表ID主键供其他表做外键")
@Id
@GeneratedValue
@Encrypt
private Long id;
@ApiModelProperty(value = "仓库编码")
private String wareCode;
@ApiModelProperty(value = "仓库名称")
private String wareName;
@ApiModelProperty(value = "联系人姓名")
private String contactName;
@ApiModelProperty(value = "联系人电话")
private String contactPhone;
@ApiModelProperty(value = "国家ID")
private Long countryId;
@ApiModelProperty(value = "省ID ")
private Long provinceId;
@ApiModelProperty(value = "市ID ")
private Long cityId;
@ApiModelProperty(value = "县ID")
private Long countyId;
@ApiModelProperty(value = "详细地址 ")
private String address;
@ApiModelProperty(value = "描述")
private String description;
@ApiModelProperty("租户ID")
@Encrypt
private Long tenantId;
@ApiModelProperty("删除标识")
private Boolean deleteFlag;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
}

View file

@ -0,0 +1,27 @@
package org.skyer.channel.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
/**
* @author: lzh
* @date: 2021-06-18
* @description:
*/
@ApiModel("渠道仓库列表请求参数")
@Data
@JsonInclude(JsonInclude.Include.NON_NULL)
public class WarehouseListDTO {
@ApiModelProperty(value = "仓库名称")
private String wareName;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
}

View file

@ -0,0 +1,36 @@
package org.skyer.channel.config;
import org.skyer.common.SkyerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.skyer.core.swagger.SkyerRouteData;
import org.skyer.swagger.annotation.SkyerExtraData;
import org.skyer.swagger.swagger.extra.ExtraData;
import org.skyer.swagger.swagger.extra.ExtraDataManager;
/**
* 服务基本信息
*
* @author gaokuo.dai@hand-china.com 2018年7月20日下午4:49:12
*/
@SkyerExtraData
public class ChannelExtraDataManager implements ExtraDataManager {
@Autowired
private Environment environment;
@Override
public ExtraData getData() {
SkyerRouteData routeData = new SkyerRouteData();
routeData.setName(environment.getProperty("skyer.service.current.name", "schl"));
routeData.setPath(environment.getProperty("skyer.service.current.path", "schl/**"));
routeData.setServiceId(
environment.getProperty("skyer.service.current.service-name", "skyer-channel"));
routeData.setPackages("org.skyer.channel.api");
extraData.put(ExtraData.ZUUL_ROUTE_DATA, routeData);
return extraData;
}
}

View file

@ -0,0 +1,37 @@
package org.skyer.channel.config;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.service.Tag;
import springfox.documentation.spring.web.plugins.Docket;
/**
* <p>
* Swagger Api 描述配置
* </p>
*
* @author qingsheng.chen 2018/7/30 星期一 14:26
*/
@Configuration
public class ChannelSwaggerApiConfig {
public static final String SHOP_MANAGE = "Shop Manage";
public static final String ONLINE_SHOP_MANAGE = "Online Shop Manage";
public static final String PHYSICAL_SHOP_MANAGE = "physical Shop Manage";
public static final String DEALER_MANAGE="Dealer Manage";
public static final String SALE_ORGANIZATION_MANAGE= "SalesOrganization Manage";
public static final String WAREHOUSE_MANAGE="Warehouse Manage";
@Autowired
public ChannelSwaggerApiConfig(Docket docket) {
docket.tags(
new Tag(SHOP_MANAGE, "店铺公共接口"),
new Tag(ONLINE_SHOP_MANAGE, "网店管理"),
new Tag(PHYSICAL_SHOP_MANAGE, "门店管理"),
new Tag(DEALER_MANAGE, "经销商管理"),
new Tag(SALE_ORGANIZATION_MANAGE, "销售组织管理"),
new Tag(WAREHOUSE_MANAGE, "渠道仓库管理")
);
}
}

View file

@ -0,0 +1,77 @@
package org.skyer.channel.domain.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import org.skyer.mybatis.annotation.ModifyAudit;
import org.skyer.mybatis.annotation.MultiLanguage;
import org.skyer.mybatis.annotation.VersionAudit;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* <p>
*
* </p>
*
* @author lzh
* @since 2021-06-17
*/
@VersionAudit
@ModifyAudit
@JsonInclude(JsonInclude.Include.NON_NULL)
@Accessors(chain = true)
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name="channel_dealer")
public class Dealer extends AuditDomain {
public static final String DEALER_NAME ="dealerName";
public static final String STATUS = "status";
public static final String DELETEFLAG="deleteFlag";
@ApiModelProperty("表ID主键供其他表做外键")
@Id
@GeneratedValue
@Encrypt
private Long id;
@ApiModelProperty(value = "经销商编码")
private String dealerCode;
@ApiModelProperty(value = "经销商名称")
@NotNull
private String dealerName;
@ApiModelProperty(value = "联系人姓名")
@NotNull
private String contactName;
@ApiModelProperty(value = "联系人电话")
@NotNull
private String contactPhone;
@ApiModelProperty(value = "描述")
private String description;
@ApiModelProperty("租户ID")
@Encrypt
private Long tenantId;
@ApiModelProperty("删除标识")
private Boolean deleteFlag;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
}

View file

@ -0,0 +1,76 @@
package org.skyer.channel.domain.entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import com.fasterxml.jackson.annotation.JsonInclude;
import javax.validation.constraints.NotBlank;
import org.skyer.mybatis.domain.AuditDomain;
import java.math.BigDecimal;
import org.skyer.mybatis.annotation.ModifyAudit;
import org.skyer.mybatis.annotation.VersionAudit;
import org.skyer.starter.keyencrypt.core.Encrypt;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author linzhuanghuang@ebc.com 2021-09-03 16:54:36
*/
@ApiModel("")
@VersionAudit
@ModifyAudit
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "channel_group")
@Data
public class Group extends AuditDomain {
public static final String FIELD_ID = "id";
public static final String FIELD_GROUP_NAME = "groupName";
public static final String FIELD_GROUP_SHORT_NAME = "groupShortName";
public static final String FIELD_LOGO = "logo";
public static final String FIELD_FAVICON = "favicon";
public static final String FIELD_TENANT_ID = "tenantId";
//
// 业务方法(按public protected private顺序排列)
// ------------------------------------------------------------------------------
//
// 数据库字段
// ------------------------------------------------------------------------------
@ApiModelProperty("")
@Id
@GeneratedValue
@Encrypt
private Long id;
@ApiModelProperty(value = "集团名称")
private String groupName;
@ApiModelProperty(value = "集团简称")
private String groupShortName;
@ApiModelProperty(value = "集团logo")
private String logo;
@ApiModelProperty(value = "集团图标")
private String favicon;
//
// 非数据库字段
// ------------------------------------------------------------------------------
//
// getter/setter
// ------------------------------------------------------------------------------
}

View file

@ -0,0 +1,89 @@
package org.skyer.channel.domain.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;
import java.util.List;
import org.skyer.mybatis.annotation.ModifyAudit;
import org.skyer.mybatis.annotation.MultiLanguage;
import org.skyer.mybatis.annotation.VersionAudit;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* <p>
*
* </p>
*
* @author lzh
* @since 2021-06-18
*/
@VersionAudit
@ModifyAudit
@JsonInclude(JsonInclude.Include.NON_NULL)
@Accessors(chain = true)
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name="channel_sales_organization")
public class SalesOrganization extends AuditDomain {
@ApiModelProperty("表ID主键供其他表做外键")
@Id
@GeneratedValue
@Encrypt
private Long id;
@ApiModelProperty(value = "公司编码")
private String orgCode;
@ApiModelProperty(value = "公司名称")
@NotNull
private String orgName;
@ApiModelProperty(value = "租户ID")
@Encrypt
private Long tenantId;
@ApiModelProperty(value = "营业执照名称")
@NotNull
private String shopPermitName;
@ApiModelProperty(value = "法人姓名")
private String legalPerson;
@ApiModelProperty(value = "统一社会信用代码")
private String uniformSocialCreditCode;
@ApiModelProperty(value = "状态 0启用 1禁用")
private Boolean status;
@ApiModelProperty("删除标识")
private Boolean deleteFlag;
@ApiModelProperty(value = "营业执照")
private String businessLicense;
@ApiModelProperty(value = "所属上级公司")
@Encrypt
private Long pid;
@ApiModelProperty(value = "所属集团")
@Encrypt
private Long groupId;
@Transient
private List<SalesOrganization> children;
}

View file

@ -0,0 +1,133 @@
package org.skyer.channel.domain.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import org.skyer.mybatis.annotation.ModifyAudit;
import org.skyer.mybatis.annotation.VersionAudit;
import org.skyer.mybatis.domain.AuditDomain;
/**
* @author lixiaoyang 2021-12-10 13:27:14
*/
@ApiModel("店铺实体类")
@VersionAudit
@ModifyAudit
@Data
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Table(name = "channel_shop")
public class Shop extends AuditDomain {
/**
* 门店对应的渠道类型编码
*/
public static final String PHYSICAL_SHOP_CHANNEL_TYPE_CODE = "999";
/**
* 门店对应的categoryType编码
*/
public static final String PHYSICAL_SHOP_CATEGORY_TYPE = "PhysicalShop";
public static final String FIELD_ID = "id";
public static final String FIELD_CODE = "code";
public static final String FIELD_NAME = "name";
public static final String FIELD_TENANT_ID = "tenantId";
public static final String FIELD_TYPE_CODE = "typeCode";
public static final String FIELD_CATEGORY_TYPE = "categoryType";
public static final String FIELD__WAREHOUSE_STATUS = "channelWarehouseStatus";
public static final String FIELD__WAREHOUSE_NAME = "channelWarehouseName";
public static final String FIELD_MANAGER = "manager";
public static final String FIELD_DESCRIPTION = "description";
public static final String FIELD_STATUS = "status";
public static final String FIELD_DELETE_FLAG = "deleteFlag";
public static final String FIELD_SALES_ORGANIZING_ID = "salesOrganizingId";
public static final String FIELD_INVOICE_TYPE_CODE = "invoiceTypeCode";
public static final String FIELD_ADDRESS = "address";
public static final String FIELD_COUNTRY_ID = "countryId";
public static final String FIELD_PROVINCE_ID = "provinceId";
public static final String FIELD_CITY_ID = "cityId";
public static final String FIELD_COUNTY_ID = "countyId";
public static final String FIELD_URL = "url";
public static final String FIELD__TYPE_CODE = "channelTypeCode";
public static final String FIELD_AUTO_CONFIRM_DAY = "autoConfirmDay";
public static final String FIELD_AUTO_DOWNLOAD_GOODS = "autoDownloadGoods";
public static final String FIELD_AUTO_SYNC_INVENTORY = "autoSyncInventory";
public static final String FIELD_RELATION_PHYSICAL_SHOP_ID = "relationPhysicalShopId";
public static final String FIELD_SELF_PICKUP_FLAG = "selfPickupFlag";
//
// 业务方法(按public protected private顺序排列)
// ------------------------------------------------------------------------------
//
// 数据库字段
// ------------------------------------------------------------------------------
@ApiModelProperty("主键")
@Id
@GeneratedValue
private Long id;
@ApiModelProperty(value = "编码")
private String code;
@ApiModelProperty(value = "店铺名称")
private String name;
@ApiModelProperty(value = "租户Id")
private Long tenantId;
@ApiModelProperty(value = "店铺类型")
private String typeCode;
@ApiModelProperty(value = "店铺类别:区分网店还是实体店")
private String categoryType;
@ApiModelProperty(value = "0否 1是")
private Boolean channelWarehouseStatus;
@ApiModelProperty(value = "渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty(value = "负责人")
private String manager;
@ApiModelProperty(value = "描述")
private String description;
@ApiModelProperty(value = "状态 1启用 0禁用")
private Boolean status;
@ApiModelProperty(value = "1删除")
private Boolean deleteFlag;
@ApiModelProperty(value = "销售组织")
private Long salesOrganizingId;
@ApiModelProperty(value = "发票种类")
private String invoiceTypeCode;
@ApiModelProperty(value = "详细地址")
private String address;
@ApiModelProperty(value = "国家ID")
private Long countryId;
@ApiModelProperty(value = "省ID")
private Long provinceId;
@ApiModelProperty(value = "市ID")
private Long cityId;
@ApiModelProperty(value = "县ID")
private Long countyId;
@ApiModelProperty(value = "网店地址(url)")
private String url;
@ApiModelProperty(value = "渠道类型")
private String channelTypeCode;
@ApiModelProperty(value = "自动确认发货(天)")
private Integer autoConfirmDay;
@ApiModelProperty(value = "自动下载商品")
private Boolean autoDownloadGoods;
@ApiModelProperty(value = "自动同步库存")
private Boolean autoSyncInventory;
@ApiModelProperty(value = "网店关联的门店")
private Long relationPhysicalShopId;
@ApiModelProperty(value = "o2o自提门店")
private Boolean selfPickupFlag;
//
// 非数据库字段
// ------------------------------------------------------------------------------
}

View file

@ -0,0 +1,99 @@
package org.skyer.channel.domain.entity;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.validation.constraints.NotNull;
import org.skyer.mybatis.annotation.ModifyAudit;
import org.skyer.mybatis.annotation.MultiLanguage;
import org.skyer.mybatis.annotation.VersionAudit;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* <p>
*
* </p>
*
* @author lzh
* @since 2021-06-18
*/
@VersionAudit
@ModifyAudit
@JsonInclude(JsonInclude.Include.NON_NULL)
@Accessors(chain = true)
@Data
@EqualsAndHashCode(callSuper = false)
@Table(name="channel_warehouse")
public class Warehouse extends AuditDomain {
@ApiModelProperty("表ID主键供其他表做外键")
@Id
@GeneratedValue
@Encrypt
private Long id;
@ApiModelProperty(value = "仓库编码")
private String wareCode;
@ApiModelProperty(value = "仓库名称")
@NotNull
private String wareName;
@ApiModelProperty(value = "联系人姓名")
@NotNull
private String contactName;
@ApiModelProperty(value = "联系人电话")
@NotNull
private String contactPhone;
@ApiModelProperty(value = "国家ID")
@NotNull
private Long countryId;
@ApiModelProperty(value = "省ID ")
@NotNull
private Long provinceId;
@ApiModelProperty(value = "市ID ")
@NotNull
private Long cityId;
@ApiModelProperty(value = "县ID")
@NotNull
private Long countyId;
@ApiModelProperty(value = "详细地址 ")
private String address;
@ApiModelProperty(value = "描述")
private String description;
@ApiModelProperty("租户ID")
@Encrypt
private Long tenantId;
@ApiModelProperty("删除标识")
private Boolean deleteFlag;
@ApiModelProperty("状态 true启用 false禁用")
private Boolean status;
@ApiModelProperty(value = "逻辑仓名称")
private String logicWarehouseName;
@ApiModelProperty(value = "是否逻辑仓 1-是 0-否")
private Boolean logicFlag;
}

View file

@ -0,0 +1,24 @@
package org.skyer.channel.domain.repository;
import org.skyer.channel.api.dto.DealerListDTO;
import org.skyer.channel.domain.entity.Dealer;
import org.skyer.channel.domain.vo.DealerVO;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.base.BaseRepository;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
/**
* @author: lzh
* @date: 2021-06-17
* @description: 经销商
*/
public interface DealerRepository extends BaseRepository<Dealer> {
/**
* 分页查询经销商
* @param pageRequest
* @param dealerListDTO
* @return
*/
Page<Dealer> pageDealerList(PageRequest pageRequest, DealerListDTO dealerListDTO);
}

View file

@ -0,0 +1,13 @@
package org.skyer.channel.domain.repository;
import org.skyer.mybatis.base.BaseRepository;
import org.skyer.channel.domain.entity.Group;
/**
* 资源库
*
* @author linzhuanghuang@ebc.com 2021-09-03 16:54:36
*/
public interface GroupRepository extends BaseRepository<Group> {
}

View file

@ -0,0 +1,11 @@
package org.skyer.channel.domain.repository;
import org.skyer.channel.domain.entity.SalesOrganization;
import org.skyer.mybatis.base.BaseRepository;
/**
* @author: lzh
* @date: 2021-06-17
* @description: 销售组织
*/
public interface SalesOrganizationReposotory extends BaseRepository<SalesOrganization> {
}

View file

@ -0,0 +1,35 @@
package org.skyer.channel.domain.repository;
import org.skyer.channel.api.dto.ChannelSaleOrderDTO;
import org.skyer.channel.api.dto.OnlineShopShowDTO;
import org.skyer.channel.api.dto.PhysicalShopShowDTO;
import org.skyer.channel.api.dto.QueryShopListDTO;
import org.skyer.channel.domain.entity.Shop;
import org.skyer.channel.domain.vo.*;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.base.BaseRepository;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import java.util.List;
/**
* 资源库
*
* @author lixiaoyang 2021-12-10 13:27:14
*/
public interface ShopRepository extends BaseRepository<Shop> {
OnlineShopSettingVO getSetting(Long id);
Page<OnlineShopVO> getPage(PageRequest pageRequest, OnlineShopShowDTO onlineShopShowDTO, Long tenantId);
Page<PhysicalShopVO> getPage(PageRequest pageRequest, PhysicalShopShowDTO physicalShopShowDTO, Long tenantId);
Page<ShopListVO> queryShop(QueryShopListDTO dto, Long tenantId, PageRequest pageRequest);
Shop getShopByNameAndCategoryTypeAndChannelType(String name, String categoryType, String channelType, String channelWarehouseName);
List<ChannelSaleOrderVO> queryChannelOrderSaleReport(ChannelSaleOrderDTO dto);
}

View file

@ -0,0 +1,11 @@
package org.skyer.channel.domain.repository;
import org.skyer.channel.domain.entity.Warehouse;
import org.skyer.mybatis.base.BaseRepository;
/**
* @author: lzh
* @date: 2021-06-18
* @description: 仓库
*/
public interface WarehouseRepository extends BaseRepository<Warehouse> {
}

View file

@ -0,0 +1,62 @@
package org.skyer.channel.domain.service;
import org.skyer.channel.api.dto.DealerDTO;
import org.skyer.channel.api.dto.DealerListDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.domain.entity.Dealer;
import org.skyer.channel.domain.vo.DealerVO;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
public interface DealerService {
/**
* 添加经销商
dealer * @return
*/
Boolean addDealer(Dealer dealer);
/**
* 修改经销商信息
* @param dealerDTO
* @return
*/
Boolean updateDealer(DealerDTO dealerDTO);
/**
* 删除经销商信息
* @param id
* @return
*/
Boolean deleteById(Long id);
/**
* 获取经销商详情
* @param id
* @return
*/
Dealer getDealerDetail(Long id);
/**
* 分页查询经销商列表
* @param pageRequest
* @param dealerListDTO
* @return
*/
Page<DealerVO> pageDealerList(PageRequest pageRequest, DealerListDTO dealerListDTO);
/**
* 禁用
* @param id
* @param flag
* @return
*/
boolean operation(Long id, Boolean flag);
/**
* 批量删除
* @param shopDeleteDTO
* @return
*/
Boolean deletes(ShopDeleteDTO shopDeleteDTO);
}

View file

@ -0,0 +1,24 @@
package org.skyer.channel.domain.service;
import org.skyer.channel.domain.entity.Group;
/**
* 应用服务
*
* @author linzhuanghuang@ebc.com 2021-09-03 16:54:36
*/
public interface GroupService {
/**
* 获取默认集团
* @return
*/
Group getDefaultGroups();
/**
* 修改默认的集团信息
* @param group
* @return
*/
int updateDefaultGroups(Group group);
}

View file

@ -0,0 +1,50 @@
package org.skyer.channel.domain.service;
import org.skyer.channel.api.dto.*;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.skyer.channel.domain.vo.OnlineShopDetailVO;
import org.skyer.channel.domain.vo.OnlineShopSettingVO;
import org.skyer.channel.domain.vo.OnlineShopVO;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
public interface OnlineShopService {
Boolean save(OnlineShopDTO onlineShopDTO);
Boolean setting(OnlineShopSettingDTO onlineShopSettingDTO);
Boolean delete(Long id, Long objectVersionNumber);
Boolean operation(Long id, Boolean flag, Long objectVersionNumber);
Page<OnlineShopVO> getPage(OnlineShopShowDTO onlineShopShowDTO, PageRequest pageRequest);
/**
* 根据主键获取全部详情
*
* @author lixiaoyang
* @date 2021/6/28 17:20
*/
OnlineShopDetailVO getDetails(Long id);
OnlineShopDetailVO getDetailsByCode(String code);
/**
* 根据主键获取设置信息
*
* @author lixiaoyang
* @date 2021/6/28 17:21
*/
OnlineShopSettingVO getSetting(Long id);
void deleteCache(Long id);
Boolean deletes(ShopDeleteDTO shopDeleteDTO);
}

View file

@ -0,0 +1,26 @@
package org.skyer.channel.domain.service;
import org.skyer.channel.api.dto.PhysicalShopDTO;
import org.skyer.channel.api.dto.PhysicalShopShowDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.domain.vo.PhysicalShopDetailVO;
import org.skyer.channel.domain.vo.PhysicalShopVO;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
public interface PhysicalShopService {
Boolean save(PhysicalShopDTO dto);
Boolean delete(Long id, Long objectVersionNumber);
Boolean deletes(ShopDeleteDTO shopDeleteDTO);
Boolean operation(Long id, Boolean flag, Long objectVersionNumber);
Page<PhysicalShopVO> getPage(PhysicalShopShowDTO physicalShopShowDTO, PageRequest pageRequest);
PhysicalShopDetailVO getDetails(Long id);
void deleteCache(Long id);
}

View file

@ -0,0 +1,87 @@
package org.skyer.channel.domain.service;
import java.util.List;
import org.skyer.channel.api.dto.SalesOrganizationDTO;
import org.skyer.channel.api.dto.SalesOrganizationListDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.domain.entity.SalesOrganization;
import org.skyer.channel.domain.vo.ListOfTreeVO;
import org.skyer.channel.domain.vo.SalesOrganizationByTenantIdVO;
import org.skyer.channel.domain.vo.SalesOrganizationListVO;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
/**
* <p>
* 经销商组织
* </p>
*
* @author lzh
* @since 2021-06-18
*/
public interface SalesOrganizationService {
/**
* 分页查询销售组织
* @param pageRequest
* @return
*/
Page<SalesOrganizationListVO> pageSalesOrganizationList(PageRequest pageRequest, SalesOrganizationListDTO salesOrganizationListDTO);
/**
* 修改销售组织
* @param salesOrganization
* @return
*/
Boolean updateSalesOrganization(SalesOrganizationDTO salesOrganization);
/**
* 新增销售组织
* @param salesOrganization
* @return
*/
Boolean createSalesOrganization(SalesOrganization salesOrganization);
/**
* 删除销售组织
* @param id
* @return
*/
Boolean deleteById(Long id);
/**
* 获取销售组织详情
* @param id
* @return
*/
SalesOrganization getSalesOrganizationDetail(Long id);
/**
* 禁用 OR 启用
* @param id
* @param flag
* @return
*/
boolean operation(Long id, Boolean flag);
/**
* 根据租户Id查询
* @param tenantId
* @return
*/
List<SalesOrganizationByTenantIdVO> getsalesOrganizationByTenantId(Long tenantId);
/**
* 批量删除
* @param shopDeleteDTO
* @return
*/
Boolean deletes(ShopDeleteDTO shopDeleteDTO);
/**
* 公司上下级树形结构
* @return
*/
List<ListOfTreeVO> listOfTree(Boolean flag);
}

View file

@ -0,0 +1,71 @@
package org.skyer.channel.domain.service;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.api.dto.WarehouseDTO;
import org.skyer.channel.api.dto.WarehouseListDTO;
import org.skyer.channel.domain.entity.Warehouse;
import org.skyer.channel.domain.vo.WarehouseListVO;
import org.skyer.core.domain.Page;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
/**
* <p>
* 服务类
* </p>
*
* @author lzh
* @since 2021-06-18
*/
public interface WarehouseService {
/**
* 修改仓库
* @param warehouse
* @return
*/
Boolean updateWarehouse(WarehouseDTO warehouse);
/**
* 新增仓库
* @param warehouse
* @return
*/
Boolean createWarehouse(Warehouse warehouse);
/**
* 删除仓库
* @param id
* @return
*/
Boolean deleteById(Long id);
/**
* 获取仓库详情
* @param id
* @return
*/
Warehouse getWarehouseDetail(Long id);
/**
* 分页查询仓库信息
* @param pageRequest
* @param warehouseListDTO
* @return
*/
Page<WarehouseListVO> pageWarehouseList(PageRequest pageRequest, WarehouseListDTO warehouseListDTO);
/**
* 禁用 OR 启用
* @param id
* @param flag
* @return
*/
boolean operation(Long id, Boolean flag);
/**
* 批量删除
* @param shopDeleteDTO
* @return
*/
Boolean deletes(ShopDeleteDTO shopDeleteDTO);
}

View file

@ -0,0 +1,117 @@
package org.skyer.channel.domain.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import org.skyer.channel.api.dto.DealerDTO;
import org.skyer.channel.api.dto.DealerListDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.domain.entity.Dealer;
import org.skyer.channel.domain.repository.DealerRepository;
import org.skyer.channel.domain.service.DealerService;
import org.skyer.channel.domain.vo.DealerVO;
import org.skyer.core.cache.ProcessCacheValue;
import org.skyer.core.domain.Page;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
/**
* @author: lzh
* @date: 2021-06-17
* @description:
*/
@Service
public class DealerServiceImpl implements DealerService {
private static final Logger logger = LoggerFactory.getLogger(DealerServiceImpl.class);
@Autowired
private DealerRepository dealerRepository;
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean addDealer(Dealer dealer) {
if (ObjectUtils.isEmpty(dealer.getDealerCode())){
dealer.setDealerCode(UUID.randomUUID().toString().replace("-", ""));
}
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
logger.info("获取当前用户==============》" + userDetails);
logger.info("获取当前用户租户ID==============》" + userDetails.getTenantId());
Long tenantId = userDetails.getTenantId();
dealer.setTenantId(tenantId);
return dealerRepository.insert(dealer) > 0;
}
@Override
public Boolean updateDealer(DealerDTO dealerDTO) {
Dealer dealer = dealerRepository.selectByPrimaryKey(dealerDTO.getId());
BeanUtils.copyProperties(dealerDTO,dealer);
return dealerRepository.updateByPrimaryKey(dealer)>0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteById(Long id) {
Dealer dealer = dealerRepository.selectByPrimaryKey(id);
dealer.setDeleteFlag(true);
return dealerRepository.updateByPrimaryKey(dealer) >0;
}
@Override
@ProcessCacheValue
public Dealer getDealerDetail(Long id) {
return dealerRepository.selectByPrimaryKey(id);
}
@Override
@ProcessCacheValue
public Page<DealerVO> pageDealerList(PageRequest pageRequest, DealerListDTO dealerListDTO) {
Page<Dealer> page = dealerRepository.pageDealerList(pageRequest, dealerListDTO);
List<Dealer> content = page.getContent();
List<DealerVO> list = new ArrayList<>();
content.forEach(item->{
DealerVO dealerVO = new DealerVO();
BeanUtils.copyProperties(item,dealerVO);
list.add(dealerVO);
});
Page<DealerVO> a = new Page<>();
a.setContent(list);
return a;
}
@Override
public boolean operation(Long id, Boolean flag) {
Dealer dealer = dealerRepository.selectByPrimaryKey(id);
dealer.setStatus(flag);
return dealerRepository.updateByPrimaryKey(dealer) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletes(ShopDeleteDTO shopDeleteDTO) {
List<Long> ids = shopDeleteDTO.getIds();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
stringBuilder.append(ids.get(i));
if (i != (ids.size() - 1)) {
stringBuilder.append(",");
}
}
List<Dealer> dealarList = dealerRepository.selectByIds(stringBuilder.toString());
for (Dealer dealar : dealarList) {
dealar.setDeleteFlag(true);
}
// 执行软删
dealerRepository.batchUpdateByPrimaryKey(dealarList);
return true;
}
}

View file

@ -0,0 +1,45 @@
package org.skyer.channel.domain.service.impl;
import org.skyer.channel.domain.entity.Group;
import org.skyer.channel.domain.repository.GroupRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.skyer.channel.domain.service.GroupService;
import org.springframework.util.ObjectUtils;
import java.util.List;
/**
* 应用服务默认实现
*
* @author linzhuanghuang@ebc.com 2021-09-03 16:54:36
*/
@Service
public class GroupServiceImpl implements GroupService {
@Autowired
private GroupRepository groupRepository;
@Override
public Group getDefaultGroups() {
List<Group> groupList = groupRepository.selectAll();
if (ObjectUtils.isEmpty(groupList)){
return new Group();
}else {
return groupList.get(0);
}
}
@Override
public int updateDefaultGroups(Group group) {
List<Group> groupList = groupRepository.selectAll();
if (ObjectUtils.isEmpty(groupList)){
return groupRepository.insert(group);
}else {
group.setId(groupList.get(0).getId());
group.setObjectVersionNumber(groupList.get(0).getObjectVersionNumber());
return groupRepository.updateByPrimaryKeySelective(group);
}
}
}

View file

@ -0,0 +1,228 @@
package org.skyer.channel.domain.service.impl;
import com.alibaba.fastjson.JSON;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.List;
import static org.skyer.channel.infra.constant.Constants.APP_CODE;
import org.skyer.boot.platform.lov.annotation.ProcessLovValue;
import org.skyer.channel.api.dto.*;
import org.skyer.channel.domain.entity.Shop;
import org.skyer.channel.domain.repository.ShopRepository;
import org.skyer.channel.domain.service.OnlineShopService;
import org.skyer.channel.domain.service.saga.ShopService;
import org.skyer.channel.domain.vo.OnlineShopDetailVO;
import org.skyer.channel.domain.vo.OnlineShopSettingVO;
import org.skyer.channel.domain.vo.OnlineShopVO;
import org.skyer.core.cache.ProcessCacheValue;
import org.skyer.core.domain.Page;
import org.skyer.core.exception.CommonException;
import org.skyer.core.redis.DynamicRedisHelper;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
@Service
public class OnlineShopServiceImpl implements OnlineShopService {
private static final Logger logger = LoggerFactory.getLogger(OnlineShopServiceImpl.class);
@Autowired
private ShopRepository shopRepository;
@Autowired
private DynamicRedisHelper redisHelper;
@Autowired
private ShopService shopService;
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean save(OnlineShopDTO dto) {
String shopName = dto.getName();
String channelWarehouseName = dto.getChannelWarehouseName();
Shop shop = null;
if (!ObjectUtils.isEmpty(shopName)) {
String typeCode = dto.getChannelTypeCode();
shop = shopRepository.getShopByNameAndCategoryTypeAndChannelType(shopName, OnlineShopDetailVO.ONLINE_SHOP, typeCode, null);
}
Shop channelShop = null;
if (!ObjectUtils.isEmpty(channelWarehouseName)) {
channelShop = shopRepository.getShopByNameAndCategoryTypeAndChannelType(null, null, null, channelWarehouseName);
}
Long id = dto.getId();
// id为空走新增逻辑
if (ObjectUtils.isEmpty(id) || id == 0) {
if (!ObjectUtils.isEmpty(shop)) {
throw new CommonException("店铺名称禁止重复");
}
if (!ObjectUtils.isEmpty(channelShop)) {
throw new CommonException("逻辑仓名称禁止重复");
}
Long tenantId = 0L;
Shop onlineShop = new Shop();
// 参数转换
BeanUtils.copyProperties(dto, onlineShop);
String code = onlineShop.getCode();
if (ObjectUtils.isEmpty(code)) {
onlineShop.setCode(shopService.creationCode(tenantId));
}
onlineShop.setTypeCode(dto.getOnlineStoreTypeCode());
onlineShop.setTenantId(tenantId);
onlineShop.setStatus(true);
onlineShop.setDeleteFlag(false);
onlineShop.setCategoryType(OnlineShopDetailVO.ONLINE_SHOP);
SaveShopDTO saveShopDTO = new SaveShopDTO();
saveShopDTO.setShop(onlineShop);
saveShopDTO.setFlag(true);
ShopDTO shopDTO = shopService.doSaveShop(saveShopDTO);
return !ObjectUtils.isEmpty(shopDTO);
} else {
if (!ObjectUtils.isEmpty(shop) && shop.getId().compareTo(id) != 0) {
throw new CommonException("店铺名称禁止重复");
}
if (!ObjectUtils.isEmpty(channelShop) && channelShop.getId().compareTo(id) != 0) {
throw new CommonException("逻辑仓名称禁止重复");
}
Shop onlineShop = shopRepository.selectByPrimaryKey(id);
// CODE 不能修改 获取出来
String code = onlineShop.getCode();
// 参数转换
BeanUtils.copyProperties(dto, onlineShop);
// 重新放入CODE
onlineShop.setCode(code);
onlineShop.setTypeCode(dto.getOnlineStoreTypeCode());
SaveShopDTO saveShopDTO = new SaveShopDTO();
saveShopDTO.setShop(onlineShop);
saveShopDTO.setFlag(false);
ShopDTO shopDTO = shopService.doSaveShop(saveShopDTO);
return !ObjectUtils.isEmpty(shopDTO);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean setting(OnlineShopSettingDTO onlineShopSettingDTO) {
Shop onlineShop = shopRepository.selectByPrimaryKey(onlineShopSettingDTO.getId());
// 参数转换
BeanUtils.copyProperties(onlineShopSettingDTO, onlineShop);
int update = shopRepository.updateByPrimaryKey(onlineShop);
if (update > 0) {
redisHelper.hshDelete(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, onlineShop.getId().toString());
return true;
}
return false;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delete(Long id, Long objectVersionNumber) {
Shop onlineShop = shopRepository.selectByPrimaryKey(id);
onlineShop.setDeleteFlag(true);
onlineShop.setObjectVersionNumber(objectVersionNumber);
int update = shopRepository.updateByPrimaryKey(onlineShop);
if (update > 0) {
redisHelper.hshDelete(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, onlineShop.getId().toString());
return true;
}
return false;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean operation(Long id, Boolean flag, Long objectVersionNumber) {
Shop onlineShop = shopRepository.selectByPrimaryKey(id);
onlineShop.setStatus(flag);
onlineShop.setChannelWarehouseStatus(flag);
onlineShop.setObjectVersionNumber(objectVersionNumber);
SaveShopDTO saveShopDTO = new SaveShopDTO();
saveShopDTO.setShop(onlineShop);
saveShopDTO.setFlag(false);
ShopDTO shopDTO = shopService.doSaveShop(saveShopDTO);
return !ObjectUtils.isEmpty(shopDTO);
}
@Override
@ProcessCacheValue
@ProcessLovValue
public Page<OnlineShopVO> getPage(OnlineShopShowDTO onlineShopShowDTO, PageRequest pageRequest) {
Long tenantId = 0L;
return shopRepository.getPage(pageRequest, onlineShopShowDTO, tenantId);
}
@Override
@ProcessLovValue
public OnlineShopDetailVO getDetails(Long id) {
String data = redisHelper.hshGet(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, id.toString());
if (ObjectUtils.isEmpty(data)) {
Shop onlineShop = shopRepository.selectByPrimaryKey(id);
OnlineShopDetailVO vo = new OnlineShopDetailVO();
// 参数转换
BeanUtils.copyProperties(onlineShop, vo);
vo.setOnlineStoreTypeCode(onlineShop.getTypeCode());
if (!ObjectUtils.isEmpty(onlineShop.getRelationPhysicalShopId())) {
Shop relationShop = shopRepository.selectByPrimaryKey(onlineShop.getRelationPhysicalShopId());
if (!ObjectUtils.isEmpty(relationShop)){
vo.setRelationPhysicalShopName(relationShop.getName());
}
}
redisHelper.hshPut(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, onlineShop.getId().toString(), JSON.toJSONString(vo));
logger.info("==============mysql获取==============");
return vo;
}
logger.info("==============缓存获取==============");
return JSON.parseObject(data, OnlineShopDetailVO.class);
}
@Override
public OnlineShopDetailVO getDetailsByCode(String code) {
Shop query = new Shop();
query.setCode(code);
Shop onlineShop = shopRepository.selectOne(query);
OnlineShopDetailVO vo = new OnlineShopDetailVO();
// 参数转换
BeanUtils.copyProperties(onlineShop, vo);
return vo;
}
@Override
public OnlineShopSettingVO getSetting(Long id) {
return shopRepository.getSetting(id);
}
@Override
public void deleteCache(Long id) {
redisHelper.hshDelete(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, id.toString());
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletes(ShopDeleteDTO shopDeleteDTO) {
List<Long> ids = shopDeleteDTO.getIds();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
stringBuilder.append(ids.get(i));
if (i != (ids.size() - 1)) {
stringBuilder.append(",");
}
}
List<Shop> onlineShopList = shopRepository.selectByIds(stringBuilder.toString());
for (Shop onlineShop : onlineShopList) {
onlineShop.setDeleteFlag(true);
// 清除缓存
redisHelper.hshDelete(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, onlineShop.getId().toString());
}
// 执行软删
shopRepository.batchUpdateByPrimaryKey(onlineShopList);
return true;
}
}

View file

@ -0,0 +1,181 @@
package org.skyer.channel.domain.service.impl;
import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.UUID;
import static org.skyer.channel.infra.constant.Constants.APP_CODE;
import org.skyer.boot.platform.lov.annotation.ProcessLovValue;
import org.skyer.channel.api.dto.*;
import org.skyer.channel.domain.entity.Shop;
import org.skyer.channel.domain.repository.ShopRepository;
import org.skyer.channel.domain.service.PhysicalShopService;
import org.skyer.channel.domain.service.saga.ShopService;
import org.skyer.channel.domain.vo.OnlineShopDetailVO;
import org.skyer.channel.domain.vo.PhysicalShopDetailVO;
import org.skyer.channel.domain.vo.PhysicalShopVO;
import org.skyer.core.cache.ProcessCacheValue;
import org.skyer.core.domain.Page;
import org.skyer.core.exception.CommonException;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.core.redis.DynamicRedisHelper;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
@Service
public class PhysicalShopServiceImpl implements PhysicalShopService {
private static final Logger logger = LoggerFactory.getLogger(PhysicalShopServiceImpl.class);
@Autowired
private ShopRepository shopRepository;
@Autowired
private DynamicRedisHelper redisHelper;
@Autowired
private ShopService shopService;
@Override
public Boolean save(PhysicalShopDTO dto) {
Shop shop = shopRepository.getShopByNameAndCategoryTypeAndChannelType(dto.getName(), PhysicalShopDetailVO.PHYSICAL_SHOP, null, null);
Shop channelShop = shopRepository.getShopByNameAndCategoryTypeAndChannelType(null, null, null, dto.getChannelWarehouseName());
Long id = dto.getId();
// id为空走新增逻辑
if (ObjectUtils.isEmpty(id) || id == 0) {
if (!ObjectUtils.isEmpty(shop)) {
throw new CommonException("店铺名称禁止重复");
}
if (!ObjectUtils.isEmpty(channelShop)) {
throw new CommonException("逻辑仓名称禁止重复");
}
Shop physicalShop = new Shop();
// 参数转换
BeanUtils.copyProperties(dto, physicalShop);
String code = physicalShop.getCode();
// 请求头中获取当前用户信息
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
logger.info("获取当前用户==============》" + userDetails);
Long tenantId = userDetails.getTenantId();
if (ObjectUtils.isEmpty(code)) {
physicalShop.setCode(shopService.creationCode(tenantId));
}
physicalShop.setTenantId(tenantId);
physicalShop.setStatus(true);
physicalShop.setDeleteFlag(false);
physicalShop.setCategoryType(PhysicalShopDetailVO.PHYSICAL_SHOP);
SaveShopDTO saveShopDTO = new SaveShopDTO();
saveShopDTO.setShop(physicalShop);
saveShopDTO.setFlag(true);
ShopDTO shopDTO = shopService.doSaveShop(saveShopDTO);
return !ObjectUtils.isEmpty(shopDTO);
} else {
if (!ObjectUtils.isEmpty(shop) && shop.getId().compareTo(id) != 0) {
throw new CommonException("店铺名称禁止重复");
}
if (!ObjectUtils.isEmpty(channelShop) && channelShop.getId().compareTo(id) != 0) {
throw new CommonException("逻辑仓名称禁止重复");
}
Shop updatePhysicalShop = shopRepository.selectByPrimaryKey(id);
// CODE 不能修改 获取出来
String code = updatePhysicalShop.getCode();
// tenantId 不能修改 获取出来
Long tenantId = updatePhysicalShop.getTenantId();
// 参数转换
BeanUtils.copyProperties(dto, updatePhysicalShop);
// 重新放入CODE
updatePhysicalShop.setCode(code);
updatePhysicalShop.setTenantId(tenantId);
SaveShopDTO saveShopDTO = new SaveShopDTO();
saveShopDTO.setShop(updatePhysicalShop);
saveShopDTO.setFlag(false);
ShopDTO shopDTO = shopService.doSaveShop(saveShopDTO);
return !ObjectUtils.isEmpty(shopDTO);
}
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean delete(Long id, Long objectVersionNumber) {
Shop physicalShop = shopRepository.selectByPrimaryKey(id);
physicalShop.setDeleteFlag(true);
physicalShop.setObjectVersionNumber(objectVersionNumber);
int update = shopRepository.updateByPrimaryKey(physicalShop);
if (update > 0) {
redisHelper.hshDelete(APP_CODE + ":" + PhysicalShopDetailVO.PHYSICAL_SHOP, physicalShop.getId().toString());
return true;
}
return false;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletes(ShopDeleteDTO shopDeleteDTO) {
List<Long> ids = shopDeleteDTO.getIds();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
stringBuilder.append(ids.get(i));
if (i != (ids.size() - 1)) {
stringBuilder.append(",");
}
}
List<Shop> physicalShopList = shopRepository.selectByIds(stringBuilder.toString());
for (Shop physicalShop : physicalShopList) {
physicalShop.setDeleteFlag(true);
// 清除缓存
redisHelper.hshDelete(APP_CODE + ":" + PhysicalShopDetailVO.PHYSICAL_SHOP, physicalShop.getId().toString());
}
// 执行软删
shopRepository.batchUpdateByPrimaryKey(physicalShopList);
return true;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean operation(Long id, Boolean flag, Long objectVersionNumber) {
Shop physicalShop = shopRepository.selectByPrimaryKey(id);
physicalShop.setStatus(flag);
physicalShop.setChannelWarehouseStatus(flag);
physicalShop.setObjectVersionNumber(objectVersionNumber);
SaveShopDTO saveShopDTO = new SaveShopDTO();
saveShopDTO.setShop(physicalShop);
saveShopDTO.setFlag(false);
ShopDTO shopDTO = shopService.doSaveShop(saveShopDTO);
return !ObjectUtils.isEmpty(shopDTO);
}
@Override
@ProcessCacheValue
@ProcessLovValue
public Page<PhysicalShopVO> getPage(PhysicalShopShowDTO physicalShopShowDTO, PageRequest pageRequest) {
Long tenantId = 0L;
return shopRepository.getPage(pageRequest, physicalShopShowDTO, tenantId);
}
@Override
@ProcessLovValue
public PhysicalShopDetailVO getDetails(Long id) {
String data = redisHelper.hshGet(APP_CODE + ":" + PhysicalShopDetailVO.PHYSICAL_SHOP, id.toString());
if (ObjectUtils.isEmpty(data)) {
Shop physicalShop = shopRepository.selectByPrimaryKey(id);
PhysicalShopDetailVO vo = new PhysicalShopDetailVO();
// 参数转换
BeanUtils.copyProperties(physicalShop, vo);
redisHelper.hshPut(APP_CODE + ":" + PhysicalShopDetailVO.PHYSICAL_SHOP, id.toString(), JSON.toJSONString(vo));
logger.info("==============mysql获取==============");
return vo;
}
logger.info("==============缓存获取==============");
return JSON.parseObject(data, PhysicalShopDetailVO.class);
}
@Override
public void deleteCache(Long id) {
redisHelper.hshDelete(APP_CODE + ":" + PhysicalShopDetailVO.PHYSICAL_SHOP, id.toString());
}
}

View file

@ -0,0 +1,252 @@
package org.skyer.channel.domain.service.impl;
import org.apache.poi.ss.formula.functions.T;
import org.skyer.channel.infra.feign.UserClient;
import org.skyer.core.exception.CommonException;
import org.skyer.core.util.ResponseUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
import org.skyer.channel.api.dto.SalesOrganizationDTO;
import org.skyer.channel.api.dto.SalesOrganizationListDTO;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.domain.entity.Dealer;
import org.skyer.channel.domain.entity.SalesOrganization;
import org.skyer.channel.domain.repository.SalesOrganizationReposotory;
import org.skyer.channel.domain.service.SalesOrganizationService;
import org.skyer.channel.domain.vo.ChildrenVO;
import org.skyer.channel.domain.vo.ListOfTreeVO;
import org.skyer.channel.domain.vo.SalesOrganizationByTenantIdVO;
import org.skyer.channel.domain.vo.SalesOrganizationListVO;
import org.skyer.channel.infra.mapper.SalesOrganizationMapper;
import org.skyer.channel.infra.util.ListUtil;
import org.skyer.core.cache.ProcessCacheValue;
import org.skyer.core.domain.Page;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.mybatis.pagehelper.PageHelper;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
/**
* <p>
* 服务实现类
* </p>
*
* @author lzh
* @since 2021-06-18
*/
@Service
public class SalesOrganizationServiceImpl implements SalesOrganizationService {
private static final Logger logger = LoggerFactory.getLogger(SalesOrganizationServiceImpl.class);
@Autowired
private SalesOrganizationReposotory salesOrganizationReposotory;
@Autowired
private SalesOrganizationMapper salesOrganizationMapper;
@Autowired
private UserClient userClient;
@Override
@ProcessCacheValue
public Page<SalesOrganizationListVO> pageSalesOrganizationList(PageRequest pageRequest, SalesOrganizationListDTO salesOrganizationListDTO) {
return PageHelper.doPage(pageRequest,()-> salesOrganizationMapper.pageSalesOrganizationList(salesOrganizationListDTO));
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateSalesOrganization(SalesOrganizationDTO salesOrganization) {
SalesOrganization organization = salesOrganizationReposotory.selectByPrimaryKey(salesOrganization.getId());
BeanUtils.copyProperties(salesOrganization,organization);
return salesOrganizationReposotory.updateByPrimaryKey(organization)>0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean createSalesOrganization(SalesOrganization salesOrganization) {
if (ObjectUtils.isEmpty(salesOrganization.getOrgCode())){
salesOrganization.setOrgCode(UUID.randomUUID().toString());
}
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
logger.info("获取当前用户==============》" + userDetails);
logger.info("获取当前用户租户ID==============》" + userDetails.getTenantId());
Long tenantId = userDetails.getTenantId();
salesOrganization.setTenantId(tenantId);
return salesOrganizationReposotory.insertSelective(salesOrganization)>0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteById(Long id) {
ResponseEntity response= userClient.companyUser(Collections.singletonList(id));
if (!response.getStatusCode().is2xxSuccessful()) {
throw new CommonException("组织已存在用户,无法删除");
}
SalesOrganization organization = salesOrganizationReposotory.selectByPrimaryKey(id);
organization.setDeleteFlag(true);
return salesOrganizationReposotory.updateByPrimaryKey(organization)>0;
}
@Override
public SalesOrganization getSalesOrganizationDetail(Long id) {
return salesOrganizationReposotory.selectByPrimaryKey(id);
}
@Override
public boolean operation(Long id, Boolean flag) {
SalesOrganization organization = salesOrganizationReposotory.selectByPrimaryKey(id);
organization.setStatus(flag);
return salesOrganizationReposotory.updateByPrimaryKey(organization) > 0;
}
@Override
public List<SalesOrganizationByTenantIdVO> getsalesOrganizationByTenantId(Long tenantId) {
SalesOrganization salesOrganization = new SalesOrganization();
salesOrganization.setTenantId(tenantId);
List<SalesOrganization> list = salesOrganizationReposotory.select(salesOrganization);
List<SalesOrganizationByTenantIdVO> vos = ListUtil.listConvert(list, SalesOrganizationByTenantIdVO.class);
return vos;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletes(ShopDeleteDTO shopDeleteDTO) {
List<Long> ids = shopDeleteDTO.getIds();
ResponseEntity response= userClient.companyUser(ids);
if (!response.getStatusCode().is2xxSuccessful()) {
throw new CommonException("组织已存在用户,无法删除");
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
stringBuilder.append(ids.get(i));
if (i != (ids.size() - 1)) {
stringBuilder.append(",");
}
}
List<SalesOrganization> list = salesOrganizationReposotory.selectByIds(stringBuilder.toString());
for (SalesOrganization salesOrganization : list) {
salesOrganization.setDeleteFlag(true);
}
// 执行软删
salesOrganizationReposotory.batchUpdateByPrimaryKey(list);
return true;
}
@Override
public List<ListOfTreeVO> listOfTree(Boolean flag) {
// 获取所有公司记录
SalesOrganization organization = new SalesOrganization();
organization.setDeleteFlag(false);
if (flag==true){
organization.setStatus(true);
}
List<SalesOrganization> allCompanyList = salesOrganizationReposotory.select(organization);
List<SalesOrganization> oneList = allCompanyList.stream().filter(model -> model.getPid() == null)
.map((menu) -> {
menu.setChildren(find(menu, allCompanyList));
return menu;
}).collect(Collectors.toList());
// List<SalesOrganization> twoList = allCompanyList.stream().filter(model -> model.getPid() != null).collect(Collectors.toList());
// Map<Long, SalesOrganization> oneMap = oneList.stream().collect(Collectors.toMap(SalesOrganization::getId, Function.identity()));
//
// Map<Long, SalesOrganization> twoMap = twoList.stream().collect(Collectors.toMap(SalesOrganization::getId, Function.identity()));
// List<SalesOrganization> list = doDataProcessing(allCompanyList, oneMap, twoMap);
return ListUtil.listConvert(oneList,ListOfTreeVO.class);
}
/**
*递归查找所有菜单的子菜单
*/
private List<SalesOrganization> find(SalesOrganization root, List<SalesOrganization> all) {
return all.stream().filter(menuEntity ->
menuEntity.getPid() != null &&
menuEntity.getPid().equals(root.getId())
).map(item -> {
//1找到子菜单(递归)
item.setChildren(find(item, all));
return item;
}).collect(Collectors.toList());
}
// /**
// * 执行数据处理 树结构构成
// *
// * @param moduleConfigSysList 所有菜单集合
// * @param oneDataMap 一级菜单集合
// * @param twoDataMap 其它级菜单集合
// * @return List<ModuleConfigVO>
// * @author lixiaoyang
// * @date 2021/6/8 16:46
// */
// private List<SalesOrganization> doDataProcessing(List<SalesOrganization> moduleConfigSysList, Map<Long, SalesOrganization> oneDataMap, Map<Long, SalesOrganization> twoDataMap) {
// List<SalesOrganization> leaveOutList = new ArrayList<>();
// for (SalesOrganization moduleConfig : moduleConfigSysList) {
// Long parentId = moduleConfig.getPid();
// if (!ObjectUtils.isEmpty(parentId) && parentId != 0) {
// //获取父菜单
// SalesOrganization parentModuleConfigVO = oneDataMap.get(parentId);
// if (ObjectUtils.isEmpty(parentModuleConfigVO)) {
//
// parentModuleConfigVO = twoDataMap.get(parentId);
// if (ObjectUtils.isEmpty(parentModuleConfigVO)) {
// leaveOutList.add(moduleConfig);
// continue;
// }
// }
// List<SalesOrganization> moduleConfigVOList = parentModuleConfigVO.getChildren();
// if (ObjectUtils.isEmpty(moduleConfigVOList)) {
// moduleConfigVOList = new ArrayList<>();
// }
// moduleConfigVOList.add(moduleConfig);
// parentModuleConfigVO.setChildren(moduleConfigVOList);
// twoDataMap.put(moduleConfig.getId(), moduleConfig);
// } else {
// oneDataMap.put(moduleConfig.getId(), moduleConfig);
// }
// }
// // 防止因顺序问题造成菜单无法挂钩父类
// if (leaveOutList.size() > 0) {
// boolean flag = false;
// while (leaveOutList.iterator().hasNext()) {
// SalesOrganization moduleConfig = leaveOutList.iterator().next();
// Long parentId = moduleConfig.getPid();
// SalesOrganization one = oneDataMap.get(parentId);
// SalesOrganization two = twoDataMap.get(parentId);
// if (!ObjectUtils.isEmpty(one) || !ObjectUtils.isEmpty(two)) {
// flag = true;
// break;
// }
// }
// if (flag) {
// doDataProcessing(leaveOutList, oneDataMap, twoDataMap);
// }
// }
// //菜单分配完成最后整合
// Set<Long> longs = oneDataMap.keySet();
// List<SalesOrganization> result = new ArrayList<>();
// longs.forEach(l -> {
// result.add(oneDataMap.get(l));
// });
// return result;
// }
}

View file

@ -0,0 +1,117 @@
package org.skyer.channel.domain.service.impl;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.ObjectUtils;
import java.util.List;
import java.util.UUID;
import org.skyer.channel.api.dto.ShopDeleteDTO;
import org.skyer.channel.api.dto.WarehouseDTO;
import org.skyer.channel.api.dto.WarehouseListDTO;
import org.skyer.channel.domain.entity.SalesOrganization;
import org.skyer.channel.domain.entity.Warehouse;
import org.skyer.channel.domain.repository.WarehouseRepository;
import org.skyer.channel.domain.service.WarehouseService;
import org.skyer.channel.domain.vo.WarehouseListVO;
import org.skyer.channel.infra.mapper.WarehouseMapper;
import org.skyer.core.cache.ProcessCacheValue;
import org.skyer.core.domain.Page;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.mybatis.pagehelper.PageHelper;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
/**
* <p>
* 服务实现类
* </p>
*
* @author lzh
* @since 2021-06-18
*/
@Service
public class WarehouseServiceImpl implements WarehouseService {
private static final Logger logger = LoggerFactory.getLogger(WarehouseServiceImpl.class);
@Autowired
private WarehouseRepository warehouseRepository;
@Autowired
private WarehouseMapper warehouseMapper;
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean updateWarehouse(WarehouseDTO warehouseDTO) {
Warehouse warehouse = warehouseRepository.selectByPrimaryKey(warehouseDTO.getId());
BeanUtils.copyProperties(warehouseDTO,warehouse);
return warehouseRepository.updateByPrimaryKey(warehouse)>0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean createWarehouse(Warehouse warehouse) {
if (ObjectUtils.isEmpty(warehouse.getWareCode())){
warehouse.setWareCode(UUID.randomUUID().toString());
}
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
logger.info("获取当前用户==============》" + userDetails);
logger.info("获取当前用户租户ID==============》" + userDetails.getTenantId());
Long tenantId = userDetails.getTenantId();
warehouse.setTenantId(tenantId);
return warehouseRepository.insertSelective(warehouse)>0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deleteById(Long id) {
Warehouse warehouse = warehouseRepository.selectByPrimaryKey(id);
warehouse.setDeleteFlag(true);
return warehouseRepository.updateByPrimaryKey(warehouse)>0;
}
@Override
public Warehouse getWarehouseDetail(Long id) {
return warehouseRepository.selectByPrimaryKey(id);
}
@Override
@ProcessCacheValue
public Page<WarehouseListVO> pageWarehouseList(PageRequest pageRequest, WarehouseListDTO warehouseListDTO) {
return PageHelper.doPageAndSort(pageRequest,()->warehouseMapper.pageWarehouseList(warehouseListDTO));
}
@Override
public boolean operation(Long id, Boolean flag) {
Warehouse warehouse = warehouseMapper.selectByPrimaryKey(id);
warehouse.setStatus(flag);
return warehouseMapper.updateByPrimaryKey(warehouse) > 0;
}
@Override
@Transactional(rollbackFor = Exception.class)
public Boolean deletes(ShopDeleteDTO shopDeleteDTO) {
List<Long> ids = shopDeleteDTO.getIds();
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < ids.size(); i++) {
stringBuilder.append(ids.get(i));
if (i != (ids.size() - 1)) {
stringBuilder.append(",");
}
}
List<Warehouse> list = warehouseRepository.selectByIds(stringBuilder.toString());
for (Warehouse warehouse : list) {
warehouse.setDeleteFlag(true);
}
// 执行软删
warehouseRepository.batchUpdateByPrimaryKey(list);
return true;
}
}

View file

@ -0,0 +1,22 @@
package org.skyer.channel.domain.service.saga;
import org.skyer.channel.api.dto.ChannelSaleOrderDTO;
import org.skyer.channel.api.dto.QueryShopListDTO;
import org.skyer.channel.api.dto.SaveShopDTO;
import org.skyer.channel.api.dto.ShopDTO;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.skyer.channel.domain.vo.ShopListVO;
import org.skyer.core.domain.Page;
import java.util.List;
public interface ShopService {
ShopDTO doSaveShop(SaveShopDTO saveShopDTO);
Page<ShopListVO> queryShop(QueryShopListDTO dto);
String creationCode(Long tenantId);
List<ChannelSaleOrderVO> queryChannelOrderSaleReport(ChannelSaleOrderDTO dto);
}

View file

@ -0,0 +1,171 @@
package org.skyer.channel.domain.service.saga.impl;
import com.alibaba.fastjson.JSONObject;
import lombok.extern.slf4j.Slf4j;
import org.skyer.channel.api.dto.ChannelSaleOrderDTO;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.skyer.channel.infra.feign.OrderReportRemoteService;
import org.skyer.channel.infra.remote.api.dto.SaleOrderOrderApiDTO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import static org.skyer.channel.infra.constant.Constants.APP_CODE;
import org.skyer.boot.platform.code.builder.CodeRuleBuilder;
import org.skyer.boot.platform.code.constant.CodeConstants;
import org.skyer.boot.platform.lov.annotation.ProcessLovValue;
import org.skyer.channel.api.dto.QueryShopListDTO;
import org.skyer.channel.api.dto.SaveShopDTO;
import org.skyer.channel.api.dto.ShopDTO;
import org.skyer.channel.domain.entity.Shop;
import org.skyer.channel.domain.repository.ShopRepository;
import org.skyer.channel.domain.service.saga.ShopService;
import org.skyer.channel.domain.vo.OnlineShopDetailVO;
import org.skyer.channel.domain.vo.PhysicalShopDetailVO;
import org.skyer.channel.domain.vo.ShopListVO;
import org.skyer.channel.infra.constant.HrConstants;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.core.redis.DynamicRedisHelper;
import org.skyer.saga.saga.annotation.Saga;
import org.skyer.saga.saga.producer.StartSagaBuilder;
import org.skyer.saga.saga.producer.TransactionalProducer;
import org.springframework.util.CollectionUtils;
import org.springframework.util.ObjectUtils;
import java.math.BigDecimal;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Function;
import java.util.stream.Collectors;
@Service
@Slf4j
public class ShopServiceImpl implements ShopService {
private static final Logger logger = LoggerFactory.getLogger(ShopServiceImpl.class);
@Autowired
private ShopRepository shopRepository;
@Autowired
private CodeRuleBuilder codeRuleBuilder;
@Autowired
private DynamicRedisHelper redisHelper;
@Autowired
private TransactionalProducer transactionalProducer;
@Autowired
private OrderReportRemoteService orderReportRemoteService;
@Override
@Saga(code = "do-save-shop", description = "商户创建", inputSchemaClass = Shop.class)
public ShopDTO doSaveShop(SaveShopDTO saveShopDTO) {
return transactionalProducer.applyAndReturn(StartSagaBuilder
.newBuilder()
.withLevel(ResourceLevel.SITE)
.withSourceId(1L)
.withRefType("saveShopDTO")
.withPayloadAndSerialize(saveShopDTO)
.withSagaCode("do-save-shop"),
build -> {
Boolean flag = saveShopDTO.getFlag();
Shop shop = saveShopDTO.getShop();
ShopDTO shopDTO = new ShopDTO();
int size;
if (flag) {
size = shopRepository.insertSelective(shop);
} else {
size = shopRepository.updateByPrimaryKeySelective(shop);
}
if (size > 0) {
redisHelper.hshDelete(APP_CODE + ":" + OnlineShopDetailVO.ONLINE_SHOP, shop.getId().toString());
redisHelper.hshDelete(APP_CODE + ":" + PhysicalShopDetailVO.PHYSICAL_SHOP, shop.getId().toString());
BeanUtils.copyProperties(shop, shopDTO);
}
build.withPayloadAndSerialize(shopDTO).withRefId(shopDTO.getId() + " time:" + System.currentTimeMillis());
return shopDTO;
});
}
@Override
@ProcessLovValue
public Page<ShopListVO> queryShop(QueryShopListDTO dto) {
// 999 其他渠道特殊处理
String channelTypeCode = dto.getChannelTypeCode();
if (!ObjectUtils.isEmpty(channelTypeCode) && Shop.PHYSICAL_SHOP_CHANNEL_TYPE_CODE.equals(channelTypeCode)) {
dto.setChannelTypeCode(null);
dto.setCategoryType(Shop.PHYSICAL_SHOP_CATEGORY_TYPE);
}
// 提货店铺特殊处理
Long o2oSalesStoreId = dto.getO2oSalesStoreId();
if (Objects.nonNull(o2oSalesStoreId)) {
Shop shop = shopRepository.selectByPrimaryKey(o2oSalesStoreId);
if (Objects.nonNull(shop) && !Shop.PHYSICAL_SHOP_CATEGORY_TYPE.equals(shop.getCategoryType())) {
// 如果销售店铺是网店则取网店关联的门店列表
if (ObjectUtils.isEmpty(shop.getRelationPhysicalShopId())){
// 如果网店没有关联门店则返回空值
return new Page<>();
}
dto.setId(shop.getRelationPhysicalShopId());
} else {
// 如果销售店铺是门店则取已启用的且是O2O订单自提门店列表
dto.setCategoryType(Shop.PHYSICAL_SHOP_CATEGORY_TYPE);
dto.setSelfPickupFlag(true);
}
}
return shopRepository.queryShop(dto, 0L, dto);
}
@Override
public String creationCode(Long tenantId) {
return codeRuleBuilder.generateCode(CodeConstants.Level.TENANT, tenantId, HrConstants.CodeRule.QD_WAREHOUSE_CODE, CodeConstants.CodeRuleLevelCode.CUSTOM, HrConstants.LevelValue.QD_WAREHOUSE_CODE, null);
}
@Override
@ProcessLovValue
public List<ChannelSaleOrderVO> queryChannelOrderSaleReport(ChannelSaleOrderDTO dto) {
List<ChannelSaleOrderVO> channelSaleOrderVOS = shopRepository.queryChannelOrderSaleReport(dto);
//调用订单中心获取订单金额等数据
if (CollectionUtils.isEmpty(channelSaleOrderVOS)) {
return channelSaleOrderVOS;
}
List<String> storeCodeList = channelSaleOrderVOS.stream().map(ChannelSaleOrderVO::getStoreCode).distinct().collect(Collectors.toList());
SaleOrderOrderApiDTO saleOrderOrderApiDTO = new SaleOrderOrderApiDTO();
saleOrderOrderApiDTO.setStartDate(dto.getStartDate());
saleOrderOrderApiDTO.setEndDate(dto.getEndDate());
saleOrderOrderApiDTO.setStoreCode(storeCodeList);
ResponseEntity<List<ChannelSaleOrderVO>> listResponseEntity = orderReportRemoteService.queryChannelOrderSaleReport(saleOrderOrderApiDTO);
log.info("调用订单中心获取订单数据 入参为:{},出参为:{}", JSONObject.toJSONString(saleOrderOrderApiDTO), JSONObject.toJSONString(listResponseEntity));
//调用订单中心获取金额等参数
List<ChannelSaleOrderVO> channelSaleOrderPartInfoVOList = listResponseEntity.getBody();
if (CollectionUtils.isEmpty(channelSaleOrderPartInfoVOList)) {
return channelSaleOrderVOS;
}
Map<String, ChannelSaleOrderVO> channelSaleOrderPartInfoVOMap = channelSaleOrderPartInfoVOList.stream().collect(Collectors.toMap(ChannelSaleOrderVO::getStoreCode, Function.identity(), (o1, o2) -> o1));
channelSaleOrderVOS.forEach(channelSaleOrderVO -> {
ChannelSaleOrderVO channelSaleOrderPartInfoVO = channelSaleOrderPartInfoVOMap.get(channelSaleOrderVO.getStoreCode());
channelSaleOrderVO.setOrderCount(0);
channelSaleOrderVO.setOrderAmount(BigDecimal.ZERO);
channelSaleOrderVO.setReverseOrderCount(0);
channelSaleOrderVO.setReverseOrderAmount(BigDecimal.ZERO);
if (channelSaleOrderPartInfoVO != null) {
channelSaleOrderVO.setOrderCount(channelSaleOrderPartInfoVO.getOrderCount());
channelSaleOrderVO.setOrderAmount(channelSaleOrderPartInfoVO.getOrderAmount());
channelSaleOrderVO.setReverseOrderCount(channelSaleOrderPartInfoVO.getReverseOrderCount());
channelSaleOrderVO.setReverseOrderAmount(channelSaleOrderPartInfoVO.getReverseOrderAmount());
}
});
return channelSaleOrderVOS;
}
}

View file

@ -0,0 +1,46 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.boot.platform.lov.annotation.LovValue;
import java.math.BigDecimal;
@Data
public class ChannelSaleOrderVO {
@ApiModelProperty(value = "渠道类型code")
@LovValue(lovCode = "SCHL.CHANNEL_TYPE", meaningField = "channelName")
private String channelTypeCode;
@ApiModelProperty(value ="渠道名称")
private String channelName;
@ApiModelProperty(value = "店铺名")
private String storeName;
@ApiModelProperty(value="店铺编码")
private String storeCode;
@ApiModelProperty(value="所属公司")
private String organizationName;
@ApiModelProperty("店铺类型编码")
private String storeTypeCode;
@ApiModelProperty(value="店铺类型")
private String storeType;
@ApiModelProperty(value="订单数")
private Integer orderCount;
@ApiModelProperty(value="销售单数")
private BigDecimal orderAmount;
@ApiModelProperty(value="售后单数")
private Integer reverseOrderCount;
@ApiModelProperty(value="售后金额")
private BigDecimal reverseOrderAmount;
}

View file

@ -0,0 +1,19 @@
package org.skyer.channel.domain.vo;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-09-07
* @description:
*/
@Data
public class ChildrenVO {
@Encrypt
private Long id;
private String orgName;
}

View file

@ -0,0 +1,39 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import org.skyer.common.SkyerCacheKey;
import org.skyer.core.cache.CacheValue;
import org.skyer.core.cache.Cacheable;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-18
* @description:
*/
@Data
public class DealerVO implements Cacheable {
@Encrypt
private Long id;
private String dealerCode;
private String dealerName;
private Boolean status;
private Date creationDate;
private Long createdBy;
@ApiModelProperty("创建人用户名")
@CacheValue(
key = SkyerCacheKey.USER,
primaryKey = "createdBy",
searchKey = "realName",
structure = CacheValue.DataStructure.MAP_OBJECT
)
private String createdName;
}

View file

@ -0,0 +1,25 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModel;
import lombok.Data;
import java.util.List;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-09-07
* @description:
*/
@ApiModel("公司层级关系树")
@Data
public class ListOfTreeVO {
@Encrypt
private Long id;
private String orgName;
private List<ChildrenVO> children;
}

View file

@ -0,0 +1,112 @@
package org.skyer.channel.domain.vo;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.boot.platform.lov.annotation.LovValue;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* <p>
* 网店
* </p>
*
* @author lixiaoyang
* @since 2021-06-16
*/
@ApiModel("网店")
@Data
public class OnlineShopDetailVO extends AuditDomain {
public static final String ONLINE_SHOP = "OnlineShop";
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("租户ID")
private Long tenantId;
@ApiModelProperty("网店名称")
private String name;
/**
* 处理后的含义字段放在哪个字段中<br/>
* 不设置则进行默认映射,将注解所在字段名末尾的Code(如果有)替换为Meaning,:<br/>
* <ul>
* <li>statusCode -> statusMeaning</li>
* <li>processStatus -> processStatusMeaning</li>
* <li>codeTypeCode -> codeTypeMeaning</li>
* </ul>
*/
@ApiModelProperty("渠道类型编码")
@LovValue(lovCode = "SCHL.CHANNEL_TYPE",meaningField = "channelTypeMeaning")
private String channelTypeCode;
//非数据库字段
@ApiModelProperty("渠道类型")
private String channelTypeMeaning;
@ApiModelProperty("网店类型编码")
@LovValue(lovCode = "SCHL.SHOP_TYPE", meaningField = "onlineStoreTypeMeaning")
private String onlineStoreTypeCode;
//非数据库字段
@ApiModelProperty("网店类型")
private String onlineStoreTypeMeaning;
@ApiModelProperty("负责人")
private String manager;
@ApiModelProperty("网店地址(url)")
private String url;
@ApiModelProperty("销售组织")
@Encrypt
private Long salesOrganizingId;
@ApiModelProperty("发票种类编码")
@LovValue(lovCode = "SCHL.INVOICE_TYPE", meaningField = "invoiceTypeCodeMeaning")
private String invoiceTypeCode;
//非数据库字段
@ApiModelProperty("发票种类")
private String invoiceTypeCodeMeaning;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("渠道仓使用状态 true是")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty("删除标识")
private Boolean deleteFlag;
// 1 = true
@ApiModelProperty("状态 true启用")
private Boolean status;
@ApiModelProperty("自动确认发货(天)")
private Integer autoConfirmDay;
@ApiModelProperty("自动下载商品 true是 false否")
private Boolean autoDownloadGoods;
@ApiModelProperty("自动同步库存 true是 false否")
private Boolean autoSyncInventory;
@ApiModelProperty("网店关联的门店id")
@Encrypt
private Long relationPhysicalShopId;
@ApiModelProperty("网店关联的门店名称")
private String relationPhysicalShopName;
}

View file

@ -0,0 +1,30 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
@ApiModel("网店设置出参类")
@Data
public class OnlineShopSettingVO {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("网店名称")
private String name;
@ApiModelProperty("自动确认发货(天)")
private Integer autoConfirmDay;
@ApiModelProperty("自动下载商品 true是 false否")
private Boolean autoDownloadGoods;
@ApiModelProperty("自动同步库存 true是 false否")
private Boolean autoSyncInventory;
@ApiModelProperty("版本号")
private Long objectVersionNumber;
}

View file

@ -0,0 +1,78 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import org.skyer.boot.platform.lov.annotation.LovValue;
import org.skyer.common.SkyerCacheKey;
import org.skyer.core.cache.CacheValue;
import org.skyer.core.cache.Cacheable;
import org.skyer.starter.keyencrypt.core.Encrypt;
@ApiModel("网店出参类")
@Data
public class OnlineShopVO implements Cacheable {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("网店名称")
private String name;
@ApiModelProperty("渠道类型编码")
@LovValue(lovCode = "SCHL.CHANNEL_TYPE", meaningField = "channelTypeMeaning")
private String channelTypeCode;
@ApiModelProperty("渠道类型")
private String channelTypeMeaning;
@ApiModelProperty("状态 true启用")
private Boolean status;
@ApiModelProperty("销售组织")
private String orgName;
@ApiModelProperty("店铺类型编码")
@LovValue(lovCode = "SCHL.SHOP_TYPE", meaningField = "onlineStoreTypeMeaning")
private String onlineStoreTypeCode;
@ApiModelProperty("店铺类型")
private String onlineStoreTypeMeaning;
@ApiModelProperty("网店地址(url)")
private String url;
@ApiModelProperty("渠道仓使用状态 true禁用")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty("网店关联的门店名称")
private String relationPhysicalShopName;
@ApiModelProperty("创建人")
private Long createdBy;
@ApiModelProperty("创建人用户名")
@CacheValue(
key = SkyerCacheKey.USER,
primaryKey = "createdBy",
searchKey = "realName",
structure = CacheValue.DataStructure.MAP_OBJECT
)
private String createdName;
@ApiModelProperty("创建时间")
private Date creationDate;
@ApiModelProperty("版本号")
private Long objectVersionNumber;
}

View file

@ -0,0 +1,92 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.boot.platform.lov.annotation.LovValue;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* <p>
* 门店
* </p>
*
* @author lixiaoyang
* @since 2021-06-16
*/
@ApiModel("门店")
@Data
public class PhysicalShopDetailVO extends AuditDomain {
public static final String PHYSICAL_SHOP = "PhysicalShop";
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("租户ID(入参不填)")
private Long tenantId;
@ApiModelProperty("门店名称")
private String name;
@ApiModelProperty("门店类型编码")
@LovValue(lovCode = "SCHL.SHOP_TYPE", meaningField = "typeCodeMeaning")
private String typeCode;
@ApiModelProperty("门店类型(入参不填)")
private String typeCodeMeaning;
@ApiModelProperty("负责人")
private String manager;
@ApiModelProperty("销售组织")
@Encrypt
private Long salesOrganizingId;
@ApiModelProperty("发票种类编码")
@LovValue(lovCode = "SCHL.INVOICE_TYPE", meaningField = "invoiceTypeCodeMeaning")
private String invoiceTypeCode;
//非数据库字段
@ApiModelProperty("发票种类(入参不填)")
private String invoiceTypeCodeMeaning;
@ApiModelProperty("详细地址")
private String address;
@ApiModelProperty("国家ID")
private Long countryId;
@ApiModelProperty("省ID")
private Long provinceId;
@ApiModelProperty("市ID")
private Long cityId;
@ApiModelProperty("县ID")
private Long countyId;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("状态 true启用")
private Boolean status;
@ApiModelProperty("渠道仓使用状态")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty("删除标识 true删除")
private Boolean deleteFlag;
@ApiModelProperty(value = "o2o自提门店")
private Boolean selfPickupFlag;
}

View file

@ -0,0 +1,74 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import org.skyer.boot.platform.lov.annotation.LovValue;
import org.skyer.common.SkyerCacheKey;
import org.skyer.core.cache.CacheValue;
import org.skyer.core.cache.Cacheable;
import org.skyer.starter.keyencrypt.core.Encrypt;
@ApiModel("门店出参类")
@Data
public class PhysicalShopVO implements Cacheable {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("网店名称")
private String name;
@ApiModelProperty("状态 true启用")
private Boolean status;
@ApiModelProperty("销售组织")
private String orgName;
@ApiModelProperty("店铺类型")
@LovValue(lovCode = "SCHL.SHOP_TYPE", meaningField = "typeCodeMeaning")
private String typeCode;
@ApiModelProperty("店铺类型")
private String typeCodeMeaning;
@ApiModelProperty("店铺地址")
private String address;
@ApiModelProperty("渠道仓使用状态")
private Boolean channelWarehouseStatus;
@ApiModelProperty("渠道仓名称")
private String channelWarehouseName;
@ApiModelProperty(value = "o2o自提门店")
private Boolean selfPickupFlag;
@ApiModelProperty("创建人")
private Long createdBy;
@ApiModelProperty("创建人用户名")
@CacheValue(
key = SkyerCacheKey.USER,
primaryKey = "createdBy",
searchKey = "realName",
structure = CacheValue.DataStructure.MAP_OBJECT
)
private String createdName;
@ApiModelProperty("创建时间")
private Date creationDate;
@ApiModelProperty("版本号")
private Long objectVersionNumber;
@ApiModelProperty("负责人")
private String manager;
}

View file

@ -0,0 +1,21 @@
package org.skyer.channel.domain.vo;
import lombok.Data;
import java.util.Date;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-25
* @description:
*/
@Data
public class SalesOrganizationByTenantIdVO {
@Encrypt
private Long id;
private String orgName;
}

View file

@ -0,0 +1,48 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import org.skyer.common.SkyerCacheKey;
import org.skyer.core.cache.CacheValue;
import org.skyer.core.cache.Cacheable;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-18
* @description:
*/
@Data
public class SalesOrganizationListVO implements Cacheable {
@Encrypt
private Long id;
private String orgCode;
private String orgName;
private String shopPermitName;
private Boolean status;
private Date creationDate;
private Long createdBy;
@ApiModelProperty("创建人用户名")
@CacheValue(
key = SkyerCacheKey.USER,
primaryKey = "createdBy",
searchKey = "realName",
structure = CacheValue.DataStructure.MAP_OBJECT
)
private String createdName;
private String superiorName;
private String groupName;
@ApiModelProperty(value = "所属上级公司")
@Encrypt
private Long pid;
}

View file

@ -0,0 +1,36 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.boot.platform.lov.annotation.LovValue;
import org.skyer.starter.keyencrypt.core.Encrypt;
@Data
@ApiModel("店铺结果集")
public class ShopListVO {
@ApiModelProperty("表ID主键供其他表做外键")
@Encrypt
private Long id;
@ApiModelProperty("编码")
private String code;
@ApiModelProperty("网店名称")
private String name;
@ApiModelProperty("渠道类型编码")
@LovValue(lovCode = "SCHL.CHANNEL_TYPE", meaningField = "channelTypeMeaning")
private String channelTypeCode;
@ApiModelProperty("渠道类型")
private String channelTypeMeaning;
@ApiModelProperty(value = "店铺类别:区分网店还是实体店 网店OnlineShop 门店PhysicalShop")
private String categoryType;
@ApiModelProperty("所属公司id")
@Encrypt
private Long salesOrganizingId;
}

View file

@ -0,0 +1,45 @@
package org.skyer.channel.domain.vo;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotNull;
import java.util.Date;
import org.skyer.common.SkyerCacheKey;
import org.skyer.core.cache.CacheValue;
import org.skyer.core.cache.Cacheable;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-06-18
* @description:
*/
@Data
public class WarehouseListVO implements Cacheable {
@Encrypt
private Long id;
private String wareCode;
private String wareName;
private String contactName;
private String contactPhone;
private Long countryId;
private Long provinceId;
private Long cityId;
private Long countyId;
private String address;
private Boolean status;
private Date creationDate;
private Long createdBy;
@ApiModelProperty("创建人用户名")
@CacheValue(
key = SkyerCacheKey.USER,
primaryKey = "createdBy",
searchKey = "realName",
structure = CacheValue.DataStructure.MAP_OBJECT
)
private String createdName;
}

View file

@ -0,0 +1,23 @@
package org.skyer.channel.infra.annocations;
import java.lang.annotation.*;
/**
* 数据源类型
*
* @author xiaoyu.zhao@hand-china.com
*/
@Inherited
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DatasourceType {
/**
* 数据源类型
*
* @return 类型
*/
String[] value();
}

View file

@ -0,0 +1,47 @@
package org.skyer.channel.infra.constant;
/**
* 公司常量类
*
* @author gaokuo.dai@hand-china.com 2018年7月10日下午7:15:05
*/
public class CompanyConstants {
/**
* 企业审批后续处理类型
*
* @author gaokuo.dai@hand-china.com 2018年7月10日下午7:21:13
*/
public static class CompanyApprovalProcessType {
/**
* 初审
*/
public static final String FIRST_APPROVAL = "FIRST_APPROVAL";
/**
* 组织分配
*/
public static final String ORG_ASSIGN = "ORG_ASSIGN";
/**
* 角色分配
*/
public static final String ROLE_ASSIGN = "ROLE_ASSIGN";
}
/**
* 企业审批后续处理状态
*
* @author gaokuo.dai@hand-china.com 2018年7月10日下午7:21:13
*/
public static class CompanyApprovalProcessStatus {
/**
* 成功
*/
public static final String SUCCESS = "S";
/**
* 错误
*/
public static final String ERROR = "E";
}
}

View file

@ -0,0 +1,331 @@
package org.skyer.channel.infra.constant;
import org.skyer.common.SkyerService;
/**
* 平台常量
*
* @author gaokuo.dai@hand-china.com 2018年6月12日下午2:38:38
*/
public interface Constants {
/**
* 国际冠码 值集编码
*/
String IDD_LOV_CODE = "HPFM.IDD";
/**
* 值集禁止状态
*/
String FORBIDDEN = "FORBIDDEN";
/**
* 服务简称
*/
String APP_CODE = "schl";
String SITE_LEVEL_UPPER_CASE = "SITE";
String TENANT_LEVEL_UPPER_CASE = "TENANT";
String CONFIG_CODE_FAVICON = "FAVICON";
/**
* 默认平台管理员角色
*/
String DEFAULT_ROLE_ADMINISTRATOR = "role/site/default/administrator";
/**
* 默认平台管理员角色
*/
String DEFAULT_ROLE_ORG_ADMINISTRATOR = "role/organization/default/administrator";
/**
* 默认模板角色
*/
String DEFAULT_ROLE_ADMINISTRATOR_TEMPLATE = "role/organization/default/template/administrator";
String HPFM_FILE_CONFIG_TYPE_CODE = "FILE";
String HPFM_TEXT_CONFIG_TYPE_CODE = "TEXT";
/**
* kafka topic常量
*
* @author gaokuo.dai@hand-china.com 2018年7月10日上午11:15:11
*/
interface KafkaTopics {
/**
* 企业注册
*/
String HPFM_COMPANY_REGISTER = "hpfm_company_register";
/**
* 角色权限分配
*/
String HPFM_HIAM_ROLE_ASSIGN = "hpfm_hiam_role_assign";
/**
* 企业注册后期处理
*/
String COMPANY_REGISTER_POST_PROCESSING = "company_register_post_processing";
}
/**
* 编码规则代码
*
* @author gaokuo.dai@hand-china.com 2018年7月10日下午5:27:21
*/
interface RuleCodes {
/**
* 公司编码
*/
String HPFM_COMPANY = "HPFM.COMPANY";
/**
* 集团编码
*/
String HPFM_GROUP = "HPFM.GROUP";
/**
* 租户编码
*/
String HPFM_TENANT = "HPFM.TENANT";
}
/**
* DashboardLayout编码
*/
interface DashboardLayout {
/*
* 默认租户
*/
Long DEFAULT_TENANT_ID = 0L;
/*
* 默认用户ID
*/
Long DEFAULT_USER_ID = 0L;
/**
* 默认角色ID
*/
Long DEFAULT_ROLE_ID = 0L;
}
/**
* 数据源常量
*/
interface Datasource {
/**
* 数据库类型-Oracle
*/
String DB_ORACLE = "ORACLE";
/**
* 数据库类型-Mysql
*/
String DB_MYSQL = "MYSQL";
/**
* 数据库类型-Tidb
*/
String DB_TIDB = "TIDB";
/**
* 数据库类型-SqlServer
*/
String DB_MSSQL = "SQLSERVER";
/**
* 数据库类型-Hana
*/
String DB_HANA = "HANA";
/**
* 数据库JDBC驱动
*/
String DRIVER_CLASS_MYSQL = "com.mysql.jdbc.Driver";
String DRIVER_CLASS_SQLSERVER = "com.microsoft.sqlserver.jdbc.SQLServerDriver";
String DRIVER_CLASS_ORACLE = "oracle.jdbc.driver.OracleDriver";
/**
* 数据库连接字符串
*/
String DATA_SOURCE_URL_MYSQL = "jdbc:mysql://${host}:${port}/${database}?characterEncoding=${encoding}";
String DATA_SOURCE_URL_SQLSERVER = "jdbc:sqlserver://${host};databaseName=${database}";
String DATA_SOURCE_URL_ORACLE = "jdbc:oracle:thin:@${host}:${port}:${database}";
String DATA_SOURCE_PURPOSE_DI = "DI";
String DATA_SOURCE_PURPOSE_DT = "DT";
String DATA_SOURCE_PURPOSE_DR = "DR";
/**
* 驱动类型自定义默认
*/
String CUSTOMIZE = "CUSTOMIZE";
String DEFAULT = "DEFAULT";
}
/**
* DashboardCard编码
*/
interface DashboardCard {
/**
* 用户维度类型
*/
String DIMENSION_TYPE_USER = "USER";
/**
* 租户维度类型
*/
String DIMENSION_TYPE_TENANT = "TENANT";
}
/**
* 属性归属
*/
interface PropertyOwner {
/**
* 表格
*/
String TABLE = "TABLE";
/**
*
*/
String COLUMN = "COLUMN";
}
/**
* 表格个性化
*/
interface UiTable {
interface SourceType {
String TENANT = "TENANT";
String ROLE = "ROLE";
String USER = "USER";
}
}
/**
* 弹性域
*/
interface Flex {
/**
* 条件
*/
interface Symbol {
String AND = "AND";
String OR = "OR";
}
/**
* 运算符
*/
interface Operator {
String EQUAL = "=";
String LIKE = "LIKE";
}
/**
* 层级
*/
interface Scope {
String TENANT = "T";
String ROLE = "R";
String USER = "U";
}
interface FieldType {
String INPUT = "INPUT";
String NUMBER = "NUMBER";
String LOV = "LOV";
String LANG = "LANG";
String SELECT = "SELECT";
String DATE = "DATE";
}
}
/**
* 表单个性化
*/
interface Personality {
/**
* 层级
*/
interface Scope {
String TENANT = "T";
String ROLE = "R";
String USER = "U";
}
}
/**
* 服务器管理
*/
interface Server {
String SEPARATOR = "/";// File.separator;
/**
* 操作系统常量
*/
String OS_LINUX = "LINUX";
}
/**
* 个性化规则类型
*/
interface CustomizeRuleType {
String URL = "URL";
String JAVA = "JAVA";
String GROOVY = "GROOVY";
}
/**
* 个性化规则位置
*/
interface CustomizeRulePosition {
String BEFORE = "BEFORE";
String REPLACE = "REPLACE";
String AFTER = "AFTER";
}
/**
* 导入模板定义
*/
interface ImportTemplateCode {
/**
* 平台多语言导入模板
*/
String PROMPT_TEMP = "HPFM.PROMPT";
/**
* 返回消息管理模板
*/
String MESSAGE_TEMP = "HPFM.MESSAGE";
/**
* 值集导入模板
*/
String LOV_TEMP = "HPFM.LOV";
/**
* 值集值导入模板
*/
String LOV_VALUE_TEMP = "HPFM.LOV_VALUE";
}
/**
* 审批日志清理类型
*/
interface ClearLogType {
String CODE = "HPFM.AUDIT_LOG.CLEAR_TYPE";
String THREE_DAY = "1";
String ONE_WEEK = "2";
String ONE_MONTH = "3";
String THREE_MONTH = "4";
String SIX_MONTH = "5";
String ONE_YEAR = "6";
}
/**
* 在线用户
*/
interface OnlineUser {
/**
* 小时数
*/
Integer HOURS = 24;
/**
* 初始在线人数
*/
Long INITIAL_ONLINE = 0L;
}
}

View file

@ -0,0 +1,5 @@
package org.skyer.channel.infra.constant;
public enum DataHierarchyDisplayStyle {
MODAL, SELECT
}

View file

@ -0,0 +1,344 @@
package org.skyer.channel.infra.constant;
/**
* 基础模块常量
*
* @author gaokuo.dai@hand-china.com 2018年6月12日下午2:38:50
*/
public interface FndConstants {
/**
* 个性化页面值类型
*/
interface AttributeType {
/**
* 字符串
*/
String STRING = "STRING";
/**
* 数字
*/
String NUMBER = "NUMBER";
/**
* boolean
*/
String BOOLEAN = "BOOLEAN";
}
/**
* 个性化页面应用层级
*/
interface UiDimensionType {
/**
* 平台级
*/
String SITE = "SITE";
/**
* 租户级
*/
String TENANT = "TENANT";
/**
* 公司及
*/
String COMPANY = "COMPANY";
/**
* 用户级
*/
String USER = "USER";
}
/**
* 缓存Key
*/
interface CacheKey {
/**
* 模板配置缓存Key
*/
String TEMPLATE_CACHE_KEY = Constants.APP_CODE + ":template:";
/**
* 模板配置缓存Key
*/
String DEFAULT_TEMPLATE_CACHE_KEY = Constants.APP_CODE + ":default-template:";
/**
* 值集缓存
*/
String LOV_KEY = Constants.APP_CODE + ":lov";
/**
* 配置维护
*/
String PROFILE_KEY = Constants.APP_CODE + ":profile";
/**
* 事件
*/
String EVENT_KEY = Constants.APP_CODE + ":event";
/**
* 个性化表格配置
*/
String CUSTOM_TABLE_KEY = Constants.APP_CODE + ":custom_table";
/**
* 数据屏蔽
*/
String PERMISSION_KEY = Constants.APP_CODE + ":permission";
/**
* 系统配置 服务级功能所以不加fnd
*/
String CONFIG_KEY = Constants.APP_CODE + ":config";
/**
* 多语言描述
*/
String PROMPT_KEY = Constants.APP_CODE + ":prompt";
/**
* 数据权限数据库关系
*/
String DATABASE_KEY = Constants.APP_CODE + ":database";
/**
* 数据源服务关系
*/
String DATASOURCE_KEY = Constants.APP_CODE + ":datasource";
/**
* 静态文本
*/
String STATIC_TEXT = Constants.APP_CODE + ":text";
/**
* 个性化页面
*/
String Ui_PAGE = Constants.APP_CODE + ":page";
/**
* 静态文本头
*/
String STATIC_TEXT_HEAD = STATIC_TEXT + ":head";
/**
* 静态文本行
*/
String STATIC_TEXT_LINE = STATIC_TEXT + ":line";
/**
* 平台卡片
*/
String DASHBOARD_CARD_KEY = Constants.APP_CODE + ":dashboard_card";
/**
* 租户卡片分配
*/
String DASHBOARD_TENANT_CARD_KEY = Constants.APP_CODE + ":dashboard_tenant_card";
}
/**
* 值集类型
*/
interface LovTypeCode {
/**
* URL型
*/
String URL = "URL";
/**
* 自定义SQL型
*/
String SQL = "SQL";
/**
* 独立值集型
*/
String INDEPENDENT = "IDP";
}
/**
* 事件调用类型
*/
interface CallType {
/**
* 方法
*/
String METHOD = "M";
/**
* API
*/
String API = "A";
}
/**
* 配置维护值应用层级
*/
interface ProfileLevelCode {
/**
* 配置维护值应用层级-角色级
*/
String ROLE = "ROLE";
/**
* 配置维护值应用层级-用户级
*/
String USER = "USER";
/**
* 配置维护值应用层级-全局(对应该租户下的所有)
*/
String GLOBAL = "GLOBAL";
}
/**
* 编码规则应用层级
*/
interface CodeRuleLevelCode {
/**
* 全局级
*/
String GLOBAL = "GLOBAL";
/**
* 公司
*/
String COMPANY = "COM";
}
/**
* 应用维度
*/
interface Level {
/**
* 应用维度-租户级
*/
String TENANT = "T";
/**
* 应用维度-平台级
*/
String PLATFORM = "P";
}
/**
* 编码规则段类型
*/
interface FieldType {
/**
* 序列
*/
String SEQUENCE = "SEQUENCE";
/**
* 常量
*/
String CONSTANT = "CONSTANT";
/**
* 日期
*/
String DATE = "DATE";
/**
* 变量
*/
String VARIABLE = "VARIABLE";
/**
* uuid
*/
String UUID = "UUID";
}
/**
* 重置频率
*/
interface ResetFrequency {
/**
* 从不
*/
String NEVER = "NEVER";
/**
* 每年
*/
String YEAR = "YEAR";
/**
* 每季
*/
String QUARTER = "QUARTER";
/**
* 每月
*/
String MONTH = "MONTH";
/**
* 每天
*/
String DAY = "DAY";
}
/**
* 序列
*/
interface Sequence {
/**
* 自增步长
*/
Long STEP = 1L;
/**
* 记录频率
*/
Long STEP_NUM = 100L;
}
/**
* 数据来源
*
* @author gaokuo.dai@hand-china.com 2018年8月27日下午4:39:03
*/
interface DataSource {
String SKYER = "SKYER";
String SRM = "SRM";
String ERP = "ERP";
}
/**
* 数据屏蔽规则类型代码
*/
interface PermissionRuleTypeCode {
/**
* sql
*/
String SQL = "SQL";
/**
* 数据库前缀
*/
String PREFIX = "PREFIX";
}
/**
* 数据源用户密码返回值
*/
interface DatasourcePassword {
/**
* 返回前端的密码信息
*/
String RETURNEDSTRING = "******";
}
}

View file

@ -0,0 +1,264 @@
package org.skyer.channel.infra.constant;
/**
* 维护返回异常信息
*
* @author xiaoyu.zhao@hand-china.com 2019/01/17 20:25
*/
public class HpfmMsgCodeConstants {
/**
* 数据源驱动已经被使用不可删除
*/
public static final String ERROR_DELETE_USED_DRIVER = "hpfm.error.deleteUsedDriver";
/**
* 缓存Key所需参数获取失败
*/
public static final String ERROR_CACHE_DATA_NULL = "hpfm.error.cache_data.null";
/**
* 事件编码已存在
*/
public static final String ERROR_EVENT_CODE_EXISTS = "hpfm.error.event.code_exists";
/**
* 值集错误无效的路由名
*/
public static final String ERROR_LOV_INVALID_ROUTE_NAME = "hpfm.error.lov.invalid_route_name";
/**
* 当前规则已经被引用禁止删除
*/
public static final String ERROR_PERMISSION_RULE_FORBID_DELETE = "hpfm.error.permission_rule_cited";
/**
* 编码规则未找到
*/
public static final String ERROR_CODE_RULE_NOT_FOUNT = "hpfm.error.code_rule.not_found";
/**
* 屏蔽规则类型重复
*/
public static final String ERROR_PERMISSION_REF_RULE_TYPE_CODE_REPEAT = "hpfm.error.blocking_rule.exist";
/**
* 租户编码或名称重复
*/
public static final String ERROR_TENANT_NAME_REPEAT = "hpfm.error.tenant.name_repeat";
/**
* 连接异常不能建立JDBC连接
*/
public static final String ERROR_CONNECTION = "hpfm.error.jdbc_connection";
/**
* 查询异常: 数据库中存在多条记录
*/
public static final String ERR_REPEAT = "hpfm.error.data_repeat";
/**
* 查询异常: 没有主键或代码
*/
public static final String ERR_NO_PRIMARY_KEY = "hpfm.error.no_pk";
/**
* 起始日期 {0} 晚于终止日期 {1}
*/
public static final String DATE_RANGE_ERROR = "hpfm.error.date.start_later_end";
/**
* 操作异常不能对公有库进行插入操作
*/
public static final String ERROR_INSERT_TO_DATABASE = "hpfm.error.can_not_insert";
public static final String ERROR_UPDATE_TO_DATABASE = "hpfm.error.can_not_update";
public static final String ERROR_DELETE_TO_DATABASE = "hpfm.error.can_not_delete";
public static final String ERROR_ALTER_TO_PUBLIC = "hpfm.error.database.can_not_alter";
public static final String ERROR_DROP_TO_PUBLIC = "hpfm.error.database.can_not_drop";
public static final String ERROR_CREATE_INDEX_TO_PUBLIC = "hpfm.error.database.can_not_create_index";
public static final String NO_OPERATION_PERMISSION = "hpfm.error.operation_without_permission";
/**
* 查询到表提示没有改表
*/
public static final String ERROR_NOT_EXIST_TABLE = "hpfm.error.table.not_exist";
public static final String ERROR_NOT_EXIST_FIELD = "hpfm.error.field.not_exist";
/**
* 同一文本编码有效期重叠
*/
public static final String REPEAT_DATE = "hpfm.error.text_code.repeat_date";
/**
* 文本编码不存在
*/
public static final String TEXT_CODE_NOT_EXISTS = "hpfm.error.text_code.not_exists";
/**
* 文本编码和语言不存在
*/
public static final String TEXT_CODE_LANG_NOT_EXISTS = "hpfm.error.text_code_lang.not_exists";
/**
* saga 发送消息失败
*/
public static final String SEND_SAGA_MESSAGE_FAIL = "hpfm.error.send_saga_message.fail";
/**
* 获取规则引擎配置失败
*/
public static final String GET_RULE_FAILED = "hpfm.error.rule_script.get_rule_failed";
/**
* 数据为空
*/
public static final String DASHBOARD_DATA_EMPTY = "hpfm.error.data.empty";
/**
* 卡片code重复
*/
public static final String DASHBOARD_CODE_REPEAT = "hpfm.error.code_repeat";
/**
* 当前角色下已经存在该卡片
*/
public static final String DASHBOARD_ROLE_CARD_EXISTS = "hpfm.error.role_card.exists";
/**
* 事件规则数据不匹配
*/
public static final String ERROR_EVENT_NOT_MATCH = "hpfm.error.event.notMatch";
/**
* saga调用失败回调
*/
public static final String ERROR_SAGA_START_FAILED = "hpfm.error.saga.start";
/**
* 当前租户与传入值集租户信息不匹配
*/
public static final String ERROR_LOV_TENANT_NOT_MATCH = "hpfm.error.lov_tenant.not_match";
/**
* 当前租户与传入多语言租户信息不匹配
*/
public static final String ERROR_PROMPT_TENANT_NOT_MATCH = "hpfm.error.prompt_tenant.not_match";
/**
* 当前租户与传入规则引擎租户信息不匹配
*/
public static final String ERROR_RULE_SCRIPT_TENANT_NOT_MATCH = "hpfm.error.rule_script.not_match";
/**
* 当前租户与传入数据权限租户信息不匹配
*/
public static final String ERROR_PERMISSION_RULE_TENANT_NOT_MATCH = "hpfm.error.permission_rule.not_match";
/**
* 卡片分配租户传入数据存在重复信息
*/
public static final String ERROR_CARD_TENANT_REPEAT = "hpfm.error.card_tenant.repeat";
public static final String ERROR_CARD_CLAUSE_REPEAT = "hpfm.error.card_clause.repeat";
/**
* 起始时间不能大于截止时间
*/
public static final String ERROR_DATE_IRREGULARITY = "hpfm.error.date.irregularity";
public static final String ERROR_DATA_DISABLED = "hpfm.error.data.disabled";
/**
* 当前租户与传入静态文本租户信息不匹配
*/
public static final String ERROR_STATIC_TEXT_TENANT_NOT_MATCH = "hpfm.error.static_text.not_match";
public static final String ERROR_EVENT_TENANT_NOT_MATCH = "hpfm.error.event.not_match";
/**
* 弹性域模型被使用不可删除
*/
public static final String FLEX_MODEL_DELETE = "hpfm.flex.model.delete";
/**
* 弹性域模型字段被使用不可删除
*/
public static final String FLEX_MODEL_FIELD_DELETE = "hpfm.flex.model_field.delete";
/**
* 弹性域规则明细被使用不可删除
*/
public static final String FLEX_RULE_DETAIL_DELETE = "hpfm.flex.rule_detail.delete";
/**
* 弹性域字段初始化失败
*/
public static final String FLEX_MODEL_FIELD_INIT = "hpfm.flex.model_field.init";
public static final String ERROR_LOV_TENANT_REPEAT = "hpfm.lov.tenant.repeat";
public static final String ERROR_LOV_SITE_COPY_FAIL = "hpfm.lov.site.copy_fail";
public static final String ERROR_LOV_VIEW_TENANT_REPEAT = "hpfm.lov_view.tenant.repeat";
public static final String ERROR_LOV_VIEW_SITE_COPY_FAIL = "hpfm.lov_view.site.copy_fail";
/**
* 模板配置已经存在不可重复添加
*/
public static final String ERROR_TEMPLATE_CONFIG_EXISTS = "hpfm.template_config.exists";
/**
* 当前数据下已经分配该模板不可重复添加
*/
public static final String ERROR_TEMPLATE_ASSIGN_EXISTS = "hpfm.template_assign.exists";
public static final String ERROR_FORM_HEADER_NULL = "hpfm.error.form_header.null";
public static final String ERROR_TEMPLATE_ASSIGN_DELETE_DEFAULT = "hpfm.error.template_assign.delete_default";
public static final String ERROR_DATASOURCE_REGISTER_FAIL = "hpfm.error.datasource_register.fail";
public static final String ERROR_GET_CONNECTION_FAIL = "hpfm.error.get_connection.fail";
public static final String ERROR_RELATIONAL_PARAM_ILLEGAL = "hpfm.relational_param.illegal";
public static final String ERROR_DATASOURCE_ID_NULL = "hpfm.error.datasource_id.null";
/**
* 数据组数据已经存在
*/
public static final String ERROR_GROUP_DATA_EXISTS = "hpfm.error.group_data_exists";
public static final String ERROR_TEMPLATE_ALREADY_REFERENCED = "hpfm.error.template.is_referenced";
/**
* 平台多语言参数校验失败
*/
public static final String ERROR_PROMPT_PARAM_NOT_NULL = "hpfm.error.prompt.param_not_null";
/**
* 导出错误信息
*/
public static final String ERROR_EXPORT_TASK_NOT_EXISTS = "hpfm.error.export_task.not_exists";
public static final String ERROR_EXPORT_TASK_CANCEL_FAILED = "hpfm.error.export.cancel_failed";
public static final String ERROR_DRIVER_EXISTS = "hpfm.error.driver.exists";
/**
* 自定义驱动无法测试连接
*/
public static final String ERROR_CUSTOM_DRIVER = "hpfm.error.custom_driver";
/**
* 父级未启用或父级不允许操作
*/
public static final String ERROR_PARENT_DISABlE = "error.parent.disable";
public static final String SEND_SOCKET = "hpfm.error.send_socket";
public static final String REFRESH_CACHE = "hpfm.error.prompt.refresh_cache";
/**
* 数据异常名称重复
*/
public static final String ERROR_MULTIPLE_NAME = "error.multiple.name";
/**
* 值集没有父级值集
*/
public static final String ERROR_LOV_IMPORT_HAVE_NOT_PARENT = "error.lov.import.have_not_parent";
/**
* 父级值集值不存在或未启用
*/
public static final String ERROR_LOV_IMPORT_PARENT_VALUE_INVALID = "error.lov.import.parent_value_invalid";
/**
* 数据层级配置 下拉列表 数量超过最大配置数量
*/
public static final String ERROR_DATA_HIERARCHY_SELECT_EXCEEDS_MAXIMUM_NUMBER_LIMIT =
"error.data_hierarchy.select.exceeds_maximum_number_limit";
/**
* 数据层级配置显示样式与父级层级不匹配
*/
public static final String ERROR_PARENT_DISPLAY_NOT_MATCH = "error.data_hierarchy.display.not_match_parent";
/**
* 数据层级配置显示样式与父级层级不匹配
*/
public static final String ERROR_CLUSTER_ASSIGN_SERVERS = "hpfm.error.clusterAssignServers";
/**
* 值集编码为: {0} 的父级值集不存在
*/
public static final String ERROR_PARENT_LOV_NOT_NULL = "hpfm.error.lov.parentLovNotNull";
/**
* 值集错误URL 值集 URL 内容不可为空
*/
public static final String ERROR_LOV_URL_NOT_NULL = "hpfm.error.lov.urlNotNull";
/**
* 值集错误SQL 值集 SQL 内容不可为空
*/
public static final String ERROR_LOV_SQL_NOT_NULL = "hpfm.error.lov.sqlNotNull";
/**
* 值集错误导入值集时不允许更新LovType内容
*/
public static final String ERROR_LOV_TYPE_NOT_MATCH = "hpfm.error.lovTypeNotMatch";
}

View file

@ -0,0 +1,64 @@
package org.skyer.channel.infra.constant;
/**
* <p>
* Hr 业务常量类
* </p>
*
* @author qingsheng.chen 2018/6/22 星期五 14:54
*/
public class HrConstants {
private HrConstants() {}
public static class LovCode {
/**
* 数据来源Lov code
*/
public static final String DATA_SOURCE = "HPFM.DATA_SOURCE";
}
/**
* 维度类型
*
* @author jian.zhang02@hand-china.com 2018年6月26日下午3:14:53
*/
public static class DimensionType {
/**
* 平台级
*/
public static final String DIMENSION_PLATFORM_TYPE = "platform";
/**
* 租户级
*/
public static final String DIMENSION_TENANT_TYPE = "tenant";
/**
* 公司级
*/
public static final String DIMENSION_COMPANY_TYPE = "company";
/**
* 用户级
*/
public static final String DIMENSION_USER_TYPE = "user";
}
public static class CodeRule {
public static final String QD_WAREHOUSE_CODE = "HPFM.COMPANY";
public static final String MOVE_RECORD_CODE = "HPFM.COMPANY";
public static final String ADJUST_RECORD_CODE = "HPFM.COMPANY";
public static final String DISTRIBUTE_PLAN = "HPFM.COMPANY";
public static final String RESERVE_RECORD_CODE = "HPFM.COMPANY";
public static final String LOG_CODE = "HPFM.COMPANY";
}
public static class LevelValue {
public static final String QD_WAREHOUSE_CODE = "HPFM.COMPANY";
public static final String ADJUST_RECORD_CODE = "HPFM.COMPANY";
public static final String MOVE_RECORD_CODE = "HPFM.COMPANY";
public static final String RESERVE_RECORD_CODE ="HPFM.COMPANY";
public static final String DISTRIBUTE_PLAN="HPFM.COMPANY";
public static final String LOG_LEVEL = "GLOBAL";
}
}

View file

@ -0,0 +1,80 @@
package org.skyer.channel.infra.convertor;
import java.util.List;
import java.util.Map;
import org.skyer.core.convert.CommonConverter;
/**
* 通用对象转换工具
*
* @author min.wang01@hand-china.com 2018/08/08 11:52
*/
public class CommonConvertor<T, V> {
/**
* List对象转换
*
* @param targetClazz 目标对象class
* @param sourceList 源对象list
* @param <T>
* @param <V>
* @return
*/
public static <T, V> List<T> listConvertor(Class<T> targetClazz, List<V> sourceList) {
return listConvertor(targetClazz, sourceList, null);
}
/**
*
* List对象转换
*
* @param targetClazz
* @param sourceList
* @param rule 自定义映射规则(target字段,source字段)
* @return
*/
public static <T, V> List<T> listConvertor(Class<T> targetClazz, List<V> sourceList, Map<String, String> rule) {
return CommonConverter.listConverter(targetClazz, sourceList, rule);
}
/**
* List对象转换(过滤当前多语言)
*
* @param targetClazz
* @param field 多语言字段名
* @param sourceList
* @return
*/
public static <T, V> List<T> listConvertor(Class<T> targetClazz, String field, List<V> sourceList) {
return listConvertor(targetClazz, field, sourceList, null);
}
/**
*
* description
*
* @param targetClazz
* @param field 多语言字段名
* @param sourceList
* @param rule 自定义映射规则(target字段,source字段)
* @return
*/
public static <T, V> List<T> listConvertor(Class<T> targetClazz, String field, List<V> sourceList,
Map<String, String> rule) {
return CommonConverter.listConverter(targetClazz, field, sourceList, rule);
}
/**
* javaBean对象转换
*
* @param targetClazz
* @param sourceObject
* @param <T>
* @param <V>
* @return
*/
public static <T, V> T beanConvert(Class<T> targetClazz, V sourceObject) {
return CommonConverter.beanConvert(targetClazz, sourceObject);
}
}

View file

@ -0,0 +1,63 @@
package org.skyer.channel.infra.enums;
/**
*
* 连接池类型
*
* @author xianzhi.chen@hand-china.com 2018年10月23日下午2:47:03
*/
public enum DBPoolTypeEnum {
/**
* C3p0
*/
C3P0("C3p0"),
/**
* Dbcp
*/
DBCP2("Dbcp2"),
/**
* Druid
*/
DRUID("Druid"),
/**
* No
*/
NO("No");
private final String value;
DBPoolTypeEnum(final String value) {
this.value = value;
}
public static DBPoolTypeEnum valueOf2(String arg) {
switch (arg) {
case "C3p0":
return C3P0;
case "Dbcp2":
return DBCP2;
case "Druid":
return DRUID;
case "No":
return NO;
default:
return NO;
}
}
public static boolean isInEnum(String value) {
for (DBPoolTypeEnum dbPoolType : DBPoolTypeEnum.values()) {
if (dbPoolType.getValue().equals(value)) {
return true;
}
}
return false;
}
public String getValue() {
return this.value;
}
}

View file

@ -0,0 +1,70 @@
package org.skyer.channel.infra.enums;
import org.skyer.channel.infra.constant.Constants;
/**
*
* 数据库类型
*
* @author xianzhi.chen@hand-china.com 2018年10月23日下午2:47:03
*/
public enum DatabaseTypeEnum {
/**
* MySQL
*/
MYSQL("MYSQL"),
/**
* SqlServer
*/
SQLSERVER("SQLSERVER"),
/**
* Oracle
*/
ORACLE("ORACLE"),
/**
* TiDB
*/
TIDB("TIDB"),
/**
* OtherDB
*/
OTHERDB("OTHERDB");
private final String value;
DatabaseTypeEnum(final String value) {
this.value = value;
}
public static DatabaseTypeEnum valueOf2(String arg) {
switch (arg) {
case Constants.Datasource.DB_MYSQL:
return MYSQL;
case Constants.Datasource.DB_MSSQL:
return SQLSERVER;
case Constants.Datasource.DB_ORACLE:
return ORACLE;
case Constants.Datasource.DB_TIDB:
return MYSQL;
default:
return OTHERDB;
}
}
public static boolean isInEnum(String value) {
for (DatabaseTypeEnum databaseType : DatabaseTypeEnum.values()) {
if (databaseType.getValue().equals(value)) {
return true;
}
}
return false;
}
public String getValue() {
return this.value;
}
}

View file

@ -0,0 +1,22 @@
package org.skyer.channel.infra.feign;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.skyer.channel.infra.feign.fallback.UserClientImpl;
import org.skyer.channel.infra.feign.impl.OrderReportRemoteServiceImpl;
import org.skyer.channel.infra.remote.api.dto.SaleOrderOrderApiDTO;
import org.skyer.common.SkyerService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.context.annotation.Primary;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
@Primary
@FeignClient(value = SkyerService.Order.NAME, fallback = OrderReportRemoteServiceImpl.class, path = "/v1/order-report")
public interface OrderReportRemoteService {
@PostMapping("/channel-sale-report")
ResponseEntity<List<ChannelSaleOrderVO>> queryChannelOrderSaleReport(@RequestBody SaleOrderOrderApiDTO saleOrderOrderApiDTO);
}

View file

@ -0,0 +1,31 @@
package org.skyer.channel.infra.feign;
import org.skyer.channel.infra.feign.fallback.UserClientImpl;
import org.skyer.common.SkyerService;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* <p>
* 用户信息获取
* </p>
*
* @author zhanglb
*/
@FeignClient(value = SkyerService.Iam.NAME, fallback = UserClientImpl.class, path = "/skyer/v1")
public interface UserClient {
/**
* 查询组织ids是否有关联用户
* @param companyIds 公司ids
* @return Boolean
*/
@PostMapping("/company/user")
ResponseEntity companyUser(@RequestBody List<Long> companyIds);
}

View file

@ -0,0 +1,25 @@
package org.skyer.channel.infra.feign.fallback;
import org.skyer.channel.infra.feign.UserClient;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import java.util.List;
/**
* 用户信息查询失败回调
* @author zhanglb
*/
@Component
public class UserClientImpl implements UserClient {
private static final Logger logger = LoggerFactory.getLogger(UserClientImpl.class);
@Override
public ResponseEntity companyUser(List<Long> companyIds) {
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).build();
}
}

View file

@ -0,0 +1,19 @@
package org.skyer.channel.infra.feign.impl;
import org.skyer.channel.domain.vo.ChannelSaleOrderVO;
import org.skyer.channel.infra.feign.OrderReportRemoteService;
import org.skyer.channel.infra.remote.api.dto.SaleOrderOrderApiDTO;
import org.skyer.core.exception.CommonException;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class OrderReportRemoteServiceImpl implements OrderReportRemoteService {
@Override
public ResponseEntity<List<ChannelSaleOrderVO>> queryChannelOrderSaleReport(SaleOrderOrderApiDTO saleOrderOrderApiDTO) {
throw new CommonException("调用订单中心查询报表异常");
}
}

View file

@ -0,0 +1,63 @@
package org.skyer.channel.infra.handler;
import org.apache.commons.lang3.StringUtils;
import org.skyer.boot.message.constant.WebSocketConstant;
import org.skyer.boot.message.entity.Msg;
import org.skyer.channel.infra.constant.HpfmMsgCodeConstants;
import org.skyer.websocket.helper.SocketMessageHandler;
import org.skyer.websocket.vo.MsgVO;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestTemplate;
import org.skyer.core.exception.CommonException;
/**
* description
*
* @author shuangfei.zhu@hand-china.com 2019/08/28 19:31
*/
@Component
public class MessageHandler extends SocketMessageHandler {
/**
* Hzero平台HTTP协议,默认http
*/
@Value("${skyer.platform.httpProtocol:http}")
private String skyerPlatformHttpProtocol;
@Autowired
private RestTemplate restTemplate;
@Override
public boolean needPrincipal() {
return true;
}
@Override
public void processMessage(MsgVO msgVO) {
String serverName = msgVO.getService();
if (StringUtils.isBlank(serverName)) {
return;
}
Msg msg = new Msg();
BeanUtils.copyProperties(msgVO, msg);
// 获取用户信息
msg.setUserDetails(getCustomUserDetails());
// 使用restTemplate通知消息客户端
String url = this.skyerPlatformHttpProtocol + "://" + serverName + WebSocketConstant.MESSAGE_HANDLER_PATH;
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON_UTF8);
HttpEntity<Msg> entity = new HttpEntity<>(msg, headers);
ResponseEntity response = restTemplate.postForEntity(url, entity, String.class);
if (!response.getStatusCode().is2xxSuccessful()) {
throw new CommonException(HpfmMsgCodeConstants.SEND_SOCKET);
}
}
}

View file

@ -0,0 +1,17 @@
package org.skyer.channel.infra.mapper;
import org.skyer.channel.domain.entity.Dealer;
import org.skyer.mybatis.common.BaseMapper;
/**
* <p>
* 经销商Mapper
* </p>
*
* @author lzh
* @since 2021-06-17
*/
public interface DealerMapper extends BaseMapper<Dealer> {
}

View file

@ -0,0 +1,13 @@
package org.skyer.channel.infra.mapper;
import org.skyer.channel.domain.entity.Group;
import org.skyer.mybatis.common.BaseMapper;
/**
* Mapper
*
* @author linzhuanghuang@ebc.com 2021-09-03 16:54:36
*/
public interface GroupMapper extends BaseMapper<Group> {
}

View file

@ -0,0 +1,27 @@
package org.skyer.channel.infra.mapper;
import java.util.List;
import org.skyer.channel.api.dto.SalesOrganizationListDTO;
import org.skyer.channel.domain.entity.SalesOrganization;
import org.skyer.channel.domain.vo.SalesOrganizationListVO;
import org.skyer.mybatis.common.BaseMapper;
/**
* <p>
* 销售组织Mapper
* </p>
*
* @author lzh
* @since 2021-06-18
*/
public interface SalesOrganizationMapper extends BaseMapper<SalesOrganization> {
/**
* 获取经销商列表
* @param salesOrganizationListDTO
* @return
*/
List<SalesOrganizationListVO> pageSalesOrganizationList(SalesOrganizationListDTO salesOrganizationListDTO);
}

View file

@ -0,0 +1,34 @@
package org.skyer.channel.infra.mapper;
import org.apache.ibatis.annotations.Param;
import java.util.List;
import org.skyer.channel.api.dto.ChannelSaleOrderDTO;
import org.skyer.channel.api.dto.OnlineShopShowDTO;
import org.skyer.channel.api.dto.PhysicalShopShowDTO;
import org.skyer.channel.api.dto.QueryShopListDTO;
import org.skyer.channel.domain.entity.Shop;
import org.skyer.channel.domain.vo.*;
import org.skyer.mybatis.common.BaseMapper;
/**
* Mapper
*
* @author lixiaoyang 2021-12-10 13:27:14
*/
public interface ShopMapper extends BaseMapper<Shop> {
OnlineShopSettingVO getSetting(@Param("id") Long id);
List<OnlineShopVO> getOnlineShopList(@Param("onlineShopShowDTO") OnlineShopShowDTO onlineShopShowDTO, @Param("tenantId") Long tenantId);
List<PhysicalShopVO> getPhysicalShopList(@Param("physicalShopDTO") PhysicalShopShowDTO physicalShopShowDTO, @Param("tenantId") Long tenantId);
List<ShopListVO> getShopList(@Param("dto") QueryShopListDTO dto, @Param("tenantId") Long tenantId);
Shop getShopByNameAndCategoryTypeAndChannelType(@Param("name") String name, @Param("categoryType") String categoryType, @Param("channelType") String channelType, @Param("channelWarehouseName") String channelWarehouseName);
List<ChannelSaleOrderVO> queryChannelOrderSaleReport(@Param("dto") ChannelSaleOrderDTO dto);
}

View file

@ -0,0 +1,28 @@
package org.skyer.channel.infra.mapper;
import java.util.List;
import org.skyer.channel.api.dto.WarehouseListDTO;
import org.skyer.channel.domain.entity.Warehouse;
import org.skyer.channel.domain.vo.WarehouseListVO;
import org.skyer.mybatis.common.BaseMapper;
/**
* <p>
* 仓库 Mapper
* </p>
*
* @author lzh
* @since 2021-06-18
*/
public interface WarehouseMapper extends BaseMapper<Warehouse> {
/**
* 获取渠道仓库列表
* @param warehouseListDTO
* @return
*/
List<WarehouseListVO> pageWarehouseList(WarehouseListDTO warehouseListDTO);
}

View file

@ -0,0 +1,118 @@
package org.skyer.channel.infra.properties;
import java.util.List;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* HPFM Properties
*
* @author gaokuo.dai@hand-china.com 2018年8月20日下午4:24:58
*/
@ConfigurationProperties(prefix = ChannelProperties.PREFIX)
public class ChannelProperties {
public static final String PREFIX = "skyer.platform";
private static final String HTTP_PROTOCOL_SUFFIX = "://";
/**
* 启动时是否刷新缓存,默认true
*/
private Boolean initCache = true;
/**
* 平台Http协议,默认http
*/
private String httpProtocol = "http";
/**
* 完整平台Http协议,默认http://
*/
private String fullHttpProtocol = "http://";
/**
* @return 启动时是否刷新缓存,默认true
*/
public Boolean getInitCache() {
return initCache;
}
/**
* 获取卡片使用的模板角色Code
*/
private List<String> roleTemplateCodes;
private Encrypt encrypt = new Encrypt();
public List<String> getRoleTemplateCodes() {
return roleTemplateCodes;
}
public void setRoleTemplateCodes(List<String> roleTemplateCodes) {
this.roleTemplateCodes = roleTemplateCodes;
}
public void setInitCache(Boolean initCache) {
this.initCache = initCache;
}
/**
* @return 平台Http协议,默认http
*/
public String getHttpProtocol() {
return httpProtocol;
}
public void setHttpProtocol(String httpProtocol) {
this.httpProtocol = httpProtocol;
this.fullHttpProtocol = httpProtocol + HTTP_PROTOCOL_SUFFIX;
}
/**
* @return 完整平台Http协议,默认http://
*/
public String getFullHttpProtocol() {
return fullHttpProtocol;
}
public Encrypt getEncrypt() {
return encrypt;
}
public void setEncrypt(Encrypt encrypt) {
this.encrypt = encrypt;
}
/**
* 加密私钥和公钥
*/
public static class Encrypt {
/**
* 密码加密公钥
*/
private String publicKey =
"MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIPdTZ1b9Q13Y2YmZ4mjQnFpypCqhV6rjGgsTQMYqC0eVu/je3/L98/4/j3lNePWqwHgCDD0mxISFm44nDKfPbcCAwEAAQ==";
/**
* 密码加密私钥
*/
private String privateKey =
"MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAg91NnVv1DXdjZiZniaNCcWnKkKqFXquMaCxNAxioLR5W7+N7f8v3z/j+PeU149arAeAIMPSbEhIWbjicMp89twIDAQABAkAYAgbLi56GISJ7yqo3KP5D39r9k85MejdKECbFVYvpCsLG51IrwtVcdGJTExmkzIuOWnwqRAYUjpQnVvPvLzZhAiEA/Dyk4j+XZtC7NVxrXjn+PHG0vWZ8x14G5sBL6RfgzEsCIQCF1O0383YF0BbDUGkBoaVGmEc3H0D7FQF5L4gMe5EYxQIgLljOSyw4G5I68+EZcWTijCSweyS7xL5IMlofGKNkkOUCIC+hqdAZEW9eMUvQaZ8QBf/LIMWIlRsHzd9wwE4ZCHo1AiEAqsUlDIIfPOrjQfbeYVWSD+Ac9PzMiFfH9H/WMuaWRtw=";
public String getPublicKey() {
return publicKey;
}
public void setPublicKey(String publicKey) {
this.publicKey = publicKey;
}
public String getPrivateKey() {
return privateKey;
}
public void setPrivateKey(String privateKey) {
this.privateKey = privateKey;
}
}
}

View file

@ -0,0 +1,19 @@
package org.skyer.channel.infra.properties;
import org.springframework.boot.context.properties.ConfigurationProperties;
/**
* @author yuelinsoft
*/
@ConfigurationProperties(prefix = "skyer.data-hierarchy.display")
public class DataHierarchyProperties {
private int maxSelectCount = 3;
public int getMaxSelectCount() {
return maxSelectCount;
}
public void setMaxSelectCount(int maxSelectCount) {
this.maxSelectCount = maxSelectCount;
}
}

View file

@ -0,0 +1,39 @@
package org.skyer.channel.infra.remote.api;
import java.util.List;
import org.skyer.boot.api.customize.commons.vo.MethodMetaData;
/**
* 客制化业务方法调用
*
* @author bojiangzhou 2019/07/04
*/
public interface RemoteCustomizeService {
/**
* 获取服务的方法
*
* @param serviceName 服务编码
* @param packageNames 包名
* @return List<MethodMetaDataDTO>
*/
List<MethodMetaData> fetchServiceMethods(String serviceName, String packageNames);
/**
* 应用客制化规则
*
* @param serviceNames 服务名
* @param ruleCodes 规则规则
*/
void applyCustomizeRule(List<String> serviceNames, List<String> ruleCodes);
/**
* 应用客制化规则
*
* @param serviceName 服务名
* @param ruleCodes 规则规则
*/
void applyCustomizeRule(String serviceName, List<String> ruleCodes);
}

View file

@ -0,0 +1,20 @@
package org.skyer.channel.infra.remote.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.Date;
import java.util.List;
@Data
public class SaleOrderOrderApiDTO {
@ApiModelProperty("订单开始时间")
private Date startDate;
@ApiModelProperty("订单结束时间")
private Date endDate;
@ApiModelProperty("店铺code")
private List<String> storeCode;
}

Some files were not shown because too many files have changed in this diff Show more