diff --git a/src/main/java/com/gxwebsoft/ai/client/OllamaClient.java b/src/main/java/com/gxwebsoft/ai/client/OllamaClient.java deleted file mode 100644 index 6e08d1b..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/OllamaClient.java +++ /dev/null @@ -1,194 +0,0 @@ -package com.gxwebsoft.ai.client; - -import com.fasterxml.jackson.databind.ObjectMapper; -import com.gxwebsoft.ai.client.dto.*; -import com.gxwebsoft.ai.config.AiOllamaProperties; -import com.gxwebsoft.common.core.exception.BusinessException; -import com.gxwebsoft.common.core.utils.JSONUtil; -import okhttp3.*; -import okio.BufferedSource; -import org.springframework.stereotype.Component; - -import javax.annotation.Resource; -import java.io.IOException; -import java.time.Duration; -import java.util.Objects; -import java.util.function.Consumer; - -/** - * 轻量 Ollama HTTP Client(兼容 /api/chat、/api/embeddings、/api/tags)。 - */ -@Component -public class OllamaClient { - @Resource - private AiOllamaProperties props; - - @Resource - private ObjectMapper objectMapper; - - private volatile OkHttpClient http; - - private OkHttpClient http() { - OkHttpClient c = http; - if (c != null) { - return c; - } - synchronized (this) { - if (http == null) { - http = new OkHttpClient.Builder() - .connectTimeout(Duration.ofMillis(props.getConnectTimeoutMs())) - .readTimeout(Duration.ofMillis(props.getReadTimeoutMs())) - .writeTimeout(Duration.ofMillis(props.getWriteTimeoutMs())) - .build(); - } - return http; - } - } - - public OllamaTagsResponse tags() { - return getJson("/api/tags", OllamaTagsResponse.class); - } - - public OllamaChatResponse chat(OllamaChatRequest req) { - if (req.getStream() == null) { - req.setStream(false); - } - return postJson("/api/chat", req, OllamaChatResponse.class); - } - - /** - * 流式对话:Ollama 会返回按行分隔的 JSON。 - */ - public void chatStream(OllamaChatRequest req, Consumer onEvent) { - Objects.requireNonNull(onEvent, "onEvent"); - if (req.getStream() == null) { - req.setStream(true); - } - - Request request = buildPost(baseUrl(), "/api/chat", JSONUtil.toJSONString(req)); - try (Response resp = http().newCall(request).execute()) { - if (!resp.isSuccessful()) { - throw new BusinessException("Ollama chat stream failed: HTTP " + resp.code()); - } - ResponseBody body = resp.body(); - if (body == null) { - throw new BusinessException("Ollama chat stream failed: empty body"); - } - - BufferedSource source = body.source(); - String line; - while ((line = source.readUtf8Line()) != null) { - line = line.trim(); - if (line.isEmpty()) { - continue; - } - OllamaChatResponse event = objectMapper.readValue(line, OllamaChatResponse.class); - onEvent.accept(event); - if (Boolean.TRUE.equals(event.getDone())) { - break; - } - } - } catch (IOException e) { - throw new BusinessException("Ollama chat stream IO error: " + e.getMessage()); - } - } - - public OllamaEmbeddingResponse embedding(String prompt) { - OllamaEmbeddingRequest req = new OllamaEmbeddingRequest(); - req.setModel(props.getEmbedModel()); - req.setPrompt(prompt); - return postJson("/api/embeddings", req, OllamaEmbeddingResponse.class); - } - - private String baseUrl() { - if (props.getBaseUrl() == null || props.getBaseUrl().trim().isEmpty()) { - throw new BusinessException("ai.ollama.base-url 未配置"); - } - return props.getBaseUrl().trim(); - } - - private String fallbackUrl() { - if (props.getFallbackUrl() == null || props.getFallbackUrl().trim().isEmpty()) { - return null; - } - return props.getFallbackUrl().trim(); - } - - private T getJson(String path, Class clazz) { - try { - return getJsonOnce(baseUrl(), path, clazz); - } catch (Exception e) { - String fb = fallbackUrl(); - if (fb == null) { - throw e; - } - return getJsonOnce(fb, path, clazz); - } - } - - private T getJsonOnce(String base, String path, Class clazz) { - Request req = new Request.Builder() - .url(join(base, path)) - .get() - .build(); - try (Response resp = http().newCall(req).execute()) { - if (!resp.isSuccessful()) { - throw new BusinessException("Ollama GET failed: HTTP " + resp.code()); - } - ResponseBody body = resp.body(); - if (body == null) { - throw new BusinessException("Ollama GET failed: empty body"); - } - return objectMapper.readValue(body.string(), clazz); - } catch (IOException e) { - throw new BusinessException("Ollama GET IO error: " + e.getMessage()); - } - } - - private T postJson(String path, Object payload, Class clazz) { - String json = JSONUtil.toJSONString(payload); - try { - return postJsonOnce(baseUrl(), path, json, clazz); - } catch (Exception e) { - String fb = fallbackUrl(); - if (fb == null) { - throw e; - } - return postJsonOnce(fb, path, json, clazz); - } - } - - private T postJsonOnce(String base, String path, String json, Class clazz) { - Request req = buildPost(base, path, json); - try (Response resp = http().newCall(req).execute()) { - if (!resp.isSuccessful()) { - throw new BusinessException("Ollama POST failed: HTTP " + resp.code()); - } - ResponseBody body = resp.body(); - if (body == null) { - throw new BusinessException("Ollama POST failed: empty body"); - } - return objectMapper.readValue(body.string(), clazz); - } catch (IOException e) { - throw new BusinessException("Ollama POST IO error: " + e.getMessage()); - } - } - - private Request buildPost(String base, String path, String json) { - RequestBody body = RequestBody.create(json, MediaType.parse("application/json; charset=utf-8")); - return new Request.Builder() - .url(join(base, path)) - .post(body) - .build(); - } - - private static String join(String base, String path) { - String b = base; - if (b.endsWith("/")) { - b = b.substring(0, b.length() - 1); - } - String p = path.startsWith("/") ? path : ("/" + path); - return b + p; - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaChatRequest.java b/src/main/java/com/gxwebsoft/ai/client/dto/OllamaChatRequest.java deleted file mode 100644 index 938894a..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaChatRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.gxwebsoft.ai.client.dto; - -import lombok.Data; - -import java.util.List; -import java.util.Map; - -@Data -public class OllamaChatRequest { - private String model; - private List messages; - private Boolean stream; - - /** - * Ollama options,例如:temperature、top_k、top_p、num_predict... - */ - private Map options; -} - diff --git a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaChatResponse.java b/src/main/java/com/gxwebsoft/ai/client/dto/OllamaChatResponse.java deleted file mode 100644 index ec9291b..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaChatResponse.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.gxwebsoft.ai.client.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import com.fasterxml.jackson.annotation.JsonProperty; -import lombok.Data; - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class OllamaChatResponse { - private String model; - - @JsonProperty("created_at") - private String createdAt; - - private OllamaMessage message; - - private Boolean done; - - @JsonProperty("total_duration") - private Long totalDuration; - - @JsonProperty("prompt_eval_count") - private Integer promptEvalCount; - - @JsonProperty("eval_count") - private Integer evalCount; -} - diff --git a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaEmbeddingRequest.java b/src/main/java/com/gxwebsoft/ai/client/dto/OllamaEmbeddingRequest.java deleted file mode 100644 index 5629eba..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaEmbeddingRequest.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gxwebsoft.ai.client.dto; - -import lombok.Data; - -@Data -public class OllamaEmbeddingRequest { - private String model; - - /** - * Ollama embeddings 目前常用字段为 prompt。 - */ - private String prompt; -} - diff --git a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaEmbeddingResponse.java b/src/main/java/com/gxwebsoft/ai/client/dto/OllamaEmbeddingResponse.java deleted file mode 100644 index 233e863..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaEmbeddingResponse.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gxwebsoft.ai.client.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -import java.util.List; - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class OllamaEmbeddingResponse { - private List embedding; -} - diff --git a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaMessage.java b/src/main/java/com/gxwebsoft/ai/client/dto/OllamaMessage.java deleted file mode 100644 index 6606c69..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaMessage.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gxwebsoft.ai.client.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class OllamaMessage { - private String role; - private String content; -} - diff --git a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaTagsResponse.java b/src/main/java/com/gxwebsoft/ai/client/dto/OllamaTagsResponse.java deleted file mode 100644 index c1fe7c0..0000000 --- a/src/main/java/com/gxwebsoft/ai/client/dto/OllamaTagsResponse.java +++ /dev/null @@ -1,22 +0,0 @@ -package com.gxwebsoft.ai.client.dto; - -import com.fasterxml.jackson.annotation.JsonIgnoreProperties; -import lombok.Data; - -import java.util.List; - -@Data -@JsonIgnoreProperties(ignoreUnknown = true) -public class OllamaTagsResponse { - private List models; - - @Data - @JsonIgnoreProperties(ignoreUnknown = true) - public static class Model { - private String name; - private Long size; - private String digest; - private String modified_at; - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/config/AiOllamaProperties.java b/src/main/java/com/gxwebsoft/ai/config/AiOllamaProperties.java deleted file mode 100644 index e0c1732..0000000 --- a/src/main/java/com/gxwebsoft/ai/config/AiOllamaProperties.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.gxwebsoft.ai.config; - -import lombok.Data; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.stereotype.Component; - -/** - * Ollama API 配置。 - * - * 说明:本项目通过自建 Ollama 网关提供服务,因此这里用 baseUrl + fallbackUrl。 - */ -@Data -@Component -@ConfigurationProperties(prefix = "ai.ollama") -public class AiOllamaProperties { - /** - * 主地址,例如:https://ai-api.websoft.top - */ - private String baseUrl; - - /** - * 备用地址,例如:http://47.119.165.234:11434 - */ - private String fallbackUrl; - - /** - * 对话模型,例如:qwen3.5:cloud - */ - private String chatModel; - - /** - * 向量模型,例如:qwen3-embedding:4b - */ - private String embedModel; - - /** - * HTTP 超时(毫秒)。 - */ - private long connectTimeoutMs = 10_000; - private long readTimeoutMs = 300_000; - private long writeTimeoutMs = 60_000; - - /** - * 并发上限(用于 embedding/入库等批处理场景)。 - */ - private int maxConcurrency = 4; - - /** - * RAG:检索候选 chunk 最大数量(避免一次性拉取过多数据导致内存/耗时过高)。 - */ - private int ragMaxCandidates = 2000; - - /** - * RAG:检索返回 topK。 - */ - private int ragTopK = 5; - - /** - * RAG:单个 chunk 最大字符数(用于入库切分)。 - */ - private int ragChunkSize = 800; - - /** - * RAG:chunk 重叠字符数(用于减少语义断裂)。 - */ - private int ragChunkOverlap = 120; -} - diff --git a/src/main/java/com/gxwebsoft/ai/controller/AiAnalyticsController.java b/src/main/java/com/gxwebsoft/ai/controller/AiAnalyticsController.java deleted file mode 100644 index fe72b49..0000000 --- a/src/main/java/com/gxwebsoft/ai/controller/AiAnalyticsController.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.ai.controller; - -import com.gxwebsoft.ai.dto.*; -import com.gxwebsoft.ai.service.AiAnalyticsService; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; - -@Tag(name = "AI - 订单数据分析") -@RestController -@RequestMapping("/api/ai/analytics") -public class AiAnalyticsController extends BaseController { - @Resource - private AiAnalyticsService analyticsService; - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "查询商城订单按天指标(当前租户)") - @PostMapping("/query") - public ApiResult query(@RequestBody AiShopMetricsQueryRequest request) { - Integer tenantId = getTenantId(); - return success(analyticsService.queryShopMetrics(tenantId, request)); - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "AI 解析并输出订单分析结论(当前租户)") - @PostMapping("/ask") - public ApiResult ask(@RequestBody AiAnalyticsAskRequest request) { - Integer tenantId = getTenantId(); - return success(analyticsService.askShopAnalytics(tenantId, request)); - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/controller/AiChatController.java b/src/main/java/com/gxwebsoft/ai/controller/AiChatController.java deleted file mode 100644 index 45d5564..0000000 --- a/src/main/java/com/gxwebsoft/ai/controller/AiChatController.java +++ /dev/null @@ -1,95 +0,0 @@ -package com.gxwebsoft.ai.controller; - -import com.gxwebsoft.ai.client.OllamaClient; -import com.gxwebsoft.ai.client.dto.OllamaChatResponse; -import com.gxwebsoft.ai.client.dto.OllamaTagsResponse; -import com.gxwebsoft.ai.dto.AiChatRequest; -import com.gxwebsoft.ai.dto.AiChatResult; -import com.gxwebsoft.ai.dto.AiMessage; -import com.gxwebsoft.ai.service.AiChatService; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.servlet.mvc.method.annotation.SseEmitter; - -import javax.annotation.Resource; -import java.util.Collections; -import java.util.LinkedHashMap; -import java.util.Map; -import java.util.concurrent.CompletableFuture; - -@Tag(name = "AI - 对话") -@RestController -@RequestMapping("/api/ai") -public class AiChatController extends BaseController { - @Resource - private OllamaClient ollamaClient; - - @Resource - private AiChatService aiChatService; - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "获取 Ollama 模型列表") - @GetMapping("/models") - public ApiResult models() { - return success(ollamaClient.tags()); - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "非流式对话") - @PostMapping("/chat") - public ApiResult chat(@RequestBody AiChatRequest request) { - return success(aiChatService.chat(request)); - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "流式对话(SSE)") - @PostMapping("/chat/stream") - public SseEmitter chatStream(@RequestBody AiChatRequest request) { - // 10 分钟超时(可根据前端需要调整) - SseEmitter emitter = new SseEmitter(10 * 60 * 1000L); - - CompletableFuture.runAsync(() -> { - try { - aiChatService.chatStream(request, - delta -> { - try { - emitter.send(SseEmitter.event().name("delta").data(delta)); - } catch (Exception e) { - // 客户端断开会触发 send 异常,这里直接结束即可 - emitter.complete(); - } - }, - (OllamaChatResponse done) -> { - try { - Map meta = new LinkedHashMap<>(); - meta.put("model", done.getModel()); - meta.put("prompt_eval_count", done.getPromptEvalCount()); - meta.put("eval_count", done.getEvalCount()); - meta.put("total_duration", done.getTotalDuration()); - emitter.send(SseEmitter.event().name("done").data(meta)); - } catch (Exception ignored) { - } finally { - emitter.complete(); - } - }); - } catch (Exception e) { - emitter.completeWithError(e); - } - }); - - return emitter; - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "流式对话(SSE, GET 版本,便于 EventSource)") - @GetMapping("/chat/stream") - public SseEmitter chatStreamGet(@RequestParam("prompt") String prompt) { - AiChatRequest req = new AiChatRequest(); - req.setMessages(Collections.singletonList(new AiMessage("user", prompt))); - return chatStream(req); - } -} diff --git a/src/main/java/com/gxwebsoft/ai/controller/AiKbController.java b/src/main/java/com/gxwebsoft/ai/controller/AiKbController.java deleted file mode 100644 index afd2078..0000000 --- a/src/main/java/com/gxwebsoft/ai/controller/AiKbController.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.gxwebsoft.ai.controller; - -import com.gxwebsoft.ai.dto.*; -import com.gxwebsoft.ai.service.AiKbRagService; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; - -@Tag(name = "AI - 知识库(RAG)") -@RestController -@RequestMapping("/api/ai/kb") -public class AiKbController extends BaseController { - @Resource - private AiKbRagService ragService; - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "上传文档入库(txt/md/html 优先)") - @PostMapping("/upload") - public ApiResult upload(@RequestParam("file") MultipartFile file) { - Integer tenantId = getTenantId(); - return success(ragService.ingestUpload(tenantId, file)); - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "同步 CMS 文章到知识库(当前租户)") - @PostMapping("/sync/cms") - public ApiResult syncCms() { - Integer tenantId = getTenantId(); - return success(ragService.syncCms(tenantId)); - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "仅检索(返回 topK 命中)") - @PostMapping("/query") - public ApiResult query(@RequestBody AiKbQueryRequest request) { - Integer tenantId = getTenantId(); - return success(ragService.query(tenantId, request)); - } - - @PreAuthorize("isAuthenticated()") - @Operation(summary = "知识库问答(RAG 生成 + 返回检索结果)") - @PostMapping("/ask") - public ApiResult ask(@RequestBody AiKbAskRequest request) { - Integer tenantId = getTenantId(); - return success(ragService.ask(tenantId, request)); - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiAnalyticsAskRequest.java b/src/main/java/com/gxwebsoft/ai/dto/AiAnalyticsAskRequest.java deleted file mode 100644 index 085472a..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiAnalyticsAskRequest.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiAnalyticsAskRequest", description = "AI 数据分析提问") -public class AiAnalyticsAskRequest { - private String question; - private String startDate; - private String endDate; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiAnalyticsAskResult.java b/src/main/java/com/gxwebsoft/ai/dto/AiAnalyticsAskResult.java deleted file mode 100644 index f11b61d..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiAnalyticsAskResult.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiAnalyticsAskResult", description = "AI 数据分析结果") -public class AiAnalyticsAskResult { - private String analysis; - private AiShopMetricsQueryResult data; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiChatRequest.java b/src/main/java/com/gxwebsoft/ai/dto/AiChatRequest.java deleted file mode 100644 index eaa90ff..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiChatRequest.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Data -@Schema(name = "AiChatRequest", description = "AI 对话请求") -public class AiChatRequest { - @Schema(description = "可选:直接传一句话。若 messages 为空则使用该字段构造 user message") - private String prompt; - - @Schema(description = "可选:OpenAI 风格 messages(role: system/user/assistant)") - private List messages; - - @Schema(description = "可选:覆盖默认模型") - private String model; - - @Schema(description = "是否流式输出(/chat/stream 端点通常忽略此字段)") - private Boolean stream; - - @Schema(description = "temperature") - private Double temperature; - - @Schema(description = "top_k") - private Integer topK; - - @Schema(description = "top_p") - private Double topP; - - @Schema(description = "num_predict(类似 max_tokens)") - private Integer numPredict; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiChatResult.java b/src/main/java/com/gxwebsoft/ai/dto/AiChatResult.java deleted file mode 100644 index c38dd41..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiChatResult.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -@Schema(name = "AiChatResult", description = "AI 对话结果") -public class AiChatResult { - private String content; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiKbAskRequest.java b/src/main/java/com/gxwebsoft/ai/dto/AiKbAskRequest.java deleted file mode 100644 index 199134c..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiKbAskRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiKbAskRequest", description = "知识库问答请求") -public class AiKbAskRequest { - private String question; - private Integer topK; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiKbAskResult.java b/src/main/java/com/gxwebsoft/ai/dto/AiKbAskResult.java deleted file mode 100644 index a23a480..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiKbAskResult.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiKbAskResult", description = "知识库问答结果") -public class AiKbAskResult { - private String answer; - private AiKbQueryResult retrieval; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiKbHit.java b/src/main/java/com/gxwebsoft/ai/dto/AiKbHit.java deleted file mode 100644 index e204685..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiKbHit.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiKbHit", description = "知识库命中") -public class AiKbHit { - private String chunkId; - private Integer documentId; - private String title; - private Double score; - private String content; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiKbIngestResult.java b/src/main/java/com/gxwebsoft/ai/dto/AiKbIngestResult.java deleted file mode 100644 index c14778d..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiKbIngestResult.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiKbIngestResult", description = "知识库入库结果") -public class AiKbIngestResult { - private Integer documentId; - private String title; - private Integer chunks; - private Integer updatedDocuments; - private Integer skippedDocuments; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiKbQueryRequest.java b/src/main/java/com/gxwebsoft/ai/dto/AiKbQueryRequest.java deleted file mode 100644 index c4ad3c6..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiKbQueryRequest.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiKbQueryRequest", description = "知识库检索请求") -public class AiKbQueryRequest { - private String query; - private Integer topK; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiKbQueryResult.java b/src/main/java/com/gxwebsoft/ai/dto/AiKbQueryResult.java deleted file mode 100644 index 33b082e..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiKbQueryResult.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Data -@Schema(name = "AiKbQueryResult", description = "知识库检索结果") -public class AiKbQueryResult { - private List hits; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiMessage.java b/src/main/java/com/gxwebsoft/ai/dto/AiMessage.java deleted file mode 100644 index 1e9ba61..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiMessage.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -@Data -@NoArgsConstructor -@AllArgsConstructor -public class AiMessage { - private String role; - private String content; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsQueryRequest.java b/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsQueryRequest.java deleted file mode 100644 index ba31384..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsQueryRequest.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -@Data -@Schema(name = "AiShopMetricsQueryRequest", description = "商城订单指标查询请求") -public class AiShopMetricsQueryRequest { - @Schema(description = "开始日期(YYYY-MM-DD)") - private String startDate; - - @Schema(description = "结束日期(YYYY-MM-DD),包含该天") - private String endDate; - - @Schema(description = "是否按天分组,默认 true") - private Boolean groupByDay; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsQueryResult.java b/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsQueryResult.java deleted file mode 100644 index f4086cc..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsQueryResult.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.util.List; - -@Data -@Schema(name = "AiShopMetricsQueryResult", description = "商城订单指标查询结果") -public class AiShopMetricsQueryResult { - private Integer tenantId; - private String startDate; - private String endDate; - private List rows; -} - diff --git a/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsRow.java b/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsRow.java deleted file mode 100644 index 747ecdf..0000000 --- a/src/main/java/com/gxwebsoft/ai/dto/AiShopMetricsRow.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.gxwebsoft.ai.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.math.BigDecimal; - -@Data -@Schema(name = "AiShopMetricsRow", description = "商城订单指标行(按 tenant/day)") -public class AiShopMetricsRow { - private Integer tenantId; - private String day; - - private Long orderCnt; - private Long paidOrderCnt; - private BigDecimal gmv; - private BigDecimal refundAmt; - private Long payUserCnt; - - private BigDecimal aov; - private BigDecimal payRate; -} - diff --git a/src/main/java/com/gxwebsoft/ai/entity/AiKbChunk.java b/src/main/java/com/gxwebsoft/ai/entity/AiKbChunk.java deleted file mode 100644 index 47ffd0c..0000000 --- a/src/main/java/com/gxwebsoft/ai/entity/AiKbChunk.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.gxwebsoft.ai.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 知识库分段(chunk)。 - */ -@Data -@Schema(name = "AiKbChunk", description = "AI 知识库分段") -public class AiKbChunk implements Serializable { - private static final long serialVersionUID = 1L; - - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - private Integer documentId; - - /** - * 外部引用用的唯一 ID(便于在答案里引用)。 - */ - private String chunkId; - - private Integer chunkIndex; - - private String title; - - private String content; - - private String contentHash; - - /** - * embedding JSON(数组),存成文本便于快速落库。 - */ - private String embedding; - - /** - * embedding 的 L2 范数,用于余弦相似度。 - */ - private Double embeddingNorm; - - @TableLogic - private Integer deleted; - - private Integer tenantId; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; -} - diff --git a/src/main/java/com/gxwebsoft/ai/entity/AiKbDocument.java b/src/main/java/com/gxwebsoft/ai/entity/AiKbDocument.java deleted file mode 100644 index dac0c3b..0000000 --- a/src/main/java/com/gxwebsoft/ai/entity/AiKbDocument.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gxwebsoft.ai.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 知识库文档(来源:上传、CMS 等)。 - */ -@Data -@Schema(name = "AiKbDocument", description = "AI 知识库文档") -public class AiKbDocument implements Serializable { - private static final long serialVersionUID = 1L; - - @TableId(value = "document_id", type = IdType.AUTO) - private Integer documentId; - - private String title; - - /** - * upload / cms - */ - private String sourceType; - - /** - * 例如 CMS article_id - */ - private Integer sourceId; - - /** - * 例如文件名、路径等 - */ - private String sourceRef; - - /** - * 文档文本内容哈希(用于增量同步/去重)。 - */ - private String contentHash; - - private Integer status; - - @TableLogic - private Integer deleted; - - private Integer tenantId; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; -} - diff --git a/src/main/java/com/gxwebsoft/ai/mapper/AiKbChunkMapper.java b/src/main/java/com/gxwebsoft/ai/mapper/AiKbChunkMapper.java deleted file mode 100644 index 1628de5..0000000 --- a/src/main/java/com/gxwebsoft/ai/mapper/AiKbChunkMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gxwebsoft.ai.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gxwebsoft.ai.entity.AiKbChunk; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface AiKbChunkMapper extends BaseMapper { -} - diff --git a/src/main/java/com/gxwebsoft/ai/mapper/AiKbDocumentMapper.java b/src/main/java/com/gxwebsoft/ai/mapper/AiKbDocumentMapper.java deleted file mode 100644 index 8dc61c6..0000000 --- a/src/main/java/com/gxwebsoft/ai/mapper/AiKbDocumentMapper.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.gxwebsoft.ai.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gxwebsoft.ai.entity.AiKbDocument; -import org.apache.ibatis.annotations.Mapper; - -@Mapper -public interface AiKbDocumentMapper extends BaseMapper { -} - diff --git a/src/main/java/com/gxwebsoft/ai/mapper/AiShopAnalyticsMapper.java b/src/main/java/com/gxwebsoft/ai/mapper/AiShopAnalyticsMapper.java deleted file mode 100644 index 27221ac..0000000 --- a/src/main/java/com/gxwebsoft/ai/mapper/AiShopAnalyticsMapper.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.gxwebsoft.ai.mapper; - -import com.gxwebsoft.ai.dto.AiShopMetricsRow; -import org.apache.ibatis.annotations.Mapper; -import org.apache.ibatis.annotations.Param; - -import java.time.LocalDateTime; -import java.util.List; - -@Mapper -public interface AiShopAnalyticsMapper { - List queryMetrics(@Param("tenantId") Integer tenantId, - @Param("start") LocalDateTime start, - @Param("end") LocalDateTime end); -} - diff --git a/src/main/java/com/gxwebsoft/ai/mapper/xml/AiShopAnalyticsMapper.xml b/src/main/java/com/gxwebsoft/ai/mapper/xml/AiShopAnalyticsMapper.xml deleted file mode 100644 index 0e745b6..0000000 --- a/src/main/java/com/gxwebsoft/ai/mapper/xml/AiShopAnalyticsMapper.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/ai/prompt/AiPrompts.java b/src/main/java/com/gxwebsoft/ai/prompt/AiPrompts.java deleted file mode 100644 index 106ae56..0000000 --- a/src/main/java/com/gxwebsoft/ai/prompt/AiPrompts.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gxwebsoft.ai.prompt; - -/** - * 统一提示词模板(尽量简短、可控)。 - */ -public class AiPrompts { - private AiPrompts() { - } - - public static final String SYSTEM_SUPPORT = - "你是 WebSoft 客服AI。规则:\n" + - "- 只使用给定的“上下文资料”回答,禁止编造。\n" + - "- 如果资料不足,直接说“资料不足”,并列出需要补充的信息。\n" + - "- 答案末尾必须给引用,格式:[source:chunk_id]。\n" + - "- 输出中文,简洁可执行。\n"; - - public static final String SYSTEM_ANALYTICS = - "你是商城订单数据分析助手。你将基于提供的按天指标数据给出结论。\n" + - "要求:\n" + - "- 只基于数据陈述,不要编造不存在的数字。\n" + - "- 输出包含:结论、关键指标变化、异常点、建议的下一步核查。\n" + - "- 输出中文,简洁。\n"; -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/AiAnalyticsService.java b/src/main/java/com/gxwebsoft/ai/service/AiAnalyticsService.java deleted file mode 100644 index 0f37aec..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/AiAnalyticsService.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.gxwebsoft.ai.service; - -import cn.hutool.core.util.StrUtil; -import com.gxwebsoft.ai.dto.*; -import com.gxwebsoft.ai.prompt.AiPrompts; -import com.gxwebsoft.common.core.exception.BusinessException; -import com.gxwebsoft.common.core.utils.JSONUtil; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.time.LocalDate; -import java.time.format.DateTimeParseException; -import java.util.Arrays; - -@Service -public class AiAnalyticsService { - @Resource - private AiShopAnalyticsService shopAnalyticsService; - @Resource - private AiChatService aiChatService; - - public AiShopMetricsQueryResult queryShopMetrics(Integer tenantId, AiShopMetricsQueryRequest request) { - if (tenantId == null) { - throw new BusinessException("tenantId 不能为空"); - } - if (request == null) { - throw new BusinessException("请求不能为空"); - } - LocalDate start = parseDate(request.getStartDate(), "startDate"); - LocalDate end = parseDate(request.getEndDate(), "endDate"); - if (end.isBefore(start)) { - throw new BusinessException("endDate 不能早于 startDate"); - } - - AiShopMetricsQueryResult r = new AiShopMetricsQueryResult(); - r.setTenantId(tenantId); - r.setStartDate(start.toString()); - r.setEndDate(end.toString()); - r.setRows(shopAnalyticsService.queryTenantDaily(tenantId, start, end)); - return r; - } - - public AiAnalyticsAskResult askShopAnalytics(Integer tenantId, AiAnalyticsAskRequest request) { - if (request == null || StrUtil.isBlank(request.getQuestion())) { - throw new BusinessException("question 不能为空"); - } - AiShopMetricsQueryRequest q = new AiShopMetricsQueryRequest(); - q.setStartDate(request.getStartDate()); - q.setEndDate(request.getEndDate()); - q.setGroupByDay(true); - AiShopMetricsQueryResult data = queryShopMetrics(tenantId, q); - - String userPrompt = - "用户问题:\n" + request.getQuestion() + "\n\n" + - "数据(JSON,字段含义:order_cnt=订单数,paid_order_cnt=已支付订单数,gmv=已支付金额,refund_amt=退款金额,pay_user_cnt=支付用户数,aov=客单价,pay_rate=支付率):\n" + - JSONUtil.toJSONString(data, true); - - AiChatRequest chat = new AiChatRequest(); - chat.setMessages(Arrays.asList( - new AiMessage("system", AiPrompts.SYSTEM_ANALYTICS), - new AiMessage("user", userPrompt) - )); - - AiChatResult resp = aiChatService.chat(chat); - AiAnalyticsAskResult r = new AiAnalyticsAskResult(); - r.setAnalysis(resp.getContent()); - r.setData(data); - return r; - } - - private static LocalDate parseDate(String s, String field) { - if (StrUtil.isBlank(s)) { - throw new BusinessException(field + " 不能为空,格式 YYYY-MM-DD"); - } - try { - return LocalDate.parse(s.trim()); - } catch (DateTimeParseException e) { - throw new BusinessException(field + " 格式错误,需 YYYY-MM-DD"); - } - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/AiChatService.java b/src/main/java/com/gxwebsoft/ai/service/AiChatService.java deleted file mode 100644 index c457607..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/AiChatService.java +++ /dev/null @@ -1,94 +0,0 @@ -package com.gxwebsoft.ai.service; - -import cn.hutool.core.util.StrUtil; -import com.gxwebsoft.ai.client.OllamaClient; -import com.gxwebsoft.ai.client.dto.OllamaChatRequest; -import com.gxwebsoft.ai.client.dto.OllamaChatResponse; -import com.gxwebsoft.ai.client.dto.OllamaMessage; -import com.gxwebsoft.ai.config.AiOllamaProperties; -import com.gxwebsoft.ai.dto.AiChatRequest; -import com.gxwebsoft.ai.dto.AiChatResult; -import com.gxwebsoft.ai.dto.AiMessage; -import com.gxwebsoft.common.core.exception.BusinessException; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.*; -import java.util.function.Consumer; - -@Service -public class AiChatService { - @Resource - private AiOllamaProperties props; - - @Resource - private OllamaClient ollamaClient; - - public AiChatResult chat(AiChatRequest request) { - OllamaChatRequest req = buildChatRequest(request, false); - OllamaChatResponse resp = ollamaClient.chat(req); - String content = resp != null && resp.getMessage() != null ? resp.getMessage().getContent() : null; - return new AiChatResult(content == null ? "" : content); - } - - public void chatStream(AiChatRequest request, Consumer onDelta, Consumer onFinal) { - Objects.requireNonNull(onDelta, "onDelta"); - OllamaChatRequest req = buildChatRequest(request, true); - ollamaClient.chatStream(req, event -> { - String delta = event != null && event.getMessage() != null ? event.getMessage().getContent() : null; - if (StrUtil.isNotBlank(delta)) { - onDelta.accept(delta); - } - if (Boolean.TRUE.equals(event.getDone()) && onFinal != null) { - onFinal.accept(event); - } - }); - } - - private OllamaChatRequest buildChatRequest(AiChatRequest request, boolean stream) { - if (request == null) { - throw new BusinessException("请求不能为空"); - } - - List messages = request.getMessages(); - if ((messages == null || messages.isEmpty()) && StrUtil.isBlank(request.getPrompt())) { - throw new BusinessException("prompt 或 messages 不能为空"); - } - if (messages == null || messages.isEmpty()) { - messages = Collections.singletonList(new AiMessage("user", request.getPrompt())); - } - - List ollamaMessages = new ArrayList<>(); - for (AiMessage m : messages) { - if (m == null || StrUtil.isBlank(m.getRole()) || m.getContent() == null) { - continue; - } - ollamaMessages.add(new OllamaMessage(m.getRole(), m.getContent())); - } - if (ollamaMessages.isEmpty()) { - throw new BusinessException("messages 为空或无有效内容"); - } - - Map options = new HashMap<>(); - if (request.getTemperature() != null) { - options.put("temperature", request.getTemperature()); - } - if (request.getTopK() != null) { - options.put("top_k", request.getTopK()); - } - if (request.getTopP() != null) { - options.put("top_p", request.getTopP()); - } - if (request.getNumPredict() != null) { - options.put("num_predict", request.getNumPredict()); - } - - OllamaChatRequest req = new OllamaChatRequest(); - req.setModel(StrUtil.blankToDefault(request.getModel(), props.getChatModel())); - req.setMessages(ollamaMessages); - req.setStream(stream); - req.setOptions(options.isEmpty() ? null : options); - return req; - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/AiKbChunkService.java b/src/main/java/com/gxwebsoft/ai/service/AiKbChunkService.java deleted file mode 100644 index 0bcc717..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/AiKbChunkService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gxwebsoft.ai.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.ai.entity.AiKbChunk; - -public interface AiKbChunkService extends IService { -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/AiKbDocumentService.java b/src/main/java/com/gxwebsoft/ai/service/AiKbDocumentService.java deleted file mode 100644 index 601f778..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/AiKbDocumentService.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.gxwebsoft.ai.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.ai.entity.AiKbDocument; - -public interface AiKbDocumentService extends IService { -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/AiKbRagService.java b/src/main/java/com/gxwebsoft/ai/service/AiKbRagService.java deleted file mode 100644 index 04c6c1f..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/AiKbRagService.java +++ /dev/null @@ -1,426 +0,0 @@ -package com.gxwebsoft.ai.service; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.gxwebsoft.ai.client.OllamaClient; -import com.gxwebsoft.ai.client.dto.OllamaEmbeddingResponse; -import com.gxwebsoft.ai.config.AiOllamaProperties; -import com.gxwebsoft.ai.dto.*; -import com.gxwebsoft.ai.entity.AiKbChunk; -import com.gxwebsoft.ai.entity.AiKbDocument; -import com.gxwebsoft.ai.prompt.AiPrompts; -import com.gxwebsoft.ai.util.AiTextUtil; -import com.gxwebsoft.cms.entity.CmsArticle; -import com.gxwebsoft.cms.entity.CmsArticleContent; -import com.gxwebsoft.cms.service.CmsArticleContentService; -import com.gxwebsoft.cms.service.CmsArticleService; -import com.gxwebsoft.common.core.exception.BusinessException; -import com.gxwebsoft.common.core.utils.JSONUtil; -import com.fasterxml.jackson.databind.ObjectMapper; -import org.apache.tika.Tika; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import javax.annotation.Resource; -import java.nio.charset.StandardCharsets; -import java.time.LocalDateTime; -import java.util.*; -import java.util.concurrent.*; -import java.util.stream.Collectors; - -@Service -public class AiKbRagService { - @Resource - private AiOllamaProperties props; - @Resource - private OllamaClient ollamaClient; - @Resource - private AiKbDocumentService documentService; - @Resource - private AiKbChunkService chunkService; - @Resource - private CmsArticleService cmsArticleService; - @Resource - private CmsArticleContentService cmsArticleContentService; - @Resource - private AiChatService aiChatService; - @Resource - private ObjectMapper objectMapper; - - private final Tika tika = new Tika(); - private volatile ExecutorService embedPool; - - private ExecutorService pool() { - ExecutorService p = embedPool; - if (p != null) { - return p; - } - synchronized (this) { - if (embedPool == null) { - embedPool = Executors.newFixedThreadPool(Math.max(1, props.getMaxConcurrency())); - } - return embedPool; - } - } - - public AiKbIngestResult ingestUpload(Integer tenantId, MultipartFile file) { - if (tenantId == null) { - throw new BusinessException("tenantId 不能为空"); - } - if (file == null || file.isEmpty()) { - throw new BusinessException("文件不能为空"); - } - String title = StrUtil.blankToDefault(file.getOriginalFilename(), "upload"); - String text = extractText(file); - if (StrUtil.isBlank(text)) { - throw new BusinessException("无法解析文件内容,请上传 txt/md/html 等可解析文本"); - } - - String contentHash = AiTextUtil.sha256(text); - AiKbDocument doc = new AiKbDocument(); - doc.setTitle(title); - doc.setSourceType("upload"); - doc.setSourceRef(title); - doc.setContentHash(contentHash); - doc.setStatus(0); - doc.setTenantId(tenantId); - doc.setCreateTime(LocalDateTime.now()); - doc.setUpdateTime(LocalDateTime.now()); - documentService.save(doc); - - int chunks = ingestChunks(doc, text); - - AiKbIngestResult r = new AiKbIngestResult(); - r.setDocumentId(doc.getDocumentId()); - r.setTitle(doc.getTitle()); - r.setChunks(chunks); - r.setUpdatedDocuments(1); - r.setSkippedDocuments(0); - return r; - } - - /** - * 同步 CMS(仅当前 tenant)。 - */ - public AiKbIngestResult syncCms(Integer tenantId) { - if (tenantId == null) { - throw new BusinessException("tenantId 不能为空"); - } - // 仅同步“已发布且未删除”的文章 - List articles = cmsArticleService.list(new LambdaQueryWrapper() - .eq(CmsArticle::getTenantId, tenantId) - .eq(CmsArticle::getDeleted, 0) - .eq(CmsArticle::getStatus, 0)); - if (articles == null || articles.isEmpty()) { - AiKbIngestResult r = new AiKbIngestResult(); - r.setUpdatedDocuments(0); - r.setSkippedDocuments(0); - r.setChunks(0); - return r; - } - - Set articleIds = articles.stream().map(CmsArticle::getArticleId).collect(Collectors.toSet()); - List contents = cmsArticleContentService.list(new LambdaQueryWrapper() - .in(CmsArticleContent::getArticleId, articleIds)); - - Map contentByArticle = contents.stream() - .collect(Collectors.toMap( - CmsArticleContent::getArticleId, - c -> c, - (a, b) -> (a.getCreateTime() != null && b.getCreateTime() != null && a.getCreateTime().isAfter(b.getCreateTime())) ? a : b - )); - - int updatedDocs = 0; - int skippedDocs = 0; - int totalChunks = 0; - - for (CmsArticle a : articles) { - CmsArticleContent c = contentByArticle.get(a.getArticleId()); - String raw = ""; - if (a.getOverview() != null) { - raw += a.getOverview() + "\n"; - } - if (c != null && c.getContent() != null) { - raw += c.getContent(); - } - String text = a.getTitle() + "\n" + AiTextUtil.stripHtml(raw); - text = AiTextUtil.normalizeWhitespace(text); - if (StrUtil.isBlank(text)) { - continue; - } - String hash = AiTextUtil.sha256(text); - - AiKbDocument existing = documentService.getOne(new LambdaQueryWrapper() - .eq(AiKbDocument::getTenantId, tenantId) - .eq(AiKbDocument::getSourceType, "cms") - .eq(AiKbDocument::getSourceId, a.getArticleId()) - .last("limit 1")); - - if (existing != null && StrUtil.equals(existing.getContentHash(), hash)) { - skippedDocs++; - continue; - } - - AiKbDocument doc; - if (existing == null) { - doc = new AiKbDocument(); - doc.setTitle(a.getTitle()); - doc.setSourceType("cms"); - doc.setSourceId(a.getArticleId()); - doc.setSourceRef(a.getCode()); - doc.setContentHash(hash); - doc.setStatus(0); - doc.setTenantId(tenantId); - doc.setCreateTime(LocalDateTime.now()); - doc.setUpdateTime(LocalDateTime.now()); - documentService.save(doc); - } else { - doc = existing; - doc.setTitle(a.getTitle()); - doc.setSourceRef(a.getCode()); - doc.setContentHash(hash); - doc.setUpdateTime(LocalDateTime.now()); - documentService.updateById(doc); - // 重新入库:先删除旧 chunk - chunkService.remove(new LambdaQueryWrapper().eq(AiKbChunk::getDocumentId, doc.getDocumentId())); - } - - int chunks = ingestChunks(doc, text); - totalChunks += chunks; - updatedDocs++; - } - - AiKbIngestResult r = new AiKbIngestResult(); - r.setUpdatedDocuments(updatedDocs); - r.setSkippedDocuments(skippedDocs); - r.setChunks(totalChunks); - return r; - } - - public AiKbQueryResult query(Integer tenantId, AiKbQueryRequest request) { - if (tenantId == null) { - throw new BusinessException("tenantId 不能为空"); - } - if (request == null || StrUtil.isBlank(request.getQuery())) { - throw new BusinessException("query 不能为空"); - } - int topK = request.getTopK() != null ? request.getTopK() : props.getRagTopK(); - topK = Math.max(1, Math.min(20, topK)); - - float[] qEmb = embedding(request.getQuery()); - float qNorm = l2(qEmb); - if (qNorm == 0f) { - throw new BusinessException("query embedding 为空"); - } - - // MVP:按 tenant 拉取最新 N 条候选 chunk,再做余弦相似度排序 - List candidates = chunkService.list(new LambdaQueryWrapper() - .eq(AiKbChunk::getTenantId, tenantId) - .orderByDesc(AiKbChunk::getId) - .last("limit " + props.getRagMaxCandidates())); - - PriorityQueue pq = new PriorityQueue<>(Comparator.comparingDouble(h -> h.getScore() == null ? -1d : h.getScore())); - for (AiKbChunk c : candidates) { - if (StrUtil.isBlank(c.getEmbedding())) { - continue; - } - float[] cEmb = parseEmbedding(c.getEmbedding()); - if (cEmb == null || cEmb.length == 0) { - continue; - } - Double cNormD = c.getEmbeddingNorm(); - float cNorm = cNormD == null ? l2(cEmb) : cNormD.floatValue(); - if (cNorm == 0f) { - continue; - } - double score = dot(qEmb, cEmb) / (qNorm * cNorm); - AiKbHit hit = new AiKbHit(); - hit.setChunkId(c.getChunkId()); - hit.setDocumentId(c.getDocumentId()); - hit.setTitle(StrUtil.blankToDefault(c.getTitle(), "")); - hit.setScore(score); - // 返回给前端时避免过长 - hit.setContent(clip(c.getContent(), 900)); - - if (pq.size() < topK) { - pq.add(hit); - } else if (hit.getScore() != null && hit.getScore() > pq.peek().getScore()) { - pq.poll(); - pq.add(hit); - } - } - - List hits = new ArrayList<>(pq); - hits.sort((a, b) -> Double.compare(b.getScore(), a.getScore())); - AiKbQueryResult r = new AiKbQueryResult(); - r.setHits(hits); - return r; - } - - public AiKbAskResult ask(Integer tenantId, AiKbAskRequest request) { - if (request == null || StrUtil.isBlank(request.getQuestion())) { - throw new BusinessException("question 不能为空"); - } - AiKbQueryRequest q = new AiKbQueryRequest(); - q.setQuery(request.getQuestion()); - q.setTopK(request.getTopK()); - AiKbQueryResult retrieval = query(tenantId, q); - - String context = buildContext(retrieval); - String userPrompt = "上下文资料:\n" + context + "\n\n用户问题:\n" + request.getQuestion(); - - AiChatRequest chatReq = new AiChatRequest(); - chatReq.setMessages(Arrays.asList( - new AiMessage("system", AiPrompts.SYSTEM_SUPPORT), - new AiMessage("user", userPrompt) - )); - AiChatResult chat = aiChatService.chat(chatReq); - - AiKbAskResult r = new AiKbAskResult(); - r.setAnswer(chat.getContent()); - r.setRetrieval(retrieval); - return r; - } - - private int ingestChunks(AiKbDocument doc, String text) { - List chunks = AiTextUtil.chunkText(text, props.getRagChunkSize(), props.getRagChunkOverlap()); - if (chunks.isEmpty()) { - return 0; - } - LocalDateTime now = LocalDateTime.now(); - - List> futures = new ArrayList<>(chunks.size()); - for (int i = 0; i < chunks.size(); i++) { - final int idx = i; - final String chunkText = chunks.get(i); - futures.add(CompletableFuture.supplyAsync(() -> { - OllamaEmbeddingResponse emb = ollamaClient.embedding(chunkText); - if (emb == null || emb.getEmbedding() == null || emb.getEmbedding().isEmpty()) { - throw new BusinessException("embedding 生成失败"); - } - float[] v = toFloat(emb.getEmbedding()); - float norm = l2(v); - AiKbChunk c = new AiKbChunk(); - c.setDocumentId(doc.getDocumentId()); - c.setChunkId(UUID.randomUUID().toString().replace("-", "")); - c.setChunkIndex(idx); - c.setTitle(doc.getTitle()); - c.setContent(chunkText); - c.setContentHash(AiTextUtil.sha256(chunkText)); - c.setEmbedding(JSONUtil.toJSONString(emb.getEmbedding())); - c.setEmbeddingNorm((double) norm); - c.setTenantId(doc.getTenantId()); - c.setCreateTime(now); - c.setDeleted(0); - return c; - }, pool())); - } - - List entities = futures.stream().map(f -> { - try { - return f.get(10, TimeUnit.MINUTES); - } catch (Exception e) { - throw new BusinessException("embedding 批处理失败: " + e.getMessage()); - } - }).collect(Collectors.toList()); - - chunkService.saveBatch(entities); - return entities.size(); - } - - private String extractText(MultipartFile file) { - try { - String contentType = file.getContentType(); - String filename = file.getOriginalFilename(); - - // 优先:对纯文本直接读 UTF-8 - if ((contentType != null && contentType.startsWith("text/")) - || (filename != null && (filename.endsWith(".txt") || filename.endsWith(".md") || filename.endsWith(".html") || filename.endsWith(".htm")))) { - return AiTextUtil.normalizeWhitespace(new String(file.getBytes(), StandardCharsets.UTF_8)); - } - - // 尝试用 tika 解析(注意:当前依赖为 tika-core,解析能力有限) - String parsed = tika.parseToString(file.getInputStream()); - return AiTextUtil.normalizeWhitespace(parsed); - } catch (Exception e) { - return ""; - } - } - - private float[] embedding(String text) { - OllamaEmbeddingResponse emb = ollamaClient.embedding(text); - if (emb == null || emb.getEmbedding() == null || emb.getEmbedding().isEmpty()) { - throw new BusinessException("embedding 生成失败"); - } - return toFloat(emb.getEmbedding()); - } - - private float[] parseEmbedding(String json) { - try { - // embedding 是一维数组,存储为 JSON 文本 - double[] d = ObjectUtil.isEmpty(json) ? null : objectMapper.readValue(json, double[].class); - if (d == null || d.length == 0) { - return null; - } - float[] f = new float[d.length]; - for (int i = 0; i < d.length; i++) { - f[i] = (float) d[i]; - } - return f; - } catch (Exception e) { - return null; - } - } - - private static float[] toFloat(List v) { - float[] out = new float[v.size()]; - for (int i = 0; i < v.size(); i++) { - Double d = v.get(i); - out[i] = d == null ? 0f : d.floatValue(); - } - return out; - } - - private static float dot(float[] a, float[] b) { - int n = Math.min(a.length, b.length); - double s = 0d; - for (int i = 0; i < n; i++) { - s += (double) a[i] * (double) b[i]; - } - return (float) s; - } - - private static float l2(float[] a) { - double s = 0d; - for (float v : a) { - s += (double) v * (double) v; - } - return (float) Math.sqrt(s); - } - - private static String clip(String s, int max) { - if (s == null) { - return ""; - } - if (s.length() <= max) { - return s; - } - return s.substring(0, max) + "..."; - } - - private static String buildContext(AiKbQueryResult retrieval) { - if (retrieval == null || retrieval.getHits() == null || retrieval.getHits().isEmpty()) { - return "(无)"; - } - StringBuilder sb = new StringBuilder(); - for (AiKbHit h : retrieval.getHits()) { - sb.append("[source:").append(h.getChunkId()).append("] "); - if (StrUtil.isNotBlank(h.getTitle())) { - sb.append(h.getTitle()).append("\n"); - } - sb.append(h.getContent()).append("\n\n"); - } - return sb.toString(); - } -} diff --git a/src/main/java/com/gxwebsoft/ai/service/AiShopAnalyticsService.java b/src/main/java/com/gxwebsoft/ai/service/AiShopAnalyticsService.java deleted file mode 100644 index 09aad90..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/AiShopAnalyticsService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gxwebsoft.ai.service; - -import com.gxwebsoft.ai.dto.AiShopMetricsRow; -import com.gxwebsoft.ai.mapper.AiShopAnalyticsMapper; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.List; - -@Service -public class AiShopAnalyticsService { - @Resource - private AiShopAnalyticsMapper mapper; - - public List queryTenantDaily(Integer tenantId, LocalDate startDate, LocalDate endDateInclusive) { - LocalDateTime start = startDate.atStartOfDay(); - LocalDateTime endExclusive = endDateInclusive.plusDays(1).atStartOfDay(); - List rows = mapper.queryMetrics(tenantId, start, endExclusive); - if (rows == null) { - return null; - } - for (AiShopMetricsRow r : rows) { - long orderCnt = r.getOrderCnt() == null ? 0L : r.getOrderCnt(); - long paidCnt = r.getPaidOrderCnt() == null ? 0L : r.getPaidOrderCnt(); - BigDecimal gmv = r.getGmv() == null ? BigDecimal.ZERO : r.getGmv(); - - if (paidCnt > 0) { - r.setAov(gmv.divide(BigDecimal.valueOf(paidCnt), 4, RoundingMode.HALF_UP)); - } else { - r.setAov(BigDecimal.ZERO); - } - if (orderCnt > 0) { - r.setPayRate(BigDecimal.valueOf(paidCnt) - .divide(BigDecimal.valueOf(orderCnt), 4, RoundingMode.HALF_UP)); - } else { - r.setPayRate(BigDecimal.ZERO); - } - } - return rows; - } -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/impl/AiKbChunkServiceImpl.java b/src/main/java/com/gxwebsoft/ai/service/impl/AiKbChunkServiceImpl.java deleted file mode 100644 index de9e157..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/impl/AiKbChunkServiceImpl.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gxwebsoft.ai.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.ai.entity.AiKbChunk; -import com.gxwebsoft.ai.mapper.AiKbChunkMapper; -import com.gxwebsoft.ai.service.AiKbChunkService; -import org.springframework.stereotype.Service; - -@Service -public class AiKbChunkServiceImpl extends ServiceImpl implements AiKbChunkService { -} - diff --git a/src/main/java/com/gxwebsoft/ai/service/impl/AiKbDocumentServiceImpl.java b/src/main/java/com/gxwebsoft/ai/service/impl/AiKbDocumentServiceImpl.java deleted file mode 100644 index 7295e96..0000000 --- a/src/main/java/com/gxwebsoft/ai/service/impl/AiKbDocumentServiceImpl.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.gxwebsoft.ai.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.ai.entity.AiKbDocument; -import com.gxwebsoft.ai.mapper.AiKbDocumentMapper; -import com.gxwebsoft.ai.service.AiKbDocumentService; -import org.springframework.stereotype.Service; - -@Service -public class AiKbDocumentServiceImpl extends ServiceImpl implements AiKbDocumentService { -} - diff --git a/src/main/java/com/gxwebsoft/ai/util/AiTextUtil.java b/src/main/java/com/gxwebsoft/ai/util/AiTextUtil.java deleted file mode 100644 index d7044f6..0000000 --- a/src/main/java/com/gxwebsoft/ai/util/AiTextUtil.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.gxwebsoft.ai.util; - -import cn.hutool.core.util.StrUtil; - -import java.nio.charset.StandardCharsets; -import java.security.MessageDigest; -import java.util.ArrayList; -import java.util.List; - -public class AiTextUtil { - private AiTextUtil() { - } - - public static String sha256(String s) { - if (s == null) { - return null; - } - try { - MessageDigest md = MessageDigest.getInstance("SHA-256"); - byte[] dig = md.digest(s.getBytes(StandardCharsets.UTF_8)); - StringBuilder sb = new StringBuilder(dig.length * 2); - for (byte b : dig) { - sb.append(String.format("%02x", b)); - } - return sb.toString(); - } catch (Exception e) { - throw new RuntimeException(e); - } - } - - /** - * 很轻量的 HTML 转纯文本(不追求完美,只用于知识库入库前清洗)。 - */ - public static String stripHtml(String html) { - if (StrUtil.isBlank(html)) { - return ""; - } - String s = html; - s = s.replaceAll("(?is)]*>.*?", " "); - s = s.replaceAll("(?is)]*>.*?", " "); - s = s.replaceAll("(?is)", "\n"); - s = s.replaceAll("(?is)", "\n"); - s = s.replaceAll("(?is)<[^>]+>", " "); - // 常见 HTML 实体最小处理 - s = s.replace(" ", " "); - s = s.replace("<", "<").replace(">", ">").replace("&", "&").replace(""", "\""); - return normalizeWhitespace(s); - } - - public static String normalizeWhitespace(String s) { - if (s == null) { - return ""; - } - // 合并空白,保留换行用于 chunking - String x = s.replace("\r", "\n"); - x = x.replaceAll("[\\t\\f\\u000B]+", " "); - x = x.replaceAll("[ ]{2,}", " "); - x = x.replaceAll("\\n{3,}", "\n\n"); - return x.trim(); - } - - /** - * 按字符数切分,并做固定 overlap。 - */ - public static List chunkText(String text, int chunkSize, int overlap) { - String s = normalizeWhitespace(text); - List out = new ArrayList<>(); - if (StrUtil.isBlank(s)) { - return out; - } - if (chunkSize <= 0) { - chunkSize = 800; - } - if (overlap < 0) { - overlap = 0; - } - if (overlap >= chunkSize) { - overlap = Math.max(0, chunkSize / 5); - } - - int n = s.length(); - int start = 0; - while (start < n) { - int end = Math.min(n, start + chunkSize); - String chunk = s.substring(start, end).trim(); - if (!chunk.isEmpty()) { - out.add(chunk); - } - if (end >= n) { - break; - } - start = end - overlap; - if (start < 0) { - start = 0; - } - } - return out; - } -} - diff --git a/src/main/java/com/gxwebsoft/auto/controller/QrLoginController.java b/src/main/java/com/gxwebsoft/auto/controller/QrLoginController.java deleted file mode 100644 index d296d82..0000000 --- a/src/main/java/com/gxwebsoft/auto/controller/QrLoginController.java +++ /dev/null @@ -1,104 +0,0 @@ -package com.gxwebsoft.auto.controller; - -import com.gxwebsoft.auto.dto.QrLoginConfirmRequest; -import com.gxwebsoft.auto.dto.QrLoginGenerateResponse; -import com.gxwebsoft.auto.dto.QrLoginStatusResponse; -import com.gxwebsoft.auto.service.QrLoginService; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.ApiResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.Parameter; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.validation.Valid; - -/** - * 认证模块 - * - * @author 科技小王子 - * @since 2025-03-06 22:50:25 - */ -@Tag(name = "认证模块") -@RestController -@RequestMapping("/api/qr-login") -public class QrLoginController extends BaseController { - - @Autowired - private QrLoginService qrLoginService; - - /** - * 生成扫码登录token - */ - @Operation(summary = "生成扫码登录token") - @PostMapping("/generate") - public ApiResult generateQrLoginToken() { - try { - QrLoginGenerateResponse response = qrLoginService.generateQrLoginToken(); - return success("生成成功", response); - } catch (Exception e) { - return fail(e.getMessage()); - } - } - - /** - * 检查扫码登录状态 - */ - @Operation(summary = "检查扫码登录状态") - @GetMapping("/status/{token}") - public ApiResult checkQrLoginStatus( - @Parameter(description = "扫码登录token") @PathVariable String token) { - try { - QrLoginStatusResponse response = qrLoginService.checkQrLoginStatus(token); - return success("查询成功", response); - } catch (Exception e) { - return fail(e.getMessage()); - } - } - - /** - * 确认扫码登录 - */ - @Operation(summary = "确认扫码登录") - @PostMapping("/confirm") - public ApiResult confirmQrLogin(@Valid @RequestBody QrLoginConfirmRequest request) { - try { - QrLoginStatusResponse response = qrLoginService.confirmQrLogin(request); - return success("确认成功", response); - } catch (Exception e) { - return fail(e.getMessage()); - } - } - - /** - * 扫码操作(可选接口,用于移动端扫码后更新状态) - */ - @Operation(summary = "扫码操作") - @PostMapping("/scan/{token}") - public ApiResult scanQrCode(@Parameter(description = "扫码登录token") @PathVariable String token) { - try { - boolean result = qrLoginService.scanQrCode(token); - return success("操作成功", result); - } catch (Exception e) { - return fail(e.getMessage()); - } - } - - /** - * 微信小程序扫码登录确认(便捷接口) - */ - @Operation(summary = "微信小程序扫码登录确认") - @PostMapping("/wechat-confirm") - public ApiResult wechatMiniProgramConfirm(@Valid @RequestBody QrLoginConfirmRequest request) { - try { - // 设置平台为微信小程序 - request.setPlatform("miniprogram"); - QrLoginStatusResponse response = qrLoginService.confirmQrLogin(request); - return success("微信小程序登录确认成功", response); - } catch (Exception e) { - return fail(e.getMessage()); - } - } - -} diff --git a/src/main/java/com/gxwebsoft/auto/dto/QrLoginConfirmRequest.java b/src/main/java/com/gxwebsoft/auto/dto/QrLoginConfirmRequest.java deleted file mode 100644 index f3b423e..0000000 --- a/src/main/java/com/gxwebsoft/auto/dto/QrLoginConfirmRequest.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gxwebsoft.auto.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import javax.validation.constraints.NotBlank; - -/** - * 扫码登录确认请求 - * - * @author 科技小王子 - * @since 2025-08-31 - */ -@Data -@Schema(description = "扫码登录确认请求") -public class QrLoginConfirmRequest { - - @Schema(description = "扫码登录token") - @NotBlank(message = "token不能为空") - private String token; - - @Schema(description = "用户ID") - private Integer userId; - - @Schema(description = "登录平台: web-网页端, app-移动应用, miniprogram-微信小程序") - private String platform; - - @Schema(description = "微信小程序相关信息") - private WechatMiniProgramInfo wechatInfo; - - /** - * 微信小程序信息 - */ - @Data - @Schema(description = "微信小程序信息") - public static class WechatMiniProgramInfo { - @Schema(description = "微信openid") - private String openid; - - @Schema(description = "微信unionid") - private String unionid; - - @Schema(description = "微信昵称") - private String nickname; - - @Schema(description = "微信头像") - private String avatar; - } - -} diff --git a/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java b/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java deleted file mode 100644 index 563bf1d..0000000 --- a/src/main/java/com/gxwebsoft/auto/dto/QrLoginData.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.gxwebsoft.auto.dto; - -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -import java.time.LocalDateTime; - -/** - * 扫码登录数据模型 - * - * @author 科技小王子 - * @since 2025-08-31 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -public class QrLoginData { - - /** - * 扫码登录token - */ - private String token; - - /** - * 状态: pending-等待扫码, scanned-已扫码, confirmed-已确认, expired-已过期 - */ - private String status; - - /** - * 用户ID(扫码确认后设置) - */ - private Integer userId; - - /** - * 用户名(扫码确认后设置) - */ - private String username; - - /** - * 创建时间 - */ - private LocalDateTime createTime; - - /** - * 过期时间 - */ - private LocalDateTime expireTime; - - /** - * JWT访问令牌(确认后生成) - */ - private String accessToken; - -} diff --git a/src/main/java/com/gxwebsoft/auto/dto/QrLoginGenerateResponse.java b/src/main/java/com/gxwebsoft/auto/dto/QrLoginGenerateResponse.java deleted file mode 100644 index f0b69e5..0000000 --- a/src/main/java/com/gxwebsoft/auto/dto/QrLoginGenerateResponse.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.gxwebsoft.auto.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 扫码登录生成响应 - * - * @author 科技小王子 - * @since 2025-08-31 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Schema(description = "扫码登录生成响应") -public class QrLoginGenerateResponse { - - @Schema(description = "扫码登录token") - private String token; - - @Schema(description = "二维码内容") - private String qrCode; - - @Schema(description = "过期时间(秒)") - private Long expiresIn; - -} diff --git a/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java b/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java deleted file mode 100644 index 1eb0d4a..0000000 --- a/src/main/java/com/gxwebsoft/auto/dto/QrLoginStatusResponse.java +++ /dev/null @@ -1,32 +0,0 @@ -package com.gxwebsoft.auto.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.AllArgsConstructor; -import lombok.Data; -import lombok.NoArgsConstructor; - -/** - * 扫码登录状态响应 - * - * @author 科技小王子 - * @since 2025-08-31 - */ -@Data -@NoArgsConstructor -@AllArgsConstructor -@Schema(description = "扫码登录状态响应") -public class QrLoginStatusResponse { - - @Schema(description = "状态: pending-等待扫码, scanned-已扫码, confirmed-已确认, expired-已过期") - private String status; - - @Schema(description = "JWT访问令牌(仅在confirmed状态时返回)") - private String accessToken; - - @Schema(description = "用户信息(仅在confirmed状态时返回)") - private Object userInfo; - - @Schema(description = "剩余过期时间(秒)") - private Long expiresIn; - -} diff --git a/src/main/java/com/gxwebsoft/auto/service/QrLoginService.java b/src/main/java/com/gxwebsoft/auto/service/QrLoginService.java deleted file mode 100644 index 85ed28f..0000000 --- a/src/main/java/com/gxwebsoft/auto/service/QrLoginService.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gxwebsoft.auto.service; - -import com.gxwebsoft.auto.dto.QrLoginConfirmRequest; -import com.gxwebsoft.auto.dto.QrLoginGenerateResponse; -import com.gxwebsoft.auto.dto.QrLoginStatusResponse; - -/** - * 扫码登录服务接口 - * - * @author 科技小王子 - * @since 2025-08-31 - */ -public interface QrLoginService { - - /** - * 生成扫码登录token - * - * @return QrLoginGenerateResponse - */ - QrLoginGenerateResponse generateQrLoginToken(); - - /** - * 检查扫码登录状态 - * - * @param token 扫码登录token - * @return QrLoginStatusResponse - */ - QrLoginStatusResponse checkQrLoginStatus(String token); - - /** - * 确认扫码登录 - * - * @param request 确认请求 - * @return QrLoginStatusResponse - */ - QrLoginStatusResponse confirmQrLogin(QrLoginConfirmRequest request); - - /** - * 扫码操作(更新状态为已扫码) - * - * @param token 扫码登录token - * @return boolean - */ - boolean scanQrCode(String token); - -} diff --git a/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java b/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java deleted file mode 100644 index 34658e8..0000000 --- a/src/main/java/com/gxwebsoft/auto/service/impl/QrLoginServiceImpl.java +++ /dev/null @@ -1,239 +0,0 @@ -package com.gxwebsoft.auto.service.impl; - -import cn.hutool.core.lang.UUID; -import cn.hutool.core.util.StrUtil; -import com.gxwebsoft.auto.dto.*; -import com.gxwebsoft.auto.service.QrLoginService; -import com.gxwebsoft.common.core.security.JwtSubject; -import com.gxwebsoft.common.core.security.JwtUtil; -import com.gxwebsoft.common.core.utils.JSONUtil; -import com.gxwebsoft.common.core.utils.RedisUtil; -import com.gxwebsoft.common.system.entity.User; -import com.gxwebsoft.common.system.service.UserService; -import lombok.extern.slf4j.Slf4j; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Service; - -import java.time.LocalDateTime; -import java.time.temporal.ChronoUnit; -import java.util.concurrent.TimeUnit; - -import static com.gxwebsoft.common.core.constants.RedisConstants.*; - -/** - * 扫码登录服务实现 - * - * @author 科技小王子 - * @since 2025-08-31 - */ -@Slf4j -@Service -public class QrLoginServiceImpl implements QrLoginService { - - @Autowired - private RedisUtil redisUtil; - - @Autowired - private UserService userService; - - @Value("${config.jwt.secret:websoft-jwt-secret-key-2025}") - private String jwtSecret; - - @Value("${config.jwt.expire:86400}") - private Long jwtExpire; - - @Override - public QrLoginGenerateResponse generateQrLoginToken() { - // 生成唯一的扫码登录token - String token = UUID.randomUUID().toString(true); - - // 创建扫码登录数据 - QrLoginData qrLoginData = new QrLoginData(); - qrLoginData.setToken(token); - qrLoginData.setStatus(QR_LOGIN_STATUS_PENDING); - qrLoginData.setCreateTime(LocalDateTime.now()); - qrLoginData.setExpireTime(LocalDateTime.now().plusSeconds(QR_LOGIN_TOKEN_TTL)); - - // 存储到Redis,设置过期时间 - String redisKey = QR_LOGIN_TOKEN_KEY + token; - redisUtil.set(redisKey, qrLoginData, QR_LOGIN_TOKEN_TTL, TimeUnit.SECONDS); - - log.info("生成扫码登录token: {}", token); - - // 构造二维码内容(这里可以是前端登录页面的URL + token参数) - String qrCodeContent = "qr-login:" + token; - - return new QrLoginGenerateResponse(token, qrCodeContent, QR_LOGIN_TOKEN_TTL); - } - - @Override - public QrLoginStatusResponse checkQrLoginStatus(String token) { - if (StrUtil.isBlank(token)) { - return new QrLoginStatusResponse(QR_LOGIN_STATUS_EXPIRED, null, null, 0L); - } - - String redisKey = QR_LOGIN_TOKEN_KEY + token; - QrLoginData qrLoginData = redisUtil.get(redisKey, QrLoginData.class); - - if (qrLoginData == null) { - return new QrLoginStatusResponse(QR_LOGIN_STATUS_EXPIRED, null, null, 0L); - } - - // 检查是否过期 - if (LocalDateTime.now().isAfter(qrLoginData.getExpireTime())) { - // 删除过期的token - redisUtil.delete(redisKey); - return new QrLoginStatusResponse(QR_LOGIN_STATUS_EXPIRED, null, null, 0L); - } - - // 计算剩余过期时间 - long expiresIn = ChronoUnit.SECONDS.between(LocalDateTime.now(), qrLoginData.getExpireTime()); - - QrLoginStatusResponse response = new QrLoginStatusResponse(); - response.setStatus(qrLoginData.getStatus()); - response.setExpiresIn(expiresIn); - - // 如果已确认,返回token和用户信息 - if (QR_LOGIN_STATUS_CONFIRMED.equals(qrLoginData.getStatus())) { - response.setAccessToken(qrLoginData.getAccessToken()); - - // 获取用户信息 - if (qrLoginData.getUserId() != null) { - User user = userService.getByIdRel(qrLoginData.getUserId()); - if (user != null) { - // 清除敏感信息 - user.setPassword(null); - response.setUserInfo(user); - } - } - - // 确认后删除token,防止重复使用 - redisUtil.delete(redisKey); - } - - return response; - } - - @Override - public QrLoginStatusResponse confirmQrLogin(QrLoginConfirmRequest request) { - String token = request.getToken(); - Integer userId = request.getUserId(); - String platform = request.getPlatform(); - - if (StrUtil.isBlank(token) || userId == null) { - throw new RuntimeException("参数不能为空"); - } - - String redisKey = QR_LOGIN_TOKEN_KEY + token; - QrLoginData qrLoginData = redisUtil.get(redisKey, QrLoginData.class); - - if (qrLoginData == null) { - throw new RuntimeException("扫码登录token不存在或已过期"); - } - - // 检查是否过期 - if (LocalDateTime.now().isAfter(qrLoginData.getExpireTime())) { - redisUtil.delete(redisKey); - throw new RuntimeException("扫码登录token已过期"); - } - - // 获取用户信息 - User user = userService.getByIdRel(userId); - if (user == null) { - throw new RuntimeException("用户不存在"); - } - - // 检查用户状态 - if (user.getStatus() != null && user.getStatus() != 0) { - throw new RuntimeException("用户已被冻结"); - } - - // 如果是微信小程序登录,处理微信相关信息 - if ("miniprogram".equals(platform) && request.getWechatInfo() != null) { - handleWechatMiniProgramLogin(user, request.getWechatInfo()); - } - - // 生成JWT token - JwtSubject jwtSubject = new JwtSubject(user.getUsername(), user.getTenantId()); - String accessToken = JwtUtil.buildToken(jwtSubject, jwtExpire, jwtSecret); - - // 更新扫码登录数据 - qrLoginData.setStatus(QR_LOGIN_STATUS_CONFIRMED); - qrLoginData.setUserId(userId); - qrLoginData.setUsername(user.getUsername()); - qrLoginData.setAccessToken(accessToken); - - // 更新Redis中的数据 - redisUtil.set(redisKey, qrLoginData, 60L, TimeUnit.SECONDS); // 给前端60秒时间获取token - - log.info("用户 {} 通过 {} 平台确认扫码登录,token: {}", user.getUsername(), - platform != null ? platform : "unknown", token); - - // 清除敏感信息 - user.setPassword(null); - - return new QrLoginStatusResponse(QR_LOGIN_STATUS_CONFIRMED, accessToken, user, 60L); - } - - /** - * 处理微信小程序登录相关逻辑 - */ - private void handleWechatMiniProgramLogin(User user, QrLoginConfirmRequest.WechatMiniProgramInfo wechatInfo) { - // 更新用户的微信信息 - if (StrUtil.isNotBlank(wechatInfo.getOpenid())) { - user.setOpenid(wechatInfo.getOpenid()); - } - if (StrUtil.isNotBlank(wechatInfo.getUnionid())) { - user.setUnionid(wechatInfo.getUnionid()); - } - if (StrUtil.isNotBlank(wechatInfo.getNickname()) && StrUtil.isBlank(user.getNickname())) { - user.setNickname(wechatInfo.getNickname()); - } - if (StrUtil.isNotBlank(wechatInfo.getAvatar()) && StrUtil.isBlank(user.getAvatar())) { - user.setAvatar(wechatInfo.getAvatar()); - } - - // 更新用户信息到数据库 - try { - userService.updateById(user); - log.info("更新用户 {} 的微信小程序信息成功", user.getUsername()); - } catch (Exception e) { - log.warn("更新用户 {} 的微信小程序信息失败: {}", user.getUsername(), e.getMessage()); - } - } - - @Override - public boolean scanQrCode(String token) { - if (StrUtil.isBlank(token)) { - return false; - } - - String redisKey = QR_LOGIN_TOKEN_KEY + token; - QrLoginData qrLoginData = redisUtil.get(redisKey, QrLoginData.class); - - if (qrLoginData == null) { - return false; - } - - // 检查是否过期 - if (LocalDateTime.now().isAfter(qrLoginData.getExpireTime())) { - redisUtil.delete(redisKey); - return false; - } - - // 只有pending状态才能更新为scanned - if (QR_LOGIN_STATUS_PENDING.equals(qrLoginData.getStatus())) { - qrLoginData.setStatus(QR_LOGIN_STATUS_SCANNED); - - // 计算剩余过期时间 - long remainingSeconds = ChronoUnit.SECONDS.between(LocalDateTime.now(), qrLoginData.getExpireTime()); - redisUtil.set(redisKey, qrLoginData, remainingSeconds, TimeUnit.SECONDS); - - log.info("扫码登录token {} 状态更新为已扫码", token); - return true; - } - - return false; - } -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicAppointmentController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicAppointmentController.java deleted file mode 100644 index cf186e3..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicAppointmentController.java +++ /dev/null @@ -1,122 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.clinic.service.ClinicAppointmentService; -import com.gxwebsoft.clinic.entity.ClinicAppointment; -import com.gxwebsoft.clinic.param.ClinicAppointmentParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 挂号控制器 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Tag(name = "挂号管理") -@RestController -@RequestMapping("/api/clinic/clinic-appointment") -public class ClinicAppointmentController extends BaseController { - @Resource - private ClinicAppointmentService clinicAppointmentService; - - @Operation(summary = "分页查询挂号") - @GetMapping("/page") - public ApiResult> page(ClinicAppointmentParam param) { - // 使用关联查询 - return success(clinicAppointmentService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:list')") - @Operation(summary = "查询全部挂号") - @GetMapping() - public ApiResult> list(ClinicAppointmentParam param) { - // 使用关联查询 - return success(clinicAppointmentService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:list')") - @Operation(summary = "根据id查询挂号") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicAppointmentService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:save')") - @OperationLog - @Operation(summary = "添加挂号") - @PostMapping() - public ApiResult save(@RequestBody ClinicAppointment clinicAppointment) { - if (clinicAppointmentService.save(clinicAppointment)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:update')") - @OperationLog - @Operation(summary = "修改挂号") - @PutMapping() - public ApiResult update(@RequestBody ClinicAppointment clinicAppointment) { - if (clinicAppointmentService.updateById(clinicAppointment)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:remove')") - @OperationLog - @Operation(summary = "删除挂号") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicAppointmentService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:save')") - @OperationLog - @Operation(summary = "批量添加挂号") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicAppointmentService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:update')") - @OperationLog - @Operation(summary = "批量修改挂号") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicAppointmentService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicAppointment:remove')") - @OperationLog - @Operation(summary = "批量删除挂号") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicAppointmentService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicDoctorApplyController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicDoctorApplyController.java deleted file mode 100644 index 7471fa7..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicDoctorApplyController.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.clinic.service.ClinicDoctorApplyService; -import com.gxwebsoft.clinic.entity.ClinicDoctorApply; -import com.gxwebsoft.clinic.param.ClinicDoctorApplyParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 医生入驻申请控制器 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Tag(name = "医生入驻申请管理") -@RestController -@RequestMapping("/api/clinic/clinic-doctor-apply") -public class ClinicDoctorApplyController extends BaseController { - @Resource - private ClinicDoctorApplyService clinicDoctorApplyService; - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:list')") - @Operation(summary = "分页查询医生入驻申请") - @GetMapping("/page") - public ApiResult> page(ClinicDoctorApplyParam param) { - // 使用关联查询 - return success(clinicDoctorApplyService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:list')") - @Operation(summary = "查询全部医生入驻申请") - @GetMapping() - public ApiResult> list(ClinicDoctorApplyParam param) { - // 使用关联查询 - return success(clinicDoctorApplyService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:list')") - @Operation(summary = "根据id查询医生入驻申请") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicDoctorApplyService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:save')") - @OperationLog - @Operation(summary = "添加医生入驻申请") - @PostMapping() - public ApiResult save(@RequestBody ClinicDoctorApply clinicDoctorApply) { - // 记录当前登录用户id - // User loginUser = getLoginUser(); - // if (loginUser != null) { - // clinicDoctorApply.setUserId(loginUser.getUserId()); - // } - if (clinicDoctorApplyService.save(clinicDoctorApply)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:update')") - @OperationLog - @Operation(summary = "修改医生入驻申请") - @PutMapping() - public ApiResult update(@RequestBody ClinicDoctorApply clinicDoctorApply) { - if (clinicDoctorApplyService.updateById(clinicDoctorApply)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:remove')") - @OperationLog - @Operation(summary = "删除医生入驻申请") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicDoctorApplyService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:save')") - @OperationLog - @Operation(summary = "批量添加医生入驻申请") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicDoctorApplyService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:update')") - @OperationLog - @Operation(summary = "批量修改医生入驻申请") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicDoctorApplyService, "apply_id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorApply:remove')") - @OperationLog - @Operation(summary = "批量删除医生入驻申请") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicDoctorApplyService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicDoctorUserController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicDoctorUserController.java deleted file mode 100644 index 9f7012e..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicDoctorUserController.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.clinic.entity.ClinicDoctorUser; -import com.gxwebsoft.clinic.param.ClinicDoctorUserParam; -import com.gxwebsoft.clinic.service.ClinicDoctorUserService; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 分销商用户记录表控制器 - * - * @author 科技小王子 - * @since 2025-10-23 15:58:21 - */ -@Tag(name = "分销商用户记录表管理") -@RestController -@RequestMapping("/api/clinic/clinic-doctor-user") -public class ClinicDoctorUserController extends BaseController { - @Resource - private ClinicDoctorUserService clinicDoctorUserService; - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:list')") - @Operation(summary = "分页查询分销商用户记录表") - @GetMapping("/page") - public ApiResult> page(ClinicDoctorUserParam param) { - // 使用关联查询 - return success(clinicDoctorUserService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:list')") - @Operation(summary = "查询全部分销商用户记录表") - @GetMapping() - public ApiResult> list(ClinicDoctorUserParam param) { - // 使用关联查询 - return success(clinicDoctorUserService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:list')") - @Operation(summary = "根据id查询分销商用户记录表") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicDoctorUserService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:save')") - @OperationLog - @Operation(summary = "添加分销商用户记录表") - @PostMapping() - public ApiResult save(@RequestBody ClinicDoctorUser clinicDoctorUser) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - clinicDoctorUser.setUserId(loginUser.getUserId()); - } - if (clinicDoctorUserService.save(clinicDoctorUser)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:update')") - @OperationLog - @Operation(summary = "修改分销商用户记录表") - @PutMapping() - public ApiResult update(@RequestBody ClinicDoctorUser clinicDoctorUser) { - if (clinicDoctorUserService.updateById(clinicDoctorUser)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:remove')") - @OperationLog - @Operation(summary = "删除分销商用户记录表") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicDoctorUserService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:save')") - @OperationLog - @Operation(summary = "批量添加分销商用户记录表") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicDoctorUserService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:update')") - @OperationLog - @Operation(summary = "批量修改分销商用户记录表") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicDoctorUserService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicDoctorUser:remove')") - @OperationLog - @Operation(summary = "批量删除分销商用户记录表") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicDoctorUserService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineController.java deleted file mode 100644 index 28e27c6..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineController.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.clinic.entity.ClinicMedicine; -import com.gxwebsoft.clinic.param.ClinicMedicineParam; -import com.gxwebsoft.clinic.service.ClinicMedicineService; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 药品库控制器 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Tag(name = "药品库管理") -@RestController -@RequestMapping("/api/clinic/clinic-medicine") -public class ClinicMedicineController extends BaseController { - @Resource - private ClinicMedicineService clinicMedicineService; - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:list')") - @Operation(summary = "分页查询药品库") - @GetMapping("/page") - public ApiResult> page(ClinicMedicineParam param) { - // 使用关联查询 - return success(clinicMedicineService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:list')") - @Operation(summary = "查询全部药品库") - @GetMapping() - public ApiResult> list(ClinicMedicineParam param) { - // 使用关联查询 - return success(clinicMedicineService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:list')") - @Operation(summary = "根据id查询药品库") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicMedicineService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:save')") - @OperationLog - @Operation(summary = "添加药品库") - @PostMapping() - public ApiResult save(@RequestBody ClinicMedicine clinicMedicine) { - // 记录当前登录用户id - // User loginUser = getLoginUser(); - // if (loginUser != null) { - // clinicMedicine.setUserId(loginUser.getUserId()); - // } - if (clinicMedicineService.save(clinicMedicine)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:update')") - @OperationLog - @Operation(summary = "修改药品库") - @PutMapping() - public ApiResult update(@RequestBody ClinicMedicine clinicMedicine) { - if (clinicMedicineService.updateById(clinicMedicine)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:remove')") - @OperationLog - @Operation(summary = "删除药品库") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicMedicineService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:save')") - @OperationLog - @Operation(summary = "批量添加药品库") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicMedicineService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:update')") - @OperationLog - @Operation(summary = "批量修改药品库") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicMedicineService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicine:remove')") - @OperationLog - @Operation(summary = "批量删除药品库") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicMedicineService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineInoutController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineInoutController.java deleted file mode 100644 index e1b89a8..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineInoutController.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.clinic.entity.ClinicMedicineInout; -import com.gxwebsoft.clinic.param.ClinicMedicineInoutParam; -import com.gxwebsoft.clinic.service.ClinicMedicineInoutService; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 出入库控制器 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Tag(name = "出入库管理") -@RestController -@RequestMapping("/api/clinic/clinic-medicine-inout") -public class ClinicMedicineInoutController extends BaseController { - @Resource - private ClinicMedicineInoutService clinicMedicineInoutService; - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:list')") - @Operation(summary = "分页查询出入库") - @GetMapping("/page") - public ApiResult> page(ClinicMedicineInoutParam param) { - // 使用关联查询 - return success(clinicMedicineInoutService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:list')") - @Operation(summary = "查询全部出入库") - @GetMapping() - public ApiResult> list(ClinicMedicineInoutParam param) { - // 使用关联查询 - return success(clinicMedicineInoutService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:list')") - @Operation(summary = "根据id查询出入库") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicMedicineInoutService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:save')") - @OperationLog - @Operation(summary = "添加出入库") - @PostMapping() - public ApiResult save(@RequestBody ClinicMedicineInout clinicMedicineInout) { - // 记录当前登录用户id - // User loginUser = getLoginUser(); - // if (loginUser != null) { - // clinicMedicineInout.setUserId(loginUser.getUserId()); - // } - if (clinicMedicineInoutService.save(clinicMedicineInout)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:update')") - @OperationLog - @Operation(summary = "修改出入库") - @PutMapping() - public ApiResult update(@RequestBody ClinicMedicineInout clinicMedicineInout) { - if (clinicMedicineInoutService.updateById(clinicMedicineInout)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:remove')") - @OperationLog - @Operation(summary = "删除出入库") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicMedicineInoutService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:save')") - @OperationLog - @Operation(summary = "批量添加出入库") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicMedicineInoutService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:update')") - @OperationLog - @Operation(summary = "批量修改出入库") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicMedicineInoutService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineInout:remove')") - @OperationLog - @Operation(summary = "批量删除出入库") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicMedicineInoutService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineStockController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineStockController.java deleted file mode 100644 index 867b425..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicMedicineStockController.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.clinic.entity.ClinicMedicineStock; -import com.gxwebsoft.clinic.param.ClinicMedicineStockParam; -import com.gxwebsoft.clinic.service.ClinicMedicineStockService; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 药品库存控制器 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Tag(name = "药品库存管理") -@RestController -@RequestMapping("/api/clinic/clinic-medicine-stock") -public class ClinicMedicineStockController extends BaseController { - @Resource - private ClinicMedicineStockService clinicMedicineStockService; - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:list')") - @Operation(summary = "分页查询药品库存") - @GetMapping("/page") - public ApiResult> page(ClinicMedicineStockParam param) { - // 使用关联查询 - return success(clinicMedicineStockService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:list')") - @Operation(summary = "查询全部药品库存") - @GetMapping() - public ApiResult> list(ClinicMedicineStockParam param) { - // 使用关联查询 - return success(clinicMedicineStockService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:list')") - @Operation(summary = "根据id查询药品库存") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicMedicineStockService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:save')") - @OperationLog - @Operation(summary = "添加药品库存") - @PostMapping() - public ApiResult save(@RequestBody ClinicMedicineStock clinicMedicineStock) { - // 记录当前登录用户id - // User loginUser = getLoginUser(); - // if (loginUser != null) { - // clinicMedicineStock.setUserId(loginUser.getUserId()); - // } - if (clinicMedicineStockService.save(clinicMedicineStock)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:update')") - @OperationLog - @Operation(summary = "修改药品库存") - @PutMapping() - public ApiResult update(@RequestBody ClinicMedicineStock clinicMedicineStock) { - if (clinicMedicineStockService.updateById(clinicMedicineStock)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:remove')") - @OperationLog - @Operation(summary = "删除药品库存") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicMedicineStockService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:save')") - @OperationLog - @Operation(summary = "批量添加药品库存") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicMedicineStockService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:update')") - @OperationLog - @Operation(summary = "批量修改药品库存") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicMedicineStockService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicMedicineStock:remove')") - @OperationLog - @Operation(summary = "批量删除药品库存") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicMedicineStockService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicPatientUserController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicPatientUserController.java deleted file mode 100644 index 87aa108..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicPatientUserController.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.clinic.service.ClinicPatientUserService; -import com.gxwebsoft.clinic.entity.ClinicPatientUser; -import com.gxwebsoft.clinic.param.ClinicPatientUserParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 患者控制器 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Tag(name = "患者管理") -@RestController -@RequestMapping("/api/clinic/clinic-patient-user") -public class ClinicPatientUserController extends BaseController { - @Resource - private ClinicPatientUserService clinicPatientUserService; - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:list')") - @Operation(summary = "分页查询患者") - @GetMapping("/page") - public ApiResult> page(ClinicPatientUserParam param) { - // 使用关联查询 - return success(clinicPatientUserService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:list')") - @Operation(summary = "查询全部患者") - @GetMapping() - public ApiResult> list(ClinicPatientUserParam param) { - // 使用关联查询 - return success(clinicPatientUserService.listRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:list')") - @Operation(summary = "根据id查询患者") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicPatientUserService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:save')") - @OperationLog - @Operation(summary = "添加患者") - @PostMapping() - public ApiResult save(@RequestBody ClinicPatientUser clinicPatientUser) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - clinicPatientUser.setUserId(loginUser.getUserId()); - } - if (clinicPatientUserService.save(clinicPatientUser)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:update')") - @OperationLog - @Operation(summary = "修改患者") - @PutMapping() - public ApiResult update(@RequestBody ClinicPatientUser clinicPatientUser) { - if (clinicPatientUserService.updateById(clinicPatientUser)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:remove')") - @OperationLog - @Operation(summary = "删除患者") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicPatientUserService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:save')") - @OperationLog - @Operation(summary = "批量添加患者") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicPatientUserService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:update')") - @OperationLog - @Operation(summary = "批量修改患者") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicPatientUserService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPatientUser:remove')") - @OperationLog - @Operation(summary = "批量删除患者") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicPatientUserService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicPrescriptionController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicPrescriptionController.java deleted file mode 100644 index f51872e..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicPrescriptionController.java +++ /dev/null @@ -1,191 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import cn.hutool.core.util.IdUtil; -import com.gxwebsoft.clinic.dto.PrescriptionOrderRequest; -import com.gxwebsoft.clinic.entity.ClinicPrescription; -import com.gxwebsoft.clinic.param.ClinicPrescriptionParam; -import com.gxwebsoft.clinic.service.ClinicPrescriptionService; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import lombok.extern.slf4j.Slf4j; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 处方主表 -控制器 - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Tag(name = "处方主表管理") -@RestController -@RequestMapping("/api/clinic/clinic-prescription") -public class ClinicPrescriptionController extends BaseController { - @Resource - private ClinicPrescriptionService clinicPrescriptionService; - - @Operation(summary = "分页查询处方主表") - @GetMapping("/page") - public ApiResult> page(ClinicPrescriptionParam param) { - // 使用关联查询 - return success(clinicPrescriptionService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:list')") - @Operation(summary = "查询全部处方主表") - @GetMapping() - public ApiResult> list(ClinicPrescriptionParam param) { - // 使用关联查询 - return success(clinicPrescriptionService.listRel(param)); - } - - @Operation(summary = "根据id查询处方主表") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicPrescriptionService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:save')") - @OperationLog - @Operation(summary = "添加处方主表") - @PostMapping() - public ApiResult save(@RequestBody ClinicPrescription clinicPrescription) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - clinicPrescription.setDoctorId(loginUser.getUserId()); - // 生成订单号 - String orderNo = Long.toString(IdUtil.getSnowflakeNextId()); - clinicPrescription.setOrderNo(orderNo); - } - if (clinicPrescriptionService.save(clinicPrescription)) { - // 返回处方数据,包含处方ID - return success("添加成功",clinicPrescriptionService.getByLastId(clinicPrescription)); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:update')") - @OperationLog - @Operation(summary = "修改处方主表") - @PutMapping() - public ApiResult update(@RequestBody ClinicPrescription clinicPrescription) { - if (clinicPrescriptionService.updateById(clinicPrescription)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:remove')") - @OperationLog - @Operation(summary = "删除处方主表") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicPrescriptionService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:save')") - @OperationLog - @Operation(summary = "批量添加处方主表") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicPrescriptionService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:update')") - @OperationLog - @Operation(summary = "批量修改处方主表") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicPrescriptionService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:remove')") - @OperationLog - @Operation(summary = "批量删除处方主表") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicPrescriptionService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @Operation(summary = "创建处方订单") - @PostMapping("/order") - public ApiResult createOrder(@RequestBody PrescriptionOrderRequest request) { - try { - // 1. 参数校验 - if (request.getPrescriptionId() == null) { - return fail("处方ID不能为空"); - } - if (request.getPayType() == null) { - return fail("支付方式不能为空"); - } - - // 2. 查询处方信息 - ClinicPrescription prescription = clinicPrescriptionService.getById(request.getPrescriptionId()); - if (prescription == null) { - return fail("处方不存在"); - } - - // 3. 检查处方状态 - if (prescription.getStatus() != null && prescription.getStatus() == 2) { - return fail("该处方已支付,无需重复支付"); - } - if (prescription.getStatus() != null && prescription.getStatus() == 3) { - return fail("该处方已取消,无法支付"); - } - - // 4. 更新处方订单信息 - ClinicPrescription updatePrescription = new ClinicPrescription(); - updatePrescription.setId(request.getPrescriptionId()); - - // 根据支付类型更新状态 - if (request.getPayType() == 1) { - // 微信支付,状态保持为正常,等待支付回调 - updatePrescription.setStatus(0); - } else if (request.getPayType() == 4 || request.getPayType() == 5) { - // 现金支付或POS机支付,直接标记为已支付 - updatePrescription.setStatus(2); - updatePrescription.setIsSettled(1); - updatePrescription.setSettleTime(LocalDateTime.now()); - } else if (request.getPayType() == 6) { - // 免费,直接标记为已完成 - updatePrescription.setStatus(1); - updatePrescription.setIsSettled(1); - updatePrescription.setSettleTime(LocalDateTime.now()); - } - - if (clinicPrescriptionService.updateById(updatePrescription)) { - return success("订单创建成功", prescription); - } - return fail("订单创建失败"); - - } catch (Exception e) { - return fail("订单创建失败:" + e.getMessage()); - } - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/ClinicPrescriptionItemController.java b/src/main/java/com/gxwebsoft/clinic/controller/ClinicPrescriptionItemController.java deleted file mode 100644 index eda3050..0000000 --- a/src/main/java/com/gxwebsoft/clinic/controller/ClinicPrescriptionItemController.java +++ /dev/null @@ -1,121 +0,0 @@ -package com.gxwebsoft.clinic.controller; - -import com.gxwebsoft.clinic.entity.ClinicPrescriptionItem; -import com.gxwebsoft.clinic.param.ClinicPrescriptionItemParam; -import com.gxwebsoft.clinic.service.ClinicPrescriptionItemService; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 处方明细表 -控制器 - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Tag(name = "处方明细表管理") -@RestController -@RequestMapping("/api/clinic/clinic-prescription-item") -public class ClinicPrescriptionItemController extends BaseController { - @Resource - private ClinicPrescriptionItemService clinicPrescriptionItemService; - - @Operation(summary = "分页查询处方明细表") - @GetMapping("/page") - public ApiResult> page(ClinicPrescriptionItemParam param) { - // 使用关联查询 - return success(clinicPrescriptionItemService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:list')") - @Operation(summary = "查询全部处方明细表") - @GetMapping() - public ApiResult> list(ClinicPrescriptionItemParam param) { - // 使用关联查询 - return success(clinicPrescriptionItemService.listRel(param)); - } - - @Operation(summary = "根据id查询处方明细表") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(clinicPrescriptionItemService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:save')") - @OperationLog - @Operation(summary = "添加处方明细表") - @PostMapping() - public ApiResult save(@RequestBody ClinicPrescriptionItem clinicPrescriptionItem) { - if (clinicPrescriptionItemService.save(clinicPrescriptionItem)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:update')") - @OperationLog - @Operation(summary = "修改处方明细表") - @PutMapping() - public ApiResult update(@RequestBody ClinicPrescriptionItem clinicPrescriptionItem) { - if (clinicPrescriptionItemService.updateById(clinicPrescriptionItem)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:remove')") - @OperationLog - @Operation(summary = "删除处方明细表") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (clinicPrescriptionItemService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:save')") - @OperationLog - @Operation(summary = "批量添加处方明细表") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (clinicPrescriptionItemService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:update')") - @OperationLog - @Operation(summary = "批量修改处方明细表") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(clinicPrescriptionItemService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('clinic:clinicPrescription:remove')") - @OperationLog - @Operation(summary = "批量删除处方明细表") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (clinicPrescriptionItemService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/controller/业务中台-排班信息接口对接文档20251114(2).docx b/src/main/java/com/gxwebsoft/clinic/controller/业务中台-排班信息接口对接文档20251114(2).docx deleted file mode 100644 index 8b21716..0000000 Binary files a/src/main/java/com/gxwebsoft/clinic/controller/业务中台-排班信息接口对接文档20251114(2).docx and /dev/null differ diff --git a/src/main/java/com/gxwebsoft/clinic/dto/PrescriptionOrderRequest.java b/src/main/java/com/gxwebsoft/clinic/dto/PrescriptionOrderRequest.java deleted file mode 100644 index 44bc7c2..0000000 --- a/src/main/java/com/gxwebsoft/clinic/dto/PrescriptionOrderRequest.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.gxwebsoft.clinic.dto; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; - -import java.io.Serializable; - -/** - * 处方订单请求参数 - * - * @author 科技小王子 - * @since 2025-11-03 - */ -@Data -@Schema(name = "PrescriptionOrderRequest", description = "处方订单请求参数") -public class PrescriptionOrderRequest implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "处方ID", required = true) - private Integer prescriptionId; - - @Schema(description = "支付方式:0余额支付,1微信支付,2支付宝支付,3银联支付,4现金支付,5POS机支付,6免费,7积分支付", required = true) - private Integer payType; -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicAppointment.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicAppointment.java deleted file mode 100644 index c38ae8d..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicAppointment.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * 挂号 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:03 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicAppointment对象", description = "挂号") -public class ClinicAppointment implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "类型") - private Integer type; - - @Schema(description = "就诊原因") - private String reason; - - @Schema(description = "挂号时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime evaluateTime; - - @Schema(description = "医生") - private Integer doctorId; - - @Schema(description = "医生名称") - @TableField(exist = false) - private String doctorName; - - @Schema(description = "医生职位") - @TableField(exist = false) - private String doctorPosition; - - @Schema(description = "患者") - private Integer userId; - - @Schema(description = "患者名称") - @TableField(exist = false) - private String nickname; - - @Schema(description = "手机") - @TableField(exist = false) - private String phone; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "排序号") - private Integer sortNumber; - - @Schema(description = "是否删除") - private Integer isDelete; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicDoctorApply.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicDoctorApply.java deleted file mode 100644 index 8d8e173..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicDoctorApply.java +++ /dev/null @@ -1,125 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.IdType; -import java.time.LocalDate; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * 医生入驻申请 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicDoctorApply对象", description = "医生入驻申请") -public class ClinicDoctorApply implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "apply_id", type = IdType.AUTO) - private Integer applyId; - - @Schema(description = "类型 0医生") - private Integer type; - - @Schema(description = "用户ID") - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "性别 1男 2女") - private Integer gender; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "客户名称") - private String dealerName; - - @Schema(description = "证件号码") - private String idCard; - - @Schema(description = "生日") - @JsonFormat(pattern = "yyyy-MM-dd") - private LocalDate birthDate; - - @Schema(description = "区分职称等级(如主治医师、副主任医师)") - private String professionalTitle; - - @Schema(description = "工作单位") - private String workUnit; - - @Schema(description = "执业资格核心凭证") - private String practiceLicense; - - @Schema(description = "限定可执业科室或疾病类型") - private String practiceScope; - - @Schema(description = "开始工作时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime startWorkDate; - - @Schema(description = "简历") - private String resume; - - @Schema(description = "使用 JSON 存储多个证件文件路径(如执业证、学历证)") - private String certificationFiles; - - @Schema(description = "详细地址") - private String address; - - @Schema(description = "签约价格") - private BigDecimal money; - - @Schema(description = "推荐人用户ID") - private Integer refereeId; - - @Schema(description = "申请方式(10需后台审核 20无需审核)") - private Integer applyType; - - @Schema(description = "审核状态 (10待审核 20审核通过 30驳回)") - private Integer applyStatus; - - @Schema(description = "申请时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime applyTime; - - @Schema(description = "审核时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime auditTime; - - @Schema(description = "合同时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime contractTime; - - @Schema(description = "过期时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime expirationTime; - - @Schema(description = "驳回原因") - private String rejectReason; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "商城ID") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicDoctorUser.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicDoctorUser.java deleted file mode 100644 index b95c86b..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicDoctorUser.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 分销商用户记录表 - * - * @author 科技小王子 - * @since 2025-10-23 15:58:20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicDoctorUser对象", description = "分销商用户记录表") -public class ClinicDoctorUser implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "类型 0经销商 1企业 2集团") - private Integer type; - - @Schema(description = "自增ID") - private Integer userId; - - @Schema(description = "昵称") - @TableField(exist = false) - private String nickname; - - @Schema(description = "头像") - @TableField(exist = false) - private String avatar; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "手机号") - @TableField(exist = false) - private String phone; - - @Schema(description = "部门") - private Integer departmentId; - - @Schema(description = "专业领域") - private String specialty; - - @Schema(description = "职务级别") - private String position; - - @Schema(description = "执业资格") - private String qualification; - - @Schema(description = "医生简介") - private String introduction; - - @Schema(description = "挂号费") - private BigDecimal consultationFee; - - @Schema(description = "工作年限") - private Integer workYears; - - @Schema(description = "问诊人数") - private Integer consultationCount; - - @Schema(description = "专属二维码") - private String qrcode; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "排序号") - private Integer sortNumber; - - @Schema(description = "是否删除") - private Integer isDelete; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicine.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicine.java deleted file mode 100644 index 43aa6df..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicine.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 药品库 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:31 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicMedicine对象", description = "药品库") -public class ClinicMedicine implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "药名") - private String name; - - @Schema(description = "拼音") - private String pinyin; - - @Schema(description = "分类(如“清热解毒”、“补气养血”)") - private String category; - - @Schema(description = "规格(如“饮片”、“颗粒”)") - private String specification; - - @Schema(description = "单位(如“克”、“袋”)") - private String unit; - - @Schema(description = "描述") - private String content; - - @Schema(description = "单价") - private BigDecimal pricePerUnit; - - @Schema(description = "是否活跃") - private Integer isActive; - - @Schema(description = "买家用户ID") - private Integer userId; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "商城ID") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicineInout.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicineInout.java deleted file mode 100644 index 3d3f428..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicineInout.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 出入库 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicMedicineInout对象", description = "出入库") -public class ClinicMedicineInout implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "买家用户ID") - private Integer userId; - - @Schema(description = "订单编号") - private String orderNo; - - @Schema(description = "分销商用户id(一级)") - private Integer firstUserId; - - @Schema(description = "分销商用户id(二级)") - private Integer secondUserId; - - @Schema(description = "分销商用户id(三级)") - private Integer thirdUserId; - - @Schema(description = "分销佣金(一级)") - private BigDecimal firstMoney; - - @Schema(description = "分销佣金(二级)") - private BigDecimal secondMoney; - - @Schema(description = "分销佣金(三级)") - private BigDecimal thirdMoney; - - @Schema(description = "单价") - private BigDecimal price; - - @Schema(description = "订单总金额") - private BigDecimal orderPrice; - - @Schema(description = "结算金额") - private BigDecimal settledPrice; - - @Schema(description = "换算成度") - private BigDecimal degreePrice; - - @Schema(description = "实发金额") - private BigDecimal payPrice; - - @Schema(description = "税率") - private BigDecimal rate; - - @Schema(description = "结算月份") - private String month; - - @Schema(description = "订单是否失效(0未失效 1已失效)") - private Integer isInvalid; - - @Schema(description = "佣金结算(0未结算 1已结算)") - private Integer isSettled; - - @Schema(description = "结算时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime settleTime; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "商城ID") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicineStock.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicineStock.java deleted file mode 100644 index aa5973a..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicMedicineStock.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 药品库存 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicMedicineStock对象", description = "药品库存") -public class ClinicMedicineStock implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "药品") - private Integer medicineId; - - @Schema(description = "库存数量") - private Integer stockQuantity; - - @Schema(description = "最小库存预警") - private Integer minStockLevel; - - @Schema(description = "上次更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime lastUpdated; - - @Schema(description = "买家用户ID") - private Integer userId; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "商城ID") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicPatientUser.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicPatientUser.java deleted file mode 100644 index 1b99fcb..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicPatientUser.java +++ /dev/null @@ -1,85 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import java.math.BigDecimal; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; -import com.fasterxml.jackson.annotation.JsonFormat; - -/** - * 患者 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicPatientUser对象", description = "患者") -public class ClinicPatientUser implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "类型 0经销商 1企业 2集团") - private Integer type; - - @Schema(description = "自增ID") - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "头像") - @TableField(exist = false) - private String avatar; - - @Schema(description = "手机号") - @TableField(exist = false) - private String phone; - - @Schema(description = "性别 0未知 1男 2女") - private Integer sex; - - @Schema(description = "年龄") - private Integer age; - - @Schema(description = "身高") - private String height; - - @Schema(description = "体重") - private String weight; - - @Schema(description = "过敏史") - private String allergyHistory; - - @Schema(description = "专属二维码") - private String qrcode; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "排序号") - private Integer sortNumber; - - @Schema(description = "是否删除") - private Integer isDelete; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicPrescription.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicPrescription.java deleted file mode 100644 index 688adfd..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicPrescription.java +++ /dev/null @@ -1,133 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.gxwebsoft.shop.entity.ShopOrder; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; -import java.util.List; - -/** - * 处方主表 - - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicPrescription对象", description = "处方主表") -public class ClinicPrescription implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "患者") - private Integer userId; - - @Schema(description = "患者名称") - @TableField(exist = false) - private String realName; - - @Schema(description = "年龄") - @TableField(exist = false) - private String age; - - @Schema(description = "身高") - @TableField(exist = false) - private String height; - - @Schema(description = "体重") - @TableField(exist = false) - private String weight; - - @Schema(description = "医生") - private Integer doctorId; - - @Schema(description = "医生名称") - @TableField(exist = false) - private String doctorName; - - @Schema(description = "医生资格") - @TableField(exist = false) - private String qualification; - - @Schema(description = "订单编号") - private String orderNo; - - @Schema(description = "0未付款,1已付款") - @TableField(exist = false) - private Boolean payStatus; - - @Schema(description = "0未使用,1已完成,2已取消,3取消中,4退款申请中,5退款被拒绝,6退款成功,7客户端申请退款") - @TableField(exist = false) - private Integer orderStatus; - - @Schema(description = "关联就诊表") - private Integer visitRecordId; - - @Schema(description = "处方类型 0中药 1西药") - private Integer prescriptionType; - - @Schema(description = "诊断结果") - private String diagnosis; - - @Schema(description = "治疗方案") - private String treatmentPlan; - - @Schema(description = "煎药说明") - private String decoctionInstructions; - - @Schema(description = "上传附件") - private String image; - - @Schema(description = "订单总金额") - private BigDecimal orderPrice; - - @Schema(description = "单价") - private BigDecimal price; - - @Schema(description = "实付金额") - private BigDecimal payPrice; - - @Schema(description = "订单是否失效(0未失效 1已失效)") - private Integer isInvalid; - - @Schema(description = "结算(0未结算 1已结算)") - private Integer isSettled; - - @Schema(description = "结算时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime settleTime; - - @Schema(description = "状态, 0正常, 1已完成,2已支付,3已取消") - private Integer status; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "商城ID") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - - @Schema(description = "处方明细") - @TableField(exist = false) - private List items; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/entity/ClinicPrescriptionItem.java b/src/main/java/com/gxwebsoft/clinic/entity/ClinicPrescriptionItem.java deleted file mode 100644 index 78329d0..0000000 --- a/src/main/java/com/gxwebsoft/clinic/entity/ClinicPrescriptionItem.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.gxwebsoft.clinic.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import com.fasterxml.jackson.annotation.JsonFormat; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 处方明细表 - - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(name = "ClinicPrescriptionItem对象", description = "处方明细表") -public class ClinicPrescriptionItem implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "自增ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "关联处方") - private Integer prescriptionId; - - @Schema(description = "订单编号") - private String prescriptionNo; - - @Schema(description = "关联药品") - private Integer medicineId; - - @Schema(description = "药品名称") - @TableField(exist = false) - private String medicineName; - - @Schema(description = "规格") - @TableField(exist = false) - private String specification; - - @Schema(description = "单位") - @TableField(exist = false) - private String unit; - - @Schema(description = "单价") - @TableField(exist = false) - private BigDecimal pricePerUnit; - - @Schema(description = "药品") - @TableField(exist = false) - private ClinicMedicine clinicMedicine; - - @Schema(description = "剂量(如“10g”)") - private String dosage; - - @Schema(description = "用法频率(如“每日三次”)") - private String usageFrequency; - - @Schema(description = "服用天数") - private Integer days; - - @Schema(description = "购买数量") - private Integer amount; - - @Schema(description = "单价") - private BigDecimal unitPrice; - - @Schema(description = "数量") - private Integer quantity; - - @Schema(description = "排序号") - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "用户id") - private Integer userId; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "更新时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicAppointmentMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicAppointmentMapper.java deleted file mode 100644 index adcec99..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicAppointmentMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicAppointment; -import com.gxwebsoft.clinic.param.ClinicAppointmentParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 挂号Mapper - * - * @author 科技小王子 - * @since 2025-10-19 09:27:03 - */ -public interface ClinicAppointmentMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicAppointmentParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicAppointmentParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicDoctorApplyMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicDoctorApplyMapper.java deleted file mode 100644 index 2a08473..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicDoctorApplyMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicDoctorApply; -import com.gxwebsoft.clinic.param.ClinicDoctorApplyParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 医生入驻申请Mapper - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicDoctorApplyMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicDoctorApplyParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicDoctorApplyParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicDoctorUserMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicDoctorUserMapper.java deleted file mode 100644 index ffda343..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicDoctorUserMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicDoctorUser; -import com.gxwebsoft.clinic.param.ClinicDoctorUserParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 分销商用户记录表Mapper - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicDoctorUserMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicDoctorUserParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicDoctorUserParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineInoutMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineInoutMapper.java deleted file mode 100644 index 9454319..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineInoutMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicMedicineInout; -import com.gxwebsoft.clinic.param.ClinicMedicineInoutParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 出入库Mapper - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -public interface ClinicMedicineInoutMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicMedicineInoutParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicMedicineInoutParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineMapper.java deleted file mode 100644 index 8fca0aa..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicMedicine; -import com.gxwebsoft.clinic.param.ClinicMedicineParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 药品库Mapper - * - * @author 科技小王子 - * @since 2025-10-22 02:06:31 - */ -public interface ClinicMedicineMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicMedicineParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicMedicineParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineStockMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineStockMapper.java deleted file mode 100644 index 9a95139..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicMedicineStockMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicMedicineStock; -import com.gxwebsoft.clinic.param.ClinicMedicineStockParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 药品库存Mapper - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -public interface ClinicMedicineStockMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicMedicineStockParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicMedicineStockParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPatientUserMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPatientUserMapper.java deleted file mode 100644 index bf25805..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPatientUserMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicPatientUser; -import com.gxwebsoft.clinic.param.ClinicPatientUserParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 患者Mapper - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicPatientUserMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicPatientUserParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicPatientUserParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPrescriptionItemMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPrescriptionItemMapper.java deleted file mode 100644 index 1a21b01..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPrescriptionItemMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicPrescriptionItem; -import com.gxwebsoft.clinic.param.ClinicPrescriptionItemParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 处方明细表 -Mapper - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -public interface ClinicPrescriptionItemMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicPrescriptionItemParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicPrescriptionItemParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPrescriptionMapper.java b/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPrescriptionMapper.java deleted file mode 100644 index 6eeefda..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/ClinicPrescriptionMapper.java +++ /dev/null @@ -1,38 +0,0 @@ -package com.gxwebsoft.clinic.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.clinic.entity.ClinicPrescription; -import com.gxwebsoft.clinic.param.ClinicPrescriptionParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 处方主表 -Mapper - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -public interface ClinicPrescriptionMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") ClinicPrescriptionParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") ClinicPrescriptionParam param); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicAppointmentMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicAppointmentMapper.xml deleted file mode 100644 index 5aee909..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicAppointmentMapper.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - SELECT a.*, b.nickname, b.phone, c.real_name as doctorName, c.position as doctorPosition - FROM clinic_appointment a - LEFT JOIN gxwebsoft_core.sys_user b ON a.user_id = b.user_id - LEFT JOIN clinic_doctor_user c ON a.doctor_id = c.user_id - - - AND a.id = #{param.id} - - - AND a.type = #{param.type} - - - AND a.reason LIKE CONCAT('%', #{param.reason}, '%') - - - AND a.evaluate_time LIKE CONCAT('%', #{param.evaluateTime}, '%') - - - AND a.doctor_id = #{param.doctorId} - - - AND a.user_id = #{param.userId} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.sort_number = #{param.sortNumber} - - - AND a.is_delete = #{param.isDelete} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicDoctorApplyMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicDoctorApplyMapper.xml deleted file mode 100644 index c701860..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicDoctorApplyMapper.xml +++ /dev/null @@ -1,114 +0,0 @@ - - - - - - - SELECT a.* - FROM clinic_doctor_apply a - - - AND a.apply_id = #{param.applyId} - - - AND a.type = #{param.type} - - - AND a.user_id = #{param.userId} - - - AND a.real_name LIKE CONCAT('%', #{param.realName}, '%') - - - AND a.gender = #{param.gender} - - - AND a.mobile LIKE CONCAT('%', #{param.mobile}, '%') - - - AND a.dealer_name LIKE CONCAT('%', #{param.dealerName}, '%') - - - AND a.id_card LIKE CONCAT('%', #{param.idCard}, '%') - - - AND a.birth_date LIKE CONCAT('%', #{param.birthDate}, '%') - - - AND a.professional_title LIKE CONCAT('%', #{param.professionalTitle}, '%') - - - AND a.work_unit LIKE CONCAT('%', #{param.workUnit}, '%') - - - AND a.practice_license LIKE CONCAT('%', #{param.practiceLicense}, '%') - - - AND a.practice_scope LIKE CONCAT('%', #{param.practiceScope}, '%') - - - AND a.start_work_date LIKE CONCAT('%', #{param.startWorkDate}, '%') - - - AND a.resume LIKE CONCAT('%', #{param.resume}, '%') - - - AND a.certification_files LIKE CONCAT('%', #{param.certificationFiles}, '%') - - - AND a.address LIKE CONCAT('%', #{param.address}, '%') - - - AND a.money = #{param.money} - - - AND a.referee_id = #{param.refereeId} - - - AND a.apply_type = #{param.applyType} - - - AND a.apply_status = #{param.applyStatus} - - - AND a.apply_time LIKE CONCAT('%', #{param.applyTime}, '%') - - - AND a.audit_time LIKE CONCAT('%', #{param.auditTime}, '%') - - - AND a.contract_time LIKE CONCAT('%', #{param.contractTime}, '%') - - - AND a.expiration_time LIKE CONCAT('%', #{param.expirationTime}, '%') - - - AND a.reject_reason LIKE CONCAT('%', #{param.rejectReason}, '%') - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicDoctorUserMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicDoctorUserMapper.xml deleted file mode 100644 index 61e787f..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicDoctorUserMapper.xml +++ /dev/null @@ -1,86 +0,0 @@ - - - - - - - SELECT a.*, b.nickname, b.phone, b.avatar - FROM clinic_doctor_user a - LEFT JOIN gxwebsoft_core.sys_user b ON a.user_id = b.user_id - - - AND a.id = #{param.id} - - - AND a.type = #{param.type} - - - AND a.user_id = #{param.userId} - - - AND a.real_name LIKE CONCAT('%', #{param.realName}, '%') - - - AND a.phone LIKE CONCAT('%', #{param.phone}, '%') - - - AND a.department_id = #{param.departmentId} - - - AND a.specialty LIKE CONCAT('%', #{param.specialty}, '%') - - - AND a.position LIKE CONCAT('%', #{param.position}, '%') - - - AND a.qualification LIKE CONCAT('%', #{param.qualification}, '%') - - - AND a.introduction LIKE CONCAT('%', #{param.introduction}, '%') - - - AND a.consultation_fee = #{param.consultationFee} - - - AND a.work_years = #{param.workYears} - - - AND a.consultation_count = #{param.consultationCount} - - - AND a.qrcode LIKE CONCAT('%', #{param.qrcode}, '%') - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.sort_number = #{param.sortNumber} - - - AND a.is_delete = #{param.isDelete} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - OR a.real_name = #{param.keywords} - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineInoutMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineInoutMapper.xml deleted file mode 100644 index 0e49aac..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineInoutMapper.xml +++ /dev/null @@ -1,93 +0,0 @@ - - - - - - - SELECT a.* - FROM clinic_medicine_inout a - - - AND a.id = #{param.id} - - - AND a.user_id = #{param.userId} - - - AND a.order_no LIKE CONCAT('%', #{param.orderNo}, '%') - - - AND a.first_user_id = #{param.firstUserId} - - - AND a.second_user_id = #{param.secondUserId} - - - AND a.third_user_id = #{param.thirdUserId} - - - AND a.first_money = #{param.firstMoney} - - - AND a.second_money = #{param.secondMoney} - - - AND a.third_money = #{param.thirdMoney} - - - AND a.price = #{param.price} - - - AND a.order_price = #{param.orderPrice} - - - AND a.settled_price = #{param.settledPrice} - - - AND a.degree_price = #{param.degreePrice} - - - AND a.pay_price = #{param.payPrice} - - - AND a.rate = #{param.rate} - - - AND a.month LIKE CONCAT('%', #{param.month}, '%') - - - AND a.is_invalid = #{param.isInvalid} - - - AND a.is_settled = #{param.isSettled} - - - AND a.settle_time LIKE CONCAT('%', #{param.settleTime}, '%') - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineMapper.xml deleted file mode 100644 index 644a454..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineMapper.xml +++ /dev/null @@ -1,66 +0,0 @@ - - - - - - - SELECT a.* - FROM clinic_medicine a - - - AND a.id = #{param.id} - - - AND a.name LIKE CONCAT('%', #{param.name}, '%') - - - AND a.pinyin LIKE CONCAT('%', #{param.pinyin}, '%') - - - AND a.category LIKE CONCAT('%', #{param.category}, '%') - - - AND a.specification LIKE CONCAT('%', #{param.specification}, '%') - - - AND a.unit LIKE CONCAT('%', #{param.unit}, '%') - - - AND a.content LIKE CONCAT('%', #{param.content}, '%') - - - AND a.price_per_unit = #{param.pricePerUnit} - - - AND a.is_active = #{param.isActive} - - - AND a.user_id = #{param.userId} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineStockMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineStockMapper.xml deleted file mode 100644 index 93ffcd9..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicMedicineStockMapper.xml +++ /dev/null @@ -1,54 +0,0 @@ - - - - - - - SELECT a.* - FROM clinic_medicine_stock a - - - AND a.id = #{param.id} - - - AND a.medicine_id = #{param.medicineId} - - - AND a.stock_quantity = #{param.stockQuantity} - - - AND a.min_stock_level = #{param.minStockLevel} - - - AND a.last_updated LIKE CONCAT('%', #{param.lastUpdated}, '%') - - - AND a.user_id = #{param.userId} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPatientUserMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPatientUserMapper.xml deleted file mode 100644 index d2124a7..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPatientUserMapper.xml +++ /dev/null @@ -1,71 +0,0 @@ - - - - - - - SELECT a.*, b.phone, b.avatar - FROM clinic_patient_user a - LEFT JOIN gxwebsoft_core.sys_user b ON a.user_id = b.user_id - - - AND a.id = #{param.id} - - - AND a.type = #{param.type} - - - AND a.user_id = #{param.userId} - - - AND a.real_name LIKE CONCAT('%', #{param.realName}, '%') - - - AND a.age LIKE CONCAT('%', #{param.age}, '%') - - - AND a.qrcode LIKE CONCAT('%', #{param.qrcode}, '%') - - - AND a.height LIKE CONCAT('%', #{param.height}, '%') - - - AND a.weight LIKE CONCAT('%', #{param.weight}, '%') - - - AND a.allergy_history LIKE CONCAT('%', #{param.allergyHistory}, '%') - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.sort_number = #{param.sortNumber} - - - AND a.is_delete = #{param.isDelete} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - OR a.real_name = #{param.keywords} - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPrescriptionItemMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPrescriptionItemMapper.xml deleted file mode 100644 index bd5f01c..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPrescriptionItemMapper.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - SELECT a.*, b.name AS medicineName, b.specification, b.unit, b.price_per_unit AS pricePerUnit - FROM clinic_prescription_item a - LEFT JOIN clinic_medicine b ON a.id = b.id - - - AND a.id = #{param.id} - - - AND a.prescription_id = #{param.prescriptionId} - - - AND a.prescription_no LIKE CONCAT('%', #{param.prescriptionNo}, '%') - - - AND a.medicine_id = #{param.medicineId} - - - AND a.dosage LIKE CONCAT('%', #{param.dosage}, '%') - - - AND a.usage_frequency LIKE CONCAT('%', #{param.usageFrequency}, '%') - - - AND a.days = #{param.days} - - - AND a.amount = #{param.amount} - - - AND a.unit_price = #{param.unitPrice} - - - AND a.quantity = #{param.quantity} - - - AND a.sort_number = #{param.sortNumber} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.user_id = #{param.userId} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPrescriptionMapper.xml b/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPrescriptionMapper.xml deleted file mode 100644 index 877387d..0000000 --- a/src/main/java/com/gxwebsoft/clinic/mapper/xml/ClinicPrescriptionMapper.xml +++ /dev/null @@ -1,132 +0,0 @@ - - - - - - - SELECT a.*, b.real_name, b.age, b.sex, b.height, b.weight, c.real_name as doctorName, c.qualification, d.order_status as orderStatus, d.pay_status as payStatus - FROM clinic_prescription a - LEFT JOIN clinic_patient_user b ON a.user_id = b.user_id - LEFT JOIN clinic_doctor_user c ON a.doctor_id = c.user_id - LEFT JOIN shop_order d ON a.order_no = d.order_no - - - AND a.id = #{param.id} - - - AND a.user_id = #{param.userId} - - - AND a.doctor_id = #{param.doctorId} - - - AND a.order_no LIKE CONCAT('%', #{param.orderNo}, '%') - - - AND a.visit_record_id = #{param.visitRecordId} - - - AND a.prescription_type = #{param.prescriptionType} - - - AND a.diagnosis LIKE CONCAT('%', #{param.diagnosis}, '%') - - - AND a.treatment_plan LIKE CONCAT('%', #{param.treatmentPlan}, '%') - - - AND a.decoction_instructions LIKE CONCAT('%', #{param.decoctionInstructions}, '%') - - - AND a.order_price = #{param.orderPrice} - - - AND a.price = #{param.price} - - - AND a.pay_price = #{param.payPrice} - - - AND a.is_invalid = #{param.isInvalid} - - - AND a.is_settled = #{param.isSettled} - - - AND a.id IN - - #{item} - - - - AND a.settle_time LIKE CONCAT('%', #{param.settleTime}, '%') - - - AND a.status = #{param.status} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - AND d.pay_status = 0 AND d.order_status = 0 - - - - AND d.pay_status = 1 AND d.delivery_status = 10 AND d.order_status = 0 - - - - AND d.pay_status = 1 AND d.order_status = 0 - - - - AND d.delivery_status = 20 AND d.order_status != 1 - - - - AND d.order_status = 1 AND d.evaluate_status = 0 - - - - AND d.order_status = 1 - - - - AND (d.order_status = 4 OR d.order_status = 5 OR d.order_status = 6 OR d.order_status = 7) - - - - AND d.deleted = 1 - - - - AND a.order_status = 2 - - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicAppointmentParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicAppointmentParam.java deleted file mode 100644 index a6e6a17..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicAppointmentParam.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 挂号查询参数 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:03 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicAppointmentParam对象", description = "挂号查询参数") -public class ClinicAppointmentParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "类型") - @QueryField(type = QueryType.EQ) - private Integer type; - - @Schema(description = "就诊原因") - private String reason; - - @Schema(description = "挂号时间") - private String evaluateTime; - - @Schema(description = "医生") - @QueryField(type = QueryType.EQ) - private Integer doctorId; - - @Schema(description = "患者") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "排序号") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "是否删除") - @QueryField(type = QueryType.EQ) - private Integer isDelete; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicDoctorApplyParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicDoctorApplyParam.java deleted file mode 100644 index e9863da..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicDoctorApplyParam.java +++ /dev/null @@ -1,114 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 医生入驻申请查询参数 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicDoctorApplyParam对象", description = "医生入驻申请查询参数") -public class ClinicDoctorApplyParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer applyId; - - @Schema(description = "类型 0医生") - @QueryField(type = QueryType.EQ) - private Integer type; - - @Schema(description = "用户ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "性别 1男 2女") - @QueryField(type = QueryType.EQ) - private Integer gender; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "客户名称") - private String dealerName; - - @Schema(description = "证件号码") - private String idCard; - - @Schema(description = "生日") - private String birthDate; - - @Schema(description = "区分职称等级(如主治医师、副主任医师)") - private String professionalTitle; - - @Schema(description = "工作单位") - private String workUnit; - - @Schema(description = "执业资格核心凭证") - private String practiceLicense; - - @Schema(description = "限定可执业科室或疾病类型") - private String practiceScope; - - @Schema(description = "开始工作时间") - private String startWorkDate; - - @Schema(description = "简历") - private String resume; - - @Schema(description = "使用 JSON 存储多个证件文件路径(如执业证、学历证)") - private String certificationFiles; - - @Schema(description = "详细地址") - private String address; - - @Schema(description = "签约价格") - @QueryField(type = QueryType.EQ) - private BigDecimal money; - - @Schema(description = "推荐人用户ID") - @QueryField(type = QueryType.EQ) - private Integer refereeId; - - @Schema(description = "申请方式(10需后台审核 20无需审核)") - @QueryField(type = QueryType.EQ) - private Integer applyType; - - @Schema(description = "审核状态 (10待审核 20审核通过 30驳回)") - @QueryField(type = QueryType.EQ) - private Integer applyStatus; - - @Schema(description = "申请时间") - private String applyTime; - - @Schema(description = "审核时间") - private String auditTime; - - @Schema(description = "合同时间") - private String contractTime; - - @Schema(description = "过期时间") - private String expirationTime; - - @Schema(description = "驳回原因") - private String rejectReason; - - @Schema(description = "备注") - private String comments; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicDoctorUserParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicDoctorUserParam.java deleted file mode 100644 index 5157044..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicDoctorUserParam.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.math.BigDecimal; - -/** - * 分销商用户记录表查询参数 - * - * @author 科技小王子 - * @since 2025-10-23 15:58:20 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicDoctorUserParam对象", description = "分销商用户记录表查询参数") -public class ClinicDoctorUserParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "类型 0经销商 1企业 2集团") - @QueryField(type = QueryType.EQ) - private Integer type; - - @Schema(description = "自增ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "手机号") - private String phone; - - @Schema(description = "部门") - @QueryField(type = QueryType.EQ) - private Integer departmentId; - - @Schema(description = "专业领域") - private String specialty; - - @Schema(description = "职务级别") - private String position; - - @Schema(description = "执业资格") - private String qualification; - - @Schema(description = "医生简介") - private String introduction; - - @Schema(description = "挂号费") - @QueryField(type = QueryType.EQ) - private BigDecimal consultationFee; - - @Schema(description = "工作年限") - @QueryField(type = QueryType.EQ) - private Integer workYears; - - @Schema(description = "问诊人数") - @QueryField(type = QueryType.EQ) - private Integer consultationCount; - - @Schema(description = "专属二维码") - private String qrcode; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "排序号") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "是否删除") - @QueryField(type = QueryType.EQ) - private Integer isDelete; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineInoutParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineInoutParam.java deleted file mode 100644 index a438209..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineInoutParam.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.math.BigDecimal; - -/** - * 出入库查询参数 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicMedicineInoutParam对象", description = "出入库查询参数") -public class ClinicMedicineInoutParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "买家用户ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "订单编号") - private String orderNo; - - @Schema(description = "分销商用户id(一级)") - @QueryField(type = QueryType.EQ) - private Integer firstUserId; - - @Schema(description = "分销商用户id(二级)") - @QueryField(type = QueryType.EQ) - private Integer secondUserId; - - @Schema(description = "分销商用户id(三级)") - @QueryField(type = QueryType.EQ) - private Integer thirdUserId; - - @Schema(description = "分销佣金(一级)") - @QueryField(type = QueryType.EQ) - private BigDecimal firstMoney; - - @Schema(description = "分销佣金(二级)") - @QueryField(type = QueryType.EQ) - private BigDecimal secondMoney; - - @Schema(description = "分销佣金(三级)") - @QueryField(type = QueryType.EQ) - private BigDecimal thirdMoney; - - @Schema(description = "单价") - @QueryField(type = QueryType.EQ) - private BigDecimal price; - - @Schema(description = "订单总金额") - @QueryField(type = QueryType.EQ) - private BigDecimal orderPrice; - - @Schema(description = "结算金额") - @QueryField(type = QueryType.EQ) - private BigDecimal settledPrice; - - @Schema(description = "换算成度") - @QueryField(type = QueryType.EQ) - private BigDecimal degreePrice; - - @Schema(description = "实发金额") - @QueryField(type = QueryType.EQ) - private BigDecimal payPrice; - - @Schema(description = "税率") - @QueryField(type = QueryType.EQ) - private BigDecimal rate; - - @Schema(description = "结算月份") - private String month; - - @Schema(description = "订单是否失效(0未失效 1已失效)") - @QueryField(type = QueryType.EQ) - private Integer isInvalid; - - @Schema(description = "佣金结算(0未结算 1已结算)") - @QueryField(type = QueryType.EQ) - private Integer isSettled; - - @Schema(description = "结算时间") - private String settleTime; - - @Schema(description = "备注") - private String comments; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineParam.java deleted file mode 100644 index 71f4744..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineParam.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.math.BigDecimal; - -/** - * 药品库查询参数 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:31 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicMedicineParam对象", description = "药品库查询参数") -public class ClinicMedicineParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "药名") - private String name; - - @Schema(description = "拼音") - private String pinyin; - - @Schema(description = "分类(如“清热解毒”、“补气养血”)") - private String category; - - @Schema(description = "规格(如“饮片”、“颗粒”)") - private String specification; - - @Schema(description = "单位(如“克”、“袋”)") - private String unit; - - @Schema(description = "描述") - private String content; - - @Schema(description = "单价") - @QueryField(type = QueryType.EQ) - private BigDecimal pricePerUnit; - - @Schema(description = "是否活跃") - @QueryField(type = QueryType.EQ) - private Integer isActive; - - @Schema(description = "买家用户ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "备注") - private String comments; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineStockParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineStockParam.java deleted file mode 100644 index a784c67..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicMedicineStockParam.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 药品库存查询参数 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicMedicineStockParam对象", description = "药品库存查询参数") -public class ClinicMedicineStockParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "药品") - @QueryField(type = QueryType.EQ) - private Integer medicineId; - - @Schema(description = "库存数量") - @QueryField(type = QueryType.EQ) - private Integer stockQuantity; - - @Schema(description = "最小库存预警") - @QueryField(type = QueryType.EQ) - private Integer minStockLevel; - - @Schema(description = "上次更新时间") - private String lastUpdated; - - @Schema(description = "买家用户ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "备注") - private String comments; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicPatientUserParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicPatientUserParam.java deleted file mode 100644 index 79373df..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicPatientUserParam.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 患者查询参数 - * - * @author 科技小王子 - * @since 2025-10-23 15:27:17 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicPatientUserParam对象", description = "患者查询参数") -public class ClinicPatientUserParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "类型 0经销商 1企业 2集团") - @QueryField(type = QueryType.EQ) - private Integer type; - - @Schema(description = "自增ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "年龄") - private String age; - - @Schema(description = "专属二维码") - private String qrcode; - - @Schema(description = "身高") - private String height; - - @Schema(description = "体重") - private String weight; - - @Schema(description = "过敏史") - private String allergyHistory; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "排序号") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "是否删除") - @QueryField(type = QueryType.EQ) - private Integer isDelete; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicPrescriptionItemParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicPrescriptionItemParam.java deleted file mode 100644 index 5f83762..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicPrescriptionItemParam.java +++ /dev/null @@ -1,81 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.math.BigDecimal; -import java.util.Set; - -/** - * 处方明细表 -查询参数 - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicPrescriptionItemParam对象", description = "处方明细表 查询参数") -public class ClinicPrescriptionItemParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "自增ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "关联处方") - @QueryField(type = QueryType.EQ) - private Integer prescriptionId; - - @Schema(description = "订单编号") - private String prescriptionNo; - - @Schema(description = "关联药品") - @QueryField(type = QueryType.EQ) - private Integer medicineId; - - @Schema(description = "剂量(如“10g”)") - private String dosage; - - @Schema(description = "用法频率(如“每日三次”)") - private String usageFrequency; - - @Schema(description = "服用天数") - @QueryField(type = QueryType.EQ) - private Integer days; - - @Schema(description = "购买数量") - @QueryField(type = QueryType.EQ) - private Integer amount; - - @Schema(description = "单价") - @QueryField(type = QueryType.EQ) - private BigDecimal unitPrice; - - @Schema(description = "数量") - @QueryField(type = QueryType.EQ) - private Integer quantity; - - @Schema(description = "排序号") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "用户id") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "处方ID集查询") - @TableField(exist = false) - private Set prescriptionIds; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/param/ClinicPrescriptionParam.java b/src/main/java/com/gxwebsoft/clinic/param/ClinicPrescriptionParam.java deleted file mode 100644 index e8c0a81..0000000 --- a/src/main/java/com/gxwebsoft/clinic/param/ClinicPrescriptionParam.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.gxwebsoft.clinic.param; - -import com.baomidou.mybatisplus.annotation.TableField; -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.math.BigDecimal; -import java.util.Set; - -/** - * 处方主表 -查询参数 - * - * @author 科技小王子 - * @since 2025-10-22 02:01:12 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(name = "ClinicPrescriptionParam对象", description = "处方主表查询参数") -public class ClinicPrescriptionParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "患者") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "医生") - @QueryField(type = QueryType.EQ) - private Integer doctorId; - - @Schema(description = "订单编号") - private String orderNo; - - @Schema(description = "订单类型 0商城订单 1处方订单") - private Integer type; - - @Schema(description = "关联就诊表") - @QueryField(type = QueryType.EQ) - private Integer visitRecordId; - - @Schema(description = "处方类型 0中药 1西药") - @QueryField(type = QueryType.EQ) - private Integer prescriptionType; - - @Schema(description = "诊断结果") - private String diagnosis; - - @Schema(description = "治疗方案") - private String treatmentPlan; - - @Schema(description = "煎药说明") - private String decoctionInstructions; - - @Schema(description = "订单总金额") - @QueryField(type = QueryType.EQ) - private BigDecimal orderPrice; - - @Schema(description = "单价") - @QueryField(type = QueryType.EQ) - private BigDecimal price; - - @Schema(description = "实付金额") - @QueryField(type = QueryType.EQ) - private BigDecimal payPrice; - - @Schema(description = "订单是否失效(0未失效 1已失效)") - @QueryField(type = QueryType.EQ) - private Integer isInvalid; - - @Schema(description = "结算(0未结算 1已结算)") - @QueryField(type = QueryType.EQ) - private Integer isSettled; - - @Schema(description = "结算时间") - private String settleTime; - - @Schema(description = "状态, 0正常, 1已完成,2已支付,3已取消") - @QueryField(type = QueryType.EQ) - private Integer status; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "处方ID集查询") - @TableField(exist = false) - private Set ids; - - @Schema(description = "订单状态筛选:-1全部,0待支付,1待发货,2待核销,3待收货,4待评价,5已完成,6已退款,7已删除") - private Integer statusFilter; - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicAppointmentService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicAppointmentService.java deleted file mode 100644 index 28c7ac1..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicAppointmentService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.clinic.entity.ClinicAppointment; -import com.gxwebsoft.clinic.param.ClinicAppointmentParam; - -import java.util.List; - -/** - * 挂号Service - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicAppointmentService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicAppointmentParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicAppointmentParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicAppointment - */ - ClinicAppointment getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicDoctorApplyService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicDoctorApplyService.java deleted file mode 100644 index 228ac95..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicDoctorApplyService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.clinic.entity.ClinicDoctorApply; -import com.gxwebsoft.clinic.param.ClinicDoctorApplyParam; - -import java.util.List; - -/** - * 医生入驻申请Service - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicDoctorApplyService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicDoctorApplyParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicDoctorApplyParam param); - - /** - * 根据id查询 - * - * @param applyId 主键ID - * @return ClinicDoctorApply - */ - ClinicDoctorApply getByIdRel(Integer applyId); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicDoctorUserService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicDoctorUserService.java deleted file mode 100644 index a417b1d..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicDoctorUserService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.clinic.entity.ClinicDoctorUser; -import com.gxwebsoft.clinic.param.ClinicDoctorUserParam; - -import java.util.List; - -/** - * 分销商用户记录表Service - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicDoctorUserService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicDoctorUserParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicDoctorUserParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicDoctorUser - */ - ClinicDoctorUser getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineInoutService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineInoutService.java deleted file mode 100644 index f3c55fa..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineInoutService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.clinic.entity.ClinicMedicineInout; -import com.gxwebsoft.clinic.param.ClinicMedicineInoutParam; -import com.gxwebsoft.common.core.web.PageResult; - -import java.util.List; - -/** - * 出入库Service - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -public interface ClinicMedicineInoutService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicMedicineInoutParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicMedicineInoutParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicMedicineInout - */ - ClinicMedicineInout getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineService.java deleted file mode 100644 index e393701..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.clinic.entity.ClinicMedicine; -import com.gxwebsoft.clinic.param.ClinicMedicineParam; -import com.gxwebsoft.common.core.web.PageResult; - -import java.util.List; - -/** - * 药品库Service - * - * @author 科技小王子 - * @since 2025-10-22 02:06:31 - */ -public interface ClinicMedicineService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicMedicineParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicMedicineParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicMedicine - */ - ClinicMedicine getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineStockService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineStockService.java deleted file mode 100644 index 04e792a..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicMedicineStockService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.clinic.entity.ClinicMedicineStock; -import com.gxwebsoft.clinic.param.ClinicMedicineStockParam; -import com.gxwebsoft.common.core.web.PageResult; - -import java.util.List; - -/** - * 药品库存Service - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -public interface ClinicMedicineStockService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicMedicineStockParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicMedicineStockParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicMedicineStock - */ - ClinicMedicineStock getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicPatientUserService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicPatientUserService.java deleted file mode 100644 index df37cc3..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicPatientUserService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.clinic.entity.ClinicPatientUser; -import com.gxwebsoft.clinic.param.ClinicPatientUserParam; - -import java.util.List; - -/** - * 患者Service - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -public interface ClinicPatientUserService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicPatientUserParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicPatientUserParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicPatientUser - */ - ClinicPatientUser getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicPrescriptionItemService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicPrescriptionItemService.java deleted file mode 100644 index 42b8687..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicPrescriptionItemService.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.clinic.entity.ClinicPrescriptionItem; -import com.gxwebsoft.clinic.param.ClinicPrescriptionItemParam; -import com.gxwebsoft.common.core.web.PageResult; - -import java.util.List; - -/** - * 处方明细表 -Service - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -public interface ClinicPrescriptionItemService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicPrescriptionItemParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicPrescriptionItemParam param); - - /** - * 根据id查询 - * - * @param id 自增ID - * @return ClinicPrescriptionItem - */ - ClinicPrescriptionItem getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/ClinicPrescriptionService.java b/src/main/java/com/gxwebsoft/clinic/service/ClinicPrescriptionService.java deleted file mode 100644 index 5e6d4c0..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/ClinicPrescriptionService.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.gxwebsoft.clinic.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.clinic.entity.ClinicPrescription; -import com.gxwebsoft.clinic.param.ClinicPrescriptionParam; -import com.gxwebsoft.common.core.web.PageResult; - -import java.util.List; - -/** - * 处方主表 -Service - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -public interface ClinicPrescriptionService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(ClinicPrescriptionParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(ClinicPrescriptionParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return ClinicPrescription - */ - ClinicPrescription getByIdRel(Integer id); - - // 添加成功后返回数据 - ClinicPrescription getByLastId(ClinicPrescription clinicPrescription); -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicAppointmentServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicAppointmentServiceImpl.java deleted file mode 100644 index 2af3f86..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicAppointmentServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.mapper.ClinicAppointmentMapper; -import com.gxwebsoft.clinic.service.ClinicAppointmentService; -import com.gxwebsoft.clinic.entity.ClinicAppointment; -import com.gxwebsoft.clinic.param.ClinicAppointmentParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 挂号Service实现 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Service -public class ClinicAppointmentServiceImpl extends ServiceImpl implements ClinicAppointmentService { - - @Override - public PageResult pageRel(ClinicAppointmentParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicAppointmentParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicAppointment getByIdRel(Integer id) { - ClinicAppointmentParam param = new ClinicAppointmentParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicDoctorApplyServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicDoctorApplyServiceImpl.java deleted file mode 100644 index 9ba52d1..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicDoctorApplyServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.mapper.ClinicDoctorApplyMapper; -import com.gxwebsoft.clinic.service.ClinicDoctorApplyService; -import com.gxwebsoft.clinic.entity.ClinicDoctorApply; -import com.gxwebsoft.clinic.param.ClinicDoctorApplyParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 医生入驻申请Service实现 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Service -public class ClinicDoctorApplyServiceImpl extends ServiceImpl implements ClinicDoctorApplyService { - - @Override - public PageResult pageRel(ClinicDoctorApplyParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicDoctorApplyParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicDoctorApply getByIdRel(Integer applyId) { - ClinicDoctorApplyParam param = new ClinicDoctorApplyParam(); - param.setApplyId(applyId); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicDoctorUserServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicDoctorUserServiceImpl.java deleted file mode 100644 index 5b65655..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicDoctorUserServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.mapper.ClinicDoctorUserMapper; -import com.gxwebsoft.clinic.service.ClinicDoctorUserService; -import com.gxwebsoft.clinic.entity.ClinicDoctorUser; -import com.gxwebsoft.clinic.param.ClinicDoctorUserParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 分销商用户记录表Service实现 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Service -public class ClinicDoctorUserServiceImpl extends ServiceImpl implements ClinicDoctorUserService { - - @Override - public PageResult pageRel(ClinicDoctorUserParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicDoctorUserParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicDoctorUser getByIdRel(Integer id) { - ClinicDoctorUserParam param = new ClinicDoctorUserParam(); - param.setUserId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineInoutServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineInoutServiceImpl.java deleted file mode 100644 index fbd1caf..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineInoutServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.entity.ClinicMedicineInout; -import com.gxwebsoft.clinic.mapper.ClinicMedicineInoutMapper; -import com.gxwebsoft.clinic.param.ClinicMedicineInoutParam; -import com.gxwebsoft.clinic.service.ClinicMedicineInoutService; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 出入库Service实现 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Service -public class ClinicMedicineInoutServiceImpl extends ServiceImpl implements ClinicMedicineInoutService { - - @Override - public PageResult pageRel(ClinicMedicineInoutParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicMedicineInoutParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicMedicineInout getByIdRel(Integer id) { - ClinicMedicineInoutParam param = new ClinicMedicineInoutParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineServiceImpl.java deleted file mode 100644 index cc6deba..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.entity.ClinicMedicine; -import com.gxwebsoft.clinic.mapper.ClinicMedicineMapper; -import com.gxwebsoft.clinic.param.ClinicMedicineParam; -import com.gxwebsoft.clinic.service.ClinicMedicineService; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 药品库Service实现 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:31 - */ -@Service -public class ClinicMedicineServiceImpl extends ServiceImpl implements ClinicMedicineService { - - @Override - public PageResult pageRel(ClinicMedicineParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicMedicineParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicMedicine getByIdRel(Integer id) { - ClinicMedicineParam param = new ClinicMedicineParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineStockServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineStockServiceImpl.java deleted file mode 100644 index 2364578..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicMedicineStockServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.entity.ClinicMedicineStock; -import com.gxwebsoft.clinic.mapper.ClinicMedicineStockMapper; -import com.gxwebsoft.clinic.param.ClinicMedicineStockParam; -import com.gxwebsoft.clinic.service.ClinicMedicineStockService; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 药品库存Service实现 - * - * @author 科技小王子 - * @since 2025-10-22 02:06:32 - */ -@Service -public class ClinicMedicineStockServiceImpl extends ServiceImpl implements ClinicMedicineStockService { - - @Override - public PageResult pageRel(ClinicMedicineStockParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicMedicineStockParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicMedicineStock getByIdRel(Integer id) { - ClinicMedicineStockParam param = new ClinicMedicineStockParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPatientUserServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPatientUserServiceImpl.java deleted file mode 100644 index a3968b2..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPatientUserServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.mapper.ClinicPatientUserMapper; -import com.gxwebsoft.clinic.service.ClinicPatientUserService; -import com.gxwebsoft.clinic.entity.ClinicPatientUser; -import com.gxwebsoft.clinic.param.ClinicPatientUserParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 患者Service实现 - * - * @author 科技小王子 - * @since 2025-10-19 09:27:04 - */ -@Service -public class ClinicPatientUserServiceImpl extends ServiceImpl implements ClinicPatientUserService { - - @Override - public PageResult pageRel(ClinicPatientUserParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicPatientUserParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicPatientUser getByIdRel(Integer id) { - ClinicPatientUserParam param = new ClinicPatientUserParam(); - param.setUserId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPrescriptionItemServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPrescriptionItemServiceImpl.java deleted file mode 100644 index 916b716..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPrescriptionItemServiceImpl.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.entity.ClinicPrescriptionItem; -import com.gxwebsoft.clinic.mapper.ClinicPrescriptionItemMapper; -import com.gxwebsoft.clinic.param.ClinicPrescriptionItemParam; -import com.gxwebsoft.clinic.service.ClinicPrescriptionItemService; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 处方明细表 -Service实现 - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Service -public class ClinicPrescriptionItemServiceImpl extends ServiceImpl implements ClinicPrescriptionItemService { - - @Override - public PageResult pageRel(ClinicPrescriptionItemParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicPrescriptionItemParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicPrescriptionItem getByIdRel(Integer id) { - ClinicPrescriptionItemParam param = new ClinicPrescriptionItemParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPrescriptionServiceImpl.java b/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPrescriptionServiceImpl.java deleted file mode 100644 index 742f741..0000000 --- a/src/main/java/com/gxwebsoft/clinic/service/impl/ClinicPrescriptionServiceImpl.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.gxwebsoft.clinic.service.impl; - -import cn.hutool.core.util.StrUtil; -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.clinic.entity.ClinicPrescription; -import com.gxwebsoft.clinic.entity.ClinicPrescriptionItem; -import com.gxwebsoft.clinic.mapper.ClinicPrescriptionMapper; -import com.gxwebsoft.clinic.param.ClinicPrescriptionItemParam; -import com.gxwebsoft.clinic.param.ClinicPrescriptionParam; -import com.gxwebsoft.clinic.service.ClinicPrescriptionItemService; -import com.gxwebsoft.clinic.service.ClinicPrescriptionService; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.shop.entity.ShopOrder; -import com.gxwebsoft.shop.entity.ShopOrderGoods; -import org.springframework.stereotype.Service; - -import javax.annotation.Resource; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - -/** - * 处方主表 -Service实现 - * - * @author 科技小王子 - * @since 2025-10-22 02:01:13 - */ -@Service -public class ClinicPrescriptionServiceImpl extends ServiceImpl implements ClinicPrescriptionService { - - @Resource - private ClinicPrescriptionItemService clinicPrescriptionItemService; - @Override - public PageResult pageRel(ClinicPrescriptionParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - // 查询处方明细 - Set collectIds = list.stream().map(ClinicPrescription::getId).collect(Collectors.toSet()); - final ClinicPrescriptionItemParam itemParam = new ClinicPrescriptionItemParam(); - itemParam.setPrescriptionIds(collectIds); - final List clinicPrescriptionItems = clinicPrescriptionItemService.listRel(itemParam); - final Map> collect = clinicPrescriptionItems.stream().collect(Collectors.groupingBy(ClinicPrescriptionItem::getPrescriptionId)); - list.forEach(d -> { - d.setItems(collect.get(d.getId())); - }); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(ClinicPrescriptionParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public ClinicPrescription getByIdRel(Integer id) { - ClinicPrescriptionParam param = new ClinicPrescriptionParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - - @Override - public ClinicPrescription getByLastId(ClinicPrescription clinicPrescription) { - return getOne(new LambdaQueryWrapper().orderByDesc(ClinicPrescription::getId).eq(ClinicPrescription::getUserId, clinicPrescription.getUserId()).last("limit 1")); - } - -} diff --git a/src/main/java/com/gxwebsoft/cms/controller/CmsAppController.java b/src/main/java/com/gxwebsoft/cms/controller/CmsAppController.java new file mode 100644 index 0000000..5aeb8f0 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/controller/CmsAppController.java @@ -0,0 +1,646 @@ +package com.gxwebsoft.cms.controller; + +import cn.hutool.core.date.DateTime; +import cn.hutool.core.date.DateUtil; +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gxwebsoft.cms.entity.*; +import com.gxwebsoft.cms.param.CmsNavigationParam; +import com.gxwebsoft.cms.service.CmsNavigationService; +import com.gxwebsoft.cms.service.CmsAppFieldService; +import com.gxwebsoft.cms.service.CmsAppSettingService; +import com.gxwebsoft.common.core.utils.CommonUtil; +import com.gxwebsoft.common.core.utils.RedisUtil; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.cms.service.CmsAppService; +import com.gxwebsoft.cms.param.CmsAppParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.BatchParam; +import com.gxwebsoft.common.system.entity.User; +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import lombok.extern.slf4j.Slf4j; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.*; + +import java.util.concurrent.TimeUnit; + +/** + * 网站信息记录表控制器 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Slf4j +@Tag(name = "网站信息记录表管理") +@RestController +@RequestMapping("/api/cms/cms-app") +public class CmsAppController extends BaseController { + @Resource + private CmsAppService cmsAppService; + @Resource + private RedisUtil redisUtil; + @Resource + private CmsAppFieldService cmsAppFieldService; + @Resource + private CmsNavigationService cmsNavigationService; + @Resource + private CmsAppSettingService cmsAppSettingService; + + private static final String SITE_INFO_KEY_PREFIX = "SiteInfo:"; + private static final String MP_INFO_KEY_PREFIX = "MpInfo:"; + private static final String SELECT_PAYMENT_KEY_PREFIX = "SelectPayment:"; + private static final String SYS_DOMAIN_SUFFIX = ".websoft.top"; + private static final String DOMAIN_SUFFIX = ".wsdns.cn"; + + @Operation(summary = "分页查询网站信息记录表") + @GetMapping("/page") + public ApiResult> page(CmsAppParam param) { + // 使用关联查询 + return success(cmsAppService.pageRel(param)); + } + + @Operation(summary = "查询全部网站信息记录表") + @GetMapping() + public ApiResult> list(CmsAppParam param) { + // 使用关联查询 + return success(cmsAppService.listRel(param)); + } + + @Operation(summary = "分页查询网站信息记录表") + @GetMapping("/pageAll") + public ApiResult> pageAll(CmsAppParam param) { + return success(cmsAppService.pageRelAll(param)); + } + + @Operation(summary = "根据id查询网站信息记录表") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(cmsAppService.getByIdRel(id)); + } + + @Operation(summary = "根据id查询网站信息记录表") + @GetMapping("/getAll/{id}") + public ApiResult getAll(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(cmsAppService.getByIdRelAll(id)); + } + + @PreAuthorize("hasAuthority('cms:website:save')") + @Operation(summary = "添加网站信息记录表") + @PostMapping() + public ApiResult save(@RequestBody CmsApp cmsApp) { + // 前端若指定了 appCode,先做唯一性校验 + if (StrUtil.isNotBlank(cmsApp.getAppCode())) { + long cnt = cmsAppService.count( + new LambdaQueryWrapper() + .eq(CmsApp::getAppCode, cmsApp.getAppCode()) + ); + if (cnt > 0) { + return fail("应用标识 [" + cmsApp.getAppCode() + "] 已存在,请更换"); + } + } + // 记录当前登录用户id + User loginUser = getLoginUser(); + if (loginUser != null) { + cmsApp.setLoginUser(loginUser); + return success("创建成功", cmsAppService.create(cmsApp)); + } + return fail("创建失败"); + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "修改网站信息记录表") + @PutMapping() + public ApiResult update(@RequestBody CmsApp cmsApp) { + // appCode 全局唯一,有值时校验是否与其他记录冲突(排除自身) + if (StrUtil.isNotBlank(cmsApp.getAppCode())) { + long cnt = cmsAppService.count( + new LambdaQueryWrapper() + .eq(CmsApp::getAppCode, cmsApp.getAppCode()) + .ne(CmsApp::getAppId, cmsApp.getAppId()) + ); + if (cnt > 0) { + return fail("应用标识 [" + cmsApp.getAppCode() + "] 已存在,请更换"); + } + } else { + // 不允许通过此接口清空或修改 appCode(设为 null 则 MP 不更新该字段) + cmsApp.setAppCode(null); + } + if (cmsAppService.updateById(cmsApp)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "修改网站信息记录表") + @PutMapping("/updateAll") + public ApiResult updateAll(@RequestBody CmsApp cmsApp) { + if (cmsAppService.updateByIdAll(cmsApp)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:website:remove')") + @Operation(summary = "删除网站信息记录表") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (cmsAppService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @PreAuthorize("hasAuthority('cms:website:remove')") + @Operation(summary = "删除网站信息记录表") + @DeleteMapping("/removeAll/{id}") + public ApiResult removeAll(@PathVariable("id") Integer id) { + if (cmsAppService.removeByIdAll(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @PreAuthorize("hasAuthority('cms:website:save')") + @Operation(summary = "批量添加网站信息记录表") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (cmsAppService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "批量修改网站信息记录表") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(cmsAppService, "app_id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:website:remove')") + @Operation(summary = "批量删除网站信息记录表") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (cmsAppService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @Operation(summary = "网站基本信息") + @GetMapping("/getSiteInfo") + public ApiResult getSiteInfo() { + log.info("开始获取网站基本信息..."); + try { + Integer tenantId = getTenantId(); + log.info("获取到租户ID: {}", tenantId); + if (ObjectUtil.isEmpty(tenantId)) { + log.warn("租户ID为空"); + return fail("租户ID不能为空", null); + } + + String key = SITE_INFO_KEY_PREFIX + tenantId; + + // 尝试从缓存获取 + try { + final String siteInfo = redisUtil.get(key); + if (StrUtil.isNotBlank(siteInfo)) { + log.info("从缓存获取网站信息: = {}", key); + // 可以启用缓存返回,但先注释掉确保数据最新 + // return success(JSONUtil.parseObject(siteInfo, CmsApp.class)); + } + } catch (Exception e) { + log.warn("获取缓存失败: {}", e.getMessage()); + } + + // 获取站点信息 + CmsApp website = null; + try { + log.info("开始查询租户{}的站点信息", tenantId); + website = cmsAppService.getOne(new LambdaQueryWrapper() + .eq(CmsApp::getTenantId, tenantId) + .eq(CmsApp::getDeleted, 0) + .last("limit 1")); + log.info("查询站点信息完成, website: {}", website != null ? "存在" : "不存在"); + } catch (Exception e) { + log.error("查询站点信息失败: {}", e.getMessage(), e); + return fail("查询站点信息失败: " + e.getMessage(), null); + } + + // 创建默认站点 + if (ObjectUtil.isEmpty(website)) { + return success("请先创建站点...", null); + } + + // 安全地构建网站信息 + try { + buildSafeWebsiteInfo(website); + } catch (Exception e) { + log.error("构建网站信息失败: {}", e.getMessage(), e); + return fail("构建网站信息失败", null); + } + + // 缓存结果 + try { + redisUtil.set(key, website, 1L, TimeUnit.DAYS); + } catch (Exception e) { + log.warn("缓存网站信息失败: {}", e.getMessage()); + } + + return success(website); + + } catch (Exception e) { + log.error("获取网站信息异常: {}", e.getMessage(), e); + return fail("获取网站信息失败: " + e.getMessage(), null); + } + } + + /** + * 安全地构建网站信息 + */ + private void buildSafeWebsiteInfo(CmsApp website) { + if (website == null) { + throw new IllegalArgumentException("网站对象不能为空"); + } + + // 1. 设置网站状态 + try { + setWebsiteStatus(website); + } catch (Exception e) { + log.warn("设置网站状态失败: {}", e.getMessage()); + website.setStatus(0); // 默认状态 + website.setStatusText("状态未知"); + } + + // 2. 构建配置信息 + try { + HashMap config = buildSafeWebsiteConfig(website); + website.setConfig(config); + } catch (Exception e) { + log.warn("构建网站配置失败: {}", e.getMessage()); + website.setConfig(new HashMap<>()); + } + + // 3. 设置导航信息 + try { + setSafeWebsiteNavigation(website); + } catch (Exception e) { + log.warn("设置网站导航失败: {}", e.getMessage()); + website.setTopNavs(new ArrayList<>()); + website.setBottomNavs(new ArrayList<>()); + } + + // 4. 设置网站设置信息 + try { + setWebsiteSetting(website); + } catch (Exception e) { + log.warn("设置网站设置失败: {}", e.getMessage()); + // 设置为null,让前端知道没有设置信息 + } + + // 5. 构建服务器时间(使用LocalDateTime) + try { + HashMap serverTime = buildSafeServerTime(); + website.setServerTime(serverTime); + } catch (Exception e) { + log.warn("构建服务器时间失败: {}", e.getMessage()); + HashMap defaultTime = new HashMap<>(); + defaultTime.put("now", java.time.LocalDateTime.now().toString()); + website.setServerTime(defaultTime); + } + } + + private void setWebsiteStatus(CmsApp website) { + // 空值检查,避免NullPointerException + Integer running = website.getRunning(); + if (running == null) { + // 默认状态:未开通 + website.setStatusIcon("error"); + website.setStatusText("状态未知"); + return; + } + + if (!running.equals(1)) { + // 未开通 + if (running.equals(0)) { + website.setStatusIcon("error"); + website.setStatusText("该站点未开通"); + } + // 维护中 + if (running.equals(2)) { + website.setStatusIcon("warning"); + } + // 已关闭 + if (running.equals(3)) { + website.setStatusIcon("error"); + website.setStatusText("已关闭"); + } + // 已欠费停机 + if (running.equals(4)) { + website.setStatusIcon("error"); + website.setStatusText("已欠费停机"); + } + // 违规关停 + if (running.equals(5)) { + website.setStatusIcon("error"); + website.setStatusText("违规关停"); + } + } + } + + private HashMap buildWebsiteConfig(CmsApp website) { + return buildSafeWebsiteConfig(website); + } + + private HashMap buildSafeWebsiteConfig(CmsApp website) { + HashMap config = new HashMap<>(); + + try { + // 获取网站字段配置 + LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); + wrapper.eq(CmsAppField::getDeleted, 0); + final List fields = cmsAppFieldService.list(wrapper); + + if (fields != null && !fields.isEmpty()) { + fields.forEach(field -> { + if (field != null && StrUtil.isNotBlank(field.getName())) { + config.put(field.getName(), field.getValue() != null ? field.getValue() : ""); + } + }); + } + } catch (Exception e) { + log.warn("获取网站字段配置失败: {}", e.getMessage()); + } + + // 安全地设置域名信息 + try { + config.put("SysDomain", getSafeSysDomain(website)); + config.put("Domain", getSafeDomain(website)); + } catch (Exception e) { + log.warn("设置域名信息失败: {}", e.getMessage()); + config.put("SysDomain", website.getTenantId() + ".websoft.top"); + config.put("Domain", website.getTenantId() + ".wsdns.cn"); + } + + return config; + } + + private String getSysDomain(CmsApp website) { + return getSafeSysDomain(website); + } + + private String getDomain(CmsApp website) { + return getSafeDomain(website); + } + + private String getSafeSysDomain(CmsApp website) { + if (website == null || website.getTenantId() == null) { + return "unknown.websoft.top"; + } + return StrUtil.isNotBlank(website.getAppCode()) ? + website.getAppCode() + SYS_DOMAIN_SUFFIX : + website.getTenantId() + SYS_DOMAIN_SUFFIX; + } + + private String getSafeDomain(CmsApp website) { + if (website == null || website.getTenantId() == null) { + return "unknown.wsdns.cn"; + } + + if (StrUtil.isNotBlank(website.getDomain())) { + return website.getDomain(); + } + if (StrUtil.isNotBlank(website.getAppCode())) { + return website.getAppCode() + DOMAIN_SUFFIX; + } + return website.getTenantId() + DOMAIN_SUFFIX; + } + + private void setWebsiteNavigation(CmsApp website) { + setSafeWebsiteNavigation(website); + } + + private void setSafeWebsiteNavigation(CmsApp website) { + if (website == null) { + return; + } + + // 设置顶部导航 + try { + final CmsNavigationParam topParam = new CmsNavigationParam(); + topParam.setHide(0); + topParam.setTop(0); + topParam.setBottom(null); + final List topNavs = cmsNavigationService.listRel(topParam); + + if (topNavs != null && !topNavs.isEmpty()) { + try { + website.setTopNavs(CommonUtil.toTreeData(topNavs, 0, + CmsNavigation::getParentId, + CmsNavigation::getNavigationId, + CmsNavigation::setChildren)); + } catch (Exception e) { + log.warn("构建顶部导航树失败: {}", e.getMessage()); + website.setTopNavs(new ArrayList<>(topNavs)); + } + } else { + website.setTopNavs(new ArrayList<>()); + } + } catch (Exception e) { + log.warn("获取顶部导航失败: {}", e.getMessage()); + website.setTopNavs(new ArrayList<>()); + } + + // 设置底部导航 + try { + final CmsNavigationParam bottomParam = new CmsNavigationParam(); + bottomParam.setHide(0); + bottomParam.setTop(null); + bottomParam.setBottom(0); + final List bottomNavs = cmsNavigationService.listRel(bottomParam); + + if (bottomNavs != null && !bottomNavs.isEmpty()) { + try { + website.setBottomNavs(CommonUtil.toTreeData(bottomNavs, 0, + CmsNavigation::getParentId, + CmsNavigation::getNavigationId, + CmsNavigation::setChildren)); + } catch (Exception e) { + log.warn("构建底部导航树失败: {}", e.getMessage()); + website.setBottomNavs(new ArrayList<>(bottomNavs)); + } + } else { + website.setBottomNavs(new ArrayList<>()); + } + } catch (Exception e) { + log.warn("获取底部导航失败: {}", e.getMessage()); + website.setBottomNavs(new ArrayList<>()); + } + } + + private void setWebsiteSetting(CmsApp website) { + final CmsAppSetting setting = cmsAppSettingService.getOne(new LambdaQueryWrapper().eq(CmsAppSetting::getAppId, website.getAppId())); + if (ObjectUtil.isNotEmpty(setting)) { + website.setSetting(setting); + } + } + + private HashMap buildServerTime() { + return buildSafeServerTime(); + } + + private HashMap buildSafeServerTime() { + HashMap serverTime = new HashMap<>(); + + try { + // 使用 LocalDateTime 替代 DateTime + java.time.LocalDateTime now = java.time.LocalDateTime.now(); + java.time.LocalDate today = java.time.LocalDate.now(); + + // 当前时间 + serverTime.put("now", now.toString()); + + // 今天日期 + serverTime.put("today", today.toString()); + + // 明天日期 + java.time.LocalDate tomorrow = today.plusDays(1); + serverTime.put("tomorrow", tomorrow.toString()); + + // 后天日期 + java.time.LocalDate afterDay = today.plusDays(2); + serverTime.put("afterDay", afterDay.toString()); + + // 今天星期几 (1=Monday, 7=Sunday) + int week = today.getDayOfWeek().getValue(); + serverTime.put("week", week); + + // 下周同一天 + java.time.LocalDate nextWeek = today.plusWeeks(1); + serverTime.put("nextWeek", nextWeek.toString()); + + // 时间戳 + serverTime.put("timestamp", System.currentTimeMillis()); + + } catch (Exception e) { + log.error("构建服务器时间失败: {}", e.getMessage(), e); + // 提供最基本的时间信息 + serverTime.put("now", java.time.LocalDateTime.now().toString()); + serverTime.put("today", java.time.LocalDate.now().toString()); + serverTime.put("timestamp", System.currentTimeMillis()); + } + + return serverTime; + } + + @Operation(summary = "清除缓存") + @DeleteMapping("/clearSiteInfo/{key}") + public ApiResult clearSiteInfo(@PathVariable("key") String key) { + log.info("清除缓存开始,key: {}", key); + System.out.println("清除缓存开始,key = " + key); + // 清除指定key + redisUtil.delete(key); + // 清除缓存 + redisUtil.delete(SITE_INFO_KEY_PREFIX.concat(getTenantId().toString())); + log.info("清除缓存结束,key: {}", SITE_INFO_KEY_PREFIX.concat(getTenantId().toString())); + // 清除小程序缓存 + redisUtil.delete(MP_INFO_KEY_PREFIX.concat(getTenantId().toString())); + // 选择支付方式 + redisUtil.delete(SELECT_PAYMENT_KEY_PREFIX.concat(getTenantId().toString())); + return success("清除成功"); + } + + // ─── 发布管理 ──────────────────────────────────────────────────────── + + @Operation(summary = "提交上架审核") + @PostMapping("/submitReview") + public ApiResult submitReview(@RequestBody Map body) { + Integer appId = body.get("appId") instanceof Number ? ((Number) body.get("appId")).intValue() : null; + if (appId == null) return fail("appId 不能为空"); + String priceType = (String) body.get("priceType"); + Integer price = body.get("price") instanceof Number ? ((Number) body.get("price")).intValue() : 0; + String subscriptionPeriod = (String) body.get("subscriptionPeriod"); + String appDescription = (String) body.get("appDescription"); + String detailDescription = (String) body.get("detailDescription"); + String screenshots = (String) body.get("screenshots"); + Integer userId = getLoginUserId(); + try { + cmsAppService.submitReview(appId, priceType, price, subscriptionPeriod, + appDescription, detailDescription, screenshots, userId); + return success("上架申请提交成功,等待审核"); + } catch (Exception e) { + return fail(e.getMessage()); + } + } + + @Operation(summary = "撤回审核申请") + @PostMapping("/withdrawReview/{appId}") + public ApiResult withdrawReview(@PathVariable Integer appId) { + try { + cmsAppService.withdrawReview(appId, getLoginUserId()); + return success("已撤回审核申请"); + } catch (Exception e) { + return fail(e.getMessage()); + } + } + + @Operation(summary = "下架应用") + @PostMapping("/unpublish/{appId}") + public ApiResult unpublish(@PathVariable Integer appId) { + try { + cmsAppService.unpublish(appId, getLoginUserId()); + return success("已下架"); + } catch (Exception e) { + return fail(e.getMessage()); + } + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "管理员审核通过") + @PostMapping("/approveReview/{appId}") + public ApiResult approveReview(@PathVariable Integer appId) { + try { + cmsAppService.approveReview(appId, getLoginUserId()); + return success("审核通过,应用已上架"); + } catch (Exception e) { + return fail(e.getMessage()); + } + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "管理员审核拒绝") + @PostMapping("/rejectReview") + public ApiResult rejectReview(@RequestBody Map body) { + Integer appId = body.get("appId") instanceof Number ? ((Number) body.get("appId")).intValue() : null; + String rejectReason = (String) body.get("rejectReason"); + if (appId == null) return fail("appId 不能为空"); + if (rejectReason == null || rejectReason.isBlank()) return fail("请填写拒绝原因"); + try { + cmsAppService.rejectReview(appId, rejectReason, getLoginUserId()); + return success("已拒绝该应用上架申请"); + } catch (Exception e) { + return fail(e.getMessage()); + } + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "获取审核列表(管理员)") + @GetMapping("/pageReviews") + public ApiResult> pageReviews(CmsAppParam param) { + return success(cmsAppService.pageReviews(param)); + } + +} + diff --git a/src/main/java/com/gxwebsoft/cms/controller/CmsAppFieldController.java b/src/main/java/com/gxwebsoft/cms/controller/CmsAppFieldController.java new file mode 100644 index 0000000..c60110a --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/controller/CmsAppFieldController.java @@ -0,0 +1,188 @@ +package com.gxwebsoft.cms.controller; + +import cn.afterturn.easypoi.excel.ExcelImportUtil; +import cn.afterturn.easypoi.excel.entity.ImportParams; +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.cms.service.CmsAppFieldService; +import com.gxwebsoft.cms.entity.CmsAppField; +import com.gxwebsoft.cms.param.CmsAppFieldParam; +import com.gxwebsoft.cms.param.CmsAppFieldImportParam; +import com.gxwebsoft.common.core.utils.JSONUtil; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.BatchParam; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.checkerframework.checker.units.qual.A; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.transaction.annotation.Transactional; +import org.springframework.web.bind.annotation.*; +import org.springframework.web.multipart.MultipartFile; + +import javax.annotation.Resource; +import java.util.HashMap; +import java.util.List; + +/** + * 应用参数控制器 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Tag(name = "应用参数管理") +@RestController +@RequestMapping("/api/cms/cms-app-field") +public class CmsAppFieldController extends BaseController { + @Resource + private CmsAppFieldService cmsAppFieldService; + + @Operation(summary = "分页查询应用参数") + @GetMapping("/page") + public ApiResult> page(CmsAppFieldParam param) { + // 使用关联查询 + return success(cmsAppFieldService.pageRel(param)); + } + + @Operation(summary = "查询全部应用参数") + @GetMapping() + public ApiResult> list(CmsAppFieldParam param) { + // 使用关联查询 + return success(cmsAppFieldService.listRel(param)); + } + + @Operation(summary = "根据id查询应用参数") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + return success(cmsAppFieldService.getByIdRel(id)); + } + + @Operation(summary = "根据code查询应用参数") + @GetMapping("/getByCode/{code}") + public ApiResult getByCode(@PathVariable("code") String code) { + // 使用关联查询 + return success(cmsAppFieldService.getByCodeRel(code)); + } + + @PreAuthorize("hasAuthority('cms:cmsAppField:save')") + @Operation(summary = "添加应用参数") + @PostMapping() + public ApiResult save(@RequestBody CmsAppField cmsAppField) { + if (cmsAppFieldService.save(cmsAppField)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppField:update')") + @Operation(summary = "修改应用参数") + @PutMapping() + public ApiResult update(@RequestBody CmsAppField cmsAppField) { + if (cmsAppFieldService.updateById(cmsAppField)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppField:remove')") + @Operation(summary = "删除应用参数") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (cmsAppFieldService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppField:save')") + @Operation(summary = "批量添加应用参数") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (cmsAppFieldService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppField:update')") + @Operation(summary = "批量修改应用参数") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(cmsAppFieldService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppField:remove')") + @Operation(summary = "批量删除应用参数") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (cmsAppFieldService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @Operation(summary = "获取网站配置参数-对象形式") + @GetMapping("/config") + public ApiResult getConfig(CmsAppFieldParam param) { + // 使用关联查询 + final List fields = cmsAppFieldService.listRel(param); + + HashMap config = new HashMap<>(); + fields.forEach(d -> { + config.put(d.getName(), d.getValue()); + }); + return success(config); + } + + /** + * excel批量导入应用参数 + */ + @PreAuthorize("hasAuthority('cms:cmsAppField:save')") + @Operation(summary = "批量导入应用参数") + @Transactional(rollbackFor = {Exception.class}) + @PostMapping("/import") + public ApiResult> importBatch(MultipartFile file) { + ImportParams importParams = new ImportParams(); + try { + // 第一步:永久删除已标记为 deleted=1 的记录 + cmsAppFieldService.remove(new LambdaQueryWrapper().eq(CmsAppField::getDeleted, 1)); + + // 第二步:将现有未删除的记录(deleted=0)标记为 deleted=1 + LambdaUpdateWrapper updateWrapper = new LambdaUpdateWrapper<>(); + updateWrapper.eq(CmsAppField::getDeleted, 0); + updateWrapper.set(CmsAppField::getDeleted, 1); + cmsAppFieldService.update(updateWrapper); + + // 第三步:导入XLS文件的内容 + List list = ExcelImportUtil.importExcel(file.getInputStream(), CmsAppFieldImportParam.class, importParams); + list.forEach(d -> { + CmsAppField item = JSONUtil.parseObject(JSONUtil.toJSONString(d), CmsAppField.class); + assert item != null; + if (ObjectUtil.isNotEmpty(item)) { + System.out.println("item = " + item); + // 设置默认值 + if (item.getDeleted() == null) { + item.setDeleted(0); // 新导入的数据deleted设为0 + } + if (item.getSortNumber() == null) { + item.setSortNumber(100); + } + if (item.getEncrypted() == null) { + item.setEncrypted(false); + } + cmsAppFieldService.save(item); + } + }); + return success("成功导入" + list.size() + "条", null); + } catch (Exception e) { + e.printStackTrace(); + } + return fail("导入失败", null); + } +} diff --git a/src/main/java/com/gxwebsoft/cms/controller/CmsAppSettingController.java b/src/main/java/com/gxwebsoft/cms/controller/CmsAppSettingController.java new file mode 100644 index 0000000..e722791 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/controller/CmsAppSettingController.java @@ -0,0 +1,121 @@ +package com.gxwebsoft.cms.controller; + +import cn.hutool.core.util.ObjectUtil; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; +import com.gxwebsoft.common.core.web.BaseController; +import com.gxwebsoft.cms.service.CmsAppSettingService; +import com.gxwebsoft.cms.entity.CmsAppSetting; +import com.gxwebsoft.cms.param.CmsAppSettingParam; +import com.gxwebsoft.common.core.web.ApiResult; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.core.web.BatchParam; +import io.swagger.v3.oas.annotations.tags.Tag; +import io.swagger.v3.oas.annotations.Operation; +import org.springframework.security.access.prepost.PreAuthorize; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; +import java.util.List; + +/** + * 网站设置控制器 + * + * @author 科技小王子 + * @since 2025-02-19 01:35:44 + */ +@Tag(name = "网站设置管理") +@RestController +@RequestMapping("/api/cms/cms-app-setting") +public class CmsAppSettingController extends BaseController { + @Resource + private CmsAppSettingService cmsAppSettingService; + + @Operation(summary = "分页查询网站设置") + @GetMapping("/page") + public ApiResult> page(CmsAppSettingParam param) { + // 使用关联查询 + return success(cmsAppSettingService.pageRel(param)); + } + + @Operation(summary = "查询全部网站设置") + @GetMapping() + public ApiResult> list(CmsAppSettingParam param) { + // 使用关联查询 + return success(cmsAppSettingService.listRel(param)); + } + + @Operation(summary = "根据id查询网站设置") + @GetMapping("/{id}") + public ApiResult get(@PathVariable("id") Integer id) { + // 使用关联查询 + final CmsAppSetting cmsAppSetting = cmsAppSettingService.getOne(new LambdaQueryWrapper().eq(CmsAppSetting::getAppId, id)); + if(ObjectUtil.isEmpty(cmsAppSetting)){ + final CmsAppSetting setting = new CmsAppSetting(); + setting.setAppId(id); + cmsAppSettingService.save(setting); + return success(cmsAppSettingService.getOne(new LambdaQueryWrapper().eq(CmsAppSetting::getAppId, id))); + } + return success(cmsAppSetting); + } + + @PreAuthorize("hasAuthority('cms:cmsAppSetting:save')") + @Operation(summary = "添加网站设置") + @PostMapping() + public ApiResult save(@RequestBody CmsAppSetting cmsAppSetting) { + if (cmsAppSettingService.save(cmsAppSetting)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('cms:website:update')") + @Operation(summary = "修改网站设置") + @PutMapping() + public ApiResult update(@RequestBody CmsAppSetting cmsAppSetting) { + if (cmsAppSettingService.updateById(cmsAppSetting)) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppSetting:remove')") + @Operation(summary = "删除网站设置") + @DeleteMapping("/{id}") + public ApiResult remove(@PathVariable("id") Integer id) { + if (cmsAppSettingService.removeById(id)) { + return success("删除成功"); + } + return fail("删除失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppSetting:save')") + @Operation(summary = "批量添加网站设置") + @PostMapping("/batch") + public ApiResult saveBatch(@RequestBody List list) { + if (cmsAppSettingService.saveBatch(list)) { + return success("添加成功"); + } + return fail("添加失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppSetting:update')") + @Operation(summary = "批量修改网站设置") + @PutMapping("/batch") + public ApiResult removeBatch(@RequestBody BatchParam batchParam) { + if (batchParam.update(cmsAppSettingService, "id")) { + return success("修改成功"); + } + return fail("修改失败"); + } + + @PreAuthorize("hasAuthority('cms:cmsAppSetting:remove')") + @Operation(summary = "批量删除网站设置") + @DeleteMapping("/batch") + public ApiResult removeBatch(@RequestBody List ids) { + if (cmsAppSettingService.removeByIds(ids)) { + return success("删除成功"); + } + return fail("删除失败"); + } + +} diff --git a/src/main/java/com/gxwebsoft/cms/entity/CmsApp.java b/src/main/java/com/gxwebsoft/cms/entity/CmsApp.java new file mode 100644 index 0000000..31f1eaf --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/entity/CmsApp.java @@ -0,0 +1,368 @@ +package com.gxwebsoft.cms.entity; + +import cn.hutool.core.util.DesensitizedUtil; +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableField; +import com.baomidou.mybatisplus.annotation.TableId; + +import java.math.BigDecimal; +import com.baomidou.mybatisplus.annotation.TableLogic; +import com.fasterxml.jackson.annotation.JsonFormat; +import java.io.Serializable; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.gxwebsoft.common.system.entity.User; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 网站信息记录表 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(name = "CmsApp对象", description = "网站信息记录表") +public class CmsApp implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "站点ID") + @TableId(value = "app_id", type = IdType.AUTO) + private Integer appId; + + @Schema(description = "网站名称") + private String appName; + + @Schema(description = "网站标识") + private String appCode; + + @Schema(description = "网站密钥") + private String websiteSecret; + + @Schema(description = "网站LOGO") + private String appIcon; + + @Schema(description = "网站LOGO") + private String websiteLogo; + + @Schema(description = "网站LOGO(深色模式)") + private String websiteDarkLogo; + + @Schema(description = "网站类型") + private String appType; + + @Schema(description = "栏目ID") + private Integer categoryId; + + + @Schema(description = "网站截图") + private String files; + + @Schema(description = "应用类型 10=web(Web应用) 20=miniprogram(小程序) 30=mobile(移动App) 40=api(API服务) 50=internal(内部工具)") + private Integer type; + + @Schema(description = "网站关键词") + private String keywords; + + @Schema(description = "域名前缀") + private String prefix; + + @Schema(description = "绑定域名") + private String domain; + + @Schema(description = "全局样式") + private String style; + + @Schema(description = "后台管理地址") + private String adminUrl; + + @Schema(description = "自定义API接口") + private String apiUrl; + + @Schema(description = "应用版本 10免费版 20授权版 30永久授权") + private Integer version; + + @Schema(description = "服务到期时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date expirationTime; + + @Schema(description = "是否到期") + @TableField(exist = false) + private Integer expired; + + @Schema(description = "剩余天数") + @TableField(exist = false) + private Long expiredDays; + + @Schema(description = "服务器ID") + private Integer assetsId; + + @Schema(description = "服务器ID") + private String assetsName; + + @Schema(description = "模版ID(存克隆的租户UID)") + private Integer templateId; + + @Schema(description = "模版名称") + @TableField(exist = false) + private String templateName; + + @Schema(description = "行业类型(父级)") + private String industryParent; + + @Schema(description = "行业类型(子级)") + private String industryChild; + + @Schema(description = "企业ID") + private Integer companyId; + + @Schema(description = "开发者名称") + private String developer; + + @Schema(description = "所在国家") + private String country; + + @Schema(description = "所在省份") + private String province; + + @Schema(description = "所在城市") + private String city; + + @Schema(description = "所在辖区") + private String region; + + @Schema(description = "经度") + private String longitude; + + @Schema(description = "纬度") + private String latitude; + + @Schema(description = "街道地址") + private String address; + + @Schema(description = "联系电话") + private String phone; + + @Schema(description = "电子邮箱") + private String email; + + @Schema(description = "ICP备案号") + private String icpNo; + + @Schema(description = "公安备案") + private String policeNo; + + @Schema(description = "网站描述") + private String content; + + @Schema(description = "备注") + private String comments; + + @Schema(description = "管理员备注") + private String remarks; + + @Schema(description = "是否推荐") + private Integer recommend; + + @Schema(description = "是否官方产品") + private Boolean official; + + @Schema(description = "允许展示到插件市场") + private Boolean market; + + @Schema(description = "是否插件类型 0应用 1插件") + private Boolean plugin; + + @Schema(description = "允许被搜索") + private Boolean search; + + @Schema(description = "主题色") + private String color; + + @Schema(description = "运行状态 0运行中 1已关闭 2维护中") + private Integer running; + + @Schema(description = "即将过期") + private Integer soon; + + @Schema(description = "评分") + private BigDecimal rate; + + @Schema(description = "点赞数量") + private Integer likes; + + @Schema(description = "点击数量") + private Integer clicks; + + @Schema(description = "购买数量") + private Integer buys; + + @Schema(description = "下载数量") + private Integer downloads; + + @Schema(description = "销售价格") + private BigDecimal price; + + @Schema(description = "交付方式") + private Integer deliveryMethod; + + @Schema(description = "计费方式") + private Integer chargingMethod; + + @Schema(description = "状态 0未开通 1运行中 2维护中 3已关闭 4已欠费停机 5违规关停") + private Integer status; + + @Schema(description = "状态图标") + @TableField(exist = false) + private String statusIcon; + + @Schema(description = "维护说明") + private String statusText; + + @Schema(description = "关闭说明") + private String statusClose; + + @Schema(description = "全局样式") + private String styles; + + @Schema(description = "排序号") + private Integer sortNumber; + + @Schema(description = "用户ID") + private Integer userId; + + @Schema(description = "商户ID") + private Long merchantId; + + @Schema(description = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @Schema(description = "租户id") + private Integer tenantId; + + @Schema(description = "租户名称") + @TableField(exist = false) + private String tenantName; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @Schema(description = "修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + + @Schema(description = "预设字段") + @TableField(exist = false) + private List fields; + + @Schema(description = "小程序导航图标") + @TableField(exist = false) + private Map> mpMenus; + + @Schema(description = "网站导航栏") + @TableField(exist = false) + private List navigations; + + @Schema(description = "顶部菜单") + @TableField(exist = false) + private List topNavs; + + @Schema(description = "底部菜单") + @TableField(exist = false) + private List bottomNavs; + + @Schema(description = "幻灯片广告") + @TableField(exist = false) + private CmsAd slide; + + @Schema(description = "站点广告") + @TableField(exist = false) + private List ads; + + @Schema(description = "首页布局") + @TableField(exist = false) + private String layout; + + @Schema(description = "友情链接") + @TableField(exist = false) + private List links; + + @Schema(description = "配置信息") + @TableField(exist = false) + private Object config; + + @Schema(description = "服务器时间") + @TableField(exist = false) + private HashMap serverTime; + + @Schema(description = "当前登录用户") + @TableField(exist = false) + private User loginUser; + + @Schema(description = "超管账号") + @TableField(exist = false) + private String superAdminPhone; + + @Schema(description = "是否登录") + @TableField(exist = false) + private Boolean isLogin; + + @Schema(description = "网站设置") + @TableField(exist = false) + private CmsAppSetting setting; + + // ─── 发布管理字段 ────────────────────────────────────────────────── + + @Schema(description = "发布状态: developing开发中 pending_review待审核 published已上架 rejected审核未通过 deprecated已下架") + private String publishStatus; + + @Schema(description = "定价模式: free免费 one_time一次性 subscription订阅") + private String priceType; + + @Schema(description = "订阅周期: month按月 year按年") + private String subscriptionPeriod; + + @Schema(description = "应用简介(市场展示用)") + private String appDescription; + + @Schema(description = "详细说明(富文本)") + private String detailDescription; + + @Schema(description = "应用截图(JSON数组字符串)") + private String screenshots; + + @Schema(description = "安装/使用次数") + private Integer installCount; + + @Schema(description = "评分(1-5)") + private java.math.BigDecimal rating; + + @Schema(description = "审核拒绝原因") + private String rejectReason; + + @Schema(description = "提交审核时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date publishApplyTime; + + @Schema(description = "正式发布上架时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date publishTime; + + @Schema(description = "审核人用户ID") + private Integer reviewerId; + + @Schema(description = "审核操作时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private java.util.Date reviewTime; + + public String getPhone(){ + return DesensitizedUtil.mobilePhone(this.phone); + } +} diff --git a/src/main/java/com/gxwebsoft/cms/entity/CmsAppField.java b/src/main/java/com/gxwebsoft/cms/entity/CmsAppField.java new file mode 100644 index 0000000..b876afb --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/entity/CmsAppField.java @@ -0,0 +1,75 @@ +package com.gxwebsoft.cms.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; +import java.time.LocalDateTime; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; + +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应用参数 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(name = "CmsAppField对象", description = "应用参数") +public class CmsAppField implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "自增ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @Schema(description = "类型,0文本 1图片 2其他") + private Integer type; + + @Schema(description = "名称") + private String name; + + @Schema(description = "默认值") + private String defaultValue; + + @Schema(description = "可修改的值 [on|off]") + private String modifyRange; + + @Schema(description = "备注") + private String comments; + + @Schema(description = "css样式") + private String style; + + @Schema(description = "名称") + private String value; + + @Schema(description = "国际化语言") + private String lang; + + @Schema(description = "是否加密") + private Boolean encrypted; + + @Schema(description = "商户ID") + private Long merchantId; + + @Schema(description = "排序(数字越小越靠前)") + private Integer sortNumber; + + @Schema(description = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @Schema(description = "租户id") + private Integer tenantId; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private LocalDateTime createTime; + +} diff --git a/src/main/java/com/gxwebsoft/cms/entity/CmsAppSetting.java b/src/main/java/com/gxwebsoft/cms/entity/CmsAppSetting.java new file mode 100644 index 0000000..94c6c5c --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/entity/CmsAppSetting.java @@ -0,0 +1,89 @@ +package com.gxwebsoft.cms.entity; + +import com.baomidou.mybatisplus.annotation.IdType; +import com.baomidou.mybatisplus.annotation.TableId; + +import com.baomidou.mybatisplus.annotation.TableLogic; +import java.io.Serializable; +import java.util.Date; + +import com.fasterxml.jackson.annotation.JsonFormat; + +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 网站设置 + * + * @author 科技小王子 + * @since 2025-02-19 01:35:44 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@Schema(name = "CmsAppSetting对象", description = "网站设置") +public class CmsAppSetting implements Serializable { + private static final long serialVersionUID = 1L; + + @Schema(description = "自增ID") + @TableId(value = "id", type = IdType.AUTO) + private Integer id; + + @Schema(description = "关联网站ID") + private Integer appId; + + @Schema(description = "是否官方插件") + private Boolean official; + + @Schema(description = "是否展示在插件市场") + private Boolean market; + + @Schema(description = "是否允许被搜索") + private Boolean search; + + @Schema(description = "是否共享") + private Boolean share; + + @Schema(description = "文章是否需要审核") + private Boolean articleReview; + + @Schema(description = "是否插件 0应用1 插件 ") + private Boolean plugin; + + @Schema(description = "编辑器类型 1 富文本编辑器 2 Markdown编辑器") + private Integer editor; + + @Schema(description = "显示站内搜索") + private Boolean searchBtn; + + @Schema(description = "显示登录注册功能") + private Boolean loginBtn; + + @Schema(description = "显示悬浮客服工具") + private Boolean floatTool; + + @Schema(description = "显示版权链接") + private Boolean copyrightLink; + + @Schema(description = "导航栏最多显示数量") + private Boolean maxMenuNum; + + @Schema(description = "排序号") + private Integer sortNumber; + + @Schema(description = "是否删除, 0否, 1是") + @TableLogic + private Integer deleted; + + @Schema(description = "租户id") + private Integer tenantId; + + @Schema(description = "创建时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date createTime; + + @Schema(description = "修改时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date updateTime; + +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/CmsAppFieldMapper.java b/src/main/java/com/gxwebsoft/cms/mapper/CmsAppFieldMapper.java new file mode 100644 index 0000000..3d10733 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/CmsAppFieldMapper.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.cms.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.cms.entity.CmsAppField; +import com.gxwebsoft.cms.param.CmsAppFieldParam; +import org.apache.ibatis.annotations.Param; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * 应用参数Mapper + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +public interface CmsAppFieldMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") CmsAppFieldParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") CmsAppFieldParam param); + + + @InterceptorIgnore(tenantLine = "true") + List selectListAllRel(@Param("param") CmsAppFieldParam param); + +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/CmsAppMapper.java b/src/main/java/com/gxwebsoft/cms/mapper/CmsAppMapper.java new file mode 100644 index 0000000..eed133c --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/CmsAppMapper.java @@ -0,0 +1,53 @@ +package com.gxwebsoft.cms.mapper; + +import com.baomidou.mybatisplus.annotation.InterceptorIgnore; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.cms.entity.CmsApp; +import com.gxwebsoft.cms.param.CmsAppParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网站信息记录表Mapper + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +public interface CmsAppMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") CmsAppParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") CmsAppParam param); + + @InterceptorIgnore(tenantLine = "true") + List selectPageRelAll(@Param("page") IPage page, + @Param("param") CmsAppParam param); + + @InterceptorIgnore(tenantLine = "true") + CmsApp getByIdRelAll(@Param("appId") Integer id); + + @InterceptorIgnore(tenantLine = "true") + boolean updateByIdAll(@Param("param") CmsApp cmsApp); + + @InterceptorIgnore(tenantLine = "true") + boolean removeByIdAll(@Param("appId") Integer id); + + @InterceptorIgnore(tenantLine = "true") + CmsApp getByTenantId(@Param("tenantId") Integer tenantId); +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/CmsAppSettingMapper.java b/src/main/java/com/gxwebsoft/cms/mapper/CmsAppSettingMapper.java new file mode 100644 index 0000000..66b9f91 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/CmsAppSettingMapper.java @@ -0,0 +1,37 @@ +package com.gxwebsoft.cms.mapper; + +import com.baomidou.mybatisplus.core.mapper.BaseMapper; +import com.baomidou.mybatisplus.core.metadata.IPage; +import com.gxwebsoft.cms.entity.CmsAppSetting; +import com.gxwebsoft.cms.param.CmsAppSettingParam; +import org.apache.ibatis.annotations.Param; + +import java.util.List; + +/** + * 网站设置Mapper + * + * @author 科技小王子 + * @since 2025-02-19 01:35:44 + */ +public interface CmsAppSettingMapper extends BaseMapper { + + /** + * 分页查询 + * + * @param page 分页对象 + * @param param 查询参数 + * @return List + */ + List selectPageRel(@Param("page") IPage page, + @Param("param") CmsAppSettingParam param); + + /** + * 查询全部 + * + * @param param 查询参数 + * @return List + */ + List selectListRel(@Param("param") CmsAppSettingParam param); + +} diff --git a/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppFieldMapper.xml b/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppFieldMapper.xml new file mode 100644 index 0000000..54ae605 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppFieldMapper.xml @@ -0,0 +1,82 @@ + + + + + + + SELECT a.*, b.user_id + FROM cms_app_field a + LEFT JOIN cms_app b ON a.tenant_id = b.tenant_id + + + AND a.id = #{param.id} + + + AND a.type = #{param.type} + + + AND a.lang = #{param.lang} + + + AND a.name LIKE CONCAT('%', #{param.name}, '%') + + + AND a.default_value LIKE CONCAT('%', #{param.defaultValue}, '%') + + + AND a.modify_range LIKE CONCAT('%', #{param.modifyRange}, '%') + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.style LIKE CONCAT('%', #{param.style}, '%') + + + AND a.value LIKE CONCAT('%', #{param.value}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND b.user_id = #{param.userId} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + OR a.value LIKE CONCAT('%', #{param.keywords}, '%') + OR a.name LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppMapper.xml b/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppMapper.xml new file mode 100644 index 0000000..fd1cc74 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppMapper.xml @@ -0,0 +1,463 @@ + + + + + + + SELECT a.*, b.tenant_name as tenantName + FROM cms_app a + LEFT JOIN gxwebsoft_core.sys_tenant b ON a.tenant_id = b.tenant_id + + + AND a.app_id = #{param.appId} + + + AND a.type LIKE CONCAT('%', #{param.type}, '%') + + + AND a.app_name LIKE CONCAT('%', #{param.appName}, '%') + + + AND a.app_code LIKE CONCAT('%', #{param.appCode}, '%') + + + AND a.app_icon LIKE CONCAT('%', #{param.appIcon}, '%') + + + AND a.website_logo LIKE CONCAT('%', #{param.websiteLogo}, '%') + + + AND a.website_dark_logo LIKE CONCAT('%', #{param.websiteDarkLogo}, '%') + + + AND a.app_type LIKE CONCAT('%', #{param.appType}, '%') + + + AND a.prefix LIKE CONCAT('%', #{param.prefix}, '%') + + + AND a.domain LIKE CONCAT('%', #{param.domain}, '%') + + + AND a.style LIKE CONCAT('%', #{param.style}, '%') + + + AND a.admin_url LIKE CONCAT('%', #{param.adminUrl}, '%') + + + AND a.version = #{param.version} + + + AND a.expiration_time LIKE CONCAT('%', #{param.expirationTime}, '%') + + + AND a.template_id = #{param.templateId} + + + AND a.industry_parent LIKE CONCAT('%', #{param.industryParent}, '%') + + + AND a.industry_child LIKE CONCAT('%', #{param.industryChild}, '%') + + + AND a.category_id = #{param.categoryId} + + + AND a.company_id = #{param.companyId} + + + AND a.country LIKE CONCAT('%', #{param.country}, '%') + + + AND a.province LIKE CONCAT('%', #{param.province}, '%') + + + AND a.city LIKE CONCAT('%', #{param.city}, '%') + + + AND a.region LIKE CONCAT('%', #{param.region}, '%') + + + AND a.longitude LIKE CONCAT('%', #{param.longitude}, '%') + + + AND a.latitude LIKE CONCAT('%', #{param.latitude}, '%') + + + AND a.address LIKE CONCAT('%', #{param.address}, '%') + + + AND a.email LIKE CONCAT('%', #{param.email}, '%') + + + AND a.icp_no LIKE CONCAT('%', #{param.icpNo}, '%') + + + AND a.police_no LIKE CONCAT('%', #{param.policeNo}, '%') + + + AND a.comments LIKE CONCAT('%', #{param.comments}, '%') + + + AND a.recommend = #{param.recommend} + + + AND a.official = #{param.official} + + + AND a.market = #{param.market} + + + AND a.plugin = #{param.plugin} + + + AND a.search = #{param.search} + + + AND a.color = #{param.color} + + + AND a.status = #{param.status} + + + AND a.status_text LIKE CONCAT('%', #{param.statusText}, '%') + + + AND a.status_close LIKE CONCAT('%', #{param.statusClose}, '%') + + + AND a.styles LIKE CONCAT('%', #{param.styles}, '%') + + + AND a.sort_number = #{param.sortNumber} + + + AND a.user_id = #{param.userId} + + + AND (a.app_name LIKE CONCAT('%', #{param.keywords}, '%') + OR a.app_code LIKE CONCAT('%', #{param.keywords}, '%') + OR a.domain LIKE CONCAT('%', #{param.keywords}, '%') + OR a.tenant_id = #{param.keywords} + ) + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + + + + + + + + + + + + + + + UPDATE cms_app + + + type = #{param.type}, + + + app_name = #{param.appName}, + + + website_logo = #{param.websiteLogo}, + + + app_code = #{param.appCode}, + + + app_type = #{param.appType}, + + + template_id = #{param.templateId}, + + + company_id = #{param.companyId}, + + + admin_url = #{param.adminUrl}, + + + running = #{param.running}, + + + domain = #{param.domain}, + + + market = #{param.market}, + + + plugin = #{param.plugin}, + + + `search` = #{param.search}, + + + developer = #{param.developer}, + + + color = #{param.color}, + + + recommend = #{param.recommend}, + + + official = #{param.official}, + + + prefix = #{param.prefix}, + + + version = #{param.version}, + + + files = #{param.files}, + + + price = #{param.price}, + + + delivery_method = #{param.deliveryMethod}, + + + charging_method = #{param.chargingMethod}, + + + keywords = #{param.keywords}, + + + comments = #{param.comments}, + + + content = #{param.content}, + + + deleted = #{param.deleted}, + + + deleted = 0, + + + + app_id = #{param.appId} + + + + + + diff --git a/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppSettingMapper.xml b/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppSettingMapper.xml new file mode 100644 index 0000000..0d8f3ea --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/mapper/xml/CmsAppSettingMapper.xml @@ -0,0 +1,81 @@ + + + + + + + SELECT a.* + FROM cms_app_setting a + + + AND a.id = #{param.id} + + + AND a.app_id = #{param.appId} + + + AND a.official = #{param.official} + + + AND a.market = #{param.market} + + + AND a.search = #{param.search} + + + AND a.share = #{param.share} + + + AND a.plugin = #{param.plugin} + + + AND a.editor = #{param.editor} + + + AND a.search_btn = #{param.searchBtn} + + + AND a.login_btn = #{param.loginBtn} + + + AND a.float_tool = #{param.floatTool} + + + AND a.copyright_link = #{param.copyrightLink} + + + AND a.max_menu_num = #{param.maxMenuNum} + + + AND a.sort_number = #{param.sortNumber} + + + AND a.deleted = #{param.deleted} + + + AND a.deleted = 0 + + + AND a.create_time >= #{param.createTimeStart} + + + AND a.create_time <= #{param.createTimeEnd} + + + AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') + ) + + + + + + + + + + + diff --git a/src/main/java/com/gxwebsoft/cms/param/CmsAppFieldImportParam.java b/src/main/java/com/gxwebsoft/cms/param/CmsAppFieldImportParam.java new file mode 100644 index 0000000..8c56d11 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/param/CmsAppFieldImportParam.java @@ -0,0 +1,56 @@ +package com.gxwebsoft.cms.param; + +import cn.afterturn.easypoi.excel.annotation.Excel; +import lombok.Data; + +import java.io.Serializable; + +/** + * 应用参数导入参数 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Data +public class CmsAppFieldImportParam implements Serializable { + private static final long serialVersionUID = 1L; + + @Excel(name = "自增ID") + private Integer id; + + @Excel(name = "类型") + private Integer type; + + @Excel(name = "名称") + private String name; + + @Excel(name = "默认值") + private String defaultValue; + + @Excel(name = "可修改的值") + private String modifyRange; + + @Excel(name = "备注") + private String comments; + + @Excel(name = "css样式") + private String style; + + @Excel(name = "值") + private String value; + + @Excel(name = "国际化语言") + private String lang; + + @Excel(name = "加密") + private Boolean encrypted; + + @Excel(name = "商户ID") + private Long merchantId; + + @Excel(name = "排序") + private Integer sortNumber; + + @Excel(name = "租户ID") + private Integer tenantId; +} diff --git a/src/main/java/com/gxwebsoft/cms/param/CmsAppFieldParam.java b/src/main/java/com/gxwebsoft/cms/param/CmsAppFieldParam.java new file mode 100644 index 0000000..1d2b43e --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/param/CmsAppFieldParam.java @@ -0,0 +1,66 @@ +package com.gxwebsoft.cms.param; + +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 应用参数查询参数 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(name = "CmsAppFieldParam对象", description = "应用参数查询参数") +public class CmsAppFieldParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @Schema(description = "自增ID") + @QueryField(type = QueryType.EQ) + private Integer id; + + @Schema(description = "类型,0文本 1图片 2其他") + @QueryField(type = QueryType.EQ) + private Integer type; + + @Schema(description = "名称") + private String name; + + @Schema(description = "默认值") + private String defaultValue; + + @Schema(description = "可修改的值 [on|off]") + private String modifyRange; + + @Schema(description = "备注") + private String comments; + + @Schema(description = "css样式") + private String style; + + @Schema(description = "名称") + private String value; + + @Schema(description = "是否加密") + private Boolean encrypted; + + @Schema(description = "排序(数字越小越靠前)") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @Schema(description = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + + @Schema(description = "创建者") + @QueryField(type = QueryType.EQ) + private Integer userId; + +} diff --git a/src/main/java/com/gxwebsoft/cms/param/CmsAppParam.java b/src/main/java/com/gxwebsoft/cms/param/CmsAppParam.java new file mode 100644 index 0000000..483004a --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/param/CmsAppParam.java @@ -0,0 +1,231 @@ +package com.gxwebsoft.cms.param; + +import com.baomidou.mybatisplus.annotation.TableField; +import com.fasterxml.jackson.annotation.JsonFormat; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +import java.time.LocalDateTime; +import java.util.Set; + +/** + * 网站信息记录表查询参数 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(name = "CmsAppParam对象", description = "网站信息记录表查询参数") +public class CmsAppParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @Schema(description = "站点ID") + @QueryField(type = QueryType.EQ) + private Integer appId; + + @Schema(description = "站点类型") + @QueryField(type = QueryType.EQ) + private Integer type; + + @Schema(description = "网站名称") + private String appName; + + @Schema(description = "网站标识") + private String appCode; + + @Schema(description = "网站密钥") + private String websiteSecret; + + @Schema(description = "网站LOGO") + private String appIcon; + + @Schema(description = "网站LOGO") + private String websiteLogo; + + @Schema(description = "网站LOGO(深色模式)") + private String websiteDarkLogo; + + @Schema(description = "网站类型") + private String appType; + + @Schema(description = "栏目ID") + @QueryField(type = QueryType.EQ) + private Integer categoryId; + + @Schema(description = "网站截图") + private String files; + + @Schema(description = "网站关键词") + private String keywords; + + @Schema(description = "域名前缀") + private String prefix; + + @Schema(description = "绑定域名") + private String domain; + + @Schema(description = "全局样式") + private String style; + + @Schema(description = "后台管理地址") + private String adminUrl; + + @Schema(description = "应用版本 10免费版 20授权版 30永久授权") + @QueryField(type = QueryType.EQ) + private Integer version; + + @Schema(description = "服务到期时间") + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private String expirationTime; + + @Schema(description = "模版ID") + @QueryField(type = QueryType.EQ) + private Integer templateId; + + @Schema(description = "行业类型(父级)") + private String industryParent; + + @Schema(description = "行业类型(子级)") + private String industryChild; + + @Schema(description = "企业ID") + @QueryField(type = QueryType.EQ) + private Integer companyId; + + @Schema(description = "开发者名称") + private String developer; + + @Schema(description = "所在国家") + private String country; + + @Schema(description = "所在省份") + private String province; + + @Schema(description = "所在城市") + private String city; + + @Schema(description = "所在辖区") + private String region; + + @Schema(description = "经度") + private String longitude; + + @Schema(description = "纬度") + private String latitude; + + @Schema(description = "街道地址") + private String address; + + @Schema(description = "联系电话") + private String phone; + + @Schema(description = "电子邮箱") + private String email; + + @Schema(description = "ICP备案号") + private String icpNo; + + @Schema(description = "公安备案") + private String policeNo; + + @Schema(description = "备注") + private String comments; + + @Schema(description = "是否推荐") + @QueryField(type = QueryType.EQ) + private Integer recommend; + + @Schema(description = "是否官方产品") + @QueryField(type = QueryType.EQ) + private Boolean official; + + @Schema(description = "是否查询超管账号") + @QueryField(type = QueryType.EQ) + private Boolean showAdminPhone; + + @Schema(description = "允许展示到插件市场") + @QueryField(type = QueryType.EQ) + private Boolean market; + + @Schema(description = "是否插件类型 0应用 1插件") + @QueryField(type = QueryType.EQ) + private Boolean plugin; + + @Schema(description = "允许被搜索") + @QueryField(type = QueryType.EQ) + private Boolean search; + + @Schema(description = "主题色") + private String color; + + @Schema(description = "点赞数量") + private Integer likes; + + @Schema(description = "点击数量") + private Integer clicks; + + @Schema(description = "购买数量") + private Integer buys; + + @Schema(description = "下载数量") + private Integer downloads; + + @Schema(description = "状态 0未开通 1运行中 2维护中 3已关闭 4已欠费停机 5违规关停") + @QueryField(type = QueryType.EQ) + private Integer status; + + @Schema(description = "维护说明") + private String statusText; + + @Schema(description = "关闭说明") + private String statusClose; + + @Schema(description = "全局样式") + private String styles; + + @Schema(description = "运行状态") + @QueryField(type = QueryType.EQ) + private Integer running; + + @Schema(description = "排序号") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @Schema(description = "用户ID") + @QueryField(type = QueryType.EQ) + private Integer userId; + + @Schema(description = "按userId集搜索") + @QueryField(type = QueryType.EQ) + private Set userIds; + + @Schema(description = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + + @Schema(description = "按WebsiteIds集搜索") + private Set appIds; + + @Schema(description = "协作成员userId(查该用户作为成员参与的应用,联表 app_user)") + private Integer memberUserId; + + @Schema(description = "当前登录用户ID") + @QueryField(type = QueryType.EQ) + private Integer loginUserId; + + @Schema(description = "管理员手机号") + @QueryField(type = QueryType.EQ) + private String adminPhone; + + @Schema(description = "发布状态筛选: developing/pending_review/published/rejected/deprecated") + private String publishStatus; + +} diff --git a/src/main/java/com/gxwebsoft/cms/param/CmsAppSettingParam.java b/src/main/java/com/gxwebsoft/cms/param/CmsAppSettingParam.java new file mode 100644 index 0000000..30d64a0 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/param/CmsAppSettingParam.java @@ -0,0 +1,86 @@ +package com.gxwebsoft.cms.param; + +import java.math.BigDecimal; +import com.gxwebsoft.common.core.annotation.QueryField; +import com.gxwebsoft.common.core.annotation.QueryType; +import com.gxwebsoft.common.core.web.BaseParam; +import com.fasterxml.jackson.annotation.JsonInclude; +import io.swagger.v3.oas.annotations.media.Schema; +import io.swagger.v3.oas.annotations.media.Schema; +import lombok.Data; +import lombok.EqualsAndHashCode; + +/** + * 网站设置查询参数 + * + * @author 科技小王子 + * @since 2025-02-19 01:35:44 + */ +@Data +@EqualsAndHashCode(callSuper = false) +@JsonInclude(JsonInclude.Include.NON_NULL) +@Schema(name = "CmsAppSettingParam对象", description = "网站设置查询参数") +public class CmsAppSettingParam extends BaseParam { + private static final long serialVersionUID = 1L; + + @Schema(description = "自增ID") + @QueryField(type = QueryType.EQ) + private Integer id; + + @Schema(description = "关联网站ID") + @QueryField(type = QueryType.EQ) + private Integer appId; + + @Schema(description = "是否官方插件") + @QueryField(type = QueryType.EQ) + private Boolean official; + + @Schema(description = "是否展示在插件市场") + @QueryField(type = QueryType.EQ) + private Boolean market; + + @Schema(description = "是否允许被搜索") + @QueryField(type = QueryType.EQ) + private Boolean search; + + @Schema(description = "是否共享") + @QueryField(type = QueryType.EQ) + private Boolean share; + + @Schema(description = "是否插件 0应用1 插件 ") + @QueryField(type = QueryType.EQ) + private Boolean plugin; + + @Schema(description = "编辑器类型 1 md-editor-v3, 2 tinymce-editor") + @QueryField(type = QueryType.EQ) + private Boolean editor; + + @Schema(description = "显示站内搜索") + @QueryField(type = QueryType.EQ) + private Boolean searchBtn; + + @Schema(description = "显示登录注册功能") + @QueryField(type = QueryType.EQ) + private Boolean loginBtn; + + @Schema(description = "显示悬浮客服工具") + @QueryField(type = QueryType.EQ) + private Boolean floatTool; + + @Schema(description = "显示版权链接") + @QueryField(type = QueryType.EQ) + private Boolean copyrightLink; + + @Schema(description = "导航栏最多显示数量") + @QueryField(type = QueryType.EQ) + private Boolean maxMenuNum; + + @Schema(description = "排序号") + @QueryField(type = QueryType.EQ) + private Integer sortNumber; + + @Schema(description = "是否删除, 0否, 1是") + @QueryField(type = QueryType.EQ) + private Integer deleted; + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/CmsAppFieldService.java b/src/main/java/com/gxwebsoft/cms/service/CmsAppFieldService.java new file mode 100644 index 0000000..85f95e1 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/CmsAppFieldService.java @@ -0,0 +1,43 @@ +package com.gxwebsoft.cms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.cms.entity.CmsAppField; +import com.gxwebsoft.cms.param.CmsAppFieldParam; + +import java.util.List; + +/** + * 应用参数Service + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +public interface CmsAppFieldService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(CmsAppFieldParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(CmsAppFieldParam param); + + /** + * 根据id查询 + * + * @param id 自增ID + * @return CmsAppField + */ + CmsAppField getByIdRel(Integer id); + + CmsAppField getByCodeRel(String code); +} diff --git a/src/main/java/com/gxwebsoft/cms/service/CmsAppService.java b/src/main/java/com/gxwebsoft/cms/service/CmsAppService.java new file mode 100644 index 0000000..e70fbb8 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/CmsAppService.java @@ -0,0 +1,92 @@ +package com.gxwebsoft.cms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.cms.entity.CmsApp; +import com.gxwebsoft.cms.param.CmsAppParam; +import com.gxwebsoft.shop.vo.ShopVo; + +import java.util.List; + +/** + * 网站信息记录表Service + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +public interface CmsAppService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(CmsAppParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(CmsAppParam param); + + /** + * 根据id查询 + * + * @param appId 站点ID + * @return CmsApp + */ + CmsApp getByIdRel(Integer appId); + + PageResult pageRelAll(CmsAppParam param); + + // 创建站点 + CmsApp create(CmsApp cmsApp); + + CmsApp getByIdRelAll(Integer id); + + boolean updateByIdAll(CmsApp cmsApp); + + boolean removeByIdAll(Integer id); + + CmsApp getByTenantId(Integer tenantId); + + /** + * 获取网站基本信息(VO格式) + * + * @param tenantId 租户ID + * @return 网站信息VO + */ + ShopVo getSiteInfo(Integer tenantId); + + /** + * 清除网站信息缓存 + * + * @param tenantId 租户ID + */ + void clearSiteInfoCache(Integer tenantId); + + // ─── 发布管理 ────────────────────────────────────────────────── + + /** 提交上架审核 */ + void submitReview(Integer appId, String priceType, Integer price, + String subscriptionPeriod, String appDescription, + String detailDescription, String screenshots, Integer userId); + + /** 撤回审核申请(回到开发中) */ + void withdrawReview(Integer appId, Integer userId); + + /** 下架应用 */ + void unpublish(Integer appId, Integer userId); + + /** 管理员审核通过 */ + void approveReview(Integer appId, Integer reviewerId); + + /** 管理员审核拒绝 */ + void rejectReview(Integer appId, String rejectReason, Integer reviewerId); + + /** 分页查询审核列表(管理员) */ + PageResult pageReviews(CmsAppParam param); +} diff --git a/src/main/java/com/gxwebsoft/cms/service/CmsAppSettingService.java b/src/main/java/com/gxwebsoft/cms/service/CmsAppSettingService.java new file mode 100644 index 0000000..8c2b915 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/CmsAppSettingService.java @@ -0,0 +1,42 @@ +package com.gxwebsoft.cms.service; + +import com.baomidou.mybatisplus.extension.service.IService; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.cms.entity.CmsAppSetting; +import com.gxwebsoft.cms.param.CmsAppSettingParam; + +import java.util.List; + +/** + * 网站设置Service + * + * @author 科技小王子 + * @since 2025-02-19 01:35:44 + */ +public interface CmsAppSettingService extends IService { + + /** + * 分页关联查询 + * + * @param param 查询参数 + * @return PageResult + */ + PageResult pageRel(CmsAppSettingParam param); + + /** + * 关联查询全部 + * + * @param param 查询参数 + * @return List + */ + List listRel(CmsAppSettingParam param); + + /** + * 根据id查询 + * + * @param id 自增ID + * @return CmsAppSetting + */ + CmsAppSetting getByIdRel(Integer id); + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppFieldServiceImpl.java b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppFieldServiceImpl.java new file mode 100644 index 0000000..2a1e0eb --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppFieldServiceImpl.java @@ -0,0 +1,54 @@ +package com.gxwebsoft.cms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.cms.mapper.CmsAppFieldMapper; +import com.gxwebsoft.cms.service.CmsAppFieldService; +import com.gxwebsoft.cms.entity.CmsAppField; +import com.gxwebsoft.cms.param.CmsAppFieldParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 应用参数Service实现 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Service +public class CmsAppFieldServiceImpl extends ServiceImpl implements CmsAppFieldService { + + @Override + public PageResult pageRel(CmsAppFieldParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time asc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(CmsAppFieldParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time asc"); + return page.sortRecords(list); + } + + @Override + public CmsAppField getByIdRel(Integer id) { + CmsAppFieldParam param = new CmsAppFieldParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public CmsAppField getByCodeRel(String code) { + CmsAppFieldParam param = new CmsAppFieldParam(); + param.setName(code); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImpl.java b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImpl.java new file mode 100644 index 0000000..9b10606 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImpl.java @@ -0,0 +1,587 @@ +package com.gxwebsoft.cms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.cms.entity.*; +import com.gxwebsoft.cms.mapper.*; +import com.gxwebsoft.cms.param.*; +import com.gxwebsoft.cms.service.*; +import com.gxwebsoft.common.core.utils.JSONUtil; +import com.gxwebsoft.common.core.utils.RedisUtil; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import com.gxwebsoft.common.system.entity.User; +import com.gxwebsoft.common.system.service.CompanyService; +import com.gxwebsoft.common.system.service.UserService; +import com.gxwebsoft.project.entity.Project; +import com.gxwebsoft.project.service.ProjectService; +import com.gxwebsoft.shop.vo.ShopVo; +import org.springframework.stereotype.Service; + +import javax.annotation.Resource; +import java.time.LocalDateTime; +import java.util.List; +import java.util.concurrent.TimeUnit; + +import cn.hutool.core.util.ObjectUtil; +import cn.hutool.core.util.StrUtil; +import lombok.extern.slf4j.Slf4j; + +/** + * 网站信息记录表Service实现 + * + * @author 科技小王子 + * @since 2024-09-10 20:36:14 + */ +@Slf4j +@Service +public class CmsAppServiceImpl extends ServiceImpl implements CmsAppService { + + private static final String SITE_INFO_KEY_PREFIX = "SiteInfo:"; + @Resource + private CmsAppFieldMapper cmsAppFieldMapper; + @Resource + private CmsModelMapper cmsModelMapper; + @Resource + private CmsNavigationMapper cmsNavigationMapper; + @Resource + private CmsLangLogMapper cmsLangLogMapper; + @Resource + private CmsAdMapper cmsAdMapper; + @Resource + private CmsLinkMapper cmsLinkMapper; + @Resource + private CmsArticleMapper cmsArticleMapper; + @Resource + private CmsAppFieldService cmsAppFieldService; + @Resource + private CmsModelService cmsModelService; + @Resource + private CmsNavigationService cmsNavigationService; + @Resource + private CmsLangLogService cmsLangLogService; + @Resource + private CmsAdService cmsAdService; + @Resource + private CmsLinkService cmsLinkService; + @Resource + private CmsArticleService cmsArticleService; + @Resource + private CmsArticleContentService cmsArticleContentService; + @Resource + private CmsAppMapper cmsAppMapper; + @Resource + private ProjectService projectService; + @Resource + private RedisUtil redisUtil; + @Resource + private UserService userService; + @Resource + private CompanyService companyService; + + @Override + public PageResult pageRel(CmsAppParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRel(page, param); + list.forEach(d -> { + LocalDateTime now = LocalDateTime.now(); + if (d.getExpirationTime() != null) { + // 将Date转换为LocalDateTime进行计算 + LocalDateTime expirationTime = d.getExpirationTime().toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + // 即将过期(30天内过期的) + d.setSoon(expirationTime.minusDays(30).compareTo(now)); + // 是否过期 -1已过期 大于0 未过期 + d.setStatus(expirationTime.compareTo(now)); + } else { + d.setSoon(0); + d.setStatus(1); + } + }); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(CmsAppParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("create_time desc"); + return page.sortRecords(list); + } + + @Override + public CmsApp getByIdRel(Integer appId) { + CmsAppParam param = new CmsAppParam(); + param.setAppId(appId); + return param.getOne(baseMapper.selectListRel(param)); + } + + @Override + public PageResult pageRelAll(CmsAppParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("create_time desc"); + List list = baseMapper.selectPageRelAll(page, param); + list.forEach(d -> { + LocalDateTime now = LocalDateTime.now(); + if (d.getExpirationTime() != null) { + // 将Date转换为LocalDateTime进行计算 + LocalDateTime expirationTime = d.getExpirationTime().toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + // 即将过期(30天内过期的) + d.setSoon(expirationTime.minusDays(30).compareTo(now)); + // 是否过期 -1已过期 大于0 未过期 + d.setStatus(expirationTime.compareTo(now)); + } else { + d.setSoon(0); + d.setStatus(1); + } + }); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public CmsApp create(CmsApp website) { + final User loginUser = website.getLoginUser(); + // 生成全局唯一 appCode:若调用方已指定则保留,否则自动生成 + if (StrUtil.isBlank(website.getAppCode())) { + website.setAppCode(generateUniqueCode("template-" + loginUser.getTenantId())); + } + website.setAppIcon("/favicon.ico"); + // 根据应用类型设置管理后台地址和 appType 字符串 + // 10=web(Web应用) | 20=miniprogram(小程序) | 30=mobile(移动App) | 40=api(API服务) | 50=internal(内部工具) + Integer siteType = website.getType(); + if (siteType == null) siteType = 10; + String adminUrl; + String appTypeName; + switch (siteType) { + case 20: + adminUrl = "https://mp.websoft.top"; + appTypeName = "miniprogram"; + break; + case 30: + adminUrl = "https://app.websoft.top"; + appTypeName = "mobile"; + break; + case 40: + adminUrl = "https://api.websoft.top"; + appTypeName = "api"; + break; + case 50: + adminUrl = "https://oa.websoft.top"; + appTypeName = "internal"; + break; + case 10: + default: + adminUrl = "https://site.websoft.top"; + appTypeName = "web"; + break; + } + website.setAdminUrl(adminUrl); + // 若前端已传 appType 则优先使用,否则用 type 推导值 + if (StrUtil.isBlank(website.getAppType())) { + website.setAppType(appTypeName); + } + website.setVersion(10); + website.setExpirationTime(java.util.Date.from(LocalDateTime.now().plusMonths(1) + .atZone(java.time.ZoneId.systemDefault()).toInstant())); + website.setUserId(loginUser.getUserId()); + website.setDeveloper(loginUser.getNickname()); + website.setTenantId(loginUser.getTenantId()); + website.setTemplateId(loginUser.getTemplateId()); + website.setCompanyId(loginUser.getCompanyId()); + + // 初始化数据 + if(save(website)){ + // 插入网站设置记录 +// final CmsAppSetting setting = new CmsAppSetting(); +// setting.setAppId(website.getAppId()); +// setting.setCreateTime(DateUtil.date()); +// setting.setUpdateTime(DateUtil.date()); +// cmsAppSettingService.save(setting); + + // 将网站创建者的userId做为查询条件 10257(4716),10324(6978),10398(26564) + Integer websiteUserId = website.getTemplateId(); + + // 只有当templateId存在时才执行复制操作 + if (websiteUserId != null && websiteUserId > 0) { + // TODO 国际化 + final CmsLangLogParam cmsLangLogParam = new CmsLangLogParam(); + cmsLangLogParam.setWebsiteUserId(websiteUserId); + final List logs = cmsLangLogMapper.selectListAllRel(cmsLangLogParam); + logs.forEach(d->{ + d.setTenantId(loginUser.getTenantId()); + }); + cmsLangLogService.saveBatch(logs); + + // TODO 复制参数 + final CmsAppFieldParam param = new CmsAppFieldParam(); + param.setUserId(websiteUserId); + final List fields = cmsAppFieldMapper.selectListAllRel(param); + fields.forEach(d->{ + d.setTenantId(loginUser.getTenantId()); + }); + cmsAppFieldService.saveBatch(fields); + + // TODO 复制模型 + final CmsModelParam modelParam = new CmsModelParam(); + modelParam.setWebsiteUserId(websiteUserId); + final List models = cmsModelMapper.selectListAllRel(modelParam); + models.forEach(d->{ + d.setUserId(loginUser.getUserId()); + d.setTenantId(loginUser.getTenantId()); + }); + cmsModelService.saveBatch(models); + + // TODO 复制广告 + final CmsAdParam cmsAdParam = new CmsAdParam(); + cmsAdParam.setWebsiteUserId(websiteUserId); + final List ads = cmsAdMapper.selectListAllRel(cmsAdParam); + ads.forEach(d -> { + d.setUserId(loginUser.getUserId()); + d.setTenantId(loginUser.getTenantId()); + }); + cmsAdService.saveBatch(ads); + + // TODO 复制链接 + CmsLinkParam cmsLinkParam = new CmsLinkParam(); + cmsLinkParam.setWebsiteUserId(websiteUserId); + final List links = cmsLinkMapper.selectListAllRel(cmsLinkParam); + links.forEach(d -> { + d.setUserId(loginUser.getUserId()); + d.setTenantId(loginUser.getTenantId()); + }); + cmsLinkService.saveBatch(links); + + // TODO 复制栏目和文章、文章内容 + CmsNavigationParam cmsNavigationParam = new CmsNavigationParam(); + cmsNavigationParam.setWebsiteUserId(websiteUserId); + cmsNavigationParam.setParentId(0); + final List parents = cmsNavigationMapper.selectListAllRel(cmsNavigationParam); + parents.forEach(d -> { + Integer navigationId = d.getNavigationId(); + // 复制顶级栏目 + d.setTenantId(loginUser.getTenantId()); + d.setUserId(loginUser.getUserId()); + if (cmsNavigationService.save(d)) { + cmsNavigationService.saveAsync(d); + // 复制栏目文章 + CmsArticleParam cmsArticleParam = new CmsArticleParam(); + cmsArticleParam.setWebsiteUserId(websiteUserId); + cmsArticleParam.setCategoryId(navigationId); + final List articles = cmsArticleMapper.selectListAllRel(cmsArticleParam); + articles.forEach(a -> { + a.setCategoryId(d.getNavigationId()); + a.setUserId(loginUser.getUserId()); + a.setTenantId(loginUser.getTenantId()); + if (cmsArticleService.save(a)) { + final CmsArticleContent content = new CmsArticleContent(); + content.setArticleId(a.getArticleId()); + content.setContent(a.getContent()); + cmsArticleContentService.save(content); + } + }); + // 复制子栏目 + cmsNavigationParam.setParentId(navigationId); + final List navigations = cmsNavigationMapper.selectListAllRel(cmsNavigationParam); + navigations.forEach(c -> { + cmsArticleParam.setCategoryId(c.getNavigationId()); + c.setParentId(d.getNavigationId()); + c.setTenantId(loginUser.getTenantId()); + c.setUserId(loginUser.getUserId()); + cmsNavigationService.save(c); + cmsNavigationService.saveAsync(c); + // 复制子栏目文章 + final List articles2 = cmsArticleMapper.selectListAllRel(cmsArticleParam); + articles2.forEach(a2 -> { + a2.setCategoryId(c.getNavigationId()); + a2.setParentId(c.getParentId()); + a2.setUserId(loginUser.getUserId()); + a2.setTenantId(loginUser.getTenantId()); + if (cmsArticleService.save(a2)) { + final CmsArticleContent content = new CmsArticleContent(); + content.setArticleId(a2.getArticleId()); + content.setContent(a2.getContent()); + cmsArticleContentService.save(content); + } + }); + }); + } + }); + } else { + log.warn("没有有效的模板ID,跳过复制操作"); + } + + // 新增项目 + final Project project = new Project(); + project.setUserId(website.getUserId()); + project.setAppName(website.getAppName()); + project.setAppIcon(website.getAppIcon()); + project.setAppCode(website.getAppCode()); + project.setAdminUrl(website.getAdminUrl()); + project.setRenewMoney(website.getPrice()); + project.setAppId(website.getAppId()); + project.setAdminUrl(website.getAdminUrl()); + project.setAppType(website.getAppType()); + project.setAppIcon(website.getWebsiteLogo()); + project.setAppUrl(website.getDomain()); + project.setCompanyId(website.getUserId()); + project.setTenantId(5); + projectService.save(project); + } + return website; + } + + @Override + public CmsApp getByIdRelAll(Integer id) { + return cmsAppMapper.getByIdRelAll(id); + } + + @Override + public boolean updateByIdAll(CmsApp cmsApp) { + return baseMapper.updateByIdAll(cmsApp); + } + + @Override + public boolean removeByIdAll(Integer id) { + return baseMapper.removeByIdAll(id); + } + + @Override + public CmsApp getByTenantId(Integer tenantId) { + return baseMapper.getByTenantId(tenantId); + } + + @Override + public ShopVo getSiteInfo(Integer tenantId) { + // 参数验证 + if (ObjectUtil.isEmpty(tenantId)) { + throw new IllegalArgumentException("租户ID不能为空"); + } + + // 尝试从缓存获取 + String cacheKey = SITE_INFO_KEY_PREFIX + tenantId; + String siteInfo = redisUtil.get(cacheKey); + if (StrUtil.isNotBlank(siteInfo)) { + log.info("从缓存获取网站信息,租户ID: {}", tenantId); + try { + // 兼容历史缓存:JSON "null" 会被解析为 null;此时应视为未命中并回源数据库。 + ShopVo cacheVo = JSONUtil.parseObject(siteInfo, ShopVo.class); + if (cacheVo != null) { + return cacheVo; + } + log.warn("网站信息缓存命中但内容为空(null),清理缓存后回源数据库,租户ID: {}", tenantId); + redisUtil.delete(cacheKey); + } catch (Exception e) { + log.warn("缓存解析失败,清理缓存后从数据库重新获取: {}", e.getMessage()); + redisUtil.delete(cacheKey); + } + } + + // 从数据库获取站点信息 + CmsApp website = getWebsiteFromDatabase(tenantId); + + + if (website == null) { + throw new RuntimeException("请先创建站点"); + } + + // 构建完整的网站信息 + buildCompleteWebsiteInfo(website); + + // 处理过期时间 + CmsAppServiceImplHelper.processExpirationTime(website); + + // 转换为VO对象 + ShopVo websiteVO = CmsAppServiceImplHelper.convertToVO(website); + + // 缓存结果 + try { + redisUtil.set(cacheKey, websiteVO, 1L, TimeUnit.DAYS); + } catch (Exception e) { + log.warn("缓存网站信息失败: {}", e.getMessage()); + } + + log.info("获取网站信息成功,网站ID: {}, 租户ID: {}", website.getAppId(), tenantId); + return websiteVO; + } + + @Override + public void clearSiteInfoCache(Integer tenantId) { + if (tenantId != null) { + String cacheKey = SITE_INFO_KEY_PREFIX + tenantId; + redisUtil.delete(cacheKey); + log.info("清除网站信息缓存成功,租户ID: {}", tenantId); + } + } + + // ─── 发布管理 ────────────────────────────────────────────────────────── + + @Override + public void submitReview(Integer appId, String priceType, Integer price, + String subscriptionPeriod, String appDescription, + String detailDescription, String screenshots, Integer userId) { + CmsApp website = getById(appId); + if (website == null) throw new RuntimeException("应用不存在"); + // 只有开发中 / 审核未通过 才能提交 + String cur = website.getPublishStatus(); + if (!"developing".equals(cur) && !"rejected".equals(cur) && cur != null) { + throw new RuntimeException("当前状态不允许提交审核"); + } + CmsApp update = new CmsApp(); + update.setAppId(appId); + update.setPublishStatus("pending_review"); + update.setPriceType(priceType != null ? priceType : "free"); + update.setPrice(price != null ? new java.math.BigDecimal(price).movePointLeft(2) : java.math.BigDecimal.ZERO); + update.setSubscriptionPeriod(subscriptionPeriod); + update.setAppDescription(appDescription); + update.setDetailDescription(detailDescription); + update.setScreenshots(screenshots); + update.setPublishApplyTime(new java.util.Date()); + update.setRejectReason(null); + updateById(update); + } + + @Override + public void withdrawReview(Integer appId, Integer userId) { + CmsApp website = getById(appId); + if (website == null) throw new RuntimeException("应用不存在"); + if (!"pending_review".equals(website.getPublishStatus())) { + throw new RuntimeException("当前状态不是待审核,无法撤回"); + } + CmsApp update = new CmsApp(); + update.setAppId(appId); + update.setPublishStatus("developing"); + updateById(update); + } + + @Override + public void unpublish(Integer appId, Integer userId) { + CmsApp website = getById(appId); + if (website == null) throw new RuntimeException("应用不存在"); + if (!"published".equals(website.getPublishStatus())) { + throw new RuntimeException("应用未上架,无法下架"); + } + CmsApp update = new CmsApp(); + update.setAppId(appId); + update.setPublishStatus("deprecated"); + updateById(update); + } + + @Override + public void approveReview(Integer appId, Integer reviewerId) { + CmsApp website = getById(appId); + if (website == null) throw new RuntimeException("应用不存在"); + if (!"pending_review".equals(website.getPublishStatus())) { + throw new RuntimeException("当前状态不是待审核"); + } + CmsApp update = new CmsApp(); + update.setAppId(appId); + update.setPublishStatus("published"); + update.setMarket(true); + update.setReviewerId(reviewerId); + update.setReviewTime(new java.util.Date()); + update.setPublishTime(new java.util.Date()); + update.setRejectReason(null); + updateById(update); + } + + @Override + public void rejectReview(Integer appId, String rejectReason, Integer reviewerId) { + CmsApp website = getById(appId); + if (website == null) throw new RuntimeException("应用不存在"); + if (!"pending_review".equals(website.getPublishStatus())) { + throw new RuntimeException("当前状态不是待审核"); + } + CmsApp update = new CmsApp(); + update.setAppId(appId); + update.setPublishStatus("rejected"); + update.setRejectReason(rejectReason); + update.setReviewerId(reviewerId); + update.setReviewTime(new java.util.Date()); + updateById(update); + } + + @Override + public PageResult pageReviews(CmsAppParam param) { + com.baomidou.mybatisplus.extension.plugins.pagination.Page page = + new com.baomidou.mybatisplus.extension.plugins.pagination.Page<>(param.getPage() != null ? param.getPage() : 1, param.getLimit() != null && param.getLimit() > 0 ? param.getLimit() : 20); + com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper wrapper = + new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(CmsApp::getDeleted, 0) + .isNotNull(CmsApp::getPublishStatus) + .ne(CmsApp::getPublishStatus, "developing") + .eq(cn.hutool.core.util.ObjectUtil.isNotEmpty(param.getPublishStatus()), + CmsApp::getPublishStatus, param.getPublishStatus()) + .and(cn.hutool.core.util.ObjectUtil.isNotEmpty(param.getKeywords()), q -> + q.like(CmsApp::getAppName, param.getKeywords()) + .or().like(CmsApp::getAppCode, param.getKeywords())) + .last("ORDER BY FIELD(publish_status,'pending_review','rejected','published','deprecated'), publish_apply_time DESC"); + baseMapper.selectPage(page, wrapper); + return new com.gxwebsoft.common.core.web.PageResult<>(page.getRecords(), page.getTotal()); + } + + + private CmsApp getWebsiteFromDatabase(Integer tenantId) { + return getByTenantId(tenantId); + } + + /** + * 构建完整的网站信息 + */ + private void buildCompleteWebsiteInfo(CmsApp website) { + // 设置网站状态 + CmsAppServiceImplHelper.setWebsiteStatus(website); + + // 设置网站配置 + CmsAppServiceImplHelper.setWebsiteConfig(website); + + // 设置网站导航 + setWebsiteNavigation(website); + + // 设置网站设置信息 + CmsAppServiceImplHelper.setWebsiteSetting(website); + + // 设置服务器时间信息 + CmsAppServiceImplHelper.setServerTimeInfo(website); + } + + /** + * 设置网站导航 + */ + private void setWebsiteNavigation(CmsApp website) { + // 获取顶部导航 + CmsNavigationParam navigationParam = new CmsNavigationParam(); + navigationParam.setHide(0); + navigationParam.setTop(0); + navigationParam.setBottom(null); + List topNavs = cmsNavigationService.listRel(navigationParam); + website.setTopNavs(topNavs); + + // 获取底部导航 + navigationParam.setTop(null); + navigationParam.setBottom(0); + List bottomNavs = cmsNavigationService.listRel(navigationParam); + website.setBottomNavs(bottomNavs); + } + + /** + * 生成全局唯一的 appCode。 + *

以 baseCode 为基础,若已存在则追加 -2、-3 … 直到找到空闲值。

+ * + * @param baseCode 期望的 code 前缀,如 "site-10398" + * @return 全局唯一的 appCode + */ + private String generateUniqueCode(String baseCode) { + String candidate = baseCode; + int suffix = 2; + while (count(new com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper() + .eq(CmsApp::getAppCode, candidate)) > 0) { + candidate = baseCode + "-" + suffix; + suffix++; + } + return candidate; + } +} diff --git a/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImplHelper.java b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImplHelper.java new file mode 100644 index 0000000..64f2bc0 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImplHelper.java @@ -0,0 +1,239 @@ +package com.gxwebsoft.cms.service.impl; + +import com.gxwebsoft.cms.entity.CmsNavigation; +import com.gxwebsoft.cms.entity.CmsApp; +import com.gxwebsoft.shop.vo.MenuVo; +import com.gxwebsoft.shop.vo.ShopVo; + +import java.time.LocalDateTime; +import java.time.format.DateTimeFormatter; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.stream.Collectors; + +/** + * CmsAppServiceImpl 辅助方法 + * 包含转换和处理逻辑 + */ +public class CmsAppServiceImplHelper { + + /** + * 处理过期时间,只处理真正需要的字段 + */ + public static void processExpirationTime(CmsApp website) { + if (website.getExpirationTime() != null) { + LocalDateTime now = LocalDateTime.now(); + Date expirationTimeDate = website.getExpirationTime(); + + // 将Date转换为LocalDateTime进行计算 + LocalDateTime expirationTime = expirationTimeDate.toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + + // 计算是否即将过期(30天内过期) + LocalDateTime thirtyDaysLater = now.plusDays(30); + website.setSoon(expirationTime.isBefore(thirtyDaysLater) ? 1 : 0); + + // 计算是否已过期 + website.setExpired(expirationTime.isBefore(now) ? -1 : 1); + + // 计算剩余天数 + long daysBetween = ChronoUnit.DAYS.between(now, expirationTime); + website.setExpiredDays(daysBetween); + } else { + // 没有过期时间的默认值 + website.setSoon(0); + website.setExpired(1); + website.setExpiredDays(0L); + } + } + + /** + * 将实体对象转换为VO对象 + */ + public static ShopVo convertToVO(CmsApp website) { + ShopVo vo = new ShopVo(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + // 基本信息 + vo.setAppId(website.getTenantId()); + vo.setAppName(website.getTenantName()); + vo.setTitle(website.getAppName()); + vo.setKeywords(website.getKeywords()); + vo.setDescription(website.getComments()); + vo.setLogo(website.getWebsiteLogo()); + vo.setMpQrCode(website.getWebsiteDarkLogo()); + vo.setDomain(website.getDomain()); + vo.setAdminUrl(website.getAdminUrl()); + vo.setApiUrl(website.getApiUrl()); + vo.setRunning(website.getRunning()); + vo.setVersion(website.getVersion()); + if (website.getCreateTime() != null) { + // 将Date转换为LocalDateTime后格式化 + LocalDateTime createTime = website.getCreateTime().toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + vo.setCreateTime(createTime.format(formatter)); + } + + // 时间字段 - 格式化为字符串 + if (website.getExpirationTime() != null) { + // 将Date转换为LocalDateTime后格式化 + LocalDateTime expirationTime = website.getExpirationTime().toInstant() + .atZone(java.time.ZoneId.systemDefault()) + .toLocalDateTime(); + vo.setExpirationTime(expirationTime.format(formatter)); + } + + // 过期相关信息 + vo.setExpired(website.getExpired()); + vo.setExpiredDays(website.getExpiredDays()); + vo.setSoon(website.getSoon()); + + // 状态信息 + vo.setStatusIcon(website.getStatusIcon()); + vo.setStatusText(website.getStatusText()); + + // 复杂对象 + vo.setConfig(website.getConfig()); + vo.setServerTime(website.getServerTime()); + vo.setSetting(website.getSetting()); // CmsAppSetting对象可以直接设置给Object类型 + + // 导航信息 + vo.setTopNavs(convertNavigationToVO(website.getTopNavs())); + vo.setBottomNavs(convertNavigationToVO(website.getBottomNavs())); + + return vo; + } + + /** + * 安全转换 target 字段为整数 + * + * @param target 字符串类型的 target 值 + * @return 对应的整数值 + */ + private static Integer convertTargetToInteger(String target) { + if (target == null) { + return 0; // 默认值:当前窗口 + } + + switch (target.toLowerCase()) { + case "_self": + return 0; // 当前窗口 + case "_blank": + return 1; // 新窗口 + default: + // 如果是数字字符串,尝试直接转换 + try { + return Integer.valueOf(target); + } catch (NumberFormatException e) { + // 转换失败时返回默认值 + return 0; + } + } + } + + /** + * 转换导航列表为VO + * 整理导航栏目录结构(ShopInfo) + */ + public static List convertNavigationToVO(List navigations) { + if (navigations == null) { + return null; + } + + return navigations.stream().map(nav -> { + MenuVo navVO = new MenuVo(); + navVO.setNavigationId(nav.getNavigationId()); + navVO.setTitle(nav.getTitle()); + navVO.setPath(nav.getPath()); + navVO.setIcon(nav.getIcon()); + navVO.setColor(nav.getColor()); + navVO.setParentId(nav.getParentId()); + navVO.setSort(nav.getSortNumber()); + navVO.setHide(nav.getHide()); + navVO.setTop(nav.getTop()); + navVO.setPath(nav.getPath()); + navVO.setTarget(convertTargetToInteger(nav.getTarget())); + navVO.setModel(nav.getModel()); + + // 递归处理子导航 + if (nav.getChildren() != null) { + navVO.setChildren(convertNavigationToVO(nav.getChildren())); + } + + return navVO; + }).collect(Collectors.toList()); + } + + /** + * 设置网站状态 + */ + public static void setWebsiteStatus(CmsApp website) { + if (website.getRunning() != null) { + switch (website.getRunning()) { + case 0: + website.setStatusIcon("🔴"); + website.setStatusText("未开通"); + break; + case 1: + website.setStatusIcon("🟢"); + website.setStatusText("正常运行"); + break; + case 2: + website.setStatusIcon("🟡"); + website.setStatusText("维护中"); + break; + case 3: + website.setStatusIcon("🔴"); + website.setStatusText("违规关停"); + break; + default: + website.setStatusIcon("❓"); + website.setStatusText("未知状态"); + } + } + } + + /** + * 设置网站配置 + */ + public static void setWebsiteConfig(CmsApp website) { + HashMap config = new HashMap<>(); + config.put("appName", website.getAppName()); + config.put("websiteComments", website.getComments()); + config.put("websiteTitle", website.getAppName()); + config.put("websiteKeywords", website.getKeywords()); + config.put("websiteDescription", website.getContent()); // 使用 content 字段作为描述 + config.put("websiteLogo", website.getWebsiteLogo()); + config.put("appIcon", website.getAppIcon()); + config.put("domain", website.getDomain()); + website.setConfig(config); + } + + /** + * 设置服务器时间信息 + */ + public static void setServerTimeInfo(CmsApp website) { + HashMap serverTime = new HashMap<>(); + LocalDateTime now = LocalDateTime.now(); + DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"); + + serverTime.put("currentTime", now.format(formatter)); + serverTime.put("timestamp", System.currentTimeMillis()); + serverTime.put("timezone", "Asia/Shanghai"); + + website.setServerTime(serverTime); + } + + /** + * 设置网站设置信息 + */ + public static void setWebsiteSetting(CmsApp website) { + // 这里可以根据需要设置网站的其他设置信息 + // 暂时设置为null,因为setting字段类型是CmsAppSetting而不是HashMap + website.setSetting(null); + } +} diff --git a/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppSettingServiceImpl.java b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppSettingServiceImpl.java new file mode 100644 index 0000000..d59f649 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/service/impl/CmsAppSettingServiceImpl.java @@ -0,0 +1,47 @@ +package com.gxwebsoft.cms.service.impl; + +import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; +import com.gxwebsoft.cms.mapper.CmsAppSettingMapper; +import com.gxwebsoft.cms.service.CmsAppSettingService; +import com.gxwebsoft.cms.entity.CmsAppSetting; +import com.gxwebsoft.cms.param.CmsAppSettingParam; +import com.gxwebsoft.common.core.web.PageParam; +import com.gxwebsoft.common.core.web.PageResult; +import org.springframework.stereotype.Service; + +import java.util.List; + +/** + * 网站设置Service实现 + * + * @author 科技小王子 + * @since 2025-02-19 01:35:44 + */ +@Service +public class CmsAppSettingServiceImpl extends ServiceImpl implements CmsAppSettingService { + + @Override + public PageResult pageRel(CmsAppSettingParam param) { + PageParam page = new PageParam<>(param); + page.setDefaultOrder("sort_number asc, create_time desc"); + List list = baseMapper.selectPageRel(page, param); + return new PageResult<>(list, page.getTotal()); + } + + @Override + public List listRel(CmsAppSettingParam param) { + List list = baseMapper.selectListRel(param); + // 排序 + PageParam page = new PageParam<>(); + page.setDefaultOrder("sort_number asc, create_time desc"); + return page.sortRecords(list); + } + + @Override + public CmsAppSetting getByIdRel(Integer id) { + CmsAppSettingParam param = new CmsAppSettingParam(); + param.setId(id); + return param.getOne(baseMapper.selectListRel(param)); + } + +} diff --git a/src/main/java/com/gxwebsoft/cms/sql/cms_app_publish.sql b/src/main/java/com/gxwebsoft/cms/sql/cms_app_publish.sql new file mode 100644 index 0000000..df3fa87 --- /dev/null +++ b/src/main/java/com/gxwebsoft/cms/sql/cms_app_publish.sql @@ -0,0 +1,17 @@ +-- 为 cms_app 表新增发布管理相关字段 +-- 执行前请确认已连接正确的数据库 + +ALTER TABLE `cms_app` + ADD COLUMN `publish_status` VARCHAR(20) NULL DEFAULT 'developing' COMMENT '发布状态: developing开发中 pending_review待审核 published已上架 rejected审核未通过 deprecated已下架' AFTER `market`, + ADD COLUMN `price_type` VARCHAR(20) NULL COMMENT '定价模式: free免费 one_time一次性 subscription订阅' AFTER `publish_status`, + ADD COLUMN `subscription_period` VARCHAR(10) NULL COMMENT '订阅周期: month按月 year按年' AFTER `price_type`, + ADD COLUMN `app_description` VARCHAR(500) NULL COMMENT '应用简介(市场展示用)' AFTER `subscription_period`, + ADD COLUMN `detail_description` TEXT NULL COMMENT '详细说明(富文本)' AFTER `app_description`, + ADD COLUMN `screenshots` TEXT NULL COMMENT '应用截图(JSON数组字符串)' AFTER `detail_description`, + ADD COLUMN `install_count` INT NULL DEFAULT 0 COMMENT '安装/使用次数' AFTER `screenshots`, + ADD COLUMN `rating` DECIMAL(3,1) NULL DEFAULT 0.0 COMMENT '评分(1-5)' AFTER `install_count`, + ADD COLUMN `reject_reason` VARCHAR(500) NULL COMMENT '审核拒绝原因' AFTER `rating`, + ADD COLUMN `publish_apply_time` DATETIME NULL COMMENT '提交审核时间' AFTER `reject_reason`, + ADD COLUMN `publish_time` DATETIME NULL COMMENT '正式发布上架时间' AFTER `publish_apply_time`, + ADD COLUMN `reviewer_id` INT NULL COMMENT '审核人用户ID' AFTER `publish_time`, + ADD COLUMN `review_time` DATETIME NULL COMMENT '审核操作时间' AFTER `reviewer_id`; diff --git a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryApplyController.java b/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryApplyController.java deleted file mode 100644 index b34af63..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryApplyController.java +++ /dev/null @@ -1,128 +0,0 @@ -package com.gxwebsoft.dormitory.controller; - -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.system.entity.User; -import com.gxwebsoft.dormitory.entity.DormitoryApply; -import com.gxwebsoft.dormitory.param.DormitoryApplyParam; -import com.gxwebsoft.dormitory.service.DormitoryApplyService; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 审批管理控制器 - * - * @author 科技小王子 - * @since 2025-10-03 15:54:30 - */ -@Tag(name = "审批管理管理") -@RestController -@RequestMapping("/api/dormitory/dormitory-apply") -public class DormitoryApplyController extends BaseController { - @Resource - private DormitoryApplyService dormitoryApplyService; - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:list')") - @Operation(summary = "分页查询审批管理") - @GetMapping("/page") - public ApiResult> page(DormitoryApplyParam param) { - // 使用关联查询 - return success(dormitoryApplyService.pageRel(param)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:list')") - @Operation(summary = "查询全部审批管理") - @GetMapping() - public ApiResult> list(DormitoryApplyParam param) { - // 使用关联查询 - return success(dormitoryApplyService.listRel(param)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:list')") - @Operation(summary = "根据id查询审批管理") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(dormitoryApplyService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:save')") - @OperationLog - @Operation(summary = "添加审批管理") - @PostMapping() - public ApiResult save(@RequestBody DormitoryApply dormitoryApply) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - dormitoryApply.setUserId(loginUser.getUserId()); - } - if (dormitoryApplyService.save(dormitoryApply)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:update')") - @OperationLog - @Operation(summary = "修改审批管理") - @PutMapping() - public ApiResult update(@RequestBody DormitoryApply dormitoryApply) { - if (dormitoryApplyService.updateById(dormitoryApply)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:remove')") - @OperationLog - @Operation(summary = "删除审批管理") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (dormitoryApplyService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:save')") - @OperationLog - @Operation(summary = "批量添加审批管理") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (dormitoryApplyService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:update')") - @OperationLog - @Operation(summary = "批量修改审批管理") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(dormitoryApplyService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryApply:remove')") - @OperationLog - @Operation(summary = "批量删除审批管理") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (dormitoryApplyService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryBedController.java b/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryBedController.java deleted file mode 100644 index c90f412..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryBedController.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.gxwebsoft.dormitory.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.dormitory.service.DormitoryBedService; -import com.gxwebsoft.dormitory.entity.DormitoryBed; -import com.gxwebsoft.dormitory.param.DormitoryBedParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 宿舍床位控制器 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Tag(name = "宿舍床位管理") -@RestController -@RequestMapping("/api/dormitory/dormitory-bed") -public class DormitoryBedController extends BaseController { - @Resource - private DormitoryBedService dormitoryBedService; - - @Operation(summary = "分页查询宿舍床位") - @GetMapping("/page") - public ApiResult> page(DormitoryBedParam param) { - // 使用关联查询 - return success(dormitoryBedService.pageRel(param)); - } - - @Operation(summary = "查询全部宿舍床位") - @GetMapping() - public ApiResult> list(DormitoryBedParam param) { - // 使用关联查询 - return success(dormitoryBedService.listRel(param)); - } - - @Operation(summary = "根据id查询宿舍床位") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(dormitoryBedService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBed:save')") - @OperationLog - @Operation(summary = "添加宿舍床位") - @PostMapping() - public ApiResult save(@RequestBody DormitoryBed dormitoryBed) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - // dormitoryBed实体类没有userId字段,所以不设置 - } - if (dormitoryBedService.save(dormitoryBed)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBed:update')") - @OperationLog - @Operation(summary = "修改宿舍床位") - @PutMapping() - public ApiResult update(@RequestBody DormitoryBed dormitoryBed) { - if (dormitoryBedService.updateById(dormitoryBed)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBed:remove')") - @OperationLog - @Operation(summary = "删除宿舍床位") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (dormitoryBedService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBed:save')") - @OperationLog - @Operation(summary = "批量添加宿舍床位") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (dormitoryBedService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBed:update')") - @OperationLog - @Operation(summary = "批量修改宿舍床位") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(dormitoryBedService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBed:remove')") - @OperationLog - @Operation(summary = "批量删除宿舍床位") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (dormitoryBedService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryBuildingController.java b/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryBuildingController.java deleted file mode 100644 index ab84fbf..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryBuildingController.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.gxwebsoft.dormitory.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.dormitory.service.DormitoryBuildingService; -import com.gxwebsoft.dormitory.entity.DormitoryBuilding; -import com.gxwebsoft.dormitory.param.DormitoryBuildingParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 宿舍楼栋控制器 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Tag(name = "宿舍楼栋管理") -@RestController -@RequestMapping("/api/dormitory/dormitory-building") -public class DormitoryBuildingController extends BaseController { - @Resource - private DormitoryBuildingService dormitoryBuildingService; - - @Operation(summary = "分页查询宿舍楼栋") - @GetMapping("/page") - public ApiResult> page(DormitoryBuildingParam param) { - // 使用关联查询 - return success(dormitoryBuildingService.pageRel(param)); - } - - @Operation(summary = "查询全部宿舍楼栋") - @GetMapping() - public ApiResult> list(DormitoryBuildingParam param) { - // 使用关联查询 - return success(dormitoryBuildingService.listRel(param)); - } - - @Operation(summary = "根据id查询宿舍楼栋") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(dormitoryBuildingService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBuilding:save')") - @OperationLog - @Operation(summary = "添加宿舍楼栋") - @PostMapping() - public ApiResult save(@RequestBody DormitoryBuilding dormitoryBuilding) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - // dormitoryBuilding实体类没有userId字段,所以不设置 - } - if (dormitoryBuildingService.save(dormitoryBuilding)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBuilding:update')") - @OperationLog - @Operation(summary = "修改宿舍楼栋") - @PutMapping() - public ApiResult update(@RequestBody DormitoryBuilding dormitoryBuilding) { - if (dormitoryBuildingService.updateById(dormitoryBuilding)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBuilding:remove')") - @OperationLog - @Operation(summary = "删除宿舍楼栋") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (dormitoryBuildingService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBuilding:save')") - @OperationLog - @Operation(summary = "批量添加宿舍楼栋") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (dormitoryBuildingService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBuilding:update')") - @OperationLog - @Operation(summary = "批量修改宿舍楼栋") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(dormitoryBuildingService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryBuilding:remove')") - @OperationLog - @Operation(summary = "批量删除宿舍楼栋") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (dormitoryBuildingService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryFloorController.java b/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryFloorController.java deleted file mode 100644 index 2d16bda..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryFloorController.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.gxwebsoft.dormitory.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.dormitory.service.DormitoryFloorService; -import com.gxwebsoft.dormitory.entity.DormitoryFloor; -import com.gxwebsoft.dormitory.param.DormitoryFloorParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 宿舍楼层控制器 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Tag(name = "宿舍楼层管理") -@RestController -@RequestMapping("/api/dormitory/dormitory-floor") -public class DormitoryFloorController extends BaseController { - @Resource - private DormitoryFloorService dormitoryFloorService; - - @Operation(summary = "分页查询宿舍楼层") - @GetMapping("/page") - public ApiResult> page(DormitoryFloorParam param) { - // 使用关联查询 - return success(dormitoryFloorService.pageRel(param)); - } - - @Operation(summary = "查询全部宿舍楼层") - @GetMapping() - public ApiResult> list(DormitoryFloorParam param) { - // 使用关联查询 - return success(dormitoryFloorService.listRel(param)); - } - - @Operation(summary = "根据id查询宿舍楼层") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(dormitoryFloorService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryFloor:save')") - @OperationLog - @Operation(summary = "添加宿舍楼层") - @PostMapping() - public ApiResult save(@RequestBody DormitoryFloor dormitoryFloor) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - // dormitoryFloor实体类没有userId字段,所以不设置 - } - if (dormitoryFloorService.save(dormitoryFloor)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryFloor:update')") - @OperationLog - @Operation(summary = "修改宿舍楼层") - @PutMapping() - public ApiResult update(@RequestBody DormitoryFloor dormitoryFloor) { - if (dormitoryFloorService.updateById(dormitoryFloor)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryFloor:remove')") - @OperationLog - @Operation(summary = "删除宿舍楼层") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (dormitoryFloorService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryFloor:save')") - @OperationLog - @Operation(summary = "批量添加宿舍楼层") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (dormitoryFloorService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryFloor:update')") - @OperationLog - @Operation(summary = "批量修改宿舍楼层") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(dormitoryFloorService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryFloor:remove')") - @OperationLog - @Operation(summary = "批量删除宿舍楼层") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (dormitoryFloorService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryRecordController.java b/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryRecordController.java deleted file mode 100644 index 7a6cc15..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/controller/DormitoryRecordController.java +++ /dev/null @@ -1,126 +0,0 @@ -package com.gxwebsoft.dormitory.controller; - -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.dormitory.service.DormitoryRecordService; -import com.gxwebsoft.dormitory.entity.DormitoryRecord; -import com.gxwebsoft.dormitory.param.DormitoryRecordParam; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.BatchParam; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.system.entity.User; -import io.swagger.v3.oas.annotations.Operation; -import io.swagger.v3.oas.annotations.tags.Tag; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * 宿舍记录控制器 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Tag(name = "宿舍记录管理") -@RestController -@RequestMapping("/api/dormitory/dormitory-record") -public class DormitoryRecordController extends BaseController { - @Resource - private DormitoryRecordService dormitoryRecordService; - - @Operation(summary = "分页查询宿舍记录") - @GetMapping("/page") - public ApiResult> page(DormitoryRecordParam param) { - // 使用关联查询 - return success(dormitoryRecordService.pageRel(param)); - } - - @Operation(summary = "查询全部宿舍记录") - @GetMapping() - public ApiResult> list(DormitoryRecordParam param) { - // 使用关联查询 - return success(dormitoryRecordService.listRel(param)); - } - - @Operation(summary = "根据id查询宿舍记录") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - // 使用关联查询 - return success(dormitoryRecordService.getByIdRel(id)); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryRecord:save')") - @OperationLog - @Operation(summary = "添加宿舍记录") - @PostMapping() - public ApiResult save(@RequestBody DormitoryRecord dormitoryRecord) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - // dormitoryRecord实体类没有userId字段,所以不设置 - } - if (dormitoryRecordService.save(dormitoryRecord)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryRecord:update')") - @OperationLog - @Operation(summary = "修改宿舍记录") - @PutMapping() - public ApiResult update(@RequestBody DormitoryRecord dormitoryRecord) { - if (dormitoryRecordService.updateById(dormitoryRecord)) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryRecord:remove')") - @OperationLog - @Operation(summary = "删除宿舍记录") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (dormitoryRecordService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryRecord:save')") - @OperationLog - @Operation(summary = "批量添加宿舍记录") - @PostMapping("/batch") - public ApiResult saveBatch(@RequestBody List list) { - if (dormitoryRecordService.saveBatch(list)) { - return success("添加成功"); - } - return fail("添加失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryRecord:update')") - @OperationLog - @Operation(summary = "批量修改宿舍记录") - @PutMapping("/batch") - public ApiResult removeBatch(@RequestBody BatchParam batchParam) { - if (batchParam.update(dormitoryRecordService, "id")) { - return success("修改成功"); - } - return fail("修改失败"); - } - - @PreAuthorize("hasAuthority('dormitory:dormitoryRecord:remove')") - @OperationLog - @Operation(summary = "批量删除宿舍记录") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (dormitoryRecordService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryApply.java b/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryApply.java deleted file mode 100644 index 0b82350..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryApply.java +++ /dev/null @@ -1,89 +0,0 @@ -package com.gxwebsoft.dormitory.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.math.BigDecimal; -import java.time.LocalDateTime; - -/** - * 审批管理 - * - * @author 科技小王子 - * @since 2025-10-03 15:54:30 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(description = "审批管理") -public class DormitoryApply implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "类型") - private Integer type; - - @Schema(description = "用户ID") - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "客户名称") - private String dealerName; - - @Schema(description = "客户编号") - private String dealerCode; - - @Schema(description = "详细地址") - private String address; - - @Schema(description = "签约价格") - private BigDecimal money; - - @Schema(description = "推荐人用户ID") - private Integer refereeId; - - @Schema(description = "申请方式(10需后台审核 20无需审核)") - private Integer applyType; - - @Schema(description = "审核状态 (10待审核 20审核通过 30驳回)") - private Integer applyStatus; - - @Schema(description = "申请时间") - private LocalDateTime applyTime; - - @Schema(description = "审核时间") - private LocalDateTime auditTime; - - @Schema(description = "合同时间") - private LocalDateTime contractTime; - - @Schema(description = "过期时间") - private LocalDateTime expirationTime; - - @Schema(description = "驳回原因") - private String rejectReason; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "商城ID") - private Integer tenantId; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - private LocalDateTime updateTime; - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryBed.java b/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryBed.java deleted file mode 100644 index 7302543..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryBed.java +++ /dev/null @@ -1,91 +0,0 @@ -package com.gxwebsoft.dormitory.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍床位 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(description = "宿舍床位") -public class DormitoryBed implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "宿舍名称") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "楼栋ID") - private Integer buildingId; - - @Schema(description = "楼栋名称") - @TableField(exist = false) - private String buildingName; - - @Schema(description = "楼层ID") - private Integer floorId; - - @Schema(description = "楼层名称") - @TableField(exist = false) - private String floorName; - - @Schema(description = "宿舍ID") - private Integer recordId; - - @Schema(description = "宿舍名称") - @TableField(exist = false) - private String recordName; - - @Schema(description = "学生ID") - private Integer userId; - - @Schema(description = "学生昵称") - @TableField(exist = false) - private String realName; - - @Schema(description = "手机号码") - @TableField(exist = false) - private String phone; - - @Schema(description = "头像") - @TableField(exist = false) - private String avatar; - - @Schema(description = "上下铺 1下铺 2上铺 0无") - private Boolean bunk; - - @Schema(description = "充电口") - private Boolean chargingPort; - - @Schema(description = "排序(数字越小越靠前)") - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1报修") - private Integer status; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryBuilding.java b/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryBuilding.java deleted file mode 100644 index f79d4fb..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryBuilding.java +++ /dev/null @@ -1,48 +0,0 @@ -package com.gxwebsoft.dormitory.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍楼栋 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(description = "宿舍楼栋") -public class DormitoryBuilding implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "楼栋名称") - private String name; - - @Schema(description = "楼栋编号") - private String code; - - @Schema(description = "排序(数字越小越靠前)") - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1冻结") - private Integer status; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryFloor.java b/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryFloor.java deleted file mode 100644 index e72b2e0..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryFloor.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.gxwebsoft.dormitory.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍楼层 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(description = "宿舍楼层") -public class DormitoryFloor implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "楼层") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "楼栋") - @TableField(exist = false) - private String buildingName; - - @Schema(description = "楼栋ID") - private Integer buildingId; - - @Schema(description = "排序(数字越小越靠前)") - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1冻结") - private Integer status; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryRecord.java b/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryRecord.java deleted file mode 100644 index d2aac03..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/entity/DormitoryRecord.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.gxwebsoft.dormitory.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableField; -import com.baomidou.mybatisplus.annotation.TableId; -import java.time.LocalDateTime; -import java.io.Serializable; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍记录 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@Schema(description = "宿舍记录") -public class DormitoryRecord implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "宿舍名称") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "楼栋ID") - private Integer buildingId; - - @Schema(description = "楼栋名称") - @TableField(exist = false) - private String buildingName; - - @Schema(description = "楼层ID") - private Integer floorId; - - @Schema(description = "楼层名称") - @TableField(exist = false) - private String floorName; - - @Schema(description = "床位数") - private Integer beds; - - @Schema(description = "独立卫生间") - private Boolean toilet; - - @Schema(description = "排序(数字越小越靠前)") - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1冻结") - private Integer status; - - @Schema(description = "租户id") - private Integer tenantId; - - @Schema(description = "创建时间") - private LocalDateTime createTime; - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryApplyMapper.java b/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryApplyMapper.java deleted file mode 100644 index b7e5ea5..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryApplyMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.dormitory.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.dormitory.entity.DormitoryApply; -import com.gxwebsoft.dormitory.param.DormitoryApplyParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 审批管理Mapper - * - * @author 科技小王子 - * @since 2025-10-03 15:54:30 - */ -public interface DormitoryApplyMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") DormitoryApplyParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") DormitoryApplyParam param); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryBedMapper.java b/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryBedMapper.java deleted file mode 100644 index 484bf2b..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryBedMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.dormitory.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.dormitory.entity.DormitoryBed; -import com.gxwebsoft.dormitory.param.DormitoryBedParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 宿舍床位Mapper - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryBedMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") DormitoryBedParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") DormitoryBedParam param); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryBuildingMapper.java b/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryBuildingMapper.java deleted file mode 100644 index 3bfc4ca..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryBuildingMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.dormitory.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.dormitory.entity.DormitoryBuilding; -import com.gxwebsoft.dormitory.param.DormitoryBuildingParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 宿舍楼栋Mapper - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryBuildingMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") DormitoryBuildingParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") DormitoryBuildingParam param); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryFloorMapper.java b/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryFloorMapper.java deleted file mode 100644 index 84f7e9b..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryFloorMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.dormitory.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.dormitory.entity.DormitoryFloor; -import com.gxwebsoft.dormitory.param.DormitoryFloorParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 宿舍楼层Mapper - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryFloorMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") DormitoryFloorParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") DormitoryFloorParam param); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryRecordMapper.java b/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryRecordMapper.java deleted file mode 100644 index 9d64316..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/DormitoryRecordMapper.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.gxwebsoft.dormitory.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.gxwebsoft.dormitory.entity.DormitoryRecord; -import com.gxwebsoft.dormitory.param.DormitoryRecordParam; -import org.apache.ibatis.annotations.Param; - -import java.util.List; - -/** - * 宿舍记录Mapper - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryRecordMapper extends BaseMapper { - - /** - * 分页查询 - * - * @param page 分页对象 - * @param param 查询参数 - * @return List - */ - List selectPageRel(@Param("page") IPage page, - @Param("param") DormitoryRecordParam param); - - /** - * 查询全部 - * - * @param param 查询参数 - * @return List - */ - List selectListRel(@Param("param") DormitoryRecordParam param); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryApplyMapper.xml b/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryApplyMapper.xml deleted file mode 100644 index a42aa41..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryApplyMapper.xml +++ /dev/null @@ -1,87 +0,0 @@ - - - - - - - SELECT a.* - FROM dormitory_apply a - - - AND a.id = #{param.id} - - - AND a.type = #{param.type} - - - AND a.user_id = #{param.userId} - - - AND a.real_name LIKE CONCAT('%', #{param.realName}, '%') - - - AND a.mobile LIKE CONCAT('%', #{param.mobile}, '%') - - - AND a.dealer_name LIKE CONCAT('%', #{param.dealerName}, '%') - - - AND a.dealer_code LIKE CONCAT('%', #{param.dealerCode}, '%') - - - AND a.address LIKE CONCAT('%', #{param.address}, '%') - - - AND a.money = #{param.money} - - - AND a.referee_id = #{param.refereeId} - - - AND a.apply_type = #{param.applyType} - - - AND a.apply_status = #{param.applyStatus} - - - AND a.apply_time LIKE CONCAT('%', #{param.applyTime}, '%') - - - AND a.audit_time LIKE CONCAT('%', #{param.auditTime}, '%') - - - AND a.contract_time LIKE CONCAT('%', #{param.contractTime}, '%') - - - AND a.expiration_time LIKE CONCAT('%', #{param.expirationTime}, '%') - - - AND a.reject_reason LIKE CONCAT('%', #{param.rejectReason}, '%') - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryBedMapper.xml b/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryBedMapper.xml deleted file mode 100644 index 351e144..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryBedMapper.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - - - - - SELECT a.*, b.name AS buildingName, c.name AS floorName, d.name AS recordName, e.real_name AS realName, e.phone AS phone, e.avatar - FROM dormitory_bed a - LEFT JOIN dormitory_building b ON a.building_id = b.id - LEFT JOIN dormitory_floor c ON a.floor_id = c.id - LEFT JOIN dormitory_record d ON a.record_id = d.id - LEFT JOIN shop_user e ON a.user_id = e.user_id - - - AND a.id = #{param.id} - - - AND a.name LIKE CONCAT('%', #{param.name}, '%') - - - AND a.code LIKE CONCAT('%', #{param.code}, '%') - - - AND a.building_id = #{param.buildingId} - - - AND a.floor_id = #{param.floorId} - - - AND a.record_id = #{param.recordId} - - - AND a.user_id = #{param.userId} - - - AND a.bunk = #{param.bunk} - - - AND a.charging_port = #{param.chargingPort} - - - AND a.sort_number = #{param.sortNumber} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.status = #{param.status} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryBuildingMapper.xml b/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryBuildingMapper.xml deleted file mode 100644 index b7a6e30..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryBuildingMapper.xml +++ /dev/null @@ -1,51 +0,0 @@ - - - - - - - SELECT a.* - FROM dormitory_building a - - - AND a.id = #{param.id} - - - AND a.name LIKE CONCAT('%', #{param.name}, '%') - - - AND a.code LIKE CONCAT('%', #{param.code}, '%') - - - AND a.sort_number = #{param.sortNumber} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.status = #{param.status} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryFloorMapper.xml b/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryFloorMapper.xml deleted file mode 100644 index 9cafffe..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryFloorMapper.xml +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - - SELECT a.*, b.name AS buildingName - FROM dormitory_floor a - LEFT JOIN dormitory_building b ON a.building_id = b.id - - - AND a.id = #{param.id} - - - AND a.name LIKE CONCAT('%', #{param.name}, '%') - - - AND a.code LIKE CONCAT('%', #{param.code}, '%') - - - AND a.building_id = #{param.buildingId} - - - AND a.sort_number = #{param.sortNumber} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.status = #{param.status} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryRecordMapper.xml b/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryRecordMapper.xml deleted file mode 100644 index 95755c9..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/mapper/xml/DormitoryRecordMapper.xml +++ /dev/null @@ -1,65 +0,0 @@ - - - - - - - SELECT a.*, b.name AS buildingName, c.name AS floorName - FROM dormitory_record a - LEFT JOIN dormitory_building b ON a.building_id = b.id - LEFT JOIN dormitory_floor c ON a.floor_id = c.id - - - AND a.id = #{param.id} - - - AND a.name LIKE CONCAT('%', #{param.name}, '%') - - - AND a.code LIKE CONCAT('%', #{param.code}, '%') - - - AND a.building_id = #{param.buildingId} - - - AND a.floor_id = #{param.floorId} - - - AND a.beds = #{param.beds} - - - AND a.toilet = #{param.toilet} - - - AND a.sort_number = #{param.sortNumber} - - - AND a.comments LIKE CONCAT('%', #{param.comments}, '%') - - - AND a.status = #{param.status} - - - AND a.create_time >= #{param.createTimeStart} - - - AND a.create_time <= #{param.createTimeEnd} - - - AND (a.comments LIKE CONCAT('%', #{param.keywords}, '%') - ) - - - - - - - - - - - diff --git a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryApplyParam.java b/src/main/java/com/gxwebsoft/dormitory/param/DormitoryApplyParam.java deleted file mode 100644 index 474cb02..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryApplyParam.java +++ /dev/null @@ -1,87 +0,0 @@ -package com.gxwebsoft.dormitory.param; - -import com.fasterxml.jackson.annotation.JsonInclude; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.math.BigDecimal; - -/** - * 审批管理查询参数 - * - * @author 科技小王子 - * @since 2025-10-03 15:54:30 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(description = "审批管理查询参数") -public class DormitoryApplyParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "主键ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "类型") - @QueryField(type = QueryType.EQ) - private Integer type; - - @Schema(description = "用户ID") - @QueryField(type = QueryType.EQ) - private Integer userId; - - @Schema(description = "姓名") - private String realName; - - @Schema(description = "手机号") - private String mobile; - - @Schema(description = "客户名称") - private String dealerName; - - @Schema(description = "客户编号") - private String dealerCode; - - @Schema(description = "详细地址") - private String address; - - @Schema(description = "签约价格") - @QueryField(type = QueryType.EQ) - private BigDecimal money; - - @Schema(description = "推荐人用户ID") - @QueryField(type = QueryType.EQ) - private Integer refereeId; - - @Schema(description = "申请方式(10需后台审核 20无需审核)") - @QueryField(type = QueryType.EQ) - private Integer applyType; - - @Schema(description = "审核状态 (10待审核 20审核通过 30驳回)") - @QueryField(type = QueryType.EQ) - private Integer applyStatus; - - @Schema(description = "申请时间") - private String applyTime; - - @Schema(description = "审核时间") - private String auditTime; - - @Schema(description = "合同时间") - private String contractTime; - - @Schema(description = "过期时间") - private String expirationTime; - - @Schema(description = "驳回原因") - private String rejectReason; - - @Schema(description = "备注") - private String comments; - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryBedParam.java b/src/main/java/com/gxwebsoft/dormitory/param/DormitoryBedParam.java deleted file mode 100644 index 2b99a10..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryBedParam.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.gxwebsoft.dormitory.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍床位查询参数 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(description = "宿舍床位查询参数") -public class DormitoryBedParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "宿舍名称") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "楼栋ID") - @QueryField(type = QueryType.EQ) - private Integer buildingId; - - @Schema(description = "楼层ID") - @QueryField(type = QueryType.EQ) - private Integer floorId; - - @Schema(description = "宿舍ID") - @QueryField(type = QueryType.EQ) - private Integer recordId; - - @Schema(description = "学生ID") - private Integer userId; - - @Schema(description = "上下铺 1下铺 2上铺 0无") - @QueryField(type = QueryType.EQ) - private Boolean bunk; - - @Schema(description = "充电口") - @QueryField(type = QueryType.EQ) - private Boolean chargingPort; - - @Schema(description = "排序(数字越小越靠前)") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1报修") - @QueryField(type = QueryType.EQ) - private Integer status; - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryBuildingParam.java b/src/main/java/com/gxwebsoft/dormitory/param/DormitoryBuildingParam.java deleted file mode 100644 index 1c02691..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryBuildingParam.java +++ /dev/null @@ -1,46 +0,0 @@ -package com.gxwebsoft.dormitory.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍楼栋查询参数 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(description = "宿舍楼栋查询参数") -public class DormitoryBuildingParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "楼栋名称") - private String name; - - @Schema(description = "楼栋编号") - private String code; - - @Schema(description = "排序(数字越小越靠前)") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1冻结") - @QueryField(type = QueryType.EQ) - private Integer status; - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryFloorParam.java b/src/main/java/com/gxwebsoft/dormitory/param/DormitoryFloorParam.java deleted file mode 100644 index d699dbc..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryFloorParam.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.gxwebsoft.dormitory.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍楼层查询参数 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(description = "宿舍楼层查询参数") -public class DormitoryFloorParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "楼层") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "楼栋ID") - @QueryField(type = QueryType.EQ) - private Integer buildingId; - - @Schema(description = "排序(数字越小越靠前)") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1冻结") - @QueryField(type = QueryType.EQ) - private Integer status; - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryRecordParam.java b/src/main/java/com/gxwebsoft/dormitory/param/DormitoryRecordParam.java deleted file mode 100644 index 2843d1d..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/param/DormitoryRecordParam.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.gxwebsoft.dormitory.param; - -import java.math.BigDecimal; -import com.gxwebsoft.common.core.annotation.QueryField; -import com.gxwebsoft.common.core.annotation.QueryType; -import com.gxwebsoft.common.core.web.BaseParam; -import com.fasterxml.jackson.annotation.JsonInclude; -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -/** - * 宿舍记录查询参数 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Data -@EqualsAndHashCode(callSuper = false) -@JsonInclude(JsonInclude.Include.NON_NULL) -@Schema(description = "宿舍记录查询参数") -public class DormitoryRecordParam extends BaseParam { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @QueryField(type = QueryType.EQ) - private Integer id; - - @Schema(description = "宿舍名称") - private String name; - - @Schema(description = "编号") - private String code; - - @Schema(description = "楼栋ID") - @QueryField(type = QueryType.EQ) - private Integer buildingId; - - @Schema(description = "楼层ID") - @QueryField(type = QueryType.EQ) - private Integer floorId; - - @Schema(description = "床位数") - @QueryField(type = QueryType.EQ) - private Integer beds; - - @Schema(description = "独立卫生间") - @QueryField(type = QueryType.EQ) - private Boolean toilet; - - @Schema(description = "排序(数字越小越靠前)") - @QueryField(type = QueryType.EQ) - private Integer sortNumber; - - @Schema(description = "备注") - private String comments; - - @Schema(description = "状态, 0正常, 1冻结") - @QueryField(type = QueryType.EQ) - private Integer status; - -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryApplyService.java b/src/main/java/com/gxwebsoft/dormitory/service/DormitoryApplyService.java deleted file mode 100644 index 3456e75..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryApplyService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.dormitory.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.dormitory.entity.DormitoryApply; -import com.gxwebsoft.dormitory.param.DormitoryApplyParam; - -import java.util.List; - -/** - * 审批管理Service - * - * @author 科技小王子 - * @since 2025-10-03 15:54:30 - */ -public interface DormitoryApplyService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(DormitoryApplyParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(DormitoryApplyParam param); - - /** - * 根据id查询 - * - * @param id 主键ID - * @return DormitoryApply - */ - DormitoryApply getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryBedService.java b/src/main/java/com/gxwebsoft/dormitory/service/DormitoryBedService.java deleted file mode 100644 index 3f80f7b..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryBedService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.dormitory.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.dormitory.entity.DormitoryBed; -import com.gxwebsoft.dormitory.param.DormitoryBedParam; - -import java.util.List; - -/** - * 宿舍床位Service - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryBedService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(DormitoryBedParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(DormitoryBedParam param); - - /** - * 根据id查询 - * - * @param id ID - * @return DormitoryBed - */ - DormitoryBed getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryBuildingService.java b/src/main/java/com/gxwebsoft/dormitory/service/DormitoryBuildingService.java deleted file mode 100644 index c5b015f..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryBuildingService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.dormitory.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.dormitory.entity.DormitoryBuilding; -import com.gxwebsoft.dormitory.param.DormitoryBuildingParam; - -import java.util.List; - -/** - * 宿舍楼栋Service - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryBuildingService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(DormitoryBuildingParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(DormitoryBuildingParam param); - - /** - * 根据id查询 - * - * @param id ID - * @return DormitoryBuilding - */ - DormitoryBuilding getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryFloorService.java b/src/main/java/com/gxwebsoft/dormitory/service/DormitoryFloorService.java deleted file mode 100644 index 0e64087..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryFloorService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.dormitory.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.dormitory.entity.DormitoryFloor; -import com.gxwebsoft.dormitory.param.DormitoryFloorParam; - -import java.util.List; - -/** - * 宿舍楼层Service - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryFloorService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(DormitoryFloorParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(DormitoryFloorParam param); - - /** - * 根据id查询 - * - * @param id ID - * @return DormitoryFloor - */ - DormitoryFloor getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryRecordService.java b/src/main/java/com/gxwebsoft/dormitory/service/DormitoryRecordService.java deleted file mode 100644 index 13fe03d..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/DormitoryRecordService.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.gxwebsoft.dormitory.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.dormitory.entity.DormitoryRecord; -import com.gxwebsoft.dormitory.param.DormitoryRecordParam; - -import java.util.List; - -/** - * 宿舍记录Service - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -public interface DormitoryRecordService extends IService { - - /** - * 分页关联查询 - * - * @param param 查询参数 - * @return PageResult - */ - PageResult pageRel(DormitoryRecordParam param); - - /** - * 关联查询全部 - * - * @param param 查询参数 - * @return List - */ - List listRel(DormitoryRecordParam param); - - /** - * 根据id查询 - * - * @param id ID - * @return DormitoryRecord - */ - DormitoryRecord getByIdRel(Integer id); - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryApplyServiceImpl.java b/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryApplyServiceImpl.java deleted file mode 100644 index 003fa9a..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryApplyServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.dormitory.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.dormitory.entity.DormitoryApply; -import com.gxwebsoft.dormitory.mapper.DormitoryApplyMapper; -import com.gxwebsoft.dormitory.param.DormitoryApplyParam; -import com.gxwebsoft.dormitory.service.DormitoryApplyService; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 审批管理Service实现 - * - * @author 科技小王子 - * @since 2025-10-03 15:54:30 - */ -@Service -public class DormitoryApplyServiceImpl extends ServiceImpl implements DormitoryApplyService { - - @Override - public PageResult pageRel(DormitoryApplyParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(DormitoryApplyParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public DormitoryApply getByIdRel(Integer id) { - DormitoryApplyParam param = new DormitoryApplyParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryBedServiceImpl.java b/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryBedServiceImpl.java deleted file mode 100644 index 0014b17..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryBedServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.dormitory.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.dormitory.mapper.DormitoryBedMapper; -import com.gxwebsoft.dormitory.service.DormitoryBedService; -import com.gxwebsoft.dormitory.entity.DormitoryBed; -import com.gxwebsoft.dormitory.param.DormitoryBedParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 宿舍床位Service实现 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Service -public class DormitoryBedServiceImpl extends ServiceImpl implements DormitoryBedService { - - @Override - public PageResult pageRel(DormitoryBedParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(DormitoryBedParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public DormitoryBed getByIdRel(Integer id) { - DormitoryBedParam param = new DormitoryBedParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryBuildingServiceImpl.java b/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryBuildingServiceImpl.java deleted file mode 100644 index e15e01e..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryBuildingServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.dormitory.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.dormitory.mapper.DormitoryBuildingMapper; -import com.gxwebsoft.dormitory.service.DormitoryBuildingService; -import com.gxwebsoft.dormitory.entity.DormitoryBuilding; -import com.gxwebsoft.dormitory.param.DormitoryBuildingParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 宿舍楼栋Service实现 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Service -public class DormitoryBuildingServiceImpl extends ServiceImpl implements DormitoryBuildingService { - - @Override - public PageResult pageRel(DormitoryBuildingParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(DormitoryBuildingParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public DormitoryBuilding getByIdRel(Integer id) { - DormitoryBuildingParam param = new DormitoryBuildingParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryFloorServiceImpl.java b/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryFloorServiceImpl.java deleted file mode 100644 index 6ddd3c5..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryFloorServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.dormitory.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.dormitory.mapper.DormitoryFloorMapper; -import com.gxwebsoft.dormitory.service.DormitoryFloorService; -import com.gxwebsoft.dormitory.entity.DormitoryFloor; -import com.gxwebsoft.dormitory.param.DormitoryFloorParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 宿舍楼层Service实现 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Service -public class DormitoryFloorServiceImpl extends ServiceImpl implements DormitoryFloorService { - - @Override - public PageResult pageRel(DormitoryFloorParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(DormitoryFloorParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public DormitoryFloor getByIdRel(Integer id) { - DormitoryFloorParam param = new DormitoryFloorParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryRecordServiceImpl.java b/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryRecordServiceImpl.java deleted file mode 100644 index a7f218b..0000000 --- a/src/main/java/com/gxwebsoft/dormitory/service/impl/DormitoryRecordServiceImpl.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.gxwebsoft.dormitory.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.dormitory.mapper.DormitoryRecordMapper; -import com.gxwebsoft.dormitory.service.DormitoryRecordService; -import com.gxwebsoft.dormitory.entity.DormitoryRecord; -import com.gxwebsoft.dormitory.param.DormitoryRecordParam; -import com.gxwebsoft.common.core.web.PageParam; -import com.gxwebsoft.common.core.web.PageResult; -import org.springframework.stereotype.Service; - -import java.util.List; - -/** - * 宿舍记录Service实现 - * - * @author 科技小王子 - * @since 2025-10-03 10:49:27 - */ -@Service -public class DormitoryRecordServiceImpl extends ServiceImpl implements DormitoryRecordService { - - @Override - public PageResult pageRel(DormitoryRecordParam param) { - PageParam page = new PageParam<>(param); - page.setDefaultOrder("sort_number asc, create_time desc"); - List list = baseMapper.selectPageRel(page, param); - return new PageResult<>(list, page.getTotal()); - } - - @Override - public List listRel(DormitoryRecordParam param) { - List list = baseMapper.selectListRel(param); - // 排序 - PageParam page = new PageParam<>(); - page.setDefaultOrder("sort_number asc, create_time desc"); - return page.sortRecords(list); - } - - @Override - public DormitoryRecord getByIdRel(Integer id) { - DormitoryRecordParam param = new DormitoryRecordParam(); - param.setId(id); - return param.getOne(baseMapper.selectListRel(param)); - } - -} diff --git a/src/main/java/com/gxwebsoft/enterprise/controller/EnterpriseController.java b/src/main/java/com/gxwebsoft/enterprise/controller/EnterpriseController.java deleted file mode 100644 index 819568a..0000000 --- a/src/main/java/com/gxwebsoft/enterprise/controller/EnterpriseController.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.gxwebsoft.enterprise.controller; - -import cn.hutool.core.util.ObjectUtil; -import cn.hutool.core.util.StrUtil; - -import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; -import com.baomidou.mybatisplus.core.metadata.IPage; -import com.baomidou.mybatisplus.extension.plugins.pagination.Page; -import com.gxwebsoft.common.core.web.BaseController; -import com.gxwebsoft.common.core.web.ApiResult; -import com.gxwebsoft.common.core.web.PageResult; -import com.gxwebsoft.common.core.annotation.OperationLog; -import com.gxwebsoft.common.system.entity.User; -import com.gxwebsoft.enterprise.entity.Enterprise; -import com.gxwebsoft.enterprise.service.EnterpriseService; -import io.swagger.v3.oas.annotations.tags.Tag; -import io.swagger.v3.oas.annotations.Operation; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.web.bind.annotation.*; - -import javax.annotation.Resource; -import java.util.List; - -/** - * - * @author GIIT-YC - * - */ -@Tag(name = "企业信息管理") -@RestController -@RequestMapping("/api/enterprise/enterprise") -public class EnterpriseController extends BaseController { - - @Resource - private EnterpriseService enterpriseService; - -// @PreAuthorize("hasAuthority('enterprise:enterprise:list')") - @Operation(summary = "分页查询企业信息") - @GetMapping("/page") - public ApiResult> page(Enterprise enterprise) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.like(StrUtil.isNotBlank(enterprise.getName()), Enterprise::getName, enterprise.getName()); - wrapper.like(StrUtil.isNotBlank(enterprise.getCreditCode()), Enterprise::getCreditCode, enterprise.getCreditCode()); - wrapper.orderByAsc(Enterprise::getName); - - final Page page = new Page<>(enterprise.getPage(), enterprise.getLimit()); - final IPage p = enterpriseService.page(page, wrapper); - - return success(new PageResult(p.getRecords(), p.getTotal())); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:list')") - @Operation(summary = "查询全部企业信息") - @GetMapping("/list") - public ApiResult> list(Enterprise enterprise) { - LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>(); - wrapper.like(StrUtil.isNotBlank(enterprise.getName()), Enterprise::getName, enterprise.getName()); - wrapper.like(StrUtil.isNotBlank(enterprise.getCreditCode()), Enterprise::getCreditCode, enterprise.getCreditCode()); - return success(enterpriseService.list(wrapper)); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:list')") - @Operation(summary = "根据id查询企业信息") - @GetMapping("/{id}") - public ApiResult get(@PathVariable("id") Integer id) { - return success(enterpriseService.getById(id)); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:list')") - @Operation(summary = "根据CreditCode查询企业信息") - @GetMapping("/creditCode/{creditCode}") - public ApiResult getByCreditCode(@PathVariable("creditCode") String creditCode) { - Enterprise enterprise = enterpriseService.getOne(new LambdaQueryWrapper().eq(Enterprise::getCreditCode, creditCode)); - return success(enterprise); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:save')") - @OperationLog - @Operation(summary = "添加企业信息") - @PostMapping() - public ApiResult save(@RequestBody Enterprise enterprise) { - // 记录当前登录用户id - User loginUser = getLoginUser(); - if (loginUser != null) { - enterprise.setUserId(loginUser.getUserId()); - final Enterprise one = enterpriseService.getOne(new LambdaQueryWrapper().eq(Enterprise::getCreditCode, enterprise.getCreditCode())); - if (!ObjectUtil.isEmpty(one)) { - return fail("企业统一信用代码已存在"); - } - if (enterpriseService.save(enterprise)) { - //TODO 查询知识库(kb_name=enterprise.getCreditCode) - - //TODO 新建知识库 - String kbId = "pggi9mpair"; - - //绑定知识库 - enterprise.setKbId(kbId); - enterpriseService.updateById(enterprise); - return success("添加成功"); - } - } - return fail("添加失败"); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:update')") - @OperationLog - @Operation(summary = "修改企业信息") - @PutMapping() - public ApiResult update(@RequestBody Enterprise enterprise) { - if(StrUtil.isEmpty(enterprise.getKbId())) { - //TODO 查询知识库 - - //TODO 新建知识库 - String kbId = "pggi9mpair"; - - //绑定知识库 - enterprise.setKbId(kbId); - } - if (enterpriseService.updateById(enterprise)) { - return success("修改成功"); - } - return fail("修改失败"); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:remove')") - @OperationLog - @Operation(summary = "删除企业信息") - @DeleteMapping("/{id}") - public ApiResult remove(@PathVariable("id") Integer id) { - if (enterpriseService.removeById(id)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -// @PreAuthorize("hasAuthority('enterprise:enterprise:remove')") - @OperationLog - @Operation(summary = "批量删除企业信息") - @DeleteMapping("/batch") - public ApiResult removeBatch(@RequestBody List ids) { - if (enterpriseService.removeByIds(ids)) { - return success("删除成功"); - } - return fail("删除失败"); - } - -} diff --git a/src/main/java/com/gxwebsoft/enterprise/entity/Enterprise.java b/src/main/java/com/gxwebsoft/enterprise/entity/Enterprise.java deleted file mode 100644 index 9e99efd..0000000 --- a/src/main/java/com/gxwebsoft/enterprise/entity/Enterprise.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.gxwebsoft.enterprise.entity; - -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -import com.baomidou.mybatisplus.annotation.TableLogic; -import com.baomidou.mybatisplus.annotation.TableName; -import com.fasterxml.jackson.annotation.JsonFormat; -import com.gxwebsoft.common.core.web.BaseParam; - -import io.swagger.v3.oas.annotations.media.Schema; -import lombok.Data; -import lombok.EqualsAndHashCode; - -import java.io.Serializable; -import java.time.LocalDateTime; - -/** - * 企业信息 - * @author GIIT-YC - */ -@Data -@TableName("enterprise") -@EqualsAndHashCode(callSuper = false) -@Schema(name = "Enterprise对象", description = "企业信息表") -public class Enterprise extends BaseParam implements Serializable { - private static final long serialVersionUID = 1L; - - @Schema(description = "ID") - @TableId(value = "id", type = IdType.AUTO) - private Integer id; - - @Schema(description = "企业名称") - private String name; - - @Schema(description = "统一代码") - private String creditCode; - - @Schema(description = "企业性质(国企、行政事业单位、民间非营利组织)") - private String enterpriseType; - - @Schema(description = "所属行业(使用插件)") - private String industry; - - @Schema(description = "知识库ID") - private String kbId; - - @Schema(description = "客户ID") - private Integer userId; - - @Schema(description = "租户ID") - private Integer tenantId; - - @Schema(description = "创建时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime createTime; - - @Schema(description = "修改时间") - @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") - private LocalDateTime updateTime; - - @Schema(description = "状态, 0正常, 1冻结") - private Integer status; - - @Schema(description = "是否删除, 0否, 1是") - @TableLogic - private Integer deleted; -} \ No newline at end of file diff --git a/src/main/java/com/gxwebsoft/enterprise/mapper/EnterpriseMapper.java b/src/main/java/com/gxwebsoft/enterprise/mapper/EnterpriseMapper.java deleted file mode 100644 index 33ca945..0000000 --- a/src/main/java/com/gxwebsoft/enterprise/mapper/EnterpriseMapper.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gxwebsoft.enterprise.mapper; - -import com.baomidou.mybatisplus.core.mapper.BaseMapper; -import com.gxwebsoft.enterprise.entity.Enterprise; - -/** - * - * @author GIIT-YC - * - */ -public interface EnterpriseMapper extends BaseMapper { - -} diff --git a/src/main/java/com/gxwebsoft/enterprise/mapper/xml/EnterpriseMapper.xml b/src/main/java/com/gxwebsoft/enterprise/mapper/xml/EnterpriseMapper.xml deleted file mode 100644 index b543162..0000000 --- a/src/main/java/com/gxwebsoft/enterprise/mapper/xml/EnterpriseMapper.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/main/java/com/gxwebsoft/enterprise/service/EnterpriseService.java b/src/main/java/com/gxwebsoft/enterprise/service/EnterpriseService.java deleted file mode 100644 index daf3ff8..0000000 --- a/src/main/java/com/gxwebsoft/enterprise/service/EnterpriseService.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.gxwebsoft.enterprise.service; - -import com.baomidou.mybatisplus.extension.service.IService; -import com.gxwebsoft.enterprise.entity.Enterprise; - -/** - * - * @author GIIT-YC - * - */ -public interface EnterpriseService extends IService { - -} diff --git a/src/main/java/com/gxwebsoft/enterprise/service/impl/EnterpriseServiceImpl.java b/src/main/java/com/gxwebsoft/enterprise/service/impl/EnterpriseServiceImpl.java deleted file mode 100644 index a6eedda..0000000 --- a/src/main/java/com/gxwebsoft/enterprise/service/impl/EnterpriseServiceImpl.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.gxwebsoft.enterprise.service.impl; - -import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; -import com.gxwebsoft.enterprise.entity.Enterprise; -import com.gxwebsoft.enterprise.mapper.EnterpriseMapper; -import com.gxwebsoft.enterprise.service.EnterpriseService; -import org.springframework.stereotype.Service; - -/** - * - * @author GIIT-YC - * - */ -@Service -public class EnterpriseServiceImpl extends ServiceImpl implements EnterpriseService { - -} diff --git a/src/test/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImplCacheTest.java b/src/test/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImplCacheTest.java new file mode 100644 index 0000000..6112ed0 --- /dev/null +++ b/src/test/java/com/gxwebsoft/cms/service/impl/CmsAppServiceImplCacheTest.java @@ -0,0 +1,66 @@ +package com.gxwebsoft.cms.service.impl; + +import com.gxwebsoft.cms.entity.CmsApp; +import com.gxwebsoft.cms.mapper.CmsAppMapper; +import com.gxwebsoft.cms.service.CmsNavigationService; +import com.gxwebsoft.common.core.utils.RedisUtil; +import com.gxwebsoft.shop.vo.ShopVo; +import org.junit.jupiter.api.Test; + +import java.lang.reflect.Field; +import java.util.Collections; + +import static org.junit.jupiter.api.Assertions.assertNotNull; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +class CmsAppServiceImplCacheTest { + + @Test + void getSiteInfo_cacheValueIsJsonNull_shouldFallbackToDb() throws Exception { + Integer tenantId = 1; + + RedisUtil redisUtil = mock(RedisUtil.class); + CmsNavigationService cmsNavigationService = mock(CmsNavigationService.class); + CmsAppMapper cmsAppMapper = mock(CmsAppMapper.class); + + // 历史缓存可能存在字符串 "null";Jackson 解析后会得到 null,需回源 DB。 + when(redisUtil.get("SiteInfo:" + tenantId)).thenReturn("null"); + when(cmsNavigationService.listRel(any())).thenReturn(Collections.emptyList()); + + CmsApp website = new CmsApp(); + website.setTenantId(tenantId); + website.setTenantName("tenant"); + website.setAppName("site"); + when(cmsAppMapper.getByTenantId(tenantId)).thenReturn(website); + + CmsAppServiceImpl service = new CmsAppServiceImpl(); + setField(service, "redisUtil", redisUtil); + setField(service, "cmsNavigationService", cmsNavigationService); + setField(service, "baseMapper", cmsAppMapper); + + ShopVo vo = service.getSiteInfo(tenantId); + + assertNotNull(vo); + verify(redisUtil).delete("SiteInfo:" + tenantId); + verify(cmsAppMapper).getByTenantId(tenantId); + } + + private static void setField(Object target, String fieldName, Object value) throws Exception { + Class c = target.getClass(); + while (c != null) { + try { + Field f = c.getDeclaredField(fieldName); + f.setAccessible(true); + f.set(target, value); + return; + } catch (NoSuchFieldException ignored) { + c = c.getSuperclass(); + } + } + throw new NoSuchFieldException(fieldName); + } +} +