commit skyer service

This commit is contained in:
jiangjianfeng 2022-06-20 19:07:24 +08:00
parent 88ba36f850
commit 6a3a6bf690
1104 changed files with 69394 additions and 0 deletions

103
skyer-goods/.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,11 @@
include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/ce450dff-5aa0-47a1-b397-6f0a71aed0c2/content.yaml
#include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/3db66342-8915-49a4-b4e0-c0e57c08c657/content.yaml
#
##include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/b2617c66-8f9a-4dca-9e4a-977a83404093/content.yaml
##
###include: http://api.k8s9.com/devops/v1/projects/285085540595404800/ci_contents/pipelines/a814fa4b-e039-4a7d-8bcf-e060b751925d/content.yaml
###
####include: http://api.baogicloud.com/devops/v1/projects/204888765897510912/ci_contents/pipelines/0cfdcff6-6fe6-43dd-a5d0-9db2c866a451/content.yaml
####
#####include: http://api.baogicloud.com/devops/v1/projects/187577360164982784/ci_contents/pipelines/903880b5-824b-42c1-9088-2f59c0598f7e/content.yaml

View file

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

View file

@ -0,0 +1,81 @@
# skyer Base Service
基于Spring Cloud Goods的微服务商品中心服务
## 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-platform`
`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,128 @@
## 实例运行数量
replicaCount: 1
## 设置默认的 image、imageTag 和 imagePullPolicy。
image:
repository: harbor.k8s9.com/k8s9-skyer-ebc/skyer-goods
pullPolicy: IfNotPresent
deployment:
managementPort: 8311
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: 8310
# 本实例管理端口
MANAGEMENT_SERVER_PORT: 8311
# 是否启用配置中心
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_goods?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
## Liveness 和 Readiness 探针相关配置
## ref: https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/
livenessProbe:
initialDelaySeconds: 180
periodSeconds: 30
timeoutSeconds: 3
successThreshold: 1
failureThreshold: 3
readinessProbe:
initialDelaySeconds: 5
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: 8310
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-goods.jar
WORKDIR /skyer
USER 33
CMD java $JAVA_OPTS $SKYWALKING_OPTS -jar /skyer/skyer-goods.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

346
skyer-goods/pom.xml Normal file
View file

@ -0,0 +1,346 @@
<?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-goods</artifactId>
<properties>
<lambok.version>1.18.16</lambok.version>
<mapstruct.version>1.3.1.Final</mapstruct.version>
</properties>
<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>
<!-- 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>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${mapstruct.version}</version>
</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>
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.2</version>
</dependency>
<dependency>
<groupId>org.skyer.starter</groupId>
<artifactId>skyer-starter-saga</artifactId>
</dependency>
<dependency>
<groupId>org.skyer.boot</groupId>
<artifactId>skyer-boot-search</artifactId>
<version>1.0.0-SNAPSHOT</version>
</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>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${mapstruct.version}</version>
</path>
<!-- other annotation processors -->
</annotationProcessorPaths>
</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,16 @@
package org.skyer.autoconfigure.goods;
import java.lang.annotation.*;
import org.springframework.context.annotation.Import;
/**
* @author bojiangzhou 2018/10/25
*/
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(GoodsAutoConfiguration.class)
public @interface EnableSkyerGoods {
}

View file

@ -0,0 +1,55 @@
package org.skyer.autoconfigure.goods;
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.goods.infra.properties.DataHierarchyProperties;
import org.skyer.goods.infra.properties.GoodsProperties;
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.goods.api", "org.skyer.goods.app",
"org.skyer.goods.config", "org.skyer.goods.domain", "org.skyer.goods.infra"})
@EnableFeignClients({"org.skyer.goods", "org.skyer", "org.skyer.plugin"})
@EnableAspectJAutoProxy(proxyTargetClass = true, exposeProxy = true)
@EnableSkyerResourceServer
@EnableObjectMapper
@EnableAsync
@EnableConfigurationProperties({GoodsProperties.class, DataHierarchyProperties.class})
public class GoodsAutoConfiguration {
/**
* 通用线程池
*/
@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,25 @@
package org.skyer.goods;
import org.skyer.autoconfigure.goods.EnableSkyerGoods;
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
*/
@EnableSkyerGoods
@EnableDiscoveryClient
@SpringBootApplication
public class GoodsApplication {
public static void main(String[] args) {
try {
SpringApplication.run(GoodsApplication.class, args);
} catch (Exception e) {
e.printStackTrace();
}
}
}

View file

@ -0,0 +1,88 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.BrandPageReqDTO;
import org.skyer.goods.api.dto.BrandReqDTO;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.api.dto.StatusReqDTO;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.service.BrandService;
import org.skyer.goods.domain.vo.BrandPageResVO;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.util.List;
/**
* 商品品牌管理
* @description
* @Author wusc
* @create 2021/6/24 9:41 上午
*/
@RestController("BrandController.v1")
@RequestMapping(value = "/v1/goods/brand")
@Api(tags = GoodsSwaggerApiConfig.GOODS_BRAND)
public class BrandController {
@Autowired
private BrandService brandService;
@ApiOperation(value = "商品品牌查询")
@PostMapping("/page")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<Page<BrandPageResVO>> pageBrand(@Valid @RequestBody BrandPageReqDTO brandPageReqDTO){
return Results.success( brandService.pageBrand(brandPageReqDTO));
}
@ApiOperation(value = "商品品牌查询")
@PostMapping("/list")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<List<BrandPageResVO>> listBrand(@Valid @RequestBody BrandPageReqDTO brandPageReqDTO){
return Results.success( brandService.listBrand(brandPageReqDTO));
}
@ApiOperation(value = "创建商品品牌")
@PostMapping("/brand")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<String> createBrand(@Valid @RequestBody BrandReqDTO brandReqDTO){
brandService.saveOrUpdateBrand(brandReqDTO);
return Results.success("操作成功");
}
@ApiOperation(value = "编辑商品品牌")
@PutMapping("/brand")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<String> updateBrand(@Valid @RequestBody BrandReqDTO brandReqDTO){
brandService.saveOrUpdateBrand(brandReqDTO);
return Results.success("操作成功");
}
@ApiOperation(value = "删除商品品牌")
@PatchMapping("/batch-delete-brand")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<String> deleteByIds(@RequestBody IdsReqDTO idsReqDTO) {
brandService.deleteBrand(idsReqDTO.getIds());
return Results.success("操作成功");
}
@ApiOperation(value = "更新状态")
@PatchMapping("/status")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
public ResponseEntity<String> updateStatus(@Valid @RequestBody StatusReqDTO statusReqDTO){
brandService.updateBrandStatus(statusReqDTO.getIds(),statusReqDTO.getStatus());
return Results.success("操作成功");
}
}

View file

@ -0,0 +1,50 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import org.skyer.core.base.BaseController;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.CategoryAttributeQueryDTO;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.repository.CategoryAttributeRepository;
import org.skyer.goods.domain.vo.CategoryAttributeVO;
import org.skyer.swagger.annotation.Permission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.util.ObjectUtils;
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 java.util.ArrayList;
import java.util.List;
/**
* 商品分类属性表 管理 API
*
* @author xurongfa 2021-12-24 09:12:57
*/
@RestController("categoryAttributeController.v1")
@RequestMapping("/v1/category/attributes")
@Api(tags = GoodsSwaggerApiConfig.GOODS_CATEGORY_ATTRIBUTE)
public class CategoryAttributeController extends BaseController {
@Autowired
private CategoryAttributeRepository categoryAttributeRepository;
@ApiModelProperty(value = "查询商品分类属性表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/list/category/attribute")
public ResponseEntity<List<CategoryAttributeVO>> queryCategoryAttribute(
@RequestBody CategoryAttributeQueryDTO param){
//控制 没有分类id 返回空
if(ObjectUtils.isEmpty( param.getCategoryId() )){
return Results.success(new ArrayList<>());
}
List<CategoryAttributeVO> categoryAttributeList = categoryAttributeRepository.listIncludedValue(param);
return Results.success(categoryAttributeList);
}
}

View file

@ -0,0 +1,100 @@
package org.skyer.goods.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 java.util.List;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.CategoryQueryDTO;
import org.skyer.goods.api.dto.CategorySaveDTO;
import org.skyer.goods.api.dto.CategoryTreeQueryDTO;
import org.skyer.goods.api.dto.CategoryUpdateByStatusFlagDTO;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.repository.CategoryRepository;
import org.skyer.goods.domain.service.CategoryManageService;
import org.skyer.goods.domain.vo.CategoryTreeVO;
import org.skyer.goods.domain.vo.CategoryVO;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* 商品分类表 管理 API
*
* @author xurongfa 2021-12-24 09:12:57
*/
@RestController("categoryController.v1")
@RequestMapping("/v1/categorys")
@Api(tags = GoodsSwaggerApiConfig.GOODS_CATEGORY)
public class CategoryController extends BaseController {
@Autowired
private CategoryRepository categoryRepository;
@Autowired
private CategoryManageService categoryManageService;
@ApiOperation(value = "保存商品分类表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/save")
public ResponseEntity<Void> save(@RequestBody @Valid CategorySaveDTO category) {
categoryManageService.save(category);
return Results.success();
}
// @ApiOperation(value = "修改商品分类表")
// @Permission(level = ResourceLevel.ORGANIZATION)
// @PostMapping("/update")
// public ResponseEntity<Category> update(@RequestBody Category category) {
// categoryRepository.updateByPrimaryKeySelective(category);
// return Results.success(category);
// }
@ApiOperation(value = "修改商品状态")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/update/status")
public ResponseEntity<Void> updateByStatusFlag(
@RequestBody @Valid CategoryUpdateByStatusFlagDTO categoryUpdateByStatusFlagDTO){
categoryManageService.updateByStatusFlag(categoryUpdateByStatusFlagDTO);
return Results.success();
}
@ApiOperation(value = "批量删除商品分类表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@DeleteMapping("/batch/delete")
public ResponseEntity<Void> batchDelete(
@Encrypt @ApiParam(value = "商品分类ids", required = true) @RequestBody List<Long> ids){
categoryManageService.batchDelete(ids);
return Results.success();
}
@ApiOperation(value = "查询分类列表")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/page")
public ResponseEntity<Page<CategoryVO>> page(
@RequestBody CategoryQueryDTO categoryQueryDTO ){
Page<CategoryVO> categoryPage = categoryManageService.pageIncludedAttr(categoryQueryDTO);
return Results.success(categoryPage);
}
@ApiOperation(value = "获取分类树")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/tree")
public ResponseEntity<List<CategoryTreeVO>> tree(
@RequestBody CategoryTreeQueryDTO queryDTO){
List<CategoryTreeVO> categoryTree = categoryManageService.getCategoryTree(queryDTO);
return Results.success(categoryTree);
}
}

View file

@ -0,0 +1,82 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.ApiOperation;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.util.Results;
import org.skyer.goods.domain.entity.GoodsShop;
import org.skyer.goods.domain.service.GoodsShopService;
import org.skyer.mybatis.pagehelper.annotation.SortDefault;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.mybatis.pagehelper.domain.Sort;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
/**
* 商品在店铺中的上下架关系表 管理 API
*
* @author chenzz
* @date 2021-06-25 13:36:41
*/
@RestController("goodsShopController.v1")
@RequestMapping("/v1/goodsshops")
public class GoodsShopController extends BaseController {
@Autowired
private GoodsShopService goodsShopService;
/**
* 列表
*/
@ApiOperation(value = "商品在店铺中的上下架关系表列表")
@GetMapping
public ResponseEntity<?> list(GoodsShop goodsShop, @ApiIgnore @SortDefault(value = GoodsShop.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<GoodsShop> list = goodsShopService.pageAndSort(pageRequest, goodsShop);
return Results.success(list);
}
/**
* 详细
*/
@ApiOperation(value = "商品在店铺中的上下架关系表明细")
@RequestMapping("/{id}")
public ResponseEntity<?> detail(@PathVariable Long id) {
GoodsShop goodsShop = goodsShopService.selectByPrimaryKey(id);
return Results.success(goodsShop);
}
/**
* 创建
*/
@ApiOperation(value = "创建商品在店铺中的上下架关系表")
@PostMapping
public ResponseEntity<?> create(@RequestBody GoodsShop goodsShop) {
goodsShopService.insertSelective(goodsShop);
return Results.success(goodsShop);
}
/**
* 修改
*/
@ApiOperation(value = "修改商品在店铺中的上下架关系表")
@PutMapping
public ResponseEntity<?> update(@RequestBody GoodsShop goodsShop) {
goodsShopService.updateByPrimaryKeySelective(goodsShop);
return Results.success(goodsShop);
}
/**
* 删除
*/
@ApiOperation(value = "删除商品在店铺中的上下架关系表")
@DeleteMapping("/{id}")
public ResponseEntity<?> remove(@PathVariable Long id) {
goodsShopService.deleteByPrimaryKey(id);
return Results.success();
}
}

View file

@ -0,0 +1,134 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.*;
import org.skyer.goods.app.service.SkuEsService;
import org.skyer.goods.app.service.SkuService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.vo.GoodsSkuDetailVO;
import org.skyer.goods.domain.vo.GoodsSkuPageVO;
import org.skyer.goods.domain.vo.RpcGoodsResVO;
import org.skyer.goods.domain.vo.RpcOrderResVO;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
/**
* 商品sku表 管理 API
*
* @author zhanglb 2021-12-28
*/
@RestController("goodsSkuController.v1")
@RequestMapping("/v1/goods/sku")
@Api(tags = GoodsSwaggerApiConfig.GOODS_SKU)
public class GoodsSkuController extends BaseController {
@Autowired
private SkuService skuService;
@Autowired
private SkuEsService skuEsService;
@ApiOperation(value = "商品sku列表(分页)")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/page")
public ResponseEntity<Page<GoodsSkuPageVO>> list(@Valid @RequestBody GoodsSkuPageDTO goodsSkuPageDTO) throws Exception {
Page<GoodsSkuPageVO> list = skuEsService.listPage(goodsSkuPageDTO);
return Results.success(list);
}
@ApiOperation(value = "sku明细")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/{id}")
public ResponseEntity<GoodsSkuDetailVO> detail(@Encrypt @PathVariable Long id,boolean isEdit) {
GoodsSkuDetailVO goodsSku = skuService.getDetail(id,isEdit);
return Results.success(goodsSku);
}
@ApiOperation(value = "根据商品id获取已经生成的sku")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/goods/{spuId}")
public ResponseEntity<List<GoodsSkuDetailVO>> goodsSkuDetail(@PathVariable @Encrypt Long spuId) {
List<GoodsSkuDetailVO> list = skuService.getSkuAndAttributeDataByGoodsId(spuId);
return Results.success(list);
}
@ApiOperation(value = "删除商品sku(多个)")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@DeleteMapping
public ResponseEntity<?> deleteByIds(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) {
skuService.deleteByIds(idsReqDTO.getIds());
return Results.success("操作成功");
}
@ApiOperation(value = "创建商品sku")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping
public ResponseEntity<?> create(@RequestBody SkuBatchSaveDTO skuBatchSaveDTO) {
skuService.saveSku(skuBatchSaveDTO);
return Results.success("操作成功");
}
@ApiOperation(value = "编辑sku")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PutMapping("/update")
public ResponseEntity<?> update(@RequestBody SkuUpdateDTO updateDTO) {
skuService.updateSku(updateDTO);
return Results.success("编辑成功");
}
@ApiModelProperty(value = "根据skuCode查询sku--用于远程调用")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping("/list/goods")
public ResponseEntity<List<RpcGoodsResVO>> getGoodsList(@RequestBody List<String> skuCodeList) {
return Results.success(skuService.queryRPCGoodsList(skuCodeList));
}
@ApiModelProperty(value = "套餐下商品的List")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping("/meals-goods-list")
public ResponseEntity<List<RpcOrderResVO>> getMealsGoodsList(@RequestBody List<String> skuCodeList) {
return Results.success(skuService.getMealsGoodsList(skuCodeList));
}
@ApiModelProperty(value = "根据skuCode查询订单skuVO--用于远程调用")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping("/order/sku/list")
public ResponseEntity<List<RpcOrderResVO>> queryOrderRpcList(@RequestBody List<String> skuCodeList) {
return Results.success(skuService.queryOrderRpcList(skuCodeList));
}
@ApiOperation(value = "批量提交审批")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PutMapping("/batchAudit")
public ResponseEntity<?> batchAudit(@RequestBody SkuBatchAuditDTO skuBatchAuditDTO) {
skuService.batchAudit(skuBatchAuditDTO);
return Results.success("提交成功");
}
@ApiOperation(value = "刷新es数据")
@GetMapping("/es-test")
@Permission(level = ResourceLevel.ORGANIZATION,permissionPublic = true)
public ResponseEntity<Void> esTest() throws Exception {
skuEsService.delSkuEsAll();
skuEsService.skuStatusUp();
return Results.success();
}
}

View file

@ -0,0 +1,83 @@
package org.skyer.goods.api.controller.v1;
import cn.hutool.core.lang.Dict;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.app.service.InstallServiceService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.dto.InstallServiceDTO;
import org.skyer.goods.domain.dto.MultiDelDTO;
import org.skyer.goods.domain.dto.PageInstallServiceDTO;
import org.skyer.goods.domain.entity.InstallService;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
/**
* 安装服务 管理 API
*
* @author chenzz 2021-08-18 15:42:47
*/
@RestController("installServiceSiteController.v1")
@RequestMapping("/v1/install-services")
@Api(tags = GoodsSwaggerApiConfig.GOODS_INSTALL_SERVICE)
public class InstallServiceController extends BaseController {
@Autowired
private InstallServiceService installServiceService;
@ApiOperation(value = "安装服务列表")
@Permission(level = ResourceLevel.SITE)
@GetMapping
public ResponseEntity<Page<?>> list(PageInstallServiceDTO installService, @ApiIgnore @SortDefault(value = InstallService.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<Dict> list = installServiceService.page(pageRequest, installService);
return Results.success(list);
}
@ApiOperation(value = "安装服务明细")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/{id}")
public ResponseEntity<?> detail(@Encrypt @PathVariable Long id) {
Dict detail = installServiceService.detail(id);
return Results.success(detail);
}
@ApiOperation(value = "创建安装服务")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<?> create(@RequestBody InstallServiceDTO service) {
validObject(service);
boolean result = installServiceService.create(service);
return result ? Results.success("添加成功") : Results.error("添加失败");
}
@ApiOperation(value = "修改安装服务")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping
public ResponseEntity<?> update(@RequestBody InstallServiceDTO service) {
// validObject(service);
boolean result = installServiceService.update(service);
return result ? Results.success("修改成功") : Results.error("修改失败");
}
@ApiOperation(value = "删除安装服务")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> batchRemove(@ApiParam("主键ID") @RequestBody MultiDelDTO idsReqDTO) {
Boolean result = installServiceService.batchRemove(idsReqDTO.getIds());
return result ? Results.success("操作成功") : Results.error("删除出错!");
}
}

View file

@ -0,0 +1,107 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.api.dto.MaterialDTO;
import org.skyer.goods.api.dto.MaterialListDTO;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.service.MaterialService;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
/**
* <p>
* 商品素材
* </p>
*
* @author chenzz
* @since 2021-06-23
*/
@RestController("materialController.v1")
@RequestMapping("/v1/goods/material")
@Api(tags = GoodsSwaggerApiConfig.GOODS_MATERIAL)
public class MaterialController {
@Autowired
private MaterialService materialService;
@ApiOperation(value = "分页获取信息")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/list")
public ResponseEntity<?> pageList(MaterialListDTO materialListDTO, PageRequest pageRequest) {
return Results.success(materialService.pageList(pageRequest, materialListDTO));
}
/**
* 详细
*/
@ApiOperation(value = "商品素材明细")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/{id}")
public ResponseEntity<?> detail(@PathVariable("id") @Encrypt Long id) {
return Results.success(materialService.getDetail(id));
}
/**
* 详细2
*/
@ApiOperation(value = "根据id获取商品素材明细")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/details")
public ResponseEntity<?> showDetails(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Results.success(materialService.getDetail(id));
}
/**
* 新增/添加
*/
@ApiOperation("新增")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/add")
public ResponseEntity<Void> add(@Validated @RequestBody MaterialDTO materialDTO) {
return Boolean.TRUE.equals(materialService.add(materialDTO)) ? Results.success() : Results.error();
}
/**
* 修改
*/
@ApiOperation("修改")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PutMapping("/edit")
public ResponseEntity<Void> edit(@Validated @RequestBody MaterialDTO materialDTO) {
if (materialDTO.getId() != null && materialDTO.getId() > 0) {
return Boolean.TRUE.equals(materialService.edit(materialDTO)) ? Results.success() : Results.error();
} else {
// 修改必须设置id
return Results.error();
}
}
/**
* 删除
*/
@ApiOperation("删除")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@DeleteMapping("/delete")
public ResponseEntity<Void> deleteById(@ApiParam("主键ID") @RequestParam(value = "id") @Encrypt Long id) {
return Boolean.TRUE.equals(materialService.deleteById(id)) ? Results.success() : Results.error();
}
@ApiOperation(value = "批量删除")
@PatchMapping("/batch-delete")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<String> deleteByIds(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) {
Boolean result = materialService.deleteByIds(idsReqDTO.getIds());
return Boolean.TRUE.equals(result) ? Results.success("操作成功") : Results.error("删除出错!");
}
}

View file

@ -0,0 +1,202 @@
package org.skyer.goods.api.controller.v1;
import cn.hutool.core.util.ObjectUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.boot.platform.lov.constant.LovConstants;
import org.skyer.boot.platform.lov.dto.LovDTO;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.domain.PageInfo;
import org.skyer.core.exception.CommonException;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.UpdatePriceItemValueDTO;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.infra.constant.Constants;
import org.skyer.goods.infra.feign.LovManageRemoteService;
import org.skyer.goods.infra.feign.LovRemoteService;
import org.skyer.goods.infra.feign.dto.LovHeaderDto;
import org.skyer.goods.infra.feign.dto.LovValueDto;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.swagger.annotation.Permission;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.util.CollectionUtils;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 租户价格项 设置 API
*
* @author chenzz
* @date 2021-07-06
*/
@RestController("priceItemSettingController.v1")
@RequestMapping("/v1/price/item/setting")
@Api(tags = GoodsSwaggerApiConfig.GOODS_PRICE_SETTING)
public class PriceItemSettingController extends BaseController {
@Autowired
LovRemoteService lovRemoteService;
@Autowired
LovManageRemoteService lovManageRemoteService;
/**
* 租户价格项值集查询 PRICE.ITEM.TYPE
**/
@ApiOperation(value = "租户价格项值集查询(分页)")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping("/page")
public ResponseEntity<Page<LovValueDto>> pagePriceItemSetting(PageRequest pageRequest) {
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
ResponseEntity<List<LovValueDto>> mapResponseEntity = lovRemoteService.queryAllLovValue(Constants.HPFM_LOV_VALUES_PRICE_ITEM, tenantId, null, tenantId);
List<LovValueDto> body = mapResponseEntity.getBody();
int pageSize = pageRequest.getSize();
int pageIndex = pageRequest.getPage() + 1;
List<LovValueDto> pageList = body.stream().skip((pageIndex) * pageSize).limit(pageSize).collect(Collectors.toList());
int totalPage = (body.size() + pageSize - 1) / pageSize;
Page<LovValueDto> pageVOS = new Page<>(pageList, new PageInfo(totalPage, pageSize), body.size());
return Results.success(pageVOS);
}
/**
* 租户价格项值集查询 PRICE.ITEM.TYPE
**/
@ApiOperation(value = "租户价格项值集查询(所有数据列表)")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@GetMapping
public ResponseEntity<List<LovValueDto>> getPriceItemSetting() {
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
ResponseEntity<List<LovValueDto>> mapResponseEntity = lovRemoteService.queryAllLovValue(Constants.HPFM_LOV_VALUES_PRICE_ITEM, tenantId, null, tenantId);
List<LovValueDto> body = mapResponseEntity.getBody();
return Results.success(body);
}
@ApiOperation(value = "值集头创建")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/add-head")
public ResponseEntity<LovDTO> saveHeadPriceItemSetting(@ApiParam("值集名称") @RequestParam String lovName) {
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
ResponseEntity<LovDTO> lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, Constants.HPFM_LOV_VALUES_PRICE_ITEM);
if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode())) {
throw new CommonException("该值集头已经存在");
}
LovHeaderDto lovDTO = new LovHeaderDto();
lovDTO.setTenantId(tenantId);
lovDTO.setLovCode(Constants.HPFM_LOV_VALUES_PRICE_ITEM);
lovDTO.setLovName(lovName);
lovDTO.setMustPageFlag(1);
lovDTO.setEnabledFlag(1);
lovDTO.setLovTypeCode(LovConstants.LovTypes.IDP);
return lovManageRemoteService.addLovHeader(tenantId, lovDTO);
}
@ApiOperation(value = "值集value创建")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/addValue")
public ResponseEntity<LovValueDto> saveValuePriceItemSetting(@RequestBody UpdatePriceItemValueDTO dto) {
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
String lovCode = Constants.HPFM_LOV_VALUES_PRICE_ITEM;
ResponseEntity<LovDTO> lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, lovCode);
if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode())) {
LovDTO lov = lovDTOResponseEntity.getBody();
if (null != lov) {
LovValueDto lovValueDto = new LovValueDto();
lovValueDto.setLovId(lov.getLovId());
lovValueDto.setLovCode(lovCode);
lovValueDto.setValue(dto.getValue());
lovValueDto.setMeaning(dto.getMeaning());
lovValueDto.setDescription(dto.getDescription());
// 设置启用禁用标志
if (ObjectUtil.isNotNull(dto.getEnabledFlag())) {
lovValueDto.setEnabledFlag(dto.getEnabledFlag());
} else {
lovValueDto.setEnabledFlag(1);
}
lovValueDto.setOrderSeq(dto.getOrderSeq());
lovValueDto.setTenantId(tenantId);
return lovManageRemoteService.addLovValues(tenantId, lovValueDto);
} else {
throw new CommonException("值集头不存在");
}
} else {
throw new CommonException("值集头不存在");
}
}
@ApiOperation(value = "值集value修改")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping("/value-update")
public ResponseEntity<LovValueDto> updatePriceItemValueSettings(@RequestBody UpdatePriceItemValueDTO dto) {
// 查询租户信息
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
String lovCode = Constants.HPFM_LOV_VALUES_PRICE_ITEM;
// 根据租户和lovCode获取值集头信息
ResponseEntity<LovDTO> lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, lovCode);
LovDTO lov = lovDTOResponseEntity.getBody();
if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode()) && null != lov) {
// 查询租户下loveCode, value匹配的值集
ResponseEntity<List<LovValueDto>> listResponseEntity = lovManageRemoteService.listValuesByLovId(tenantId, lov.getLovId(), dto.getValue(), null);
List<LovValueDto> body = listResponseEntity.getBody();
if (HttpStatus.OK.equals(listResponseEntity.getStatusCode()) && !CollectionUtils.isEmpty(body)) {
LovValueDto lovValueDto = body.get(0);
lovValueDto.setMeaning(dto.getMeaning());
lovValueDto.setDescription(dto.getDescription());
// 设置可用禁用标志
if (ObjectUtil.isNotNull(dto.getEnabledFlag())) {
lovValueDto.setEnabledFlag(dto.getEnabledFlag());
}
lovValueDto.setOrderSeq(dto.getOrderSeq());
return lovManageRemoteService.updateLovValuesByPrimaryKey(tenantId, lovValueDto);
} else {
throw new CommonException("值集值不存在");
}
} else {
throw new CommonException("值集头不存在");
}
}
@ApiOperation(value = "值集value删除")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping("/value-delete/{valueCode}")
public ResponseEntity deletePriceItemValueSettings(@PathVariable("valueCode") String valueCode) {
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
String lovCode = Constants.HPFM_LOV_VALUES_PRICE_ITEM;
ResponseEntity<LovDTO> lovDTOResponseEntity = lovManageRemoteService.queryHeaderByCode(tenantId, lovCode);
LovDTO lov = lovDTOResponseEntity.getBody();
if (HttpStatus.OK.equals(lovDTOResponseEntity.getStatusCode()) && null != lov) {
ResponseEntity<List<LovValueDto>> listResponseEntity = lovManageRemoteService.listValuesByLovId(tenantId, lov.getLovId(), valueCode, null);
List<LovValueDto> body = listResponseEntity.getBody();
if (HttpStatus.OK.equals(listResponseEntity.getStatusCode()) && !CollectionUtils.isEmpty(body)) {
LovValueDto lovValueDto = body.get(0);
List<LovValueDto> lovValueDtos = new ArrayList<>();
lovValueDtos.add(lovValueDto);
return lovManageRemoteService.batchDeleteLovValuesByPrimaryKey(tenantId, lovValueDtos);
} else {
throw new CommonException("值集值不存在");
}
} else {
throw new CommonException("值集头不存在");
}
}
}

View file

@ -0,0 +1,75 @@
package org.skyer.goods.api.controller.v1;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.domain.entity.SkuAttributeValue;
import org.skyer.goods.domain.repository.SkuAttributeValueRepository;
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;
/**
* sku属性关联表 管理 API
*
* @author zhanglongbing@ebc.com 2021-12-28 09:17:10
*/
@RestController("skuAttributeValueSiteController.v1")
@RequestMapping("/v1/sku-attribute-values")
public class SkuAttributeValueController extends BaseController {
@Autowired
private SkuAttributeValueRepository skuAttributeValueRepository;
@ApiOperation(value = "sku属性关联表列表")
@Permission(level = ResourceLevel.SITE)
@GetMapping
public ResponseEntity<Page<SkuAttributeValue>> list(SkuAttributeValue skuAttributeValue, @ApiIgnore @SortDefault(value = SkuAttributeValue.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<SkuAttributeValue> list = skuAttributeValueRepository.pageAndSort(pageRequest, skuAttributeValue);
return Results.success(list);
}
@ApiOperation(value = "sku属性关联表明细")
@Permission(level = ResourceLevel.SITE)
@GetMapping("/{id}")
public ResponseEntity<SkuAttributeValue> detail(@PathVariable Long id) {
SkuAttributeValue skuAttributeValue = skuAttributeValueRepository.selectByPrimaryKey(id);
return Results.success(skuAttributeValue);
}
@ApiOperation(value = "创建sku属性关联表")
@Permission(level = ResourceLevel.SITE)
@PostMapping
public ResponseEntity<SkuAttributeValue> create(@RequestBody SkuAttributeValue skuAttributeValue) {
validObject(skuAttributeValue);
skuAttributeValueRepository.insertSelective(skuAttributeValue);
return Results.success(skuAttributeValue);
}
@ApiOperation(value = "修改sku属性关联表")
@Permission(level = ResourceLevel.SITE)
@PutMapping
public ResponseEntity<SkuAttributeValue> update(@RequestBody SkuAttributeValue skuAttributeValue) {
skuAttributeValueRepository.updateByPrimaryKeySelective(skuAttributeValue);
return Results.success(skuAttributeValue);
}
@ApiOperation(value = "删除sku属性关联表")
@Permission(level = ResourceLevel.SITE)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody SkuAttributeValue skuAttributeValue) {
skuAttributeValueRepository.deleteByPrimaryKey(skuAttributeValue);
return Results.success();
}
}

View file

@ -0,0 +1,75 @@
package org.skyer.goods.api.controller.v1;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.domain.entity.SkuAttributeValueDraft;
import org.skyer.goods.domain.repository.SkuAttributeValueDraftRepository;
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;
/**
* sku属性关联草稿表 管理 API
*
* @author zhanglongbing@ebc.com 2021-12-29 11:23:43
*/
@RestController("skuAttributeValueDraftSiteController.v1")
@RequestMapping("/v1/sku-attribute-value-drafts")
public class SkuAttributeValueDraftController extends BaseController {
@Autowired
private SkuAttributeValueDraftRepository skuAttributeValueDraftRepository;
@ApiOperation(value = "sku属性关联草稿表列表")
@Permission(level = ResourceLevel.SITE)
@GetMapping
public ResponseEntity<Page<SkuAttributeValueDraft>> list(SkuAttributeValueDraft skuAttributeValueDraft, @ApiIgnore @SortDefault(value = SkuAttributeValueDraft.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<SkuAttributeValueDraft> list = skuAttributeValueDraftRepository.pageAndSort(pageRequest, skuAttributeValueDraft);
return Results.success(list);
}
@ApiOperation(value = "sku属性关联草稿表明细")
@Permission(level = ResourceLevel.SITE)
@GetMapping("/{id}")
public ResponseEntity<SkuAttributeValueDraft> detail(@PathVariable Long id) {
SkuAttributeValueDraft skuAttributeValueDraft = skuAttributeValueDraftRepository.selectByPrimaryKey(id);
return Results.success(skuAttributeValueDraft);
}
@ApiOperation(value = "创建sku属性关联草稿表")
@Permission(level = ResourceLevel.SITE)
@PostMapping
public ResponseEntity<SkuAttributeValueDraft> create(@RequestBody SkuAttributeValueDraft skuAttributeValueDraft) {
validObject(skuAttributeValueDraft);
skuAttributeValueDraftRepository.insertSelective(skuAttributeValueDraft);
return Results.success(skuAttributeValueDraft);
}
@ApiOperation(value = "修改sku属性关联草稿表")
@Permission(level = ResourceLevel.SITE)
@PutMapping
public ResponseEntity<SkuAttributeValueDraft> update(@RequestBody SkuAttributeValueDraft skuAttributeValueDraft) {
skuAttributeValueDraftRepository.updateByPrimaryKeySelective(skuAttributeValueDraft);
return Results.success(skuAttributeValueDraft);
}
@ApiOperation(value = "删除sku属性关联草稿表")
@Permission(level = ResourceLevel.SITE)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody SkuAttributeValueDraft skuAttributeValueDraft) {
skuAttributeValueDraftRepository.deleteByPrimaryKey(skuAttributeValueDraft);
return Results.success();
}
}

View file

@ -0,0 +1,44 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.app.service.SkuService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.dto.AuditDTO;
import org.skyer.goods.domain.dto.SkuAuditDTO;
import org.skyer.goods.domain.vo.SkuAuditVO;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* SKU审核管理s
* @author lixiaoyang
* @date 2021/12/30 10:58
*/
@RestController("skuAuditController.v1")
@RequestMapping("/v1/sku/audit")
@Api(tags = GoodsSwaggerApiConfig.GOODS_SKU_AUDIT_MANAGER)
public class SkuAuditController {
@Autowired
private SkuService skuService;
@ApiOperation(value = "SKU审核详情")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping("/detail")
public ResponseEntity<SkuAuditVO> detail( @RequestBody SkuAuditDTO dto) {
return Results.success(skuService.getAuditDetail(dto));
}
@ApiOperation(value = "SKU审核操作")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping
public ResponseEntity<Boolean> audit( @RequestBody AuditDTO dto) {
return Results.success(skuService.skuAudit(dto));
}
}

View file

@ -0,0 +1,51 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.skyer.core.base.BaseController;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.app.service.SkuAuditSettingService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.entity.SkuAuditSetting;
import org.skyer.goods.domain.repository.SkuAuditSettingRepository;
import org.skyer.swagger.annotation.Permission;
/**
* 商品SKU审核 管理 API
*
* @author zhanglongbing@ebc.com 2021-12-27 10:09:56
*/
@RestController("skuAuditSettingSiteController.v1")
@RequestMapping("/v1/sku-audit-settings")
@Api(tags = GoodsSwaggerApiConfig.GOODS_SKU_AUDIT_SETTING)
public class SkuAuditSettingController extends BaseController {
@Autowired
private SkuAuditSettingRepository skuAuditSettingRepository;
@Autowired
private SkuAuditSettingService auditSettingService;
@ApiOperation(value = "商品SKU审核设置明细")
@Permission(level = ResourceLevel.SITE)
@GetMapping("/default")
public ResponseEntity<SkuAuditSetting> detail() {
SkuAuditSetting skuAuditSetting = skuAuditSettingRepository.selectDefault();
return Results.success(skuAuditSetting);
}
@ApiOperation(value = "修改商品SKU审核设置")
@Permission(level = ResourceLevel.SITE)
@PutMapping("/update")
public ResponseEntity<SkuAuditSetting> update(@RequestBody SkuAuditSetting skuAuditSetting) {
skuAuditSettingRepository.updateDefault(skuAuditSetting);
return Results.success(skuAuditSetting);
}
}

View file

@ -0,0 +1,75 @@
package org.skyer.goods.api.controller.v1;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.domain.entity.SkuDraft;
import org.skyer.goods.domain.repository.SkuDraftRepository;
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-29 11:12:15
*/
@RestController("skuDraftSiteController.v1")
@RequestMapping("/v1/sku-drafts")
public class SkuDraftController extends BaseController {
@Autowired
private SkuDraftRepository skuDraftRepository;
@ApiOperation(value = "商品规格草稿表列表")
@Permission(level = ResourceLevel.SITE)
@GetMapping
public ResponseEntity<Page<SkuDraft>> list(SkuDraft skuDraft, @ApiIgnore @SortDefault(value = SkuDraft.FIELD_SKU_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<SkuDraft> list = skuDraftRepository.pageAndSort(pageRequest, skuDraft);
return Results.success(list);
}
@ApiOperation(value = "商品规格草稿表明细")
@Permission(level = ResourceLevel.SITE)
@GetMapping("/{skuId}")
public ResponseEntity<SkuDraft> detail(@PathVariable Long skuId) {
SkuDraft skuDraft = skuDraftRepository.selectByPrimaryKey(skuId);
return Results.success(skuDraft);
}
@ApiOperation(value = "创建商品规格草稿表")
@Permission(level = ResourceLevel.SITE)
@PostMapping
public ResponseEntity<SkuDraft> create(@RequestBody SkuDraft skuDraft) {
validObject(skuDraft);
skuDraftRepository.insertSelective(skuDraft);
return Results.success(skuDraft);
}
@ApiOperation(value = "修改商品规格草稿表")
@Permission(level = ResourceLevel.SITE)
@PutMapping
public ResponseEntity<SkuDraft> update(@RequestBody SkuDraft skuDraft) {
skuDraftRepository.updateByPrimaryKeySelective(skuDraft);
return Results.success(skuDraft);
}
@ApiOperation(value = "删除商品规格草稿表")
@Permission(level = ResourceLevel.SITE)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody SkuDraft skuDraft) {
skuDraftRepository.deleteByPrimaryKey(skuDraft);
return Results.success();
}
}

View file

@ -0,0 +1,67 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import org.skyer.core.domain.Page;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.api.dto.GoodsGroupReqDTO;
import org.skyer.goods.api.dto.GroupPageReqDTO;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.service.SkuGroupService;
import org.skyer.goods.domain.vo.GroupPageResVO;
import org.skyer.goods.domain.vo.SkuGroupResVO;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.swagger.annotation.Permission;
import io.swagger.annotations.ApiOperation;
/**
* Sku组合表 管理 API
*
* @author wushaochuan 2021-08-13 09:55:04
*/
@Api(tags = GoodsSwaggerApiConfig.GOODS_GROUP)
@RestController("skuGroupController.v1")
@RequestMapping("/v1/sku-groups")
public class SkuGroupController extends BaseController {
@Autowired
private SkuGroupService skuGroupService;
@ApiOperation(value = "创建或者更新sku组合")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
@PostMapping("/sku-group")
public ResponseEntity<String> createOrUpdateSkuGroup(@RequestBody GoodsGroupReqDTO goodsGroupReqDTO){
skuGroupService.createOrUpdateSkuGroup(goodsGroupReqDTO);
return Results.success("操作成功");
}
@ApiOperation(value = "sku组合查询")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@GetMapping("/detail/{groupId}")
public ResponseEntity<SkuGroupResVO> skuGroupDetail(@Encrypt @PathVariable("groupId") Long groupId) {
SkuGroupResVO skuGroupResVO = skuGroupService.skuGroupDetail(groupId);
return Results.success(skuGroupResVO);
}
@ApiOperation(value = "商品组合分页")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@PostMapping("/page")
public ResponseEntity<Page<GroupPageResVO>> pageGroup(@RequestBody GroupPageReqDTO groupPageReqDTO) {
return Results.success(skuGroupService.pageGroup(groupPageReqDTO));
}
@ApiOperation(value = "删除商品组合")
@Permission(level = ResourceLevel.ORGANIZATION,permissionLogin = true)
@DeleteMapping("/group")
public ResponseEntity<String> delGroup(@RequestBody IdsReqDTO idsReqDTO) {
skuGroupService.delGroup(idsReqDTO);
return Results.success("操作成功");
}
}

View file

@ -0,0 +1,77 @@
package org.skyer.goods.api.controller.v1;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.domain.entity.SpuAttrValueRelation;
import org.skyer.goods.domain.repository.SpuAttrValueRelationRepository;
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 wushaochuan 2021-07-19 09:18:33
*/
@RestController("goodsAttrValueRelationController.v1")
@RequestMapping("/v1/{organizationId}/goods-attr-value-relations")
public class SpuAttrValueRelationController extends BaseController {
@Autowired
private SpuAttrValueRelationRepository spuAttrValueRelationRepository;
@ApiOperation(value = "商品和属性值关联关系列表")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping
public ResponseEntity<Page<SpuAttrValueRelation>> list(SpuAttrValueRelation spuAttrValueRelation, @ApiIgnore @SortDefault(value = SpuAttrValueRelation.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<SpuAttrValueRelation> list = spuAttrValueRelationRepository.pageAndSort(pageRequest, spuAttrValueRelation);
return Results.success(list);
}
@ApiOperation(value = "商品和属性值关联关系明细")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/{id}")
public ResponseEntity<SpuAttrValueRelation> detail(@PathVariable Long id) {
SpuAttrValueRelation spuAttrValueRelation = spuAttrValueRelationRepository.selectByPrimaryKey(id);
return Results.success(spuAttrValueRelation);
}
@ApiOperation(value = "创建商品和属性值关联关系")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<SpuAttrValueRelation> create(@RequestBody SpuAttrValueRelation spuAttrValueRelation) {
validObject(spuAttrValueRelation);
spuAttrValueRelationRepository.insertSelective(spuAttrValueRelation);
return Results.success(spuAttrValueRelation);
}
@ApiOperation(value = "修改商品和属性值关联关系")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping
public ResponseEntity<SpuAttrValueRelation> update(@RequestBody SpuAttrValueRelation spuAttrValueRelation) {
SecurityTokenHelper.validToken(spuAttrValueRelation);
spuAttrValueRelationRepository.updateByPrimaryKeySelective(spuAttrValueRelation);
return Results.success(spuAttrValueRelation);
}
@ApiOperation(value = "删除商品和属性值关联关系")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody SpuAttrValueRelation spuAttrValueRelation) {
SecurityTokenHelper.validToken(spuAttrValueRelation);
spuAttrValueRelationRepository.deleteByPrimaryKey(spuAttrValueRelation);
return Results.success();
}
}

View file

@ -0,0 +1,86 @@
package org.skyer.goods.api.controller.v1;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.domain.entity.SpuAttribute;
import org.skyer.goods.domain.repository.SpuAttributeRepository;
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 linzhuanghuang@ebc.com 2021-12-28 16:40:03
*/
@RestController("spuAttributeController.v1")
@RequestMapping("/v1/spu-attributes")
public class SpuAttributeController extends BaseController {
@Autowired
private SpuAttributeRepository spuAttributeRepository;
@ApiOperation(value = "属性表列表")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping
public ResponseEntity<Page<SpuAttribute>> list(SpuAttribute spuAttribute, @ApiIgnore @SortDefault(value = SpuAttribute.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<SpuAttribute> list = spuAttributeRepository.pageAndSort(pageRequest, spuAttribute);
return Results.success(list);
}
@ApiOperation(value = "属性表明细")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/{id}")
public ResponseEntity<SpuAttribute> detail(@PathVariable Long id) {
SpuAttribute spuAttribute = spuAttributeRepository.selectByPrimaryKey(id);
return Results.success(spuAttribute);
}
@ApiOperation(value = "创建属性表")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<SpuAttribute> create(@RequestBody SpuAttribute spuAttribute) {
validObject(spuAttribute);
spuAttributeRepository.insertSelective(spuAttribute);
return Results.success(spuAttribute);
}
@ApiOperation(value = "修改属性表")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping
public ResponseEntity<SpuAttribute> update(@RequestBody SpuAttribute spuAttribute) {
SecurityTokenHelper.validToken(spuAttribute);
spuAttributeRepository.updateByPrimaryKeySelective(spuAttribute);
return Results.success(spuAttribute);
}
@ApiOperation(value = "删除属性表")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody SpuAttribute spuAttribute) {
SecurityTokenHelper.validToken(spuAttribute);
spuAttributeRepository.deleteByPrimaryKey(spuAttribute);
return Results.success();
}
@ApiOperation(value = "删除商品属性")
@PatchMapping("/batch-delete-attribute")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<String> deleteByIds(@RequestBody IdsReqDTO idsReqDTO) {
spuAttributeRepository.deleteAttribute(idsReqDTO.getIds());
return Results.success("操作成功");
}
}

View file

@ -0,0 +1,77 @@
package org.skyer.goods.api.controller.v1;
import org.skyer.core.util.Results;
import org.skyer.core.base.BaseController;
import org.skyer.goods.domain.entity.SpuAttributeValue;
import org.skyer.goods.domain.repository.SpuAttributeValueRepository;
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 linzhuanghuang@ebc.com 2021-12-28 16:40:03
*/
@RestController("spuAttributeValueController.v1")
@RequestMapping("/v1/spu-attribute-values")
public class SpuAttributeValueController extends BaseController {
@Autowired
private SpuAttributeValueRepository spuAttributeValueRepository;
@ApiOperation(value = "属性值表列表")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping
public ResponseEntity<Page<SpuAttributeValue>> list(SpuAttributeValue spuAttributeValue, @ApiIgnore @SortDefault(value = SpuAttributeValue.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<SpuAttributeValue> list = spuAttributeValueRepository.pageAndSort(pageRequest, spuAttributeValue);
return Results.success(list);
}
@ApiOperation(value = "属性值表明细")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/{id}")
public ResponseEntity<SpuAttributeValue> detail(@PathVariable Long id) {
SpuAttributeValue spuAttributeValue = spuAttributeValueRepository.selectByPrimaryKey(id);
return Results.success(spuAttributeValue);
}
@ApiOperation(value = "创建属性值表")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<SpuAttributeValue> create(@RequestBody SpuAttributeValue spuAttributeValue) {
validObject(spuAttributeValue);
spuAttributeValueRepository.insertSelective(spuAttributeValue);
return Results.success(spuAttributeValue);
}
@ApiOperation(value = "修改属性值表")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping
public ResponseEntity<SpuAttributeValue> update(@RequestBody SpuAttributeValue spuAttributeValue) {
SecurityTokenHelper.validToken(spuAttributeValue);
spuAttributeValueRepository.updateByPrimaryKeySelective(spuAttributeValue);
return Results.success(spuAttributeValue);
}
@ApiOperation(value = "删除属性值表")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> remove(@RequestBody SpuAttributeValue spuAttributeValue) {
SecurityTokenHelper.validToken(spuAttributeValue);
spuAttributeValueRepository.deleteByPrimaryKey(spuAttributeValue);
return Results.success();
}
}

View file

@ -0,0 +1,113 @@
package org.skyer.goods.api.controller.v1;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import javax.validation.Valid;
import java.io.IOException;
import java.util.List;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.GoodsPageReqDTO;
import org.skyer.goods.api.dto.GoodsRequestDTO;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.api.dto.StatusReqDTO;
import org.skyer.goods.app.service.SpuEsService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.service.SpuService;
import org.skyer.goods.domain.vo.GoodsDetailsVO;
import org.skyer.goods.domain.vo.GoodsPageResVO;
import org.skyer.starter.keyencrypt.core.Encrypt;
import org.skyer.swagger.annotation.Permission;
/**
* 商品管理
*
* @description
* @Author wusc
* @create 2021/6/24 10:36 上午
*/
@RestController("GoodsController.v1")
@RequestMapping(value = "/v1/goods/manager")
@Api(tags = GoodsSwaggerApiConfig.GOODS_MANAGER)
public class SpuController {
@Autowired
private SpuService spuService;
@Autowired
private SpuEsService spuEsService;
@ApiOperation(value = "商品页面查询")
@PostMapping("/page")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<Page<GoodsPageResVO>> pageGoods(@Valid @RequestBody GoodsPageReqDTO goodsPageReqDTO) throws Exception {
if (StringUtils.isNotBlank(goodsPageReqDTO.getName())) {
return Results.success(spuEsService.querySpuEs(goodsPageReqDTO));
}
return Results.success(spuService.pageGoods(goodsPageReqDTO));
}
@ApiOperation(value = "查询spu的商品List")
@PostMapping("/goods-list-spu")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<List<GoodsPageResVO>> queryGoodsBySpuList(@RequestBody List<String> spuCodeList) {
return Results.success(spuService.queryGoodsBySpuList(spuCodeList));
}
@ApiOperation(value = "更新商品")
@PutMapping("/goods")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<String> updateGoods(@Valid @RequestBody GoodsRequestDTO goodsRequestDTO) {
spuService.insertOrUpdateGoods(goodsRequestDTO);
return Results.success("操作成功");
}
@ApiOperation("创建商品")
@PostMapping("/goods")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<String> createGoods(@Valid @RequestBody GoodsRequestDTO goodsRequestDTO) {
spuService.insertOrUpdateGoods(goodsRequestDTO);
return Results.success("操作成功");
}
@ApiOperation(value = "删除商品")
@PatchMapping("/batch-delete-goods")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<String> deleteByIds(@RequestBody IdsReqDTO idsReqDTO) {
spuService.deleteByIds(idsReqDTO.getIds());
return Results.success("操作成功");
}
@ApiOperation(value = "查询商品详情")
@GetMapping("/detail/{id}")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<GoodsDetailsVO> queryDetail(@ApiParam("主键ID") @Encrypt @PathVariable("id") Long id) {
GoodsDetailsVO goodsDetailsVO = spuService.getDetailsById(id);
return Results.success(goodsDetailsVO);
}
@ApiOperation(value = "修改商品状态")
@PatchMapping("/goods")
@Permission(level = ResourceLevel.ORGANIZATION, permissionLogin = true)
public ResponseEntity<String> updateGoodsStatus(@Valid @RequestBody StatusReqDTO statusReqDTO) {
spuService.updateGoodsStatus(statusReqDTO.getIds(), statusReqDTO.getStatus());
return Results.success("操作成功");
}
@ApiOperation(value = "商品批量上传ES测试")
@GetMapping("/es-test")
@Permission(level = ResourceLevel.ORGANIZATION, permissionPublic = true)
public ResponseEntity<Void> esTest() throws IOException {
spuEsService.productStatusUp();
return Results.success();
}
}

View file

@ -0,0 +1,84 @@
package org.skyer.goods.api.controller.v1;
import cn.hutool.core.lang.Dict;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.app.service.SpuInstallServiceService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.dto.PageSpuInstallServiceDTO;
import org.skyer.goods.domain.dto.SpuInstallServiceDTO;
import org.skyer.goods.domain.entity.SpuInstallService;
import org.skyer.goods.domain.entity.SpuSonMum;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
/**
* 商品安装服务 管理 API
*
* @author chenzz 2021-08-18 16:42:11
*/
@RestController("spuInstallServiceSiteController.v1")
@RequestMapping("/v1/spu-install-services")
@Api(tags = GoodsSwaggerApiConfig.GOODS_SPU_INSTALL_SERVICE)
public class SpuInstallServiceController extends BaseController {
@Autowired
private SpuInstallServiceService spuInstallServiceService;
@ApiOperation(value = "商品安装服务列表")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping
public ResponseEntity<Page<?>> list(PageSpuInstallServiceDTO serviceDTO, @ApiIgnore @SortDefault(value = SpuInstallService.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<Dict> list = spuInstallServiceService.page(pageRequest, serviceDTO);
return Results.success(list);
}
@ApiOperation(value = "商品安装服务明细")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/{id}")
public ResponseEntity<?> detail(@Encrypt @PathVariable Long id) {
Dict installService = spuInstallServiceService.detail(id);
return Results.success(installService);
}
@ApiOperation(value = "创建商品安装服务")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<SpuSonMum> create(@RequestBody SpuInstallServiceDTO dto) {
validObject(dto);
boolean result = spuInstallServiceService.create(dto);
return result ? Results.success() : Results.error();
}
@ApiOperation(value = "修改商品安装服务")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping
public ResponseEntity<SpuSonMum> update(@RequestBody SpuInstallServiceDTO dto) {
validObject(dto);
boolean result = spuInstallServiceService.update(dto);
return result ? Results.success() : Results.error();
}
@ApiOperation(value = "删除商品安装服务")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> batchRemove(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) {
Boolean result = spuInstallServiceService.batchRemove(idsReqDTO.getIds());
return result ? Results.success("操作成功") : Results.error("删除出错!");
}
}

View file

@ -0,0 +1,83 @@
package org.skyer.goods.api.controller.v1;
import cn.hutool.core.lang.Dict;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.skyer.core.base.BaseController;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.core.util.Results;
import org.skyer.goods.api.dto.IdsReqDTO;
import org.skyer.goods.app.service.SpuSonMumService;
import org.skyer.goods.config.GoodsSwaggerApiConfig;
import org.skyer.goods.domain.dto.PageSonMumDTO;
import org.skyer.goods.domain.dto.SpuSonMumDTO;
import org.skyer.goods.domain.entity.SpuSonMum;
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;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import springfox.documentation.annotations.ApiIgnore;
/**
* 子母商品 管理 API
*
* @author chenzz 2021-08-16 15:04:38
*/
@RestController("spuSonMumController.v1")
@RequestMapping("/v1/spu-son-mums")
@Api(tags = GoodsSwaggerApiConfig.GOODS_SPU_SON_MUM)
public class SpuSonMumController extends BaseController {
@Autowired
private SpuSonMumService spuSonMumService;
@ApiOperation(value = "子母商品列表")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping
public ResponseEntity<Page<?>> list(PageSonMumDTO spuSonMum, @ApiIgnore @SortDefault(value = SpuSonMum.FIELD_ID,
direction = Sort.Direction.DESC) PageRequest pageRequest) {
Page<Dict> list = spuSonMumService.page(pageRequest, spuSonMum);
return Results.success(list);
}
@ApiOperation(value = "子母商品明细")
@Permission(level = ResourceLevel.ORGANIZATION)
@GetMapping("/{id}")
public ResponseEntity<?> detail(@Encrypt @PathVariable Long id) {
Dict spuSonMum = spuSonMumService.detail(id);
return Results.success(spuSonMum);
}
@ApiOperation(value = "创建子母商品")
@Permission(level = ResourceLevel.ORGANIZATION)
@PostMapping
public ResponseEntity<?> create(@RequestBody SpuSonMumDTO spuSonMumDTO) {
validObject(spuSonMumDTO);
boolean result = spuSonMumService.create(spuSonMumDTO);
return result ? Results.success("添加成功") : Results.error("添加失败");
}
@ApiOperation(value = "修改子母商品")
@Permission(level = ResourceLevel.ORGANIZATION)
@PutMapping
public ResponseEntity<?> update(@RequestBody SpuSonMumDTO spuSonMumDTO) {
validObject(spuSonMumDTO);
boolean result = spuSonMumService.update(spuSonMumDTO);
return result ? Results.success("修改成功") : Results.error("修改失败");
}
@ApiOperation(value = "删除子母商品")
@Permission(level = ResourceLevel.ORGANIZATION)
@DeleteMapping
public ResponseEntity<?> batchRemove(@ApiParam("主键ID") @RequestBody IdsReqDTO idsReqDTO) {
Boolean result = spuSonMumService.batchRemove(idsReqDTO.getIds());
return result ? Results.success("操作成功") : Results.error("删除出错!");
}
}

View file

@ -0,0 +1,55 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import org.skyer.goods.domain.entity.SpuAttributeValue;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-12-28
* @description:
*/
@Data
@ApiModel("spu属性列表入参")
public class AttrListRequestDTO {
@ApiModelProperty("id")
@Encrypt
private Long id;
@ApiModelProperty("属性编码")
private String code;
@ApiModelProperty("是否用于生产sku")
private Boolean isSku;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty(value = "1-系统默认属性 2-分类属性 0-商品属性 3附加属性")
private Integer type;
@ApiModelProperty(value = "属性类别 1单选2复选3文本4下拉")
private Integer submissionsType;
@ApiModelProperty("属性名称")
@NotBlank(message = "属性名称不可为空")
private String attributeName;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("排序")
private Integer sort;
@ApiModelProperty("属性值")
private List<SpuAttributeValue> values;
}

View file

@ -0,0 +1,30 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.validation.constraints.NotNull;
/**
* @description sku属性
* @Author zhanglongbing@ebc.com
* @create 2021/12/27
*/
@Data
public class AttributeDTO {
@ApiModelProperty("attributeId")
@Encrypt
private Long attributeId;
@ApiModelProperty("类型")
private Integer attributeType;
@ApiModelProperty("属性名称")
private String attributeName;
@ApiModelProperty("属性值")
private String attributeValue;
}

View file

@ -0,0 +1,38 @@
package org.skyer.goods.api.dto;
import com.fasterxml.jackson.annotation.JsonIgnore;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.Date;
/**
* @description
* @Author wusc
* @create 2021/6/24 9:50 上午
*/
@Data
@ApiModel("商品品牌查询条件")
public class BrandPageReqDTO extends PageReqDTO {
@ApiModelProperty("主键")
@Encrypt
private Long id;
@ApiModelProperty("品牌名称")
private String brandName;
@ApiModelProperty("品牌状态")
private Integer status;
@ApiModelProperty("品牌编码")
private String code;
@ApiModelProperty("租户Id")
@JsonIgnore
private Long tenantId;
}

View file

@ -0,0 +1,39 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @description
* @Author wusc
* @create 2021/6/24 9:59 上午
*/
@Data
@ApiModel("新增或者编辑商品品牌")
public class BrandReqDTO {
@ApiModelProperty("主键")
@Encrypt
private Long id;
@ApiModelProperty("品牌编码")
private String code;
@ApiModelProperty("品牌名称")
private String brandName;
@ApiModelProperty("品牌logo")
private String logo;
@ApiModelProperty("制造商")
private String manufacturer;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty("备注")
private String remark;
}

View file

@ -0,0 +1,30 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
@Data
@ApiModel(value ="商品分类属性查询对象")
public class CategoryAttributeQueryDTO {
@Encrypt
@ApiModelProperty("分类属性id")
private Long id;
@Encrypt
@ApiModelProperty(value = "分类id,null返回空集", required = true)
private Long categoryId;
@ApiModelProperty(value = "表单方式 1单选2复选3文本4下拉")
private Integer formType;
@ApiModelProperty(value = "是否用于生成sku true是 false否")
private Boolean skuFlag;
@ApiModelProperty(value = "状态 true启用 false禁用")
private Boolean statusFlag;
@ApiModelProperty(value = "来源类型 0新增 1系统 2分级分类")
private Integer sourceType;
}

View file

@ -0,0 +1,46 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@ApiModel("商品分类属性")
public class CategoryAttributeSaveDTO {
// @Encrypt
// @ApiModelProperty("id")
// private Long id;
//
// @Encrypt
// @ApiModelProperty(value = "分类id sgoo_category.id",required = true)
// private Long categoryId;
@ApiModelProperty(value = "属性名称")
private String name;
@ApiModelProperty(value = "属性编码")
private String code;
@ApiModelProperty(value = "排序")
private Long sort;
@ApiModelProperty(value = "表单方式 1单选2复选3文本4下拉")
private Integer formType;
@ApiModelProperty(value = "是否用于生成sku true是 false否")
private Boolean skuFlag;
@ApiModelProperty(value = "状态 true启用 false禁用")
private Boolean statusFlag;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "来源类型")
private Integer sourceType;
@ApiModelProperty(value = "属性值列表")
private List<CategoryAttributeValueSaveDTO> attributeValueList;
}

View file

@ -0,0 +1,24 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("分类属性值")
public class CategoryAttributeValueSaveDTO {
// @Encrypt
// @ApiModelProperty("id")
// private Long id;
//
// @Encrypt
// @ApiModelProperty(value = "属性id sgoo_category_attribute.id")
// private Long attributeId;
@ApiModelProperty(value = "属性值")
private String value;
@ApiModelProperty(value = "排序")
private Long sort;
}

View file

@ -0,0 +1,38 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
@Data
@ApiModel("商品分类查询")
public class CategoryQueryDTO extends PageRequest {
@Encrypt
@ApiModelProperty("id")
private Long id;
@ApiModelProperty(value = "分类编码")
private String code;
@ApiModelProperty(value = "分类名称")
private String name;
@Encrypt
@ApiModelProperty(value = "父id 0,代表一级")
private Long parentId;
@ApiModelProperty(value = "状态 true启用 false禁用")
private Boolean statusFlag;
@ApiModelProperty(value = "类目等级")
private Integer level;
@ApiModelProperty(value = "是否叶子类目 true是 false否")
private Boolean subFlag;
@ApiModelProperty(value = "备注")
private String remark;
}

View file

@ -0,0 +1,52 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import java.util.List;
@Data
@ApiModel("商品分类保存")
public class CategorySaveDTO {
@Encrypt
@ApiModelProperty("id 为空代表新增")
private Long id;
@ApiModelProperty(value = "分类编码")
@Pattern(regexp = "^[A-Za-z0-9]*$")
private String code;
@NotNull
@Pattern(regexp = "^[\\u4E00-\\u9FA5A-Za-z0-9]+$")
@ApiModelProperty(value = "分类名称")
private String name;
@Encrypt
@ApiModelProperty(value = "父id 0,代表一级")
private Long parentId;
@ApiModelProperty(value = "状态 true启用 false禁用")
private Boolean statusFlag;
@ApiModelProperty(value = "类目等级 一级开始 默认1")
private Integer level;
@ApiModelProperty(value = "是否叶子类目 false否 true是")
private Boolean subFlag;
@ApiModelProperty(value = "排序")
private Long sort;
@ApiModelProperty(value = "备注")
private String remark;
@ApiModelProperty(value = "商品属性表(包含属性值)")
private List<CategoryAttributeSaveDTO> attributeList;
@ApiModelProperty(value = "版本号")
private Long objectVersionNumber;
}

View file

@ -0,0 +1,19 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@Data
@ApiModel("商品分类树筛选条件")
public class CategoryTreeQueryDTO {
@ApiModelProperty(value = "状态 true启用 false禁用")
private Boolean statusFlag;
@ApiModelProperty(value = "是否叶子类目 true是 false否")
private Boolean subFlag;
@ApiModelProperty(value = "是否移除子孙没有叶子分类的普通分类 true移除 false不移除")
private Boolean removeNotSubFlag;
}

View file

@ -0,0 +1,24 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.validation.constraints.NotNull;
@Data
@ApiModel("商品分类修改状态")
public class CategoryUpdateByStatusFlagDTO {
@Encrypt
@ApiModelProperty(value = "id", required = true)
@NotNull
private Long id;
@ApiModelProperty(value = "状态 true启用 false禁用", required = true)
@NotNull
private Boolean statusFlag;
@ApiModelProperty(value = "版本号")
private Long objectVersionNumber;
}

View file

@ -0,0 +1,44 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.List;
/**
* @description
* @Author wusc
* @create 2021/8/13 10:11 上午
*/
@ApiModel("商品组合")
@Data
public class GoodsGroupReqDTO {
@ApiModelProperty("id")
@Encrypt
private Long id;
@ApiModelProperty(value = "spuId")
@Encrypt
private Long spuId;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("套餐名")
private String groupName;
@ApiModelProperty("店铺id")
@Encrypt
private List<Long> storeIdList;
@ApiModelProperty("是否全部店铺")
private Boolean isAllStore;
@ApiModelProperty("组合商品sku")
private List<GoodsGroupSkuReqDTO> goodsGroupSkuReqDTOS;
}

View file

@ -0,0 +1,25 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.math.BigDecimal;
/**
* skuId 数量
* @description
* @Author wusc
* @create 2021/8/13 10:43 上午
*/
@ApiModel("商品组合sku")
@Data
public class GoodsGroupSkuReqDTO {
@ApiModelProperty("skuId")
@Encrypt
private Long skuId;
@ApiModelProperty("数量")
private BigDecimal num;
}

View file

@ -0,0 +1,43 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.List;
/**
* @description
* @Author wusc
* @create 2021/6/24 11:33 上午
*/
@Data
public class GoodsPageReqDTO extends PageReqDTO{
@ApiModelProperty("主键id")
@Encrypt
private String id;
@ApiModelProperty("spu编码")
private String spuCode;
@ApiModelProperty("商品名称")
private String name;
@ApiModelProperty("商品类别")
private Integer type;
@ApiModelProperty("目录编码")
@Encrypt
private List<Long> categoryIdList;
@ApiModelProperty(value = "状态")
private Integer status;
@ApiModelProperty("套餐标识0-单品1-套餐")
private Integer setFlag;
}

View file

@ -0,0 +1,53 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
/**
* @description
* @Author wusc
* @create 2021/6/24 10:44 上午
*/
@Data
@ApiModel("新增或者编辑商品")
public class GoodsReqDTO {
@ApiModelProperty("主键id")
@Encrypt
private Long id;
@ApiModelProperty("商品编码")
private String code;
@ApiModelProperty("类别")
@NotNull(message = "类别不能为空")
private Integer type;
@ApiModelProperty("商品名称")
@NotBlank(message = "名称不能为空")
private String name;
@ApiModelProperty("类别id")
@NotNull(message = "类别id不能为空")
@Encrypt
private Long categoryId;
@ApiModelProperty("品牌Id")
@Encrypt
private Long brandId;
@ApiModelProperty("素材Id")
@Encrypt
private Long materialId;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("状态")
private Integer status;
}

View file

@ -0,0 +1,63 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.util.List;
import org.skyer.goods.domain.entity.SpuAttributeValue;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @author: lzh
* @date: 2021-12-28
* @description:
*/
@Data
@ApiModel("添加编辑商品参数")
public class GoodsRequestDTO {
@ApiModelProperty("主键id")
@Encrypt
private Long id;
@ApiModelProperty("商品编码")
@NotBlank(message = "编码不能为空")
private String spuCode;
@ApiModelProperty("类别")
@NotNull(message = "类别不能为空")
private Integer type;
@ApiModelProperty("商品名称")
@NotBlank(message = "名称不能为空")
private String name;
@ApiModelProperty("类别id")
@NotNull(message = "商品类别不能为空")
@Encrypt
private Long categoryId;
@ApiModelProperty("品牌Id")
@Encrypt
private Long brandId;
@ApiModelProperty("素材Id")
@Encrypt
private Long materialId;
@ApiModelProperty("备注")
private String remark;
@ApiModelProperty("状态")
private Integer status;
@ApiModelProperty("套餐标识0-单品1-套餐")
private Integer setFlag;
@ApiModelProperty("属性")
private List<AttrListRequestDTO> attrs;
}

View file

@ -0,0 +1,47 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.List;
/**
* 商品规格表
*
* @author chenzz 2021-07-06 10:35:43
*/
@ApiModel("商品SKU")
@Data
public class GoodsSkuPageDTO extends PageRequest {
@ApiModelProperty(value = "商品名称")
private String spuName;
@ApiModelProperty(value = "商品编码")
private String spuCode;
@ApiModelProperty(value = "商品类别")
private String spuType;
@ApiModelProperty("套餐标识0-单品1-套餐")
private Integer setFlag;
@ApiModelProperty("目录编码")
@Encrypt
private List<Long> categoryIdList;
@ApiModelProperty(value = "0草稿 1被驳回 2审核中 3已生效 4已生效(修改中) ")
private List<String> status;
@ApiModelProperty(value = "sku名称")
private String skuName;
@ApiModelProperty(value = "skuCode")
private String skuCode;
}

View file

@ -0,0 +1,21 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @description
* @Author wusc
* @create 2021/8/16 5:15 下午
*/
@Data
@ApiModel("分组传入参数")
public class GroupPageReqDTO extends PageReqDTO{
@ApiModelProperty(value = "spu编码")
private String spuCode;
@ApiModelProperty("spu名称")
private String spuName;
}

View file

@ -0,0 +1,22 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.List;
/**
* @description
* @Author wusc
* @create 2021/6/30 11:20 上午
*/
@Data
@ApiModel("删除id")
public class IdsReqDTO {
@ApiModelProperty("主键id")
@Encrypt
private List<Long> ids;
}

View file

@ -0,0 +1,34 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
/**
* @description
* @Author wusc
* @create 2021/6/25 5:29 下午
*/
@Data
public class LevelCategoryDTO {
/**
* 分类等级
*/
@ApiModelProperty("分类等级")
private Integer level;
/**
* 分类id
*/
@ApiModelProperty("分类id")
@Encrypt
private Long id;
/**
* 分类名称
*/
@ApiModelProperty("分类名称")
private String name;
}

View file

@ -0,0 +1,71 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.validation.constraints.NotNull;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.List;
/**
* <p>
* 商品素材
* </p>
*
* @author chenzz
* @since 2021-06-23
*/
@Getter
@Setter
@ToString
@ApiModel("商品素材")
public class MaterialDTO {
@ApiModelProperty("id,添加时不需要设置")
@Encrypt
private Long id;
/**
* 编码
*/
@ApiModelProperty("编码")
private String code;
/**
* 素材名称
*/
@ApiModelProperty("素材名称")
@NotNull
private String materialName;
/**
* 主图
*/
@ApiModelProperty("主图")
private List<String> mainImage;
/**
* 详情图
*/
@ApiModelProperty("详情图")
private List<String> detailImage;
/**
* 详情内容
*/
@ApiModelProperty("详情内容")
private String detailHtml;
/**
* 备注
*/
@ApiModelProperty("备注")
private String remark;
}

View file

@ -0,0 +1,36 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
/**
* <p>
* 商品素材
* </p>
*
* @author chenzz
* @since 2021-06-23
*/
@Getter
@Setter
@ToString
@ApiModel("商品素材")
public class MaterialListDTO {
/**
* 编码
*/
@ApiModelProperty("编码")
private String code;
/**
* 素材名称
*/
@ApiModelProperty("素材名称")
private String materialName;
}

View file

@ -0,0 +1,36 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.skyer.core.domain.Page;
import org.skyer.core.domain.PageInfo;
import java.io.Serializable;
/**
* @description
* @Author wusc
* @create 2021/6/23 2:58 下午
*/
@Data
@AllArgsConstructor
@NoArgsConstructor
@ApiModel(description = "分页请求类")
public class PageReqDTO implements Serializable {
@ApiModelProperty(value = "每页条数", example = "10")
private Integer size;
@ApiModelProperty(value = "当前页数", example = "1")
private Integer page;
public PageInfo createPage() {
int page = this.page == null || this.page < 0 ? 0: this.page;
int size = this.size == null || this.size < 0 ? 10: this.size;
return new PageInfo(page, size);
}
}

View file

@ -0,0 +1,21 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import java.util.List;
/**
*
* @author zhanglb
*/
@Data
public class SkuBatchAuditDTO {
@ApiModelProperty("skuId列表")
@Encrypt
List<Long> skuIds;
}

View file

@ -0,0 +1,20 @@
package org.skyer.goods.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import java.util.List;
@Data
@JsonInclude(value = JsonInclude.Include.NON_NULL)
public class SkuBatchSaveDTO {
@ApiModelProperty(value = "SKU列表")
private List<SkuListRequestDTO> skuList;
@ApiModelProperty(value = "true保存为草稿 false提交")
private Boolean flag;
@ApiModelProperty("套餐标识0-单品1-套餐")
private Integer setFlag;
}

View file

@ -0,0 +1,75 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.goods.domain.entity.SkuPackage;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
* @description
* @Author zhanglongbing@ebc.com
* @create 2021/12/27
*/
@Data
public class SkuListRequestDTO {
@ApiModelProperty("spuId")
@Encrypt
@NotNull(message = "spuId不能为空")
private Long spuId;
@ApiModelProperty("skuCode")
@NotBlank(message = "skuCode不能为空")
private String skuCode;
@ApiModelProperty("sku名称")
@NotBlank(message = "skuName不能为空")
private String skuName;
@ApiModelProperty("商品重量")
private BigDecimal weight;
@ApiModelProperty("商品长度")
private BigDecimal length;
@ApiModelProperty("商品宽度")
private BigDecimal width;
@ApiModelProperty("商品高度")
private BigDecimal height;
@ApiModelProperty("成本价")
private BigDecimal costPrice;
@ApiModelProperty("销售价")
private BigDecimal salesPrice;
@ApiModelProperty("活动价")
private BigDecimal activityPrice;
@ApiModelProperty("市场价")
private BigDecimal marketPrice;
@ApiModelProperty("分销价")
private BigDecimal distributionPrice;
@ApiModelProperty("批发价")
private BigDecimal wholesalePrice;
@ApiModelProperty("结算价")
private BigDecimal clearingPrice;
@ApiModelProperty("原始属性列表")
private List<AttributeDTO> skuAttributeList;
@ApiModelProperty("附加属性列表")
private List<AttributeDTO> otherAttributeList;
@ApiModelProperty("套餐信息 sku明细")
@Encrypt
private List<SkuPackage> skuDetailList;
}

View file

@ -0,0 +1,23 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.goods.domain.entity.Sku;
/**
*
* @author zhanglb
*/
@Data
public class SkuUpdateDTO {
@ApiModelProperty(value = "sku更改信息")
private SkuUpdateInfoDTO sku;
@ApiModelProperty(value = "true保存为草稿 false提交")
private Boolean flag;
}

View file

@ -0,0 +1,57 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.goods.domain.entity.SkuAttributeValue;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.validation.constraints.NotNull;
import java.math.BigDecimal;
import java.util.List;
/**
* @author zhanglongbing
*/
@Data
public class SkuUpdateInfoDTO {
@ApiModelProperty("id")
@Encrypt
@NotNull(message = "id不能为空")
private Long id;
@ApiModelProperty(value = "skuCode")
private String skuCode;
@ApiModelProperty(value = "sku名称")
private String skuName;
@ApiModelProperty(value = "成本价")
private BigDecimal costPrice;
@ApiModelProperty(value = "销售价")
private BigDecimal salesPrice;
@ApiModelProperty(value = "活动价")
private BigDecimal activityPrice;
@ApiModelProperty(value = "市场价")
private BigDecimal marketPrice;
@ApiModelProperty(value = "分销价")
private BigDecimal distributionPrice;
@ApiModelProperty(value = "批发价")
private BigDecimal wholesalePrice;
@ApiModelProperty(value = "结算价")
private BigDecimal clearingPrice;
@ApiModelProperty(value = "商品重量")
private BigDecimal weight;
@ApiModelProperty(value = "商品长度")
private BigDecimal length;
@ApiModelProperty(value = "商品宽度")
private BigDecimal width;
@ApiModelProperty(value = "商品高度")
private BigDecimal height;
@ApiModelProperty("原始属性列表")
private List<SkuAttributeValue> skuAttributeList;
@ApiModelProperty("附加属性列表")
private List<SkuAttributeValue> otherAttributeList;
}

View file

@ -0,0 +1,32 @@
package org.skyer.goods.api.dto;
import com.fasterxml.jackson.annotation.JsonInclude;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.skyer.goods.domain.entity.Spu;
import java.util.ArrayList;
import java.util.List;
/**
* @Author wusc 2021-01-07 1753
*/
@ApiModel("SPU集合")
@JsonInclude(value = JsonInclude.Include.NON_NULL)
@Data
public class SpuListDTO {
public SpuListDTO(){}
public SpuListDTO(Spu spu){
this.spuList = new ArrayList<Spu>(){{add(spu);}};
}
public SpuListDTO(List<Spu> spuList){
this.spuList = spuList;
}
@ApiModelProperty("spu集合")
private List<Spu> spuList;
private Boolean deleteFlag;
}

View file

@ -0,0 +1,28 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.skyer.starter.keyencrypt.core.Encrypt;
import javax.validation.constraints.NotEmpty;
import java.util.List;
/**
* @description
* @Author wusc
* @create 2021/6/24 10:18 上午
*/
@Data
@ApiModel("用于编辑状态")
public class StatusReqDTO {
@ApiModelProperty("主键id")
@NotEmpty(message = "主键id不能为空")
@Encrypt
private List<Long> ids;
@ApiModelProperty("状态")
private Integer status;
}

View file

@ -0,0 +1,37 @@
package org.skyer.goods.api.dto;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
@ApiModel("更新值集")
@Data
public class UpdatePriceItemValueDTO {
@ApiModelProperty("value编码")
String value;
@ApiModelProperty("value含义")
String meaning;
@ApiModelProperty("排序标识")
Integer orderSeq;
@ApiModelProperty("描述")
private String description;
@ApiModelProperty("生效标识")
private Integer enabledFlag;
//====================
// @ApiModelProperty("值集值ID")
// private Long lovValueId;
//
// @ApiModelProperty("值集ID")
// private Long lovId;
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 商品分类属性表应用服务
*
* @author xurongfa 2021-12-24 09:12:57
*/
public interface CategoryAttributeService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 商品分类属性值表应用服务
*
* @author xurongfa 2021-12-24 09:12:57
*/
public interface CategoryAttributeValueService {
}

View file

@ -0,0 +1,9 @@
package org.skyer.goods.app.service;
/**
* 商品分类表应用服务
*
* @author xurongfa 2021-12-24 09:12:57
*/
public interface CategoryService {
}

View file

@ -0,0 +1,69 @@
package org.skyer.goods.app.service;
import cn.hutool.core.lang.Dict;
import org.skyer.core.domain.Page;
import org.skyer.goods.domain.dto.InstallServiceDTO;
import org.skyer.goods.domain.dto.PageInstallServiceDTO;
import org.skyer.goods.domain.entity.InstallService;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* 安装服务应用服务
*
* @author chenzz 2021-08-18 15:42:47
*/
public interface InstallServiceService {
/**
* 列表
*
* @param installServiceDTO
* @return
*/
List<InstallService> list(PageInstallServiceDTO installServiceDTO);
/**
* 分页
*
* @param pageRequest
* @param installServiceDTO
* @return
*/
Page<Dict> page(PageRequest pageRequest, PageInstallServiceDTO installServiceDTO);
/**
* 详情
*
* @param id
* @return
*/
Dict detail(Long id);
/**
* 添加创建
*
* @param dto
* @return
*/
Boolean create(@RequestBody InstallServiceDTO dto);
/**
* 更新修改
*
* @param dto
* @return
*/
Boolean update(@RequestBody InstallServiceDTO dto);
/**
* 批量删除
*
* @param ids
* @return
*/
Boolean batchRemove(List<Long> ids);
}

View file

@ -0,0 +1,33 @@
package org.skyer.goods.app.service;
/**
* 加密工具(针对字符串,id等进行加密)
*
* @author chenzz
*/
public interface MyEncryptionService {
/**
* 加密字符串
*
* @param text
* @return
*/
String encrypt(String text);
/**
* 加密id
*
* @param id
* @return
*/
String encrypt(Long id);
/**
* 加密id
*
* @param id
* @return
*/
String encrypt(Integer id);
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* sku属性关联草稿表应用服务
*
* @author zhanglongbing@ebc.com 2021-12-29 11:23:43
*/
public interface SkuAttributeValueDraftService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* sku属性关联表应用服务
*
* @author zhanglongbing@ebc.com 2021-12-28 09:17:10
*/
public interface SkuAttributeValueService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 商品SKU审核应用服务
*
* @author zhanglongbing@ebc.com 2021-12-27 10:09:56
*/
public interface SkuAuditSettingService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 商品规格草稿表应用服务
*
* @author zhanglongbing@ebc.com 2021-12-29 11:12:15
*/
public interface SkuDraftService {
}

View file

@ -0,0 +1,65 @@
package org.skyer.goods.app.service;
import org.skyer.core.domain.Page;
import org.skyer.goods.api.dto.GoodsSkuPageDTO;
import org.skyer.goods.domain.entity.Sku;
import org.skyer.goods.domain.vo.GoodsSkuPageVO;
import java.io.IOException;
import java.util.List;
import java.util.function.Supplier;
/**
* @author zhanglb
*/
public interface SkuEsService {
/**
* 创建skuList异步saga任务
* @param skuList skuList
* @return List
*/
List<Sku> syncSkuListEsSage(List<Sku> skuList);
/**
* 消费异步saga任务
* @param skuListJsonStr skuListJsonStr
* @return List<Sku>
* @throws IOException 转换异常
*/
List<Sku> syncSkuListEsSageTask(String skuListJsonStr) throws IOException;
/**
* 批量删除es数据 到saga
* @param skuList skuList
* @return List<Sku>
*/
List<Sku> syncDelSkuListEsSage(List<Sku> skuList);
/**
* 批量删除es数据
* @param skuListJsonStr skuListJsonStr
* @return List<Sku>
* @throws IOException 删除异常
*/
List<Sku> syncDelSkuListEsSageTask(String skuListJsonStr) throws IOException;
/**
* 清空sku所有记录
*/
void delSkuEsAll() throws Exception;
/**
* es查询sku列表
* @param goodsSkuPageDTO skuPage
* @return Page<GoodsSkuPageVO>
*/
Page<GoodsSkuPageVO> listPage(GoodsSkuPageDTO goodsSkuPageDTO) throws Exception;
/**
* 批量导入sku的所有数据
* @throws IOException 导入异常
*/
void skuStatusUp() throws IOException;
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 应用服务
*
* @author zhanglongbing@ebc.com 2022-03-03 10:45:30
*/
public interface SkuPackageService {
}

View file

@ -0,0 +1,114 @@
package org.skyer.goods.app.service;
import org.skyer.core.domain.Page;
import org.skyer.goods.api.dto.*;
import org.skyer.goods.domain.dto.AuditDTO;
import org.skyer.goods.domain.dto.SkuAuditDTO;
import org.skyer.goods.domain.vo.*;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import java.util.List;
/**
* 商品规格表应用服务
*
* @author chenzz 2021-07-06 10:35:43
*/
public interface SkuService {
/**
* sku商品分页返回商品的资料
* @param goodsSku
* @return
*/
Page<GoodsSkuPageVO> listPage( GoodsSkuPageDTO goodsSku);
/**
* 查看商品详情
* @param id skuId
* @param isEdit 是否编辑
* @return
*/
GoodsSkuDetailVO getDetail(Long id, boolean isEdit);
/**
* 保存sku
*
* @param skuBatchSaveDTO
* @return
*/
Boolean saveSku(SkuBatchSaveDTO skuBatchSaveDTO);
/**
* 删除sku
*
* @param ids
* @return
*/
Boolean deleteByIds(List<Long> ids);
/**
* 变更sku信息
*
* @param updateDTO
* @return
*/
boolean updateSku(SkuUpdateDTO updateDTO);
/**
* 批量提交数据
*
* @param batchAuditDTO
* @return
*/
int batchAudit(SkuBatchAuditDTO batchAuditDTO);
/**
* 根据商品id获取sku列表和属性列表
*
* @param spuId
* @return
*/
List<GoodsSkuDetailVO> getSkuAndAttributeDataByGoodsId(Long spuId);
/**
* 查询rpc商品
*
* @param skuCodeList
* @return
*/
List<RpcGoodsResVO> queryRPCGoodsList(List<String> skuCodeList);
/**
* 查询套餐内的详情
* @param skuCodeList
* @return
*/
List<RpcOrderResVO> getMealsGoodsList(List<String> skuCodeList);
/**
* 查询订单RpcVo
* @param skuCodeList skuList
* @return List<RpcOrderResVO>
*/
List<RpcOrderResVO> queryOrderRpcList(List<String> skuCodeList);
/**
* 获取审核详情
*
* @author lixiaoyang
* @date 2021/12/30 11:11
*/
SkuAuditVO getAuditDetail(SkuAuditDTO dto);
/**
* SKU审核操作
*
* @author lixiaoyang
* @date 2021/12/30 14:44
*/
Boolean skuAudit(AuditDTO dto);
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 属性表应用服务
*
* @author linzhuanghuang@ebc.com 2021-12-28 16:40:03
*/
public interface SpuAttributeService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 属性值表应用服务
*
* @author linzhuanghuang@ebc.com 2021-12-28 16:40:03
*/
public interface SpuAttributeValueService {
}

View file

@ -0,0 +1,66 @@
package org.skyer.goods.app.service;
import org.skyer.core.domain.Page;
import org.skyer.goods.api.dto.GoodsPageReqDTO;
import org.skyer.goods.api.dto.SpuListDTO;
import org.skyer.goods.domain.entity.Spu;
import org.skyer.goods.domain.vo.GoodsPageResVO;
import java.io.IOException;
import java.util.List;
import java.util.function.Supplier;
/**
* 查询或者更新es
*
* @description
* @Author lzh
* @create 2022/1/6
*/
public interface SpuEsService {
/**
* 生成spu集合数据同步到es
* @param spuListDTO 包含spu列表的DTO
*/
SpuListDTO syncSpuEsSage(SpuListDTO spuListDTO);
/**
* saga task消费同步es数据
* @param spuListJSONStr spuListDTO的json串
* @return SpuListDTO
* @throws IOException
*/
SpuListDTO syncSpuEsSageTask(String spuListJSONStr) throws IOException;
/**
* 将spu数据存入es
*
* @param
*/
void createOrUpdateSpuEs(Spu spu);
/**
* 查询商品
* @param goodsPageReqDTO
* @return
*/
Page<GoodsPageResVO> querySpuEs(GoodsPageReqDTO goodsPageReqDTO) throws Exception;
/**
* 删除es数据
*/
void delSpuEs(List<Spu> spuList);
/**
* 清空库存所有记录
*/
void delSpuEsAll();
/**
* 批量导入商品数据
* @return
* @throws IOException
*/
void productStatusUp() throws IOException;
}

View file

@ -0,0 +1,58 @@
package org.skyer.goods.app.service;
import cn.hutool.core.lang.Dict;
import org.skyer.core.domain.Page;
import org.skyer.goods.domain.dto.PageSpuInstallServiceDTO;
import org.skyer.goods.domain.dto.SpuInstallServiceDTO;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* 商品安装服务应用服务
*
* @author chenzz 2021-08-18 16:42:11
*/
public interface SpuInstallServiceService {
/**
* 分页
*
* @param pageRequest
* @param spuInstallService
* @return
*/
Page<Dict> page(PageRequest pageRequest, PageSpuInstallServiceDTO spuInstallService);
/**
* 详情
*
* @param id
* @return
*/
Dict detail(Long id);
/**
* 添加创建
*
* @param spuInstallServiceDTO
* @return
*/
Boolean create(@RequestBody SpuInstallServiceDTO spuInstallServiceDTO);
/**
* 更新修改
*
* @param spuInstallServiceDTO
* @return
*/
Boolean update(@RequestBody SpuInstallServiceDTO spuInstallServiceDTO);
/**
* 批量删除
*
* @param ids
* @return
*/
Boolean batchRemove(List<Long> ids);
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 商品安装服务sku表应用服务
*
* @author chenzz 2021-08-18 16:42:11
*/
public interface SpuInstallServiceSkuService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 商品安装服务售卖门店应用服务
*
* @author chenzz 2021-08-18 16:42:11
*/
public interface SpuInstallServiceStoreService {
}

View file

@ -0,0 +1,59 @@
package org.skyer.goods.app.service;
import cn.hutool.core.lang.Dict;
import org.skyer.core.domain.Page;
import org.skyer.goods.domain.dto.PageSonMumDTO;
import org.skyer.goods.domain.dto.SpuSonMumDTO;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.springframework.web.bind.annotation.RequestBody;
import java.util.List;
/**
* 子母商品应用服务
*
* @author chenzz 2021-08-16 15:04:38
*/
public interface SpuSonMumService {
/**
* 分页
*
* @param pageRequest
* @param spuSonMum
* @return
*/
Page<Dict> page(PageRequest pageRequest, PageSonMumDTO spuSonMum);
/**
* 详情
*
* @param id
* @return
*/
Dict detail(Long id);
/**
* 添加创建
*
* @param spuSonMumDTO
* @return
*/
Boolean create(@RequestBody SpuSonMumDTO spuSonMumDTO);
/**
* 更新修改
*
* @param spuSonMumDTO
* @return
*/
Boolean update(@RequestBody SpuSonMumDTO spuSonMumDTO);
/**
* 批量删除
*
* @param ids
* @return
*/
Boolean batchRemove(List<Long> ids);
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 子母商品sku表应用服务
*
* @author chenzz 2021-08-17 15:49:14
*/
public interface SpuSonMumSkuService {
}

View file

@ -0,0 +1,10 @@
package org.skyer.goods.app.service;
/**
* 子母商品售卖门店应用服务
*
* @author chenzz 2021-08-16 15:04:38
*/
public interface SpuSonMumStoreService {
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.CategoryAttributeService;
import org.springframework.stereotype.Service;
/**
* 商品分类属性表应用服务默认实现
*
* @author xurongfa 2021-12-24 09:12:57
*/
@Service
public class CategoryAttributeServiceImpl implements CategoryAttributeService {
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.CategoryAttributeValueService;
import org.springframework.stereotype.Service;
/**
* 商品分类属性值表应用服务默认实现
*
* @author xurongfa 2021-12-24 09:12:57
*/
@Service
public class CategoryAttributeValueServiceImpl implements CategoryAttributeValueService {
}

View file

@ -0,0 +1,21 @@
package org.skyer.goods.app.service.impl;
import org.skyer.core.exception.CommonException;
import org.skyer.goods.app.service.CategoryService;
import org.skyer.goods.domain.entity.Category;
import org.skyer.goods.domain.repository.CategoryRepository;
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;
/**
* 商品分类表应用服务默认实现
*
* @author xurongfa 2021-12-24 09:12:57
*/
@Service
public class CategoryServiceImpl implements CategoryService {
}

View file

@ -0,0 +1,218 @@
package org.skyer.goods.app.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Dict;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONUtil;
import org.skyer.core.domain.Page;
import org.skyer.core.domain.PageInfo;
import org.skyer.core.exception.CommonException;
import org.skyer.core.oauth.CustomUserDetails;
import org.skyer.core.oauth.DetailsHelper;
import org.skyer.goods.app.service.InstallServiceService;
import org.skyer.goods.app.service.MyEncryptionService;
import org.skyer.goods.domain.dto.InstallServiceDTO;
import org.skyer.goods.domain.dto.PageInstallServiceDTO;
import org.skyer.goods.domain.dto.ServiceZoneDTO;
import org.skyer.goods.domain.entity.InstallService;
import org.skyer.goods.domain.repository.InstallServiceRepository;
import org.skyer.goods.domain.vo.ChinaZoingRemoteVO;
import org.skyer.goods.infra.feign.ChinaZoingRemoteService;
import org.skyer.mybatis.domian.Condition;
import org.skyer.mybatis.pagehelper.PageHelper;
import org.skyer.mybatis.pagehelper.domain.PageRequest;
import org.skyer.mybatis.util.Sqls;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;
/**
* 安装服务应用服务默认实现
*
* @author chenzz 2021-08-18 15:42:47
*/
@Service
public class InstallServiceServiceImpl implements InstallServiceService {
@Autowired
private InstallServiceRepository installServiceRepository;
@Autowired
private ChinaZoingRemoteService chinaZoingRemoteService;
@Autowired
private MyEncryptionService myEncryptionService;
@Override
public List<InstallService> list(PageInstallServiceDTO installServiceDTO) {
// 根据条件查找
return installServiceRepository.selectByCondition(Condition.builder(InstallService.class)
.andWhere(Sqls.custom()
.andLike(InstallService.FIELD_SERVICE_CODE, installServiceDTO.getServiceCode(), true)
.andLike(InstallService.FIELD_NAME, installServiceDTO.getName(), true)
.andEqualTo(InstallService.FIELD_DELETE_FLAG, false))
.build());
}
@Override
public Page<Dict> page(PageRequest pageRequest, PageInstallServiceDTO installServiceDTO) {
Page<InstallService> page = PageHelper.doPageAndSort(pageRequest, () -> installServiceRepository.selectByCondition(Condition.builder(InstallService.class)
.andWhere(Sqls.custom()
.andLike(InstallService.FIELD_SERVICE_CODE, installServiceDTO.getServiceCode(), true)
.andLike(InstallService.FIELD_NAME, installServiceDTO.getName(), true)
.andEqualTo(InstallService.FIELD_DELETE_FLAG, false))
.build()));
List<InstallService> pageListContent = page.getContent();
if (CollUtil.isNotEmpty(pageListContent)) {
List<Dict> dictList = pageListContent.stream().map(xx -> {
Dict item = Dict.create();
item.set("id", myEncryptionService.encrypt(xx.getId()));
item.set("name", xx.getName());
item.set("money", xx.getMoney());
item.set("installServiceCode", xx.getServiceCode());
item.set("peopleAmount", xx.getPeopleAmount());
item.set("type", xx.getType());
item.set("remark", xx.getRemark());
item.set("createdBy", xx.getCreatedBy());
item.set("creationDate", DateUtil.formatDateTime(xx.getCreationDate()));
String serviceZone = xx.getServiceZone();
if (StrUtil.isNotEmpty(serviceZone)) {
List<ServiceZoneDTO> listServiceZone = JSONUtil.toList(serviceZone, ServiceZoneDTO.class);
List<Dict> listDict = listServiceZone.stream().map(ooo -> {
Dict itemDict = Dict.create().parseBean(ooo);
ResponseEntity<ChinaZoingRemoteVO> showDetails = chinaZoingRemoteService.showDetails(ooo.getCityId());
if (HttpStatus.OK.equals(showDetails.getStatusCode())) {
ChinaZoingRemoteVO detailsBody = showDetails.getBody();
if (null != detailsBody) {
itemDict.set("cityDetail", Dict.create()
.set("levelThreeAreaName", detailsBody.getLevelThreeAreaName())
.set("levelTwoAreaName", detailsBody.getLevelTwoAreaName())
.set("levelOneAreaName", detailsBody.getLevelOneAreaName())
);
} else {
itemDict.set("cityDetail", null);
}
}
return itemDict;
}).collect(Collectors.toList());
item.set("serviceZone", listDict);
}
return item;
}).collect(Collectors.toList());
return new Page<>(dictList, new PageInfo(page.getTotalPages(), page.getSize()), page.getTotalElements());
}
return new Page<>(new ArrayList<>(), new PageInfo(0, page.getSize()), 0);
}
@Override
public Dict detail(Long id) {
InstallService installService = installServiceRepository.selectByPrimaryKey(id);
if (ObjectUtil.isNotNull(installService)) {
Dict dict = Dict.create();
dict.set("id", myEncryptionService.encrypt(installService.getId()));
dict.set("name", installService.getName());
dict.set("money", installService.getMoney());
dict.set("installServiceCode", installService.getServiceCode());
dict.set("peopleAmount", installService.getPeopleAmount());
dict.set("type", installService.getType());
dict.set("remark", installService.getRemark());
dict.set("createdBy", installService.getCreatedBy());
dict.set("objectVersionNumber", installService.getObjectVersionNumber());
dict.set("creationDate", DateUtil.formatDateTime(installService.getCreationDate()));
String serviceZone = installService.getServiceZone();
if (StrUtil.isNotEmpty(serviceZone)) {
List<ServiceZoneDTO> listServiceZone = JSONUtil.toList(serviceZone, ServiceZoneDTO.class);
List<Dict> listDict = listServiceZone.stream().map(ooo -> {
Dict itemDict = Dict.create().parseBean(ooo);
ResponseEntity<ChinaZoingRemoteVO> showDetails = chinaZoingRemoteService.showDetails(ooo.getCityId());
if (HttpStatus.OK.equals(showDetails.getStatusCode())) {
ChinaZoingRemoteVO detailsBody = showDetails.getBody();
if (null != detailsBody) {
itemDict.set("cityDetail", Dict.create()
.set("levelThreeAreaName", detailsBody.getLevelThreeAreaName())
.set("levelTwoAreaName", detailsBody.getLevelTwoAreaName())
.set("levelOneAreaName", detailsBody.getLevelOneAreaName())
);
} else {
itemDict.set("cityDetail", null);
}
}
return itemDict;
}).collect(Collectors.toList());
dict.set("serviceZone", listDict);
}
return dict;
}
return Dict.create().parseBean(installService);
}
@Override
public Boolean create(InstallServiceDTO dto) {
if (CollUtil.isEmpty(dto.getServiceZone())) {
throw new CommonException("没有设置服务区域!");
}
InstallService installService = new InstallService();
BeanUtils.copyProperties(dto, installService);
if (StrUtil.isEmpty(dto.getServiceCode())) {
installService.setServiceCode(RandomUtil.randomString(6) + RandomUtil.randomNumbers(3) + RandomUtil.randomString(2));
}
// 获取租户的id
CustomUserDetails userDetails = DetailsHelper.getUserDetails();
Long tenantId = userDetails.getTenantId();
installService.setServiceZone(JSONUtil.parse(dto.getServiceZone()).toString());
installService.setDeleteFlag(false);
installService.setTenantId(tenantId);
return installServiceRepository.insert(installService) > 0;
}
@Override
public Boolean update(InstallServiceDTO dto) {
InstallService installService = new InstallService();
BeanUtils.copyProperties(dto, installService);
if (CollUtil.isNotEmpty(dto.getServiceZone())) {
installService.setServiceZone(JSONUtil.parse(dto.getServiceZone()).toString());
}
return installServiceRepository.updateByPrimaryKeySelective(installService) > 0;
}
@Override
public Boolean batchRemove(List<Long> ids) {
List<InstallService> installServiceList = installServiceRepository.selectByCondition(Condition.builder(InstallService.class)
.andWhere(Sqls.custom()
.andIn(InstallService.FIELD_ID, ids, true))
.build());
return installServiceRepository.batchDelete(installServiceList) > 0;
}
}

View file

@ -0,0 +1,38 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.MyEncryptionService;
import org.skyer.starter.keyencrypt.core.EncryptProperties;
import org.skyer.starter.keyencrypt.core.EncryptionService;
import org.skyer.starter.keyencrypt.core.IEncryptionService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class MyEncryptionServiceImpl implements MyEncryptionService {
@Autowired
private EncryptProperties encryptProperties;
private IEncryptionService encryptionService = null;
private IEncryptionService getEncryptionService() {
if (encryptionService == null) {
encryptionService = new EncryptionService(encryptProperties);
}
return encryptionService;
}
@Override
public String encrypt(String text) {
return getEncryptionService().encrypt(text, "");
}
@Override
public String encrypt(Long id) {
return encrypt(String.valueOf(id));
}
@Override
public String encrypt(Integer id) {
return encrypt(String.valueOf(id));
}
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SkuAttributeValueDraftService;
import org.springframework.stereotype.Service;
/**
* sku属性关联草稿表应用服务默认实现
*
* @author zhanglongbing@ebc.com 2021-12-29 11:23:43
*/
@Service
public class SkuAttributeValueDraftServiceImpl implements SkuAttributeValueDraftService {
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SkuAttributeValueService;
import org.springframework.stereotype.Service;
/**
* sku属性关联表应用服务默认实现
*
* @author zhanglongbing@ebc.com 2021-12-28 09:17:10
*/
@Service
public class SkuAttributeValueServiceImpl implements SkuAttributeValueService {
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SkuAuditSettingService;
import org.springframework.stereotype.Service;
/**
* 商品SKU审核应用服务默认实现
*
* @author zhanglongbing@ebc.com 2021-12-27 10:09:56
*/
@Service
public class SkuAuditSettingServiceImpl implements SkuAuditSettingService {
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SkuDraftService;
import org.springframework.stereotype.Service;
/**
* 商品规格草稿表应用服务默认实现
*
* @author zhanglongbing@ebc.com 2021-12-29 11:12:15
*/
@Service
public class SkuDraftServiceImpl implements SkuDraftService {
}

View file

@ -0,0 +1,435 @@
package org.skyer.goods.app.service.impl;
import cn.hutool.core.collection.CollUtil;
import cn.hutool.core.util.ObjectUtil;
import com.alibaba.fastjson.JSON;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.elasticsearch.action.bulk.BulkRequest;
import org.elasticsearch.action.bulk.BulkResponse;
import org.elasticsearch.action.index.IndexRequest;
import org.elasticsearch.action.search.*;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.client.indices.GetIndexRequest;
import org.elasticsearch.common.unit.TimeValue;
import org.elasticsearch.common.xcontent.XContentType;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.reindex.DeleteByQueryRequest;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.skyer.core.domain.Page;
import org.skyer.core.iam.ResourceLevel;
import org.skyer.goods.api.dto.GoodsSkuPageDTO;
import org.skyer.goods.app.service.SkuEsService;
import org.skyer.goods.domain.entity.Material;
import org.skyer.goods.domain.entity.Sku;
import org.skyer.goods.domain.entity.SkuAttributeValue;
import org.skyer.goods.domain.entity.Spu;
import org.skyer.goods.domain.repository.*;
import org.skyer.goods.domain.vo.GoodsSkuPageVO;
import org.skyer.goods.domain.vo.SpuEsModel;
import org.skyer.goods.infra.constant.ObjectConstant;
import org.skyer.goods.infra.util.EsBoolQueryUtil;
import org.skyer.mybatis.domain.AuditDomain;
import org.skyer.mybatis.domian.Condition;
import org.skyer.mybatis.util.Sqls;
import org.skyer.saga.saga.SagaDefinition;
import org.skyer.saga.saga.annotation.Saga;
import org.skyer.saga.saga.annotation.SagaTask;
import org.skyer.saga.saga.producer.StartSagaBuilder;
import org.skyer.saga.saga.producer.TransactionalProducer;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
import static org.skyer.goods.domain.entity.Sku.*;
/**
* @author zhanglb
*/
@Slf4j
@Service
public class SkuEsServiceImpl implements SkuEsService {
@Autowired
private RestHighLevelClient client;
@Autowired
private CategoryRepository categoryRepository;
@Autowired
private SkuRepository skuRepository;
@Autowired
private SpuRepository spuRepository;
@Autowired
private MaterialRepository materialRepository;
@Autowired
private SkuAttributeValueRepository skuAttributeValueRepository;
@Autowired
private TransactionalProducer transactionalProducer;
@Override
@Saga(description = "同步skuList到saga", code = "sync-sku-list-es")
public List<Sku> syncSkuListEsSage(List<Sku> skuList) {
List<String> skuCodeList = skuList.stream().map(Sku::getSkuCode).collect(Collectors.toList());
List<Sku> skuEsList = skuRepository.selectByCondition(Condition.builder(Sku.class)
.andWhere(Sqls.custom().andIn(FIELD_SKU_CODE,skuCodeList)).build());
return transactionalProducer.applyAndReturn(
StartSagaBuilder.newBuilder()
.withSagaCode("sync-sku-list-es").withLevel(ResourceLevel.ORGANIZATION)
.withRefType("listSku")
.withSourceId(1L),
build -> {
build.withPayloadAndSerialize(skuEsList)
.withRefId(skuEsList.hashCode() + " time:" + System.currentTimeMillis());
return skuEsList;
});
}
@SagaTask(description = "同步skuList到es sage task",
code = "sync-sku-es-list-sage-task",
sagaCode = "sync-sku-list-es",
concurrentLimitNum = 2,
concurrentLimitPolicy = SagaDefinition.ConcurrentLimitPolicy.NONE,
seq = 1)
@Override
public List<Sku> syncSkuListEsSageTask(String skuListJsonStr) throws IOException {
List<Sku> skuList = JSON.parseArray(skuListJsonStr, Sku.class);
BulkRequest bulkRequest = new BulkRequest();
skuList.forEach(x -> {
//构造保存请求
String jsonString = JSON.toJSONString(x);
IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SKU_INDEX);
indexRequest.id(x.getId().toString());
indexRequest.source(jsonString, XContentType.JSON);
bulkRequest.add(indexRequest);
});
client.bulk(bulkRequest, RequestOptions.DEFAULT);
return skuList;
}
@Override
public Page<GoodsSkuPageVO> listPage(GoodsSkuPageDTO goodsSkuPageDTO) throws Exception {
// 判断索引库是否存在
if (!isExistsIndex(ObjectConstant.EsKey.SKU_INDEX)){
return new Page<>();
}
if (CollUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())) {
goodsSkuPageDTO.setCategoryIdList(categoryRepository.getLaterCategoryId(goodsSkuPageDTO.getCategoryIdList()));
}
Page<GoodsSkuPageVO> skuPage = new Page<>();
int size = goodsSkuPageDTO.getSize();
skuPage.setSize(size);
skuPage.setNumber(goodsSkuPageDTO.getPage() + 1);
SearchRequest searchRequest = this.buildSearchRequest(goodsSkuPageDTO);
try {
SearchResponse search = client.search(searchRequest, RequestOptions.DEFAULT);
SearchHits hits = search.getHits();
long totalElements = hits.getTotalHits().value;
skuPage.setTotalElements(totalElements);
int total = (int) totalElements;
int page = total / size;
skuPage.setTotalPages(page);
List<Sku> esSkuList = Arrays.stream(hits.getHits()).map(s -> JSON.parseObject(s.getSourceAsString()).toJavaObject(Sku.class)).collect(Collectors.toList());
if (ObjectUtil.isNotEmpty(esSkuList)){
List<Long> skuIdList = esSkuList.stream().map(Sku::getId).collect(Collectors.toList());
//查询数据库获取最新数据
List<Sku> skuList = skuRepository.selectByCondition(Condition.builder(Sku.class)
.andWhere(Sqls.custom().andIn(FIELD_ID,skuIdList)).orderByDesc(AuditDomain.FIELD_CREATION_DATE).build());
skuPage.setContent(this.getPageList(skuList));
}else {
skuPage.setContent(new ArrayList<>());
}
} catch (IOException e) {
e.printStackTrace();
}
return skuPage;
}
private List<GoodsSkuPageVO> getPageList(List<Sku> skuList) {
List<GoodsSkuPageVO> pageList = new ArrayList<>();
if (CollUtil.isNotEmpty(skuList)) {
// 找出所有的商品数据
Set<Long> goodsIds = skuList.stream().map(Sku::getSpuId).collect(Collectors.toSet());
List<Spu> spuList = spuRepository.selectByCondition(Condition.builder(Spu.class)
.andWhere(Sqls.custom()
.andIn(org.skyer.goods.domain.entity.Spu.ID, goodsIds, true)
.andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false))
.build());
// 找出所有素材
Set<Long> materialIds = spuList.stream().map(Spu::getMaterialId).collect(Collectors.toSet());
List<Material> materialList = materialRepository.selectByCondition(Condition.builder(Material.class)
.andWhere(Sqls.custom()
.andIn("id", materialIds, true)
.andEqualTo(org.skyer.goods.domain.entity.Spu.DELETE_FLAG, false))
.build());
//属性
List<Long> skuIdList = skuList.stream().map(Sku::getId).collect(Collectors.toList());
List<SkuAttributeValue> skuAttrValueRelationList = skuAttributeValueRepository.selectByCondition(Condition.builder(SkuAttributeValue.class)
.andWhere(Sqls.custom().andIn(SkuAttributeValue.FIELD_SKU_ID, skuIdList, true))
.build());
//组装返回数据
Map<Long,String> categoryMap = Maps.newHashMap();
skuList.forEach(o -> {
GoodsSkuPageVO skuPageVO = new GoodsSkuPageVO();
//复制id 价格等信息
BeanUtils.copyProperties(o, skuPageVO);
//找到与sku匹配的spu
Spu tempSpu = spuList.stream().filter(xx -> xx.getId().longValue() == o.getSpuId().longValue()).findFirst().orElse(null);
if (ObjectUtil.isNotNull(tempSpu)) {
//设置sku属性字段
skuPageVO.setMaterialId(tempSpu.getMaterialId());
skuPageVO.setSpuName(tempSpu.getName());
skuPageVO.setSpuType(tempSpu.getType());
skuPageVO.setCategoryCode(tempSpu.getCategoryCode());
skuPageVO.setSpuCode(tempSpu.getSpuCode());
if (ObjectUtil.isNotNull(tempSpu.getRemark())) {
skuPageVO.setGoodsRemark(tempSpu.getRemark());
}
String categoryName = categoryMap.get(tempSpu.getCategoryId());
if (StringUtils.isEmpty(categoryName)){
categoryName = categoryRepository.getCategoryNameById(tempSpu.getCategoryId());
categoryMap.put(tempSpu.getCategoryId(),categoryName);
}
skuPageVO.setCategoryName(categoryName);
//匹配素材
if (ObjectUtil.isNotNull(tempSpu.getMaterialId())) {
skuPageVO.setMaterialId(tempSpu.getMaterialId());
Material tempMaterial = materialList.stream().filter(xx -> xx.getId().longValue() == skuPageVO.getMaterialId().longValue()).findFirst().orElse(null);
if (ObjectUtil.isNotNull(tempMaterial)) {
skuPageVO.setMaterialMainImages(Arrays.asList(Optional.ofNullable(tempMaterial.getMainImage()).orElse("").split(",")));
skuPageVO.setMaterialName(tempMaterial.getMaterialName());
}
}
//查询属性值 是带入初始属性 否放入到额外属性
List<SkuAttributeValue> skuAttrValueRelationLists= skuAttrValueRelationList.stream().filter(xx -> xx.getSkuId().longValue() == o.getId().longValue()).collect(Collectors.toList());
if (CollUtil.isNotEmpty(skuAttrValueRelationLists)) {
List<SkuAttributeValue> originalAttributeList = skuAttrValueRelationLists.stream().filter(SkuAttributeValue::getIsSku).collect(Collectors.toList());
skuPageVO.setSkuAttributeList(originalAttributeList);
List<SkuAttributeValue> attachedAttributeList = skuAttrValueRelationLists.stream().filter(f -> !f.getIsSku()).collect(Collectors.toList());
skuPageVO.setOtherAttributeList(attachedAttributeList);
}
}
pageList.add(skuPageVO);
});
}
return pageList;
}
@Override
@Saga(description = "删除skuList到saga", code = "sync-del-sku-list-es")
public List<Sku> syncDelSkuListEsSage(List<Sku> skuList) {
return transactionalProducer.applyAndReturn(
StartSagaBuilder.newBuilder()
.withSagaCode("sync-del-sku-list-es").withLevel(ResourceLevel.ORGANIZATION)
.withRefType("listSku")
.withSourceId(1L),
build -> {
build.withPayloadAndSerialize(skuList)
.withRefId(skuList.hashCode() + " time:" + System.currentTimeMillis());
return skuList;
});
}
@SagaTask(description = "同步skuList到es sage task",
code = "sync-del-sku-es-list-sage-task",
sagaCode = "sync-del-sku-list-es",
concurrentLimitNum = 2,
concurrentLimitPolicy = SagaDefinition.ConcurrentLimitPolicy.NONE,
seq = 1)
@Override
public List<Sku> syncDelSkuListEsSageTask(String skuListJsonStr) throws IOException {
List<Sku> skuList = JSON.parseArray(skuListJsonStr, Sku.class);
List<String> keys = Lists.newArrayList();
skuList.forEach(item -> keys.add(String.valueOf(item.getId())));
DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SKU_INDEX);
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
queryBuilder = EsBoolQueryUtil.inStringQuery(queryBuilder, "id", keys);
request.setQuery(queryBuilder);
request.setTimeout(TimeValue.timeValueMinutes(2));
client.deleteByQuery(request, RequestOptions.DEFAULT);
return skuList;
}
@Override
public void delSkuEsAll() throws Exception {
if (isExistsIndex(ObjectConstant.EsKey.SKU_INDEX)) {
DeleteByQueryRequest request = new DeleteByQueryRequest(ObjectConstant.EsKey.SKU_INDEX);
BoolQueryBuilder queryBuilder = new BoolQueryBuilder();
request.setQuery(queryBuilder);
request.setTimeout(TimeValue.timeValueMinutes(2));
client.deleteByQuery(request, RequestOptions.DEFAULT);
}
}
@Override
public void skuStatusUp() throws IOException {
List<Sku> skuList = skuRepository.selectAll();
BulkRequest bulkRequest = new BulkRequest();
skuList.forEach(x -> {
//构造保存请求
IndexRequest indexRequest = new IndexRequest(ObjectConstant.EsKey.SKU_INDEX);
indexRequest.id(x.getId().toString());
String jsonString = JSON.toJSONString(x);
indexRequest.source(jsonString, XContentType.JSON);
bulkRequest.add(indexRequest);
});
BulkResponse bulk = client.bulk(bulkRequest, RequestOptions.DEFAULT);
}
/**
* 获取ES查询编辑器
*
* @param goodsSkuPageDTO
* @return
*/
private SearchRequest buildSearchRequest(GoodsSkuPageDTO goodsSkuPageDTO) {
BoolQueryBuilder builder = QueryBuilders.boolQuery();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())||
ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuName()) ||
ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuCode()) ||
ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuType())) {
List<Long> spuIds = this.esQuerySpuIds(goodsSkuPageDTO);
if (ObjectUtil.isEmpty(spuIds)){
builder = EsBoolQueryUtil.andTermQuery(builder, "spuId", "-1");
}else {
builder = EsBoolQueryUtil.inTermQuery(builder, "spuId", spuIds);
}
}
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSkuCode())) {
builder = EsBoolQueryUtil.andStringQuery(builder, "skuCode",goodsSkuPageDTO.getSkuCode());
}
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSkuName())) {
builder.must(QueryBuilders.matchPhraseQuery("skuName",goodsSkuPageDTO.getSkuName()));
}
if (Objects.nonNull(goodsSkuPageDTO.getSetFlag())) {
builder = EsBoolQueryUtil.andTermQuery(builder, "setFlag", goodsSkuPageDTO.getSetFlag());
}
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getStatus())) {
builder = EsBoolQueryUtil.inTermQuery(builder, "status", goodsSkuPageDTO.getStatus());
}
searchSourceBuilder.query(builder);
// 排序
searchSourceBuilder.sort("creationDate",SortOrder.DESC);
searchSourceBuilder.trackTotalHits(true);
EsBoolQueryUtil.page(searchSourceBuilder, goodsSkuPageDTO.getPage(), goodsSkuPageDTO.getSize());
return new SearchRequest(new String[]{ObjectConstant.EsKey.SKU_INDEX}, searchSourceBuilder);
}
/**
* 在es中查询复核条件的spuId
*
* @param goodsSkuPageDTO 查询条件
* @return spuIdList
*/
private List<Long> esQuerySpuIds(GoodsSkuPageDTO goodsSkuPageDTO) {
BoolQueryBuilder builder = QueryBuilders.boolQuery();
SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getCategoryIdList())) {
builder = EsBoolQueryUtil.inTermQuery(builder, "categoryId", goodsSkuPageDTO.getCategoryIdList());
}
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuName())) {
builder.must(QueryBuilders.matchPhraseQuery("name",goodsSkuPageDTO.getSpuName()));
}
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuCode())) {
builder = EsBoolQueryUtil.andStringQuery(builder, "spuCode",goodsSkuPageDTO.getSpuCode());
}
if (ObjectUtil.isNotEmpty(goodsSkuPageDTO.getSpuType())) {
builder = EsBoolQueryUtil.andStringQuery(builder, "type", goodsSkuPageDTO.getSpuType());
}
searchSourceBuilder.size(9000);
searchSourceBuilder.query(builder);
searchSourceBuilder.trackTotalHits(true);
SearchRequest searchRequest = new SearchRequest(ObjectConstant.EsKey.SPU_INDEX);
searchRequest.source(searchSourceBuilder);
searchRequest.scroll(TimeValue.timeValueMinutes(2L));
List<Long> spuIds = Lists.newArrayList();
try {
// 执行检索请求
SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
String scrollId = searchResponse.getScrollId();
SearchHits hits = searchResponse.getHits();
if (hits.getHits() != null && hits.getHits().length > 0) {
for (SearchHit hit : hits.getHits()) {
SpuEsModel spu = JSON.parseObject(hit.getSourceAsString()).toJavaObject(SpuEsModel.class);
spuIds.add(spu.getId());
}
}
while (true) {
// 5循环创建SearchScrollRequest
SearchScrollRequest scrollRequest = new SearchScrollRequest(scrollId);
//6再指定scroll的生存时间若不指定它会归零
scrollRequest.scroll(TimeValue.timeValueMinutes(2L));
//7执行查询获取结果
SearchResponse scrollResp = client.scroll(scrollRequest, RequestOptions.DEFAULT);
//8判断是否查询到了数据输出
SearchHit[] scrollHits = scrollResp.getHits().getHits();
if (scrollHits != null && scrollHits.length > 0) {
for (SearchHit hit : hits) {
SpuEsModel spu = JSON.parseObject(hit.getSourceAsString()).toJavaObject(SpuEsModel.class);
spuIds.add(spu.getId());
}
} else {
//9若无数据则退出
break;
}
}
//10创建ClearScrollRequest
ClearScrollRequest clearScrollRequest = new ClearScrollRequest();
//11指定scrollId
clearScrollRequest.addScrollId(scrollId);
//12删除scrollId
ClearScrollResponse clearScrollResponse = client.clearScroll(clearScrollRequest, RequestOptions.DEFAULT);
//13根据它返回判断删除成功没
clearScrollResponse.isSucceeded();
} catch (IOException e) {
e.printStackTrace();
}
return spuIds;
}
/**
* 判断一个索引是否存在
* @param indexName
* @return
*/
private boolean isExistsIndex(String indexName) throws Exception{
GetIndexRequest request = new GetIndexRequest(indexName);
return client.indices().exists(request, RequestOptions.DEFAULT);
}
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SkuPackageService;
import org.springframework.stereotype.Service;
/**
* 应用服务默认实现
*
* @author zhanglongbing@ebc.com 2022-03-03 10:45:30
*/
@Service
public class SkuPackageServiceImpl implements SkuPackageService {
}

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SpuAttributeService;
import org.springframework.stereotype.Service;
/**
* 属性表应用服务默认实现
*
* @author linzhuanghuang@ebc.com 2021-12-28 16:40:03
*/
@Service
public class SpuAttributeServiceImpl implements SpuAttributeService {
}

View file

@ -0,0 +1,13 @@
package org.skyer.goods.app.service.impl;
import org.skyer.goods.app.service.SpuAttributeValueService;
import org.springframework.stereotype.Service;
/**
* 属性值表应用服务默认实现
*
* @author linzhuanghuang@ebc.com 2021-12-28 16:40:03
*/
@Service
public class SpuAttributeValueServiceImpl implements SpuAttributeValueService {
}

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